Page Not Found
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/404.html b/404.html index d289dc426..8926e611f 100644 --- a/404.html +++ b/404.html @@ -1,14 +1 @@ - - -
- - -We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
/etc/fstab
that is not present at boot time",id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",level:2},{value:"Incorrectly applied updates / disk changes",id:"incorrectly-applied-updates--disk-changes",level:2},{value:"Mounting your system",id:"mounting-your-system",level:3},{value:"Encrypted systems / LVM systems",id:"encrypted-systems--lvm-systems",level:4},{value:"UEFI",id:"uefi",level:4},{value:"Other partitions",id:"other-partitions",level:4},{value:"Chrooting to your Solus system",id:"chrooting-to-your-solus-system",level:3},{value:"Networking",id:"networking",level:3},{value:"Repairing packages",id:"repairing-packages",level:3},{value:"Correcting disks",id:"correcting-disks",level:3},{value:"Re-run system-wide configuration triggers",id:"re-run-system-wide-configuration-triggers",level:3},{value:"Regenerate UEFI boot entries",id:"regenerate-uefi-boot-entries",level:3},{value:"Unmounting your system",id:"unmounting-your-system",level:3}];function c(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"boot-rescue",children:"Boot Rescue"})}),"\n",(0,o.jsx)(s.p,{children:"In this document, we will walk through restoring the ability to boot Solus."}),"\n",(0,o.jsx)(s.p,{children:"The inability to boot Solus can be attributed to various issues, such as:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:'Multi-booting with an other operating system that "owns" GRUB and fails to show Solus after an upgrade of Solus is performed.'}),"\n",(0,o.jsx)(s.li,{children:'Upgrades, such as to the kernel, that may not have applied correctly. In which case this could affect "legacy boot" (non-UEFI) or UEFI systems.'}),"\n",(0,o.jsx)(s.li,{children:"If a disk is added, removed or had its UUID / mount point change."}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:'NOTE: Most examples below use sdX as the drive name. If your system has nvme drives, substitute the appropriate name, for example "nvme0n1".'}),"\n",(0,o.jsx)(s.h2,{id:"multi-booting",children:"Multi-booting"}),"\n",(0,o.jsx)(s.p,{children:'Multi-booting is when you have multiple operating systems on the same device. Also referred to as "dual-booting" when only having two operating systems on the same device.'}),"\n",(0,o.jsxs)(s.p,{children:['The inability to access Solus in a multi-boot scenario typically applies to "legacy boot" (non-UEFI), where the other operating system owns GRUB, which is used booting itself and Solus. This can be resolved by accessing the other operating system and running ',(0,o.jsx)(s.code,{children:"sudo update-grub"}),"."]}),"\n",(0,o.jsxs)(s.h2,{id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",children:["An entry is present in ",(0,o.jsx)(s.code,{children:"/etc/fstab"})," that is not present at boot time"]}),"\n",(0,o.jsxs)(s.p,{children:["If you get to an emergency prompt when the system tries to boot, check ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),'. Look for any entries that might refer to disks not present at boot, such as a USB drive or NFS mount. Try adding "noauto" and rebooting. A USB drive entry might look like:']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"UUID=XXXXXX /mnt/mydisk exfat noauto,uid=1000,gid=1000,umask=0022 0 0\n"})}),"\n",(0,o.jsx)(s.h2,{id:"incorrectly-applied-updates--disk-changes",children:"Incorrectly applied updates / disk changes"}),"\n",(0,o.jsx)(s.p,{children:"In the case that updates have not been applied correctly by the system, the updates were interrupted, or the disks have changed, it may be possible to boot rescue the Solus system. To do so, you will need:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:"A Live ISO of Solus booted on your system"}),"\n",(0,o.jsx)(s.li,{children:"A terminal in that Live ISO opened"}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"mounting-your-system",children:"Mounting your system"}),"\n",(0,o.jsxs)(s.p,{children:["Whether you're using GRUB or UEFI, you will need to mount your Solus root (",(0,o.jsx)(s.code,{children:"/"}),") partition as the first step of performing a boot rescue. This is typically your primary partition, formatted as the filesystem type ",(0,o.jsx)(s.code,{children:"ext4"}),"."]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["First we need to be the root user. Type: ",(0,o.jsx)(s.code,{children:"sudo su"})]}),"\n",(0,o.jsxs)(s.li,{children:["Next we make a directory where we will mount our local Solus system: ",(0,o.jsx)(s.code,{children:"mkdir /target"})]}),"\n",(0,o.jsxs)(s.li,{children:["Now, using ",(0,o.jsx)(s.code,{children:"lsblk"}),", determine the partition of the Solus system. We recommend checking the size of the partition listed and if it matches the size of your Solus install, use that. It will likely be something along the lines of ",(0,o.jsx)(s.code,{children:"sda#"})," or ",(0,o.jsx)(s.code,{children:"sdb#"}),". For NVMe drives, the name will look like ",(0,o.jsx)(s.code,{children:"nvme0n1px"}),'\nNote: If you see "lvm" as the type, the system has LVM partitions. See the next section for how to mount them.']}),"\n",(0,o.jsxs)(s.li,{children:['If your root partition is of type sdX / nvme0n1x, replace the "sdX#" in the following command with the partition and mount to the target directory we created: ',(0,o.jsx)(s.code,{children:"mount /dev/sdX# /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"encrypted-systems--lvm-systems",children:"Encrypted systems / LVM systems"}),"\n",(0,o.jsx)(s.p,{children:"If you use LVM volumes on your system, the process for mounting the system is a little different.\nIf you use LUKS-based encryption, the process will involve decrypting your LUKS partition before mounting it to the correct location. To do this, note the sda / sdb device from the prior steps and follow the steps below:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["If the disk is encrypted, decrypt it by running ",(0,o.jsx)(s.code,{children:"cryptsetup luksOpen /dev/sdX# decrypted"}),", replacing ",(0,o.jsx)(s.code,{children:"X#"})," with the partition you identified, and enter your password when prompted."]}),"\n",(0,o.jsxs)(s.li,{children:["Next check the output of ",(0,o.jsx)(s.code,{children:"lsblk"}),". This will show you any LVM volumes. You should now see ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),".\nFor non-encrypted volumes, you may see something like this. In this example, ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' are under "sda2":']}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nsr0 11:0 1 2.7G 0 rom /run/initramfs/live\nzram0 251:0 0 7.8G 0 disk [SWAP]\nsda 252:0 0 96G 0 disk\n\u251c\u2500sda1 252:1 0 287M 0 part\n\u2514\u2500sda2 252:2 0 69.7G 0 part\n \u251c\u2500SolusSystem-Swap 253:0 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:1 0 46G 0 lvm\n...\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For decrypted volumes, the output should look similar to this, with ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' being under "decrypted":']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nloop2 7:2 0 6.2G 1 loop\n\u2514\u2500live-base 253:0 0 6.2G 1 dm\nsda 8:0 0 238.5G 0 disk\n\u251c\u2500sda1 8:1 0 488.3M 0 part\n\u2514\u2500sda2 8:2 0 238G 0 part\n \u2514\u2500decrypted 253:1 0 238G 0 crypt\n \u251c\u2500SolusSystem-Swap 253:2 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:3 0 234.3G 0 lvm\nsdb 8:16 1 7.3G 0 disk\n\u251c\u2500sdb1 8:17 1 1.4G 0 part /run/initramfs/live\n\u2514\u2500sdb2 8:18 1 40M 0 part\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Mount ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"})," by running ",(0,o.jsx)(s.code,{children:"mount /dev/mapper/SolusSystem-Root /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"uefi",children:"UEFI"}),"\n",(0,o.jsxs)(s.p,{children:["If your system uses UEFI as opposed to GRUB, you will also need to mount your EFI System Partition, otherwise referred to as ESP. If you followed our ",(0,o.jsx)(s.a,{href:"/docs/user/quick-start/installation/disks#uefi",children:"UEFI guide"}),' during installation of Solus, then in all likelihood your ESP will be about 1GB in size. For an older installation, it may be around 512MB. If you\'re unsure of the partition, run the following, replacing "X" with the same letter used during your mounting of your root file system, minus the number:']}),"\n",(0,o.jsx)(s.p,{children:"For HDD / SDD drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/sdX\n"})}),"\n",(0,o.jsx)(s.p,{children:"For nvme drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/nvme0nX\n"})}),"\n",(0,o.jsx)(s.p,{children:"Your output may look something similar to:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"Device Size Type\n/dev/sda1 512M EFI System\n/dev/sda2 111.3G Linux filesystem\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Notice we have ",(0,o.jsx)(s.code,{children:"/dev/sda1"})," as the Device with the ",(0,o.jsx)(s.code,{children:"EFI System"})," type and roughly 500MB in size. This is the partition we will be mounting."]}),"\n",(0,o.jsxs)(s.p,{children:["With our ESP device known, let's go ahead and mount it, replacing ",(0,o.jsx)(s.code,{children:"sdX#"})," in the case below with our partition."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount /dev/sdX# /target/boot\n"})}),"\n",(0,o.jsx)(s.h4,{id:"other-partitions",children:"Other partitions"}),"\n",(0,o.jsxs)(s.p,{children:["If your system has other specific partitions, such as a separate ",(0,o.jsx)(s.code,{children:"/home"})," partition, they will also need to be mounted."]}),"\n",(0,o.jsx)(s.h3,{id:"chrooting-to-your-solus-system",children:"Chrooting to your Solus system"}),"\n",(0,o.jsx)(s.p,{children:"To access your system and perform boot rescue, you will need to mount specific directories from the host system (in this case, our Live ISO), to our Solus system, and then chroot (change root) to the Solus system."}),"\n",(0,o.jsx)(s.p,{children:"First run the following commands:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount --types proc /proc /target/proc\nmount --rbind /dev /target/dev\nmount --rbind /sys /target/sys\nmount --make-rslave /target/dev\nmount --make-rslave /target/sys\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Assuming all goes well, you should now be able to chroot into your Solus system by doing ",(0,o.jsx)(s.code,{children:"chroot /target"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"networking",children:"Networking"}),"\n",(0,o.jsxs)(s.p,{children:["To validate a working network connection (assuming a network connection is available in your live image), you can run ",(0,o.jsx)(s.code,{children:"ping google.com"})," in the chrooted environment. If you get responses from ",(0,o.jsx)(s.code,{children:"google.com"}),", you have a successful connection to the Internet. If you do not, try the following:"]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Exit the chroot by typing ",(0,o.jsx)(s.code,{children:"exit"})]}),"\n",(0,o.jsx)(s.li,{children:"Run:"}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"cp /run/systemd/resolve/stub-resolv.conf /target/run/systemd/resolve/\ncd /target/etc\nln -s ../run/systemd/resolve/stub-resolv.conf /target/etc/resolv.conf\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Chroot back into ",(0,o.jsx)(s.code,{children:"/target"})," by running ",(0,o.jsx)(s.code,{children:"chroot /target"})," again."]}),"\n",(0,o.jsx)(s.li,{children:"Retry networking."}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"repairing-packages",children:"Repairing packages"}),"\n",(0,o.jsx)(s.p,{children:"In the event you had an incomplete upgrade, try the following commands:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg rebuild-db"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg up"})}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs sudo eopkg it --reinstall"}),'\nIf you see output that starts with "Usage", this means the system has no broken packages.']}),"\n",(0,o.jsxs)(s.li,{children:['Try reverting the latest package transaction (this should only be done if the first two steps, followed by the "Re-run System-Wide Configuration Triggers", failed to produce a successful bootup). See ',(0,o.jsx)(s.a,{href:"/docs/user/package-management/history-and-rollback",children:"our documentation on history and rollback"})," for more information, followed by re-applying your updates by running ",(0,o.jsx)(s.code,{children:"sudo eopkg up"}),"."]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"correcting-disks",children:"Correcting disks"}),"\n",(0,o.jsx)(s.p,{children:"In the event that disk changes had caused the system to fail to boot, try the following in the chroot environment:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Get the UUIDs of your partitions the system expects from ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["Compare this to the output of ",(0,o.jsx)(s.code,{children:"ls -lah /dev/disk/by-uuid"})]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"re-run-system-wide-configuration-triggers",children:"Re-run system-wide configuration triggers"}),"\n",(0,o.jsx)(s.p,{children:"In the chroot environment, run the following command which will perform various configuration triggers to update your icon cache, update GRUB and EFI configuration, re-compile settings, and more:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,o.jsx)(s.h3,{id:"regenerate-uefi-boot-entries",children:"Regenerate UEFI boot entries"}),"\n",(0,o.jsx)(s.p,{children:"Run the following command, which will update the boot entries for your EFI menu:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo clr-boot-manager update\n"})}),"\n",(0,o.jsxs)(s.p,{children:["After this, you should exit your chroot with ",(0,o.jsx)(s.code,{children:"exit"})," then reboot your system. In the event you are still unable to access Solus, please ",(0,o.jsx)(s.a,{href:"/docs/user/contributing/getting-involved",children:"contact us"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"unmounting-your-system",children:"Unmounting your system"}),"\n",(0,o.jsx)(s.p,{children:"In case further partition modifications are required, there's a series of steps that must be followed."}),"\n",(0,o.jsxs)(s.p,{children:["If you are still chrooted you have to exit the chroot environment by pressing ",(0,o.jsx)(s.code,{children:"Ctrl"})," + ",(0,o.jsx)(s.code,{children:"D"}),"."]}),"\n",(0,o.jsx)(s.p,{children:"Then proceed with unmounting the filesystem."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"umount -R /target\n"})}),"\n",(0,o.jsx)(s.p,{children:"In case of having a LUKS-based encryption you'll have to deactivate your logical volumes plus volume groups and then close your LUKS partition."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"lvchange -a n /dev/SolusSystem/Swap # `-a n` means `active: no`\nlvchange -a n /dev/SolusSystem/Root\nvgchange -a n SolusSystem\ncryptsetup luksClose decrypted\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>r});var o=t(67294);const n={},i=o.createContext(n);function r(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/09dbd43b.33479490.js b/assets/js/09dbd43b.33479490.js
new file mode 100644
index 000000000..55e01d623
--- /dev/null
+++ b/assets/js/09dbd43b.33479490.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8388"],{56721:function(e,s,t){t.r(s),t.d(s,{metadata:()=>o,contentTitle:()=>l,default:()=>h,assets:()=>a,toc:()=>d,frontMatter:()=>r});var o=JSON.parse('{"id":"user/troubleshooting/boot-rescue","title":"Boot Rescue","description":"In this document, we will walk through restoring the ability to boot Solus.","source":"@site/docs/user/troubleshooting/boot-rescue.md","sourceDirName":"user/troubleshooting","slug":"/user/troubleshooting/boot-rescue","permalink":"/docs/user/troubleshooting/boot-rescue","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/boot-rescue.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Boot Rescue","summary":"Troubleshooting the boot process for Solus"},"sidebar":"userSidebar","previous":{"title":"Troubleshooting","permalink":"/docs/user/troubleshooting/"},"next":{"title":"Installation Issues","permalink":"/docs/user/troubleshooting/installation"}}'),n=t("85893"),i=t("50065");let r={title:"Boot Rescue",summary:"Troubleshooting the boot process for Solus"},l="Boot Rescue",a={},d=[{value:"Multi-booting",id:"multi-booting",level:2},{value:"An entry is present in /etc/fstab
that is not present at boot time",id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",level:2},{value:"Incorrectly applied updates / disk changes",id:"incorrectly-applied-updates--disk-changes",level:2},{value:"Mounting your system",id:"mounting-your-system",level:3},{value:"Encrypted systems / LVM systems",id:"encrypted-systems--lvm-systems",level:4},{value:"UEFI",id:"uefi",level:4},{value:"Other partitions",id:"other-partitions",level:4},{value:"Chrooting to your Solus system",id:"chrooting-to-your-solus-system",level:3},{value:"Networking",id:"networking",level:3},{value:"Repairing packages",id:"repairing-packages",level:3},{value:"Correcting disks",id:"correcting-disks",level:3},{value:"Re-run system-wide configuration triggers",id:"re-run-system-wide-configuration-triggers",level:3},{value:"Regenerate UEFI boot entries",id:"regenerate-uefi-boot-entries",level:3},{value:"Unmounting your system",id:"unmounting-your-system",level:3}];function c(e){let s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"boot-rescue",children:"Boot Rescue"})}),"\n",(0,n.jsx)(s.p,{children:"In this document, we will walk through restoring the ability to boot Solus."}),"\n",(0,n.jsx)(s.p,{children:"The inability to boot Solus can be attributed to various issues, such as:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:'Multi-booting with an other operating system that "owns" GRUB and fails to show Solus after an upgrade of Solus is performed.'}),"\n",(0,n.jsx)(s.li,{children:'Upgrades, such as to the kernel, that may not have applied correctly. In which case this could affect "legacy boot" (non-UEFI) or UEFI systems.'}),"\n",(0,n.jsx)(s.li,{children:"If a disk is added, removed or had its UUID / mount point change."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:'NOTE: Most examples below use sdX as the drive name. If your system has nvme drives, substitute the appropriate name, for example "nvme0n1".'}),"\n",(0,n.jsx)(s.h2,{id:"multi-booting",children:"Multi-booting"}),"\n",(0,n.jsx)(s.p,{children:'Multi-booting is when you have multiple operating systems on the same device. Also referred to as "dual-booting" when only having two operating systems on the same device.'}),"\n",(0,n.jsxs)(s.p,{children:['The inability to access Solus in a multi-boot scenario typically applies to "legacy boot" (non-UEFI), where the other operating system owns GRUB, which is used booting itself and Solus. This can be resolved by accessing the other operating system and running ',(0,n.jsx)(s.code,{children:"sudo update-grub"}),"."]}),"\n",(0,n.jsxs)(s.h2,{id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",children:["An entry is present in ",(0,n.jsx)(s.code,{children:"/etc/fstab"})," that is not present at boot time"]}),"\n",(0,n.jsxs)(s.p,{children:["If you get to an emergency prompt when the system tries to boot, check ",(0,n.jsx)(s.code,{children:"/etc/fstab"}),'. Look for any entries that might refer to disks not present at boot, such as a USB drive or NFS mount. Try adding "noauto" and rebooting. A USB drive entry might look like:']}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"UUID=XXXXXX /mnt/mydisk exfat noauto,uid=1000,gid=1000,umask=0022 0 0\n"})}),"\n",(0,n.jsx)(s.h2,{id:"incorrectly-applied-updates--disk-changes",children:"Incorrectly applied updates / disk changes"}),"\n",(0,n.jsx)(s.p,{children:"In the case that updates have not been applied correctly by the system, the updates were interrupted, or the disks have changed, it may be possible to boot rescue the Solus system. To do so, you will need:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"A Live ISO of Solus booted on your system"}),"\n",(0,n.jsx)(s.li,{children:"A terminal in that Live ISO opened"}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"mounting-your-system",children:"Mounting your system"}),"\n",(0,n.jsxs)(s.p,{children:["Whether you're using GRUB or UEFI, you will need to mount your Solus root (",(0,n.jsx)(s.code,{children:"/"}),") partition as the first step of performing a boot rescue. This is typically your primary partition, formatted as the filesystem type ",(0,n.jsx)(s.code,{children:"ext4"}),"."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["First we need to be the root user. Type: ",(0,n.jsx)(s.code,{children:"sudo su"})]}),"\n",(0,n.jsxs)(s.li,{children:["Next we make a directory where we will mount our local Solus system: ",(0,n.jsx)(s.code,{children:"mkdir /target"})]}),"\n",(0,n.jsxs)(s.li,{children:["Now, using ",(0,n.jsx)(s.code,{children:"lsblk"}),", determine the partition of the Solus system. We recommend checking the size of the partition listed and if it matches the size of your Solus install, use that. It will likely be something along the lines of ",(0,n.jsx)(s.code,{children:"sda#"})," or ",(0,n.jsx)(s.code,{children:"sdb#"}),". For NVMe drives, the name will look like ",(0,n.jsx)(s.code,{children:"nvme0n1px"}),'\nNote: If you see "lvm" as the type, the system has LVM partitions. See the next section for how to mount them.']}),"\n",(0,n.jsxs)(s.li,{children:['If your root partition is of type sdX / nvme0n1x, replace the "sdX#" in the following command with the partition and mount to the target directory we created: ',(0,n.jsx)(s.code,{children:"mount /dev/sdX# /target"})]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"encrypted-systems--lvm-systems",children:"Encrypted systems / LVM systems"}),"\n",(0,n.jsx)(s.p,{children:"If you use LVM volumes on your system, the process for mounting the system is a little different.\nIf you use LUKS-based encryption, the process will involve decrypting your LUKS partition before mounting it to the correct location. To do this, note the sda / sdb device from the prior steps and follow the steps below:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["If the disk is encrypted, decrypt it by running ",(0,n.jsx)(s.code,{children:"cryptsetup luksOpen /dev/sdX# decrypted"}),", replacing ",(0,n.jsx)(s.code,{children:"X#"})," with the partition you identified, and enter your password when prompted."]}),"\n",(0,n.jsxs)(s.li,{children:["Next check the output of ",(0,n.jsx)(s.code,{children:"lsblk"}),". This will show you any LVM volumes. You should now see ",(0,n.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,n.jsx)(s.code,{children:"SolusSystem-Root"}),".\nFor non-encrypted volumes, you may see something like this. In this example, ",(0,n.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,n.jsx)(s.code,{children:"SolusSystem-Root"}),' are under "sda2":']}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nsr0 11:0 1 2.7G 0 rom /run/initramfs/live\nzram0 251:0 0 7.8G 0 disk [SWAP]\nsda 252:0 0 96G 0 disk\n\u251C\u2500sda1 252:1 0 287M 0 part\n\u2514\u2500sda2 252:2 0 69.7G 0 part\n \u251C\u2500SolusSystem-Swap 253:0 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:1 0 46G 0 lvm\n...\n"})}),"\n",(0,n.jsxs)(s.p,{children:["For decrypted volumes, the output should look similar to this, with ",(0,n.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,n.jsx)(s.code,{children:"SolusSystem-Root"}),' being under "decrypted":']}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nloop2 7:2 0 6.2G 1 loop\n\u2514\u2500live-base 253:0 0 6.2G 1 dm\nsda 8:0 0 238.5G 0 disk\n\u251C\u2500sda1 8:1 0 488.3M 0 part\n\u2514\u2500sda2 8:2 0 238G 0 part\n \u2514\u2500decrypted 253:1 0 238G 0 crypt\n \u251C\u2500SolusSystem-Swap 253:2 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:3 0 234.3G 0 lvm\nsdb 8:16 1 7.3G 0 disk\n\u251C\u2500sdb1 8:17 1 1.4G 0 part /run/initramfs/live\n\u2514\u2500sdb2 8:18 1 40M 0 part\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"3",children:["\n",(0,n.jsxs)(s.li,{children:["Mount ",(0,n.jsx)(s.code,{children:"SolusSystem-Root"})," by running ",(0,n.jsx)(s.code,{children:"mount /dev/mapper/SolusSystem-Root /target"})]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"uefi",children:"UEFI"}),"\n",(0,n.jsxs)(s.p,{children:["If your system uses UEFI as opposed to GRUB, you will also need to mount your EFI System Partition, otherwise referred to as ESP. If you followed our ",(0,n.jsx)(s.a,{href:"/docs/user/quick-start/installation/disks#uefi",children:"UEFI guide"}),' during installation of Solus, then in all likelihood your ESP will be about 1GB in size. For an older installation, it may be around 512MB. If you\'re unsure of the partition, run the following, replacing "X" with the same letter used during your mounting of your root file system, minus the number:']}),"\n",(0,n.jsx)(s.p,{children:"For HDD / SDD drives:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/sdX\n"})}),"\n",(0,n.jsx)(s.p,{children:"For nvme drives:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/nvme0nX\n"})}),"\n",(0,n.jsx)(s.p,{children:"Your output may look something similar to:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"Device Size Type\n/dev/sda1 512M EFI System\n/dev/sda2 111.3G Linux filesystem\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Notice we have ",(0,n.jsx)(s.code,{children:"/dev/sda1"})," as the Device with the ",(0,n.jsx)(s.code,{children:"EFI System"})," type and roughly 500MB in size. This is the partition we will be mounting."]}),"\n",(0,n.jsxs)(s.p,{children:["With our ESP device known, let's go ahead and mount it, replacing ",(0,n.jsx)(s.code,{children:"sdX#"})," in the case below with our partition."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"mount /dev/sdX# /target/boot\n"})}),"\n",(0,n.jsx)(s.h4,{id:"other-partitions",children:"Other partitions"}),"\n",(0,n.jsxs)(s.p,{children:["If your system has other specific partitions, such as a separate ",(0,n.jsx)(s.code,{children:"/home"})," partition, they will also need to be mounted."]}),"\n",(0,n.jsx)(s.h3,{id:"chrooting-to-your-solus-system",children:"Chrooting to your Solus system"}),"\n",(0,n.jsx)(s.p,{children:"To access your system and perform boot rescue, you will need to mount specific directories from the host system (in this case, our Live ISO), to our Solus system, and then chroot (change root) to the Solus system."}),"\n",(0,n.jsx)(s.p,{children:"First run the following commands:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"mount --types proc /proc /target/proc\nmount --rbind /dev /target/dev\nmount --rbind /sys /target/sys\nmount --make-rslave /target/dev\nmount --make-rslave /target/sys\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Assuming all goes well, you should now be able to chroot into your Solus system by doing ",(0,n.jsx)(s.code,{children:"chroot /target"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"networking",children:"Networking"}),"\n",(0,n.jsxs)(s.p,{children:["To validate a working network connection (assuming a network connection is available in your live image), you can run ",(0,n.jsx)(s.code,{children:"ping google.com"})," in the chrooted environment. If you get responses from ",(0,n.jsx)(s.code,{children:"google.com"}),", you have a successful connection to the Internet. If you do not, try the following:"]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Exit the chroot by typing ",(0,n.jsx)(s.code,{children:"exit"})]}),"\n",(0,n.jsx)(s.li,{children:"Run:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cp /run/systemd/resolve/stub-resolv.conf /target/run/systemd/resolve/\ncd /target/etc\nln -s ../run/systemd/resolve/stub-resolv.conf /target/etc/resolv.conf\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"3",children:["\n",(0,n.jsxs)(s.li,{children:["Chroot back into ",(0,n.jsx)(s.code,{children:"/target"})," by running ",(0,n.jsx)(s.code,{children:"chroot /target"})," again."]}),"\n",(0,n.jsx)(s.li,{children:"Retry networking."}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"repairing-packages",children:"Repairing packages"}),"\n",(0,n.jsx)(s.p,{children:"In the event you had an incomplete upgrade, try the following commands:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.code,{children:"sudo eopkg rebuild-db"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.code,{children:"sudo eopkg up"})}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.code,{children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs sudo eopkg it --reinstall"}),'\nIf you see output that starts with "Usage", this means the system has no broken packages.']}),"\n",(0,n.jsxs)(s.li,{children:['Try reverting the latest package transaction (this should only be done if the first two steps, followed by the "Re-run System-Wide Configuration Triggers", failed to produce a successful bootup). See ',(0,n.jsx)(s.a,{href:"/docs/user/package-management/history-and-rollback",children:"our documentation on history and rollback"})," for more information, followed by re-applying your updates by running ",(0,n.jsx)(s.code,{children:"sudo eopkg up"}),"."]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"correcting-disks",children:"Correcting disks"}),"\n",(0,n.jsx)(s.p,{children:"In the event that disk changes had caused the system to fail to boot, try the following in the chroot environment:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Get the UUIDs of your partitions the system expects from ",(0,n.jsx)(s.code,{children:"/etc/fstab"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Compare this to the output of ",(0,n.jsx)(s.code,{children:"ls -lah /dev/disk/by-uuid"})]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"re-run-system-wide-configuration-triggers",children:"Re-run system-wide configuration triggers"}),"\n",(0,n.jsx)(s.p,{children:"In the chroot environment, run the following command which will perform various configuration triggers to update your icon cache, update GRUB and EFI configuration, re-compile settings, and more:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,n.jsx)(s.h3,{id:"regenerate-uefi-boot-entries",children:"Regenerate UEFI boot entries"}),"\n",(0,n.jsx)(s.p,{children:"Run the following command, which will update the boot entries for your EFI menu:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo clr-boot-manager update\n"})}),"\n",(0,n.jsxs)(s.p,{children:["After this, you should exit your chroot with ",(0,n.jsx)(s.code,{children:"exit"})," then reboot your system. In the event you are still unable to access Solus, please ",(0,n.jsx)(s.a,{href:"/docs/user/contributing/getting-involved",children:"contact us"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"unmounting-your-system",children:"Unmounting your system"}),"\n",(0,n.jsx)(s.p,{children:"In case further partition modifications are required, there's a series of steps that must be followed."}),"\n",(0,n.jsxs)(s.p,{children:["If you are still chrooted you have to exit the chroot environment by pressing ",(0,n.jsx)(s.code,{children:"Ctrl"})," + ",(0,n.jsx)(s.code,{children:"D"}),"."]}),"\n",(0,n.jsx)(s.p,{children:"Then proceed with unmounting the filesystem."}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"umount -R /target\n"})}),"\n",(0,n.jsx)(s.p,{children:"In case of having a LUKS-based encryption you'll have to deactivate your logical volumes plus volume groups and then close your LUKS partition."}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"lvchange -a n /dev/SolusSystem/Swap # `-a n` means `active: no`\nlvchange -a n /dev/SolusSystem/Root\nvgchange -a n SolusSystem\ncryptsetup luksClose decrypted\n"})})]})}function h(e={}){let{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},50065:function(e,s,t){t.d(s,{Z:function(){return l},a:function(){return r}});var o=t(67294);let n={},i=o.createContext(n);function r(e){let s=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0b254e3a.1f9c4124.js b/assets/js/0b254e3a.1f9c4124.js
deleted file mode 100644
index 2fcc6f191..000000000
--- a/assets/js/0b254e3a.1f9c4124.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6726],{99528:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>l});var i=a(85893),s=a(11151);const t={title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},r="Updating an Existing Package",o={id:"packaging/updating-an-existing-package",title:"Updating an Existing Package",description:"This article will go over updating a package that is already in the Solus package repositories.",source:"@site/docs/packaging/updating-an-existing-package.md",sourceDirName:"packaging",slug:"/packaging/updating-an-existing-package",permalink:"/docs/packaging/updating-an-existing-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/updating-an-existing-package.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,sidebarPosition:4,frontMatter:{title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},sidebar:"packagingSidebar",previous:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"},next:{title:"Testing a Package",permalink:"/docs/packaging/testing-a-package"}},c={},l=[{value:"Update your clone of the packages repository",id:"update-your-clone-of-the-packages-repository",level:3},{value:"Switch to a new git branch",id:"switch-to-a-new-git-branch",level:2},{value:"Updating a package",id:"updating-a-package",level:2},{value:"Bumping a package",id:"bumping-a-package",level:3},{value:"Using a different version",id:"using-a-different-version",level:3},{value:"The MAINTAINERS.md
file",id:"the-maintainersmd-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format",id:"commit-message-format",level:2},{value:"Package update",id:"package-update",level:3},{value:"Other commit message format examples",id:"other-commit-message-format-examples",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"updating-an-existing-package",children:"Updating an Existing Package"})}),"\n",(0,i.jsx)(n.p,{children:"This article will go over updating a package that is already in the Solus package repositories."}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," for the software update"]}),".\nIf there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software update request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-your-clone-of-the-packages-repository",children:"Update your clone of the packages repository"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages/packages/n/nano\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"switch-to-a-new-git-branch",children:"Switch to a new git branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c update_nano\n"})}),"\n",(0,i.jsx)(n.h2,{id:"updating-a-package",children:"Updating a package"}),"\n",(0,i.jsx)(n.p,{children:"There are two types of package updates: a package bump, and moving a package to a different version."}),"\n",(0,i.jsxs)(n.p,{children:["Bumping a package is typically done when rebuilding against a changed dependency, such as ",(0,i.jsx)(n.code,{children:"imagemagick"})," needing to be rebuilt if ",(0,i.jsx)(n.code,{children:"libwebp"})," changes. It is also done if changes are being made to the package, such as adding new dependencies or other modifications which aren't a version update."]}),"\n",(0,i.jsx)(n.h3,{id:"bumping-a-package",children:"Bumping a package"}),"\n",(0,i.jsxs)(n.p,{children:["Bumping can be achieved by running the ",(0,i.jsx)(n.code,{children:"bump"})," task, which increments the release number by 1."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task bump\n"})}),"\n",(0,i.jsx)(n.p,{children:"Check to make sure that the result is as expected."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git diff package.yml\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Certain packages with long descriptions might have their description messed up when this is run. Check if this happened, and fix it if necessary."})}),"\n",(0,i.jsx)(n.h3,{id:"using-a-different-version",children:"Using a different version"}),"\n",(0,i.jsxs)(n.p,{children:["To update the package to a newer version, use the ",(0,i.jsx)(n.code,{children:"update"})," task."]}),"\n",(0,i.jsx)(n.p,{children:"This task takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Version"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you're updating the package to a newer version, naturally you would change both the version and source. If you're merely changing the source URL for the existing version, just pass the same version number and the new source URL."}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task update -- 1.0 https://example.com/example-1.0.tar.xz\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"the-maintainersmd-file",children:["The ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["There must be a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Add it if it does not already exist. It should name the current maintainer(s) of the package."]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h2,{id:"commit-message-format",children:"Commit message format"}),"\n",(0,i.jsx)(n.p,{children:'With the switch to a single large package git repository, having a regular, easy-to-read, and standardized commit message format helps enable quick and efficient "at-a-glance" reading of git commit messages for packagers and Staff alike.'}),"\n",(0,i.jsx)(n.p,{children:"Each commit message should consist of a meaningful summary line (which starts with the package name), a blank line, and then the rest of the commit message body."}),"\n",(0,i.jsxs)(n.p,{children:["Note that ",(0,i.jsx)(n.code,{children:"[NFC]"}),' (listed in an example below) is an abbreviation for "No Functional Change".']}),"\n",(0,i.jsx)(n.h3,{id:"package-update",children:"Package update"}),"\n",(0,i.jsx)(n.p,{children:"The following guidelines apply to the commit message body:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsx)(n.li,{children:"Include a changelog with a brief list of updates from the upstream release notes, with no links or issue numbers."}),"\n",(0,i.jsx)(n.li,{children:"There may also be a section for Solus specific work (e.g. rebuild against x / rework to remove dependency)."}),"\n",(0,i.jsx)(n.li,{children:"Optional: A link to the upstream release notes page."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"Important"}),": Do not include issue numbers in changelogs. This will incorrectly link your issue to another one in our repository."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"- #123 fixed a thing\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you want to intentionally link to another issue in this repository, the right way is to use our repository name:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Fixes getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"foo: Update to 1.2.3\n\n**Summary**\n\nBugfixes:\n\n- Fixed a crash\n- Something else\n\nEnhancements:\n\n- Implemented a feature\n- Error when encountering a thing\n\nFull release notes:\n\n- [1.2.3](https://github.com/foo/foo/releases/tag/v1.2.3)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"other-commit-message-format-examples",children:"Other commit message format examples"}),"\n",(0,i.jsx)(n.p,{children:"In the cases where you are not updating a package to a new version, but simply applying a patch or fixing an existing version, the following commit messages are considered suitable:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Add the ",(0,i.jsx)(n.code,{children:"homepage"})," metadata key:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Add homepage"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Fix a packaging issue (including adding a patch to fix the package)","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Fix (...)"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Updating a README, ",(0,i.jsx)(n.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml file"})," or other stuff that does not directly ",(0,i.jsx)(n.em,{children:"change"})," the package, meaning the package release number didn't need a bump:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: [NFC] Add README.md and monitoring.yml"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["As stated previously, ",(0,i.jsx)(n.code,{children:"[NFC]"}),' is an abbreviation of "No Functional Change".']}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>o,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0b254e3a.5f373001.js b/assets/js/0b254e3a.5f373001.js
new file mode 100644
index 000000000..9962b7dea
--- /dev/null
+++ b/assets/js/0b254e3a.5f373001.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1751"],{30607:function(e,n,a){a.r(n),a.d(n,{metadata:()=>i,contentTitle:()=>o,default:()=>h,assets:()=>c,toc:()=>l,frontMatter:()=>r});var i=JSON.parse('{"id":"packaging/updating-an-existing-package","title":"Updating an Existing Package","description":"This article will go over updating a package that is already in the Solus package repositories.","source":"@site/docs/packaging/updating-an-existing-package.md","sourceDirName":"packaging","slug":"/packaging/updating-an-existing-package","permalink":"/docs/packaging/updating-an-existing-package","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/updating-an-existing-package.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"sidebarPosition":4,"frontMatter":{"title":"Updating an Existing Package","summary":"Updating an Existing Package","sidebar_position":4},"sidebar":"packagingSidebar","previous":{"title":"Creating a New Package","permalink":"/docs/packaging/creating-a-new-package"},"next":{"title":"Testing a Package","permalink":"/docs/packaging/testing-a-package"}}'),s=a("85893"),t=a("50065");let r={title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},o="Updating an Existing Package",c={},l=[{value:"Update your clone of the packages repository",id:"update-your-clone-of-the-packages-repository",level:3},{value:"Switch to a new git branch",id:"switch-to-a-new-git-branch",level:2},{value:"Updating a package",id:"updating-a-package",level:2},{value:"Bumping a package",id:"bumping-a-package",level:3},{value:"Using a different version",id:"using-a-different-version",level:3},{value:"The MAINTAINERS.md
file",id:"the-maintainersmd-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format",id:"commit-message-format",level:2},{value:"Package update",id:"package-update",level:3},{value:"Other commit message format examples",id:"other-commit-message-format-examples",level:3}];function d(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"updating-an-existing-package",children:"Updating an Existing Package"})}),"\n",(0,s.jsx)(n.p,{children:"This article will go over updating a package that is already in the Solus package repositories."}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsxs)(n.strong,{children:["Please ",(0,s.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," for the software update"]}),".\nIf there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"This PR resolves software update request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,s.jsx)(n.h3,{id:"update-your-clone-of-the-packages-repository",children:"Update your clone of the packages repository"}),"\n",(0,s.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,s.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,s.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages/packages/n/nano\ngit switch main\ngit pull\n"})}),"\n",(0,s.jsx)(n.h2,{id:"switch-to-a-new-git-branch",children:"Switch to a new git branch"}),"\n",(0,s.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git switch -c update_nano\n"})}),"\n",(0,s.jsx)(n.h2,{id:"updating-a-package",children:"Updating a package"}),"\n",(0,s.jsx)(n.p,{children:"There are two types of package updates: a package bump, and moving a package to a different version."}),"\n",(0,s.jsxs)(n.p,{children:["Bumping a package is typically done when rebuilding against a changed dependency, such as ",(0,s.jsx)(n.code,{children:"imagemagick"})," needing to be rebuilt if ",(0,s.jsx)(n.code,{children:"libwebp"})," changes. It is also done if changes are being made to the package, such as adding new dependencies or other modifications which aren't a version update."]}),"\n",(0,s.jsx)(n.h3,{id:"bumping-a-package",children:"Bumping a package"}),"\n",(0,s.jsxs)(n.p,{children:["Bumping can be achieved by running the ",(0,s.jsx)(n.code,{children:"bump"})," task, which increments the release number by 1."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task bump\n"})}),"\n",(0,s.jsx)(n.p,{children:"Check to make sure that the result is as expected."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git diff package.yml\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Certain packages with long descriptions might have their description messed up when this is run. Check if this happened, and fix it if necessary."})}),"\n",(0,s.jsx)(n.h3,{id:"using-a-different-version",children:"Using a different version"}),"\n",(0,s.jsxs)(n.p,{children:["To update the package to a newer version, use the ",(0,s.jsx)(n.code,{children:"update"})," task."]}),"\n",(0,s.jsx)(n.p,{children:"This task takes two arguments, in the following order:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Version"}),"\n",(0,s.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If you're updating the package to a newer version, naturally you would change both the version and source. If you're merely changing the source URL for the existing version, just pass the same version number and the new source URL."}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task update -- 1.0 https://example.com/example-1.0.tar.xz\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"the-maintainersmd-file",children:["The ",(0,s.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,s.jsxs)(n.p,{children:["There must be a file called ",(0,s.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,s.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Add it if it does not already exist. It should name the current maintainer(s) of the package."]}),"\n",(0,s.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,s.jsxs)(n.p,{children:["Build the package using ",(0,s.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,s.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,s.jsxs)(n.p,{children:["Check the ",(0,s.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,s.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,s.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,s.jsx)(n.h2,{id:"commit-message-format",children:"Commit message format"}),"\n",(0,s.jsx)(n.p,{children:'With the switch to a single large package git repository, having a regular, easy-to-read, and standardized commit message format helps enable quick and efficient "at-a-glance" reading of git commit messages for packagers and Staff alike.'}),"\n",(0,s.jsx)(n.p,{children:"Each commit message should consist of a meaningful summary line (which starts with the package name), a blank line, and then the rest of the commit message body."}),"\n",(0,s.jsxs)(n.p,{children:["Note that ",(0,s.jsx)(n.code,{children:"[NFC]"}),' (listed in an example below) is an abbreviation for "No Functional Change".']}),"\n",(0,s.jsx)(n.h3,{id:"package-update",children:"Package update"}),"\n",(0,s.jsx)(n.p,{children:"The following guidelines apply to the commit message body:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,s.jsx)(n.li,{children:"Include a changelog with a brief list of updates from the upstream release notes, with no links or issue numbers."}),"\n",(0,s.jsx)(n.li,{children:"There may also be a section for Solus specific work (e.g. rebuild against x / rework to remove dependency)."}),"\n",(0,s.jsx)(n.li,{children:"Optional: A link to the upstream release notes page."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"git commit"})," on ",(0,s.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,s.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Important"}),": Do not include issue numbers in changelogs. This will incorrectly link your issue to another one in our repository."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"- #123 fixed a thing\n"})}),"\n",(0,s.jsx)(n.p,{children:"If you want to intentionally link to another issue in this repository, the right way is to use our repository name:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Fixes getsolus/packages#issuenumber\n"})}),"\n",(0,s.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"foo: Update to 1.2.3\n\n**Summary**\n\nBugfixes:\n\n- Fixed a crash\n- Something else\n\nEnhancements:\n\n- Implemented a feature\n- Error when encountering a thing\n\nFull release notes:\n\n- [1.2.3](https://github.com/foo/foo/releases/tag/v1.2.3)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"other-commit-message-format-examples",children:"Other commit message format examples"}),"\n",(0,s.jsx)(n.p,{children:"In the cases where you are not updating a package to a new version, but simply applying a patch or fixing an existing version, the following commit messages are considered suitable:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the ",(0,s.jsx)(n.code,{children:"homepage"})," metadata key:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"package: Add homepage"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Fix a packaging issue (including adding a patch to fix the package)","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"package: Fix (...)"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Updating a README, ",(0,s.jsx)(n.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml file"})," or other stuff that does not directly ",(0,s.jsx)(n.em,{children:"change"})," the package, meaning the package release number didn't need a bump:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"package: [NFC] Add README.md and monitoring.yml"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["As stated previously, ",(0,s.jsx)(n.code,{children:"[NFC]"}),' is an abbreviation of "No Functional Change".']}),"\n",(0,s.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,s.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Next, you'll ",(0,s.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){let{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},50065:function(e,n,a){a.d(n,{Z:function(){return o},a:function(){return r}});var i=a(67294);let s={},t=i.createContext(s);function r(e){let n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0b85ec06.4722941f.js b/assets/js/0b85ec06.4722941f.js
deleted file mode 100644
index 6cd9980d7..000000000
--- a/assets/js/0b85ec06.4722941f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3398],{22844:e=>{e.exports=JSON.parse('{"tag":{"label":"pgo","permalink":"/blog/tags/pgo","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/pgo","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0b85ec06.f6b30f07.js b/assets/js/0b85ec06.f6b30f07.js
new file mode 100644
index 000000000..c43b384b1
--- /dev/null
+++ b/assets/js/0b85ec06.f6b30f07.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3161"],{93120:function(e){e.exports=JSON.parse('{"tag":{"label":"pgo","permalink":"/blog/tags/pgo","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/pgo","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0cfc9369.b63787ba.js b/assets/js/0cfc9369.b63787ba.js
deleted file mode 100644
index fa2090a8e..000000000
--- a/assets/js/0cfc9369.b63787ba.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6025],{82504:e=>{e.exports=JSON.parse('{"tag":{"label":"lto","permalink":"/blog/tags/lto","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/lto","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0cfc9369.d0ec6f81.js b/assets/js/0cfc9369.d0ec6f81.js
new file mode 100644
index 000000000..2e3c5fc25
--- /dev/null
+++ b/assets/js/0cfc9369.d0ec6f81.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8955"],{9093:function(e){e.exports=JSON.parse('{"tag":{"label":"lto","permalink":"/blog/tags/lto","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/lto","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0e3c5e6b.6768dae5.js b/assets/js/0e3c5e6b.6768dae5.js
new file mode 100644
index 000000000..4fa0afdca
--- /dev/null
+++ b/assets/js/0e3c5e6b.6768dae5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5157"],{67391:function(e,t,s){s.r(t),s.d(t,{metadata:()=>n,contentTitle:()=>o,default:()=>u,assets:()=>l,toc:()=>d,frontMatter:()=>a});var n=JSON.parse('{"id":"user/editions/plasma/index","title":"Plasma","description":"Solus Plasma","source":"@site/docs/user/editions/plasma/index.md","sourceDirName":"user/editions/plasma","slug":"/user/editions/plasma/","permalink":"/docs/user/editions/plasma/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Plasma","summary":"A quick introduction to the Plasma edition of Solus"},"sidebar":"userSidebar","previous":{"title":"Tips and Tricks","permalink":"/docs/user/editions/mate/tips-and-tricks"},"next":{"title":"Configuration","permalink":"/docs/user/editions/plasma/configuration"}}'),i=s("85893"),r=s("50065");let a={title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},o="Plasma",l={},d=[];function c(e){let t={a:"a",em:"em",h1:"h1",header:"header",hr:"hr",img:"img",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"plasma",children:"Plasma"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Solus Plasma",src:s(59640).Z+"",width:"1920",height:"1080"})}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.em,{children:"Plasma"})," desktop is a graphical user interface for Linux distributions that aims to offer users an intuitive and customizable user interface to interact with their devices. The Plasma desktop is developed by KDE."]}),"\n",(0,i.jsx)(t.p,{children:"To learn more about the Plasma desktop and KDE, refer to the following pages:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://kde.org/plasma-desktop/",children:"https://kde.org/plasma-desktop/"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://kde.org/announcements/",children:"https://kde.org/announcements/"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://kde.org/support/",children:"https://kde.org/support/"})}),"\n"]}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(t.p,{children:"Learn how to customize and configure the Plasma Desktop on Solus."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,i.jsx)(t.p,{children:"Helpful tips and tricks for using Plasma on Solus."})]})}function u(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},59640:function(e,t,s){s.d(t,{Z:function(){return n}});let n=s.p+"assets/images/plasma-32bee314c05b57e65e0b26b6bf23f14f.jpg"},50065:function(e,t,s){s.d(t,{Z:function(){return o},a:function(){return a}});var n=s(67294);let i={},r=n.createContext(i);function a(e){let t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0e3c5e6b.6d3db483.js b/assets/js/0e3c5e6b.6d3db483.js
deleted file mode 100644
index 99e3fba44..000000000
--- a/assets/js/0e3c5e6b.6d3db483.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4859],{5166:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=t(85893),i=t(11151);const r={title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},a="Plasma",o={id:"user/editions/plasma/index",title:"Plasma",description:"Solus Plasma",source:"@site/docs/user/editions/plasma/index.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/",permalink:"/docs/user/editions/plasma/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/plasma/configuration"}},l={},d=[];function c(e){const s={a:"a",em:"em",h1:"h1",header:"header",hr:"hr",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma",children:"Plasma"})}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Solus Plasma",src:t(52603).Z+"",width:"1920",height:"1080"})}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.em,{children:"Plasma"})," desktop is a graphical user interface for Linux distributions that aims to offer users an intuitive and customizable user interface to interact with their devices. The Plasma desktop is developed by KDE."]}),"\n",(0,n.jsx)(s.p,{children:"To learn more about the Plasma desktop and KDE, refer to the following pages:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/plasma-desktop/",children:"https://kde.org/plasma-desktop/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/announcements/",children:"https://kde.org/announcements/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/support/",children:"https://kde.org/support/"})}),"\n"]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(s.p,{children:"Learn how to customize and configure the Plasma Desktop on Solus."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(s.p,{children:"Helpful tips and tricks for using Plasma on Solus."})]})}function u(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},52603:(e,s,t)=>{t.d(s,{Z:()=>n});const n=t.p+"assets/images/plasma-32bee314c05b57e65e0b26b6bf23f14f.jpg"},11151:(e,s,t)=>{t.d(s,{Z:()=>o,a:()=>a});var n=t(67294);const i={},r=n.createContext(i);function a(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0e862883.abf6c904.js b/assets/js/0e862883.abf6c904.js
new file mode 100644
index 000000000..9f6fe1cab
--- /dev/null
+++ b/assets/js/0e862883.abf6c904.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1125"],{52954:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,contentTitle:()=>l,default:()=>h,assets:()=>a,toc:()=>c,frontMatter:()=>o});var s=JSON.parse('{"id":"user/contributing/testing-an-iso","title":"Testing an ISO","description":"A handy checklist anyone can use for testing an ISO.","source":"@site/docs/user/contributing/testing-an-iso.md","sourceDirName":"user/contributing","slug":"/user/contributing/testing-an-iso","permalink":"/docs/user/contributing/testing-an-iso","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/testing-an-iso.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{},"sidebar":"userSidebar","previous":{"title":"Solus Style Guide","permalink":"/docs/user/contributing/style"},"next":{"title":"Editions","permalink":"/docs/user/editions/"}}'),i=t("85893"),r=t("50065");let o={},l="Testing an ISO",a={},c=[{value:"For any release",id:"for-any-release",level:2},{value:"Laptops",id:"laptops",level:3},{value:"VMs",id:"vms",level:3},{value:"For the specific release",id:"for-the-specific-release",level:2}];function d(e){let n={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"testing-an-iso",children:"Testing an ISO"})}),"\n",(0,i.jsx)(n.p,{children:"A handy checklist anyone can use for testing an ISO."}),"\n",(0,i.jsx)(n.p,{children:"This is a list of some general things to check. It is not meant to be exhaustive, just enough to hit major points and hopefully uncover obvious problems. Testers are certainly not prohibited from doing more, at their discretion. Not all points will be testable by everyone (ex: docking / undocking). That is fine; this is just a reference."}),"\n",(0,i.jsx)(n.p,{children:"When testing, try to keep different types of users in mind. For instance, would a general / new user be comfortable with the experience? Would a technical user be put off by a limitation?"}),"\n",(0,i.jsx)(n.h2,{id:"for-any-release",children:"For any release"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"ISO can be written to a USB, used to boot a system and install"}),"\n",(0,i.jsx)(n.li,{children:"Can unlock the device if the live ISO lock screen engages"}),"\n",(0,i.jsx)(n.li,{children:"Installer is easy to follow"}),"\n",(0,i.jsx)(n.li,{children:"Installer detects location, time and time zone properly. Bonus points if the correct timezone is shown in the picker and you don't have to manually select one."}),"\n",(0,i.jsx)(n.li,{children:"Start menu works, has search"}),"\n",(0,i.jsx)(n.li,{children:"Can scan / print / use your peripherals"}),"\n",(0,i.jsx)(n.li,{children:"Sound over speakers"}),"\n",(0,i.jsx)(n.li,{children:"Bluetooth device connects, has high fidelity and headphone modes, you can hear sound"}),"\n",(0,i.jsx)(n.li,{children:"Install your usual software and just make sure basic functionality works"}),"\n",(0,i.jsx)(n.li,{children:"Plugging in a USB drive allows user to mount the drive and access files"}),"\n",(0,i.jsx)(n.li,{children:"System can be put to sleep and woken, things still work after waking (display, keyboard, mouse, sound, network)"}),"\n",(0,i.jsxs)(n.li,{children:["Able to create and use samba shares via file manager (you must ",(0,i.jsx)(n.a,{href:"/docs/user/software/networking/samba#samba-on-solus",children:"enable smb after installation"}),")"]}),"\n",(0,i.jsx)(n.li,{children:"Anything that's been flaky in your experience (LVM, for instance)"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"laptops",children:"Laptops"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Multi-monitor display behaves properly with docking and undocking."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"vms",children:"VMs"}),"\n",(0,i.jsx)(n.p,{children:"This functionality might be affected by the settings of the VM."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Copy and paste works from host to guest ",(0,i.jsx)(n.em,{children:"before"})," install, while booted into the live ISO"]}),"\n",(0,i.jsxs)(n.li,{children:["Copy and paste works ",(0,i.jsx)(n.em,{children:"after"})," installation and rebooting the VM"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"for-the-specific-release",children:"For the specific release"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Any issues that have been recently fixed, or are known to be recently flaky."}),"\n",(0,i.jsx)(n.li,{children:"Check the ISO task in the tracker for other potential areas of interest."}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return l},a:function(){return o}});var s=t(67294);let i={},r=s.createContext(i);function o(e){let n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0e862883.f9142d94.js b/assets/js/0e862883.f9142d94.js
deleted file mode 100644
index bd8ff9468..000000000
--- a/assets/js/0e862883.f9142d94.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[172],{24673:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(85893),i=t(11151);const r={},o="Testing an ISO",a={id:"user/contributing/testing-an-iso",title:"Testing an ISO",description:"A handy checklist anyone can use for testing an ISO.",source:"@site/docs/user/contributing/testing-an-iso.md",sourceDirName:"user/contributing",slug:"/user/contributing/testing-an-iso",permalink:"/docs/user/contributing/testing-an-iso",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/testing-an-iso.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"},next:{title:"Editions",permalink:"/docs/user/editions/"}},l={},c=[{value:"For any release",id:"for-any-release",level:2},{value:"Laptops",id:"laptops",level:3},{value:"VMs",id:"vms",level:3},{value:"For the specific release",id:"for-the-specific-release",level:2}];function d(e){const n={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"testing-an-iso",children:"Testing an ISO"})}),"\n",(0,s.jsx)(n.p,{children:"A handy checklist anyone can use for testing an ISO."}),"\n",(0,s.jsx)(n.p,{children:"This is a list of some general things to check. It is not meant to be exhaustive, just enough to hit major points and hopefully uncover obvious problems. Testers are certainly not prohibited from doing more, at their discretion. Not all points will be testable by everyone (ex: docking / undocking). That is fine; this is just a reference."}),"\n",(0,s.jsx)(n.p,{children:"When testing, try to keep different types of users in mind. For instance, would a general / new user be comfortable with the experience? Would a technical user be put off by a limitation?"}),"\n",(0,s.jsx)(n.h2,{id:"for-any-release",children:"For any release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"ISO can be written to a USB, used to boot a system and install"}),"\n",(0,s.jsx)(n.li,{children:"Can unlock the device if the live ISO lock screen engages"}),"\n",(0,s.jsx)(n.li,{children:"Installer is easy to follow"}),"\n",(0,s.jsx)(n.li,{children:"Installer detects location, time and time zone properly. Bonus points if the correct timezone is shown in the picker and you don't have to manually select one."}),"\n",(0,s.jsx)(n.li,{children:"Start menu works, has search"}),"\n",(0,s.jsx)(n.li,{children:"Can scan / print / use your peripherals"}),"\n",(0,s.jsx)(n.li,{children:"Sound over speakers"}),"\n",(0,s.jsx)(n.li,{children:"Bluetooth device connects, has high fidelity and headphone modes, you can hear sound"}),"\n",(0,s.jsx)(n.li,{children:"Install your usual software and just make sure basic functionality works"}),"\n",(0,s.jsx)(n.li,{children:"Plugging in a USB drive allows user to mount the drive and access files"}),"\n",(0,s.jsx)(n.li,{children:"System can be put to sleep and woken, things still work after waking (display, keyboard, mouse, sound, network)"}),"\n",(0,s.jsxs)(n.li,{children:["Able to create and use samba shares via file manager (you must ",(0,s.jsx)(n.a,{href:"/docs/user/software/networking/samba#samba-on-solus",children:"enable smb after installation"}),")"]}),"\n",(0,s.jsx)(n.li,{children:"Anything that's been flaky in your experience (LVM, for instance)"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"laptops",children:"Laptops"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Multi-monitor display behaves properly with docking and undocking."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"vms",children:"VMs"}),"\n",(0,s.jsx)(n.p,{children:"This functionality might be affected by the settings of the VM."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Copy and paste works from host to guest ",(0,s.jsx)(n.em,{children:"before"})," install, while booted into the live ISO"]}),"\n",(0,s.jsxs)(n.li,{children:["Copy and paste works ",(0,s.jsx)(n.em,{children:"after"})," installation and rebooting the VM"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"for-the-specific-release",children:"For the specific release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Any issues that have been recently fixed, or are known to be recently flaky."}),"\n",(0,s.jsx)(n.li,{children:"Check the ISO task in the tracker for other potential areas of interest."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/14488e92.3f3176d3.js b/assets/js/14488e92.3f3176d3.js
deleted file mode 100644
index e75c57a9b..000000000
--- a/assets/js/14488e92.3f3176d3.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4815],{93980:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>A,default:()=>o,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var t=s(85893),c=s(11151);const n={title:"Default Applications",summary:"A guide to the default applications included with Solus."},A="Default applications",r={id:"user/quick-start/default-applications",title:"Default Applications",description:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks.",source:"@site/docs/user/quick-start/default-applications.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/default-applications",permalink:"/docs/user/quick-start/default-applications",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/default-applications.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Default Applications",summary:"A guide to the default applications included with Solus."},sidebar:"userSidebar",previous:{title:"Boot Management",permalink:"/docs/user/quick-start/boot-management"},next:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"}},l={},d=[{value:"Web browser",id:"web-browser",level:2},{value:"Email client",id:"email-client",level:2},{value:"Managing your files",id:"managing-your-files",level:2},{value:"Nemo",id:"nemo",level:3},{value:"GNOME Files",id:"gnome-files",level:3},{value:"Dolphin",id:"dolphin",level:3},{value:"Office suite",id:"office-suite",level:2},{value:"Calc",id:"calc",level:3},{value:"Draw",id:"draw",level:3},{value:"Impress",id:"impress",level:3},{value:"Math",id:"math",level:3},{value:"Writer",id:"writer",level:3},{value:"Spell-checking",id:"spell-checking",level:3},{value:"Finnish",id:"finnish",level:4},{value:"Music",id:"music",level:2},{value:"Rhythmbox",id:"rhythmbox",level:3},{value:"Elisa",id:"elisa",level:3},{value:"Video",id:"video",level:2},{value:"Celluloid",id:"celluloid",level:3},{value:"Haruna",id:"haruna",level:3},{value:"Parole",id:"parole",level:3}];function a(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"default-applications",children:"Default applications"})}),"\n",(0,t.jsx)(i.p,{children:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks."}),"\n",(0,t.jsx)(i.h2,{id:"web-browser",children:"Web browser"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with Firefox, a secure and trustworthy web browser provided by the non-profit organization ",(0,t.jsx)(i.a,{href:"https://www.mozilla.org/",children:"Mozilla"}),"."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Firefox Screenshot",src:s(34133).Z+"",width:"1920",height:"1046"})}),"\n",(0,t.jsx)(i.h2,{id:"email-client",children:"Email client"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with the powerful ",(0,t.jsx)(i.a,{href:"https://www.thunderbird.net/",children:"Thunderbird"})," email, newsgroup, and feeds client."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Thunderbird Screenshot",src:s(80649).Z+"",width:"982",height:"822"})}),"\n",(0,t.jsx)(i.h2,{id:"managing-your-files",children:"Managing your files"}),"\n",(0,t.jsx)(i.p,{children:"Each Linux desktop environment has its own graphical application for managing files:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Nemo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"GNOME Files (formerly Nautilus)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Dolphin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Nemo"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"nemo",children:"Nemo"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Nemo Screenshot",src:s(80274).Z+"",width:"800",height:"586"})}),"\n",(0,t.jsx)(i.h3,{id:"gnome-files",children:"GNOME Files"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"GNOME Files Screenshot",src:s(51055).Z+"",width:"886",height:"548"})}),"\n",(0,t.jsx)(i.h3,{id:"dolphin",children:"Dolphin"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dolphin Screenshot",src:s(3638).Z+"",width:"1022",height:"721"})}),"\n",(0,t.jsx)(i.h2,{id:"office-suite",children:"Office suite"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with ",(0,t.jsx)(i.a,{href:"https://www.libreoffice.org",children:"LibreOffice"}),", an office suite that is capable of replacing Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office for the most common tasks."]}),"\n",(0,t.jsx)(i.p,{children:"By default, Solus provides Writer (document editor), Calc (spreadsheet editor), and Impress (presentation editor). Other applications such as Math or Draw can be installed from the Software Center."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"LibreOffice"}),(0,t.jsx)(i.th,{children:"Microsoft Office Equivalent"}),(0,t.jsx)(i.th,{children:"Apple Equivalent"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Writer"}),(0,t.jsx)(i.td,{children:"Word"}),(0,t.jsx)(i.td,{children:"Pages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Calc"}),(0,t.jsx)(i.td,{children:"Excel"}),(0,t.jsx)(i.td,{children:"Numbers"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Impress"}),(0,t.jsx)(i.td,{children:"PowerPoint"}),(0,t.jsx)(i.td,{children:"Keynote"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Draw"}),(0,t.jsx)(i.td,{children:"Visio"}),(0,t.jsx)(i.td,{})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Math"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"calc",children:"Calc"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Calc Screenshot",src:s(85353).Z+"",width:"1068",height:"607"})}),"\n",(0,t.jsxs)(i.p,{children:["Calc is a spreadsheet editor. You can view, create, and edit spreadsheets as well as leverage a comprehensive range of advanced functions. Calc supports a variety of common open formats and Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"xls"}),", ",(0,t.jsx)(i.code,{children:"xlsx"}),", and ",(0,t.jsx)(i.code,{children:"ods"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"draw",children:"Draw"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Draw Screenshot",src:s(91955).Z+"",width:"1068",height:"637"})}),"\n",(0,t.jsxs)(i.p,{children:["Draw is a graphical editor that allows you to sketch diagrams, workflows and any kind of other simple to complex drawing you can imagine. You can install Draw from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-draw"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"impress",children:"Impress"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Impress Screenshot",src:s(8017).Z+"",width:"1068",height:"605"})}),"\n",(0,t.jsxs)(i.p,{children:["Impress is a presentation viewer and editor. You can view, create, edit, and export presentations in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"ppt"}),", ",(0,t.jsx)(i.code,{children:"pptx"}),", and ",(0,t.jsx)(i.code,{children:"odp"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"math",children:"Math"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Math Screenshot",src:s(56243).Z+"",width:"1068",height:"598"})}),"\n",(0,t.jsxs)(i.p,{children:["Math is a formula editor. Create your mathematical and scientific expressions and insert them with the correct formatting into your text documents, spreadsheets, presentations, or drawings. Math can be installed from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-math"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"writer",children:"Writer"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Writer Screenshot",src:s(51304).Z+"",width:"1068",height:"748"})}),"\n",(0,t.jsxs)(i.p,{children:["Writer is a document editor. You can view, create, edit, and export documents in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"doc"}),", ",(0,t.jsx)(i.code,{children:"docx"}),", and ",(0,t.jsx)(i.code,{children:"odt"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"spell-checking",children:"Spell-checking"}),"\n",(0,t.jsxs)(i.p,{children:["LibreOffice Writer users may want to install the package ",(0,t.jsx)(i.code,{children:"libreoffice-common-dictionaries"})," from Software Center to automatically enable spell-checking support."]}),"\n",(0,t.jsx)(i.h4,{id:"finnish",children:"Finnish"}),"\n",(0,t.jsxs)(i.p,{children:["Finnish language support is provided by installing ",(0,t.jsx)(i.code,{children:"libreoffice-voikko"}),". After installation of this package, there is further configuration required to properly leverage the Voikko spell-checking and Finnish dictionary support."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open up LibreOffice Writer"}),"\n",(0,t.jsxs)(i.li,{children:["In the menubar, go to ",(0,t.jsx)(i.code,{children:"Tools"})," then ",(0,t.jsx)(i.code,{children:"Options"}),". This will open up the Options dialog."]}),"\n",(0,t.jsx)(i.li,{children:"Go to the Language Settings, listed on the left of Options."}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Writing Aids and ensure the "Spellchecker (Voikko)", "Grammar checker (Voikko)", and "Hyphenator (Voikko)" are under the "Available language modules" section.'}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Voikko and ensure "standard: suomi (perussanasto)" is selected under the "Vocabulary" section.'}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"music",children:"Music"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Elisa"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"rhythmbox",children:"Rhythmbox"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Rhythmbox Screenshot",src:s(48392).Z+"",width:"789",height:"606"})}),"\n",(0,t.jsx)(i.h3,{id:"elisa",children:"Elisa"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Elisa Screenshot",src:s(92304).Z+"",width:"1020",height:"720"})}),"\n",(0,t.jsx)(i.h2,{id:"video",children:"Video"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Haruna"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Parole"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"celluloid",children:"Celluloid"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Celluloid Screenshot",src:s(18646).Z+"",width:"651",height:"491"})}),"\n",(0,t.jsx)(i.h3,{id:"haruna",children:"Haruna"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Haruna Screenshot",src:s(13289).Z+"",width:"1190",height:"749"})}),"\n",(0,t.jsx)(i.h3,{id:"parole",children:"Parole"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Parole Screenshot",src:s(22407).Z+"",width:"764",height:"450"})})]})}function o(e={}){const{wrapper:i}={...(0,c.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},18646:(e,i,s)=>{s.d(i,{Z:()=>t});const t="data:image/webp;base64,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"},3638:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/dolphin-06132e0261dad073f7f27bbee6bcbfba.jpg"},92304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/elisa-63e84725c74e3606d527b80a49234bdf.jpg"},34133:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/firefox-0510dce504768afbd216c0fd00abe580.jpg"},13289:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/haruna-aee9cd480cd936456de187af2cb0ecfb.jpg"},85353:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-calc-d000f05dad58cf8e0877111b52108ecb.jpg"},91955:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-draw-46b341512a31da6fdf6505368197b96e.jpg"},8017:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-impress-8851e5e8a47c676d011846d7a919f95d.jpg"},56243:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-math-0fb2b8bfd4c3f8736d107cb81b546a13.jpg"},51304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-writer-aeca166c3f0379a027c3d34f7d2c5d2c.jpg"},51055:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nautilus-33ea265420bee017f2cdad24b84e912d.jpg"},80274:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nemo-b369a1bfe8c00fd1e524e56bd0369e0c.jpg"},22407:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/parole-06df9f8c261a82dbfa968ee1482b4ec0.png"},48392:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/rhythmbox-eb6d0894497e065d9512c2c8454f25e6.jpg"},80649:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/thunderbird-95db449fb1a8d3241f691334bf0b2eb3.jpg"},11151:(e,i,s)=>{s.d(i,{Z:()=>r,a:()=>A});var t=s(67294);const c={},n=t.createContext(c);function A(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:A(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/14488e92.4a4843cc.js b/assets/js/14488e92.4a4843cc.js
new file mode 100644
index 000000000..d06d59b55
--- /dev/null
+++ b/assets/js/14488e92.4a4843cc.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8301"],{73504:function(e,i,t){t.r(i),t.d(i,{metadata:()=>n,contentTitle:()=>l,default:()=>o,assets:()=>A,toc:()=>d,frontMatter:()=>r});var n=JSON.parse('{"id":"user/quick-start/default-applications","title":"Default Applications","description":"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks.","source":"@site/docs/user/quick-start/default-applications.md","sourceDirName":"user/quick-start","slug":"/user/quick-start/default-applications","permalink":"/docs/user/quick-start/default-applications","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/default-applications.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Default Applications","summary":"A guide to the default applications included with Solus."},"sidebar":"userSidebar","previous":{"title":"Boot Management","permalink":"/docs/user/quick-start/boot-management"},"next":{"title":"Preparing to Install","permalink":"/docs/user/quick-start/installation/"}}'),s=t("85893"),c=t("50065");let r={title:"Default Applications",summary:"A guide to the default applications included with Solus."},l="Default applications",A={},d=[{value:"Web browser",id:"web-browser",level:2},{value:"Email client",id:"email-client",level:2},{value:"Managing your files",id:"managing-your-files",level:2},{value:"Nemo",id:"nemo",level:3},{value:"GNOME Files",id:"gnome-files",level:3},{value:"Dolphin",id:"dolphin",level:3},{value:"Office suite",id:"office-suite",level:2},{value:"Calc",id:"calc",level:3},{value:"Draw",id:"draw",level:3},{value:"Impress",id:"impress",level:3},{value:"Math",id:"math",level:3},{value:"Writer",id:"writer",level:3},{value:"Spell-checking",id:"spell-checking",level:3},{value:"Finnish",id:"finnish",level:4},{value:"Music",id:"music",level:2},{value:"Rhythmbox",id:"rhythmbox",level:3},{value:"Elisa",id:"elisa",level:3},{value:"Video",id:"video",level:2},{value:"Celluloid",id:"celluloid",level:3},{value:"Haruna",id:"haruna",level:3},{value:"Parole",id:"parole",level:3}];function a(e){let i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"default-applications",children:"Default applications"})}),"\n",(0,s.jsx)(i.p,{children:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks."}),"\n",(0,s.jsx)(i.h2,{id:"web-browser",children:"Web browser"}),"\n",(0,s.jsxs)(i.p,{children:["Solus comes pre-installed with Firefox, a secure and trustworthy web browser provided by the non-profit organization ",(0,s.jsx)(i.a,{href:"https://www.mozilla.org/",children:"Mozilla"}),"."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Firefox Screenshot",src:t(15972).Z+"",width:"1920",height:"1046"})}),"\n",(0,s.jsx)(i.h2,{id:"email-client",children:"Email client"}),"\n",(0,s.jsxs)(i.p,{children:["Solus comes pre-installed with the powerful ",(0,s.jsx)(i.a,{href:"https://www.thunderbird.net/",children:"Thunderbird"})," email, newsgroup, and feeds client."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Thunderbird Screenshot",src:t(2811).Z+"",width:"982",height:"822"})}),"\n",(0,s.jsx)(i.h2,{id:"managing-your-files",children:"Managing your files"}),"\n",(0,s.jsx)(i.p,{children:"Each Linux desktop environment has its own graphical application for managing files:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Desktop"}),(0,s.jsx)(i.th,{children:"Application"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Budgie"}),(0,s.jsx)(i.td,{children:"Nemo"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"GNOME"}),(0,s.jsx)(i.td,{children:"GNOME Files (formerly Nautilus)"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Plasma"}),(0,s.jsx)(i.td,{children:"Dolphin"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"XFCE"}),(0,s.jsx)(i.td,{children:"Nemo"})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"nemo",children:"Nemo"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Nemo Screenshot",src:t(78160).Z+"",width:"800",height:"586"})}),"\n",(0,s.jsx)(i.h3,{id:"gnome-files",children:"GNOME Files"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"GNOME Files Screenshot",src:t(4642).Z+"",width:"886",height:"548"})}),"\n",(0,s.jsx)(i.h3,{id:"dolphin",children:"Dolphin"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Dolphin Screenshot",src:t(98894).Z+"",width:"1022",height:"721"})}),"\n",(0,s.jsx)(i.h2,{id:"office-suite",children:"Office suite"}),"\n",(0,s.jsxs)(i.p,{children:["Solus comes pre-installed with ",(0,s.jsx)(i.a,{href:"https://www.libreoffice.org",children:"LibreOffice"}),", an office suite that is capable of replacing Microsoft",(0,s.jsx)("sup",{children:"TM"})," Office for the most common tasks."]}),"\n",(0,s.jsx)(i.p,{children:"By default, Solus provides Writer (document editor), Calc (spreadsheet editor), and Impress (presentation editor). Other applications such as Math or Draw can be installed from the Software Center."}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"LibreOffice"}),(0,s.jsx)(i.th,{children:"Microsoft Office Equivalent"}),(0,s.jsx)(i.th,{children:"Apple Equivalent"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Writer"}),(0,s.jsx)(i.td,{children:"Word"}),(0,s.jsx)(i.td,{children:"Pages"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Calc"}),(0,s.jsx)(i.td,{children:"Excel"}),(0,s.jsx)(i.td,{children:"Numbers"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Impress"}),(0,s.jsx)(i.td,{children:"PowerPoint"}),(0,s.jsx)(i.td,{children:"Keynote"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Draw"}),(0,s.jsx)(i.td,{children:"Visio"}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Math"}),(0,s.jsx)(i.td,{}),(0,s.jsx)(i.td,{})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"calc",children:"Calc"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"LibreOffice Calc Screenshot",src:t(78906).Z+"",width:"1068",height:"607"})}),"\n",(0,s.jsxs)(i.p,{children:["Calc is a spreadsheet editor. You can view, create, and edit spreadsheets as well as leverage a comprehensive range of advanced functions. Calc supports a variety of common open formats and Microsoft",(0,s.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,s.jsx)(i.code,{children:"xls"}),", ",(0,s.jsx)(i.code,{children:"xlsx"}),", and ",(0,s.jsx)(i.code,{children:"ods"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"draw",children:"Draw"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"LibreOffice Draw Screenshot",src:t(13131).Z+"",width:"1068",height:"637"})}),"\n",(0,s.jsxs)(i.p,{children:["Draw is a graphical editor that allows you to sketch diagrams, workflows and any kind of other simple to complex drawing you can imagine. You can install Draw from the Software Center by searching for the package ",(0,s.jsx)(i.code,{children:"libreoffice-draw"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"impress",children:"Impress"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"LibreOffice Impress Screenshot",src:t(3664).Z+"",width:"1068",height:"605"})}),"\n",(0,s.jsxs)(i.p,{children:["Impress is a presentation viewer and editor. You can view, create, edit, and export presentations in common open formats or Microsoft",(0,s.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,s.jsx)(i.code,{children:"ppt"}),", ",(0,s.jsx)(i.code,{children:"pptx"}),", and ",(0,s.jsx)(i.code,{children:"odp"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"math",children:"Math"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"LibreOffice Math Screenshot",src:t(50131).Z+"",width:"1068",height:"598"})}),"\n",(0,s.jsxs)(i.p,{children:["Math is a formula editor. Create your mathematical and scientific expressions and insert them with the correct formatting into your text documents, spreadsheets, presentations, or drawings. Math can be installed from the Software Center by searching for the package ",(0,s.jsx)(i.code,{children:"libreoffice-math"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"writer",children:"Writer"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"LibreOffice Writer Screenshot",src:t(96200).Z+"",width:"1068",height:"748"})}),"\n",(0,s.jsxs)(i.p,{children:["Writer is a document editor. You can view, create, edit, and export documents in common open formats or Microsoft",(0,s.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,s.jsx)(i.code,{children:"doc"}),", ",(0,s.jsx)(i.code,{children:"docx"}),", and ",(0,s.jsx)(i.code,{children:"odt"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"spell-checking",children:"Spell-checking"}),"\n",(0,s.jsxs)(i.p,{children:["LibreOffice Writer users may want to install the package ",(0,s.jsx)(i.code,{children:"libreoffice-common-dictionaries"})," from Software Center to automatically enable spell-checking support."]}),"\n",(0,s.jsx)(i.h4,{id:"finnish",children:"Finnish"}),"\n",(0,s.jsxs)(i.p,{children:["Finnish language support is provided by installing ",(0,s.jsx)(i.code,{children:"libreoffice-voikko"}),". After installation of this package, there is further configuration required to properly leverage the Voikko spell-checking and Finnish dictionary support."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open up LibreOffice Writer"}),"\n",(0,s.jsxs)(i.li,{children:["In the menubar, go to ",(0,s.jsx)(i.code,{children:"Tools"})," then ",(0,s.jsx)(i.code,{children:"Options"}),". This will open up the Options dialog."]}),"\n",(0,s.jsx)(i.li,{children:"Go to the Language Settings, listed on the left of Options."}),"\n",(0,s.jsx)(i.li,{children:'Under Language Settings, click Writing Aids and ensure the "Spellchecker (Voikko)", "Grammar checker (Voikko)", and "Hyphenator (Voikko)" are under the "Available language modules" section.'}),"\n",(0,s.jsx)(i.li,{children:'Under Language Settings, click Voikko and ensure "standard: suomi (perussanasto)" is selected under the "Vocabulary" section.'}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"music",children:"Music"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Desktop"}),(0,s.jsx)(i.th,{children:"Application"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Budgie"}),(0,s.jsx)(i.td,{children:"Rhythmbox"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"GNOME"}),(0,s.jsx)(i.td,{children:"Rhythmbox"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Plasma"}),(0,s.jsx)(i.td,{children:"Elisa"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"XFCE"}),(0,s.jsx)(i.td,{children:"Rhythmbox"})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"rhythmbox",children:"Rhythmbox"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Rhythmbox Screenshot",src:t(62318).Z+"",width:"789",height:"606"})}),"\n",(0,s.jsx)(i.h3,{id:"elisa",children:"Elisa"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Elisa Screenshot",src:t(34615).Z+"",width:"1020",height:"720"})}),"\n",(0,s.jsx)(i.h2,{id:"video",children:"Video"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Desktop"}),(0,s.jsx)(i.th,{children:"Application"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Budgie"}),(0,s.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"GNOME"}),(0,s.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Plasma"}),(0,s.jsx)(i.td,{children:"Haruna"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"XFCE"}),(0,s.jsx)(i.td,{children:"Parole"})]})]})]}),"\n",(0,s.jsx)(i.h3,{id:"celluloid",children:"Celluloid"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Celluloid Screenshot",src:t(82330).Z+"",width:"651",height:"491"})}),"\n",(0,s.jsx)(i.h3,{id:"haruna",children:"Haruna"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Haruna Screenshot",src:t(73201).Z+"",width:"1190",height:"749"})}),"\n",(0,s.jsx)(i.h3,{id:"parole",children:"Parole"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Parole Screenshot",src:t(49134).Z+"",width:"764",height:"450"})})]})}function o(e={}){let{wrapper:i}={...(0,c.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},82330:function(e,i,t){t.d(i,{Z:function(){return n}});let n="data:image/webp;base64,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"},98894:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/dolphin-06132e0261dad073f7f27bbee6bcbfba.jpg"},34615:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/elisa-63e84725c74e3606d527b80a49234bdf.jpg"},15972:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/firefox-0510dce504768afbd216c0fd00abe580.jpg"},73201:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/haruna-aee9cd480cd936456de187af2cb0ecfb.jpg"},78906:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/libreoffice-calc-d000f05dad58cf8e0877111b52108ecb.jpg"},13131:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/libreoffice-draw-46b341512a31da6fdf6505368197b96e.jpg"},3664:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/libreoffice-impress-8851e5e8a47c676d011846d7a919f95d.jpg"},50131:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/libreoffice-math-0fb2b8bfd4c3f8736d107cb81b546a13.jpg"},96200:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/libreoffice-writer-aeca166c3f0379a027c3d34f7d2c5d2c.jpg"},4642:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/nautilus-33ea265420bee017f2cdad24b84e912d.jpg"},78160:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/nemo-b369a1bfe8c00fd1e524e56bd0369e0c.jpg"},49134:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/parole-06df9f8c261a82dbfa968ee1482b4ec0.png"},62318:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/rhythmbox-eb6d0894497e065d9512c2c8454f25e6.jpg"},2811:function(e,i,t){t.d(i,{Z:function(){return n}});let n=t.p+"assets/images/thunderbird-95db449fb1a8d3241f691334bf0b2eb3.jpg"},50065:function(e,i,t){t.d(i,{Z:function(){return l},a:function(){return r}});var n=t(67294);let s={},c=n.createContext(s);function r(e){let i=n.useContext(c);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(c.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/14eb3368.14ad20f9.js b/assets/js/14eb3368.14ad20f9.js
new file mode 100644
index 000000000..2c60d85aa
--- /dev/null
+++ b/assets/js/14eb3368.14ad20f9.js
@@ -0,0 +1,4 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1983"],{19572:function(e,t,n){n.d(t,{Z:()=>f});var r=n("85893");n("67294");var s=n("74904"),i=n("50490"),a=n("71364"),l=n("16896"),o=n("27544"),c=n("1822"),d=n("7571");function u(e){return(0,r.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,r.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}let h="breadcrumbHomeIcon_YNFT";function m(){let e=(0,d.ZP)("/");return(0,r.jsx)("li",{className:"breadcrumbs__item",children:(0,r.jsx)(o.Z,{"aria-label":(0,c.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,r.jsx)(u,{className:h})})})}let p="breadcrumbsContainer_Z_bl";function b(e){let{children:t,href:n,isLast:s}=e,i="breadcrumbs__link";return s?(0,r.jsx)("span",{className:i,itemProp:"name",children:t}):n?(0,r.jsx)(o.Z,{className:i,href:n,itemProp:"item",children:(0,r.jsx)("span",{itemProp:"name",children:t})}):(0,r.jsx)("span",{className:i,children:t})}function x(e){let{children:t,active:n,index:i,addMicrodata:a}=e;return(0,r.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,r.jsx)("meta",{itemProp:"position",content:String(i+1)})]})}function f(){let e=(0,a.s1)(),t=(0,l.Ns)();return e?(0,r.jsx)("nav",{className:(0,s.Z)(i.k.docs.docBreadcrumbs,p),"aria-label":(0,c.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,r.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,r.jsx)(m,{}),e.map((t,n)=>{let s=n===e.length-1,i="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,r.jsx)(x,{active:s,index:n,addMicrodata:!!i,children:(0,r.jsx)(b,{href:i,isLast:s,children:t.label})},n)})]})}):null}},40855:function(e,t,n){n.r(t),n.d(t,{default:()=>C});var r=n("85893");n("67294");var s=n("81921"),i=n("71364"),a=n("7571"),l=n("74904"),o=n("27544"),c=n("67984"),d=n("76520"),u=n("1822"),h=n("52068");let m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function p(e){let{href:t,children:n}=e;return(0,r.jsx)(o.Z,{href:t,className:(0,l.Z)("card padding--lg",m.cardContainer),children:n})}function b(e){let{href:t,icon:n,title:s,description:i}=e;return(0,r.jsxs)(p,{href:t,children:[(0,r.jsxs)(h.Z,{as:"h2",className:(0,l.Z)("text--truncate",m.cardTitle),title:s,children:[n," ",s]}),i&&(0,r.jsx)("p",{className:(0,l.Z)("text--truncate",m.cardDescription),title:i,children:i})]})}function x(e){let{item:t}=e,n=(0,i.LM)(t),s=function(){let{selectMessage:e}=(0,c.c)();return t=>e(t,(0,u.I)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,r.jsx)(b,{href:n,icon:"\uD83D\uDDC3\uFE0F",title:t.label,description:t.description??s(t.items.length)}):null}function f(e){let{item:t}=e,n=(0,d.Z)(t.href)?"\uD83D\uDCC4\uFE0F":"\uD83D\uDD17",s=(0,i.xz)(t.docId??void 0);return(0,r.jsx)(b,{href:t.href,icon:n,title:t.label,description:t.description??s?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,r.jsx)(f,{item:t});case"category":return(0,r.jsx)(x,{item:t});default:throw Error(`unknown item type ${JSON.stringify(t)}`)}}function g(e){let{className:t}=e,n=(0,i.jA)();return(0,r.jsx)(j,{items:n.items,className:t})}function j(e){let{items:t,className:n}=e;if(!t)return(0,r.jsx)(g,{...e});let s=(0,i.MN)(t);return(0,r.jsx)("section",{className:(0,l.Z)("row",n),children:s.map((e,t)=>(0,r.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,r.jsx)(v,{item:e})},t))})}var Z=n("16583"),N=n("70271"),_=n("6682"),k=n("19572");let L="generatedIndexPage_vN6x",T="list_eTzJ",w="title_kItE";function y(e){let{categoryGeneratedIndex:t}=e;return(0,r.jsx)(s.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,a.ZP)(t.image)})}function I(e){let{categoryGeneratedIndex:t}=e,n=(0,i.jA)();return(0,r.jsxs)("div",{className:L,children:[(0,r.jsx)(N.Z,{}),(0,r.jsx)(k.Z,{}),(0,r.jsx)(_.Z,{}),(0,r.jsxs)("header",{children:[(0,r.jsx)(h.Z,{as:"h1",className:w,children:t.title}),t.description&&(0,r.jsx)("p",{children:t.description})]}),(0,r.jsx)("article",{className:"margin-top--lg",children:(0,r.jsx)(j,{items:n.items,className:T})}),(0,r.jsx)("footer",{className:"margin-top--lg",children:(0,r.jsx)(Z.Z,{previous:t.navigation.previous,next:t.navigation.next})})]})}function C(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(y,{...e}),(0,r.jsx)(I,{...e})]})}},16583:function(e,t,n){n.d(t,{Z:function(){return a}});var r=n(85893);n(67294);var s=n(1822),i=n(15779);function a(e){let{previous:t,next:n}=e;return(0,r.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,r.jsx)(i.Z,{...t,subLabel:(0,r.jsx)(s.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,r.jsx)(i.Z,{...n,subLabel:(0,r.jsx)(s.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},6682:function(e,t,n){n.d(t,{Z:function(){return o}});var r=n(85893);n(67294);var s=n(74904),i=n(1822),a=n(50490),l=n(85302);function o(e){let{className:t}=e,n=(0,l.E)();return n.badge?(0,r.jsx)("span",{className:(0,s.Z)(t,a.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,r.jsx)(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},70271:function(e,t,n){n.d(t,{Z:function(){return x}});var r=n(85893);n(67294);var s=n(74904),i=n(93934),a=n(27544),l=n(1822),o=n(1652),c=n(50490),d=n(13908),u=n(85302);let h={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,r.jsx)(l.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,r.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,r.jsx)(l.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,r.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function m(e){let t=h[e.versionMetadata.banner];return(0,r.jsx)(t,{...e})}function p(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,r.jsx)(l.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,r.jsx)("b",{children:(0,r.jsx)(a.Z,{to:n,onClick:s,children:(0,r.jsx)(l.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function b(e){let t,{className:n,versionMetadata:a}=e,{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:u}=(0,o.gA)({failfast:!0}),{savePreferredVersionName:h}=(0,d.J)(u),{latestDocSuggestion:b,latestVersionSuggestion:x}=(0,o.Jo)(u);let f=b??(t=x).docs.find(e=>e.id===t.mainDocId);return(0,r.jsxs)("div",{className:(0,s.Z)(n,c.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,r.jsx)("div",{children:(0,r.jsx)(m,{siteTitle:l,versionMetadata:a})}),(0,r.jsx)("div",{className:"margin-top--md",children:(0,r.jsx)(p,{versionLabel:x.label,to:f.path,onClick:()=>h(x.name)})})]})}function x(e){let{className:t}=e,n=(0,u.E)();return n.banner?(0,r.jsx)(b,{className:t,versionMetadata:n}):null}},15779:function(e,t,n){n.d(t,{Z:function(){return a}});var r=n(85893);n(67294);var s=n(74904),i=n(27544);function a(e){let{permalink:t,title:n,subLabel:a,isNext:l}=e;return(0,r.jsxs)(i.Z,{className:(0,s.Z)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[a&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,r.jsx)("div",{className:"pagination-nav__label",children:n})]})}},67984:function(e,t,n){n.d(t,{c:function(){return o}});var r=n(67294),s=n(93934);let i=["zero","one","two","few","many","other"];function a(e){return i.filter(t=>e.includes(t))}let l={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){let e=function(){let{i18n:{currentLocale:e}}=(0,s.Z)();return(0,r.useMemo)(()=>{try{return function(e){let t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".
+Docusaurus will fallback to the default (English) implementation.
+Error: ${t.message}
+`),l}},[e])}();return{selectMessage:(t,n)=>(function(e,t,n){let r=e.split("|");if(1===r.length)return r[0];r.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${r.length}: ${e}`);let s=n.select(t);return r[Math.min(n.pluralForms.indexOf(s),r.length-1)]})(n,t,e)}}}}]);
\ No newline at end of file
diff --git a/assets/js/14eb3368.e474746e.js b/assets/js/14eb3368.e474746e.js
deleted file mode 100644
index be7a860a7..000000000
--- a/assets/js/14eb3368.e474746e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9817],{36300:(e,t,n)=>{n.d(t,{Z:()=>g});n(67294);var s=n(36905),r=n(50563),i=n(68879),a=n(51997),l=n(38208),o=n(55361),c=n(23466),d=n(85893);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.ZP)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.Z,{"aria-label":(0,o.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const b={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function p(e){let{children:t,href:n,isLast:s}=e;const r="breadcrumbs__link";return s?(0,d.jsx)("span",{className:r,itemProp:"name",children:t}):n?(0,d.jsx)(l.Z,{className:r,href:n,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:t})}):(0,d.jsx)("span",{className:r,children:t})}function x(e){let{children:t,active:n,index:r,addMicrodata:i}=e;return(0,d.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,d.jsx)("meta",{itemProp:"position",content:String(r+1)})]})}function g(){const e=(0,i.s1)(),t=(0,a.Ns)();return e?(0,d.jsx)("nav",{className:(0,s.Z)(r.k.docs.docBreadcrumbs,b.breadcrumbsContainer),"aria-label":(0,o.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,d.jsx)(h,{}),e.map(((t,n)=>{const s=n===e.length-1,r="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(x,{active:s,index:n,addMicrodata:!!r,children:(0,d.jsx)(p,{href:r,isLast:s,children:t.label})},n)}))]})}):null}},31745:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});n(67294);var s=n(96984),r=n(68879),i=n(23466),a=n(36905),l=n(38208),o=n(59676),c=n(41117),d=n(55361),u=n(42704);const m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var h=n(85893);function b(e){let{href:t,children:n}=e;return(0,h.jsx)(l.Z,{href:t,className:(0,a.Z)("card padding--lg",m.cardContainer),children:n})}function p(e){let{href:t,icon:n,title:s,description:r}=e;return(0,h.jsxs)(b,{href:t,children:[(0,h.jsxs)(u.Z,{as:"h2",className:(0,a.Z)("text--truncate",m.cardTitle),title:s,children:[n," ",s]}),r&&(0,h.jsx)("p",{className:(0,a.Z)("text--truncate",m.cardDescription),title:r,children:r})]})}function x(e){let{item:t}=e;const n=(0,r.LM)(t),s=function(){const{selectMessage:e}=(0,o.c)();return t=>e(t,(0,d.I)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,h.jsx)(p,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??s(t.items.length)}):null}function g(e){let{item:t}=e;const n=(0,c.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",s=(0,r.xz)(t.docId??void 0);return(0,h.jsx)(p,{href:t.href,icon:n,title:t.label,description:t.description??s?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,h.jsx)(g,{item:t});case"category":return(0,h.jsx)(x,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function f(e){let{className:t}=e;const n=(0,r.jA)();return(0,h.jsx)(j,{items:n.items,className:t})}function j(e){const{items:t,className:n}=e;if(!t)return(0,h.jsx)(f,{...e});const s=(0,r.MN)(t);return(0,h.jsx)("section",{className:(0,a.Z)("row",n),children:s.map(((e,t)=>(0,h.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,h.jsx)(v,{item:e})},t)))})}var N=n(78695),Z=n(1188),_=n(60425),L=n(36300);const k={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return(0,h.jsx)(s.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,i.ZP)(t.image)})}function I(e){let{categoryGeneratedIndex:t}=e;const n=(0,r.jA)();return(0,h.jsxs)("div",{className:k.generatedIndexPage,children:[(0,h.jsx)(Z.Z,{}),(0,h.jsx)(L.Z,{}),(0,h.jsx)(_.Z,{}),(0,h.jsxs)("header",{children:[(0,h.jsx)(u.Z,{as:"h1",className:k.title,children:t.title}),t.description&&(0,h.jsx)("p",{children:t.description})]}),(0,h.jsx)("article",{className:"margin-top--lg",children:(0,h.jsx)(j,{items:n.items,className:k.list})}),(0,h.jsx)("footer",{className:"margin-top--lg",children:(0,h.jsx)(N.Z,{previous:t.navigation.previous,next:t.navigation.next})})]})}function y(e){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(T,{...e}),(0,h.jsx)(I,{...e})]})}},78695:(e,t,n)=>{n.d(t,{Z:()=>a});n(67294);var s=n(55361),r=n(60968),i=n(85893);function a(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(r.Z,{...t,subLabel:(0,i.jsx)(s.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(r.Z,{...n,subLabel:(0,i.jsx)(s.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},60425:(e,t,n)=>{n.d(t,{Z:()=>o});n(67294);var s=n(36905),r=n(55361),i=n(50563),a=n(72950),l=n(85893);function o(e){let{className:t}=e;const n=(0,a.E)();return n.badge?(0,l.jsx)("span",{className:(0,s.Z)(t,i.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(r.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},1188:(e,t,n)=>{n.d(t,{Z:()=>x});n(67294);var s=n(36905),r=n(75276),i=n(38208),a=n(55361),l=n(48878),o=n(50563),c=n(5055),d=n(72950),u=n(85893);const m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,u.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const t=m[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function b(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,u.jsx)(a.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.Z,{to:n,onClick:s,children:(0,u.jsx)(a.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function p(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:i}}=(0,r.Z)(),{pluginId:a}=(0,l.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,c.J)(a),{latestDocSuggestion:m,latestVersionSuggestion:p}=(0,l.Jo)(a),x=m??(g=p).docs.find((e=>e.id===g.mainDocId));var g;return(0,u.jsxs)("div",{className:(0,s.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:n})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(b,{versionLabel:p.label,to:x.path,onClick:()=>d(p.name)})})]})}function x(e){let{className:t}=e;const n=(0,d.E)();return n.banner?(0,u.jsx)(p,{className:t,versionMetadata:n}):null}},60968:(e,t,n)=>{n.d(t,{Z:()=>a});n(67294);var s=n(36905),r=n(38208),i=n(85893);function a(e){const{permalink:t,title:n,subLabel:a,isNext:l}=e;return(0,i.jsxs)(r.Z,{className:(0,s.Z)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[a&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},59676:(e,t,n)=>{n.d(t,{c:()=>c});var s=n(67294),r=n(75276);const i=["zero","one","two","few","many","other"];function a(e){return i.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,r.Z)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function c(){const e=o();return{selectMessage:(t,n)=>function(e,t,n){const s=e.split("|");if(1===s.length)return s[0];s.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const r=n.select(t),i=n.pluralForms.indexOf(r);return s[Math.min(i,s.length-1)]}(n,t,e)}}}}]);
\ No newline at end of file
diff --git a/assets/js/156eae2c.2c19d67a.js b/assets/js/156eae2c.2c19d67a.js
deleted file mode 100644
index 54f96b2a8..000000000
--- a/assets/js/156eae2c.2c19d67a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8692],{92354:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Networking","slug":"/category/networking","permalink":"/docs/category/networking","sidebar":"userSidebar","navigation":{"previous":{"title":"IBus","permalink":"/docs/user/software/localization/ibus"},"next":{"title":"Samba File Sharing","permalink":"/docs/user/software/networking/samba"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/156eae2c.cb0cfbcc.js b/assets/js/156eae2c.cb0cfbcc.js
new file mode 100644
index 000000000..90a914047
--- /dev/null
+++ b/assets/js/156eae2c.cb0cfbcc.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9223"],{88713:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Networking","slug":"/category/networking","permalink":"/docs/category/networking","sidebar":"userSidebar","navigation":{"previous":{"title":"IBus","permalink":"/docs/user/software/localization/ibus"},"next":{"title":"Samba File Sharing","permalink":"/docs/user/software/networking/samba"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/17896441.0ad84ab7.js b/assets/js/17896441.0ad84ab7.js
new file mode 100644
index 000000000..9154a2fb9
--- /dev/null
+++ b/assets/js/17896441.0ad84ab7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7048"],{43672:function(e,t,n){n.d(t,{Z:function(){return c}});var i=n(85893);n(67294);var s=n(74904),l=n(72372),r=n(50490),a=n(77793);function o(e){let{className:t}=e;return(0,i.jsx)(a.Z,{type:"caution",title:(0,i.jsx)(l.cI,{}),className:(0,s.Z)(t,r.k.common.unlistedBanner),children:(0,i.jsx)(l.eU,{})})}function c(e){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.T$,{}),(0,i.jsx)(o,{...e})]})}},38154:function(e,t,n){n.d(t,{Z:()=>d});var i=n("85893");n("67294");var s=n("74904"),l=n("72372"),r=n("50490"),a=n("77793");function o(e){let{className:t}=e;return(0,i.jsx)(a.Z,{type:"caution",title:(0,i.jsx)(l.ht,{}),className:(0,s.Z)(t,r.k.common.draftBanner),children:(0,i.jsx)(l.xo,{})})}var c=n("43672");function d(e){let{metadata:t}=e,{unlisted:n,frontMatter:s}=t;return(0,i.jsxs)(i.Fragment,{children:[(n||s.unlisted)&&(0,i.jsx)(c.Z,{}),s.draft&&(0,i.jsx)(o,{})]})}},19572:function(e,t,n){n.d(t,{Z:()=>f});var i=n("85893");n("67294");var s=n("74904"),l=n("50490"),r=n("71364"),a=n("16896"),o=n("27544"),c=n("1822"),d=n("7571");function u(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}let m="breadcrumbHomeIcon_YNFT";function h(){let e=(0,d.ZP)("/");return(0,i.jsx)("li",{className:"breadcrumbs__item",children:(0,i.jsx)(o.Z,{"aria-label":(0,c.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,i.jsx)(u,{className:m})})})}let b="breadcrumbsContainer_Z_bl";function v(e){let{children:t,href:n,isLast:s}=e,l="breadcrumbs__link";return s?(0,i.jsx)("span",{className:l,itemProp:"name",children:t}):n?(0,i.jsx)(o.Z,{className:l,href:n,itemProp:"item",children:(0,i.jsx)("span",{itemProp:"name",children:t})}):(0,i.jsx)("span",{className:l,children:t})}function x(e){let{children:t,active:n,index:l,addMicrodata:r}=e;return(0,i.jsxs)("li",{...r&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,i.jsx)("meta",{itemProp:"position",content:String(l+1)})]})}function f(){let e=(0,r.s1)(),t=(0,a.Ns)();return e?(0,i.jsx)("nav",{className:(0,s.Z)(l.k.docs.docBreadcrumbs,b),"aria-label":(0,c.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,i.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,i.jsx)(h,{}),e.map((t,n)=>{let s=n===e.length-1,l="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,i.jsx)(x,{active:s,index:n,addMicrodata:!!l,children:(0,i.jsx)(v,{href:l,isLast:s,children:t.label})},n)})]})}):null}},39436:function(e,t,n){n.r(t),n.d(t,{default:()=>R});var i=n("85893"),s=n("67294"),l=n("81921"),r=n("57100");let a=s.createContext(null);function o(e){var t;let{children:n,content:l}=e;let r=(t=l,(0,s.useMemo)(()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,contentTitle:t.contentTitle,toc:t.toc}),[t]));return(0,i.jsx)(a.Provider,{value:r,children:n})}function c(){let e=(0,s.useContext)(a);if(null===e)throw new r.i6("DocProvider");return e}function d(){let{metadata:e,frontMatter:t,assets:n}=c();return(0,i.jsx)(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n("74904"),m=n("72649"),h=n("16583");function b(){let{metadata:e}=c();return(0,i.jsx)(h.Z,{previous:e.previous,next:e.next})}var v=n("70271"),x=n("6682"),f=n("50490"),p=n("50905"),j=n("57216");function g(){let{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:l}=e,r=l.length>0,a=!!(t||n||s);return r||a?(0,i.jsxs)("footer",{className:(0,u.Z)(f.k.docs.docFooter,"docusaurus-mt-lg"),children:[r&&(0,i.jsx)("div",{className:(0,u.Z)("row margin-top--sm",f.k.docs.docFooterTagsRow),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(p.Z,{tags:l})})}),a&&(0,i.jsx)(j.Z,{className:(0,u.Z)("margin-top--sm",f.k.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var Z=n("6560"),_=n("51515"),C=n("1822");let N={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function L(e){let{collapsed:t,...n}=e;return(0,i.jsx)("button",{type:"button",...n,className:(0,u.Z)("clean-btn",N.tocCollapsibleButton,!t&&N.tocCollapsibleButtonExpanded,n.className),children:(0,i.jsx)(C.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}let k={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function T(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:l}=e,{collapsed:r,toggleCollapsed:a}=(0,Z.u)({initialState:!0});return(0,i.jsxs)("div",{className:(0,u.Z)(k.tocCollapsible,!r&&k.tocCollapsibleExpanded,n),children:[(0,i.jsx)(L,{collapsed:r,onClick:a}),(0,i.jsx)(Z.z,{lazy:!0,className:k.tocCollapsibleContent,collapsed:r,children:(0,i.jsx)(_.Z,{toc:t,minHeadingLevel:s,maxHeadingLevel:l})})]})}let y="tocMobile_ITEo";function w(){let{toc:e,frontMatter:t}=c();return(0,i.jsx)(T,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.Z)(f.k.docs.docTocMobile,y)})}var B=n("28669");function E(){let{toc:e,frontMatter:t}=c();return(0,i.jsx)(B.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:f.k.docs.docTocDesktop})}var I=n("52068"),M=n("27913");function A(e){let{children:t}=e,n=function(){let{metadata:e,frontMatter:t,contentTitle:n}=c();return!t.hide_title&&void 0===n?e.title:null}();return(0,i.jsxs)("div",{className:(0,u.Z)(f.k.docs.docMarkdown,"markdown"),children:[n&&(0,i.jsx)("header",{children:(0,i.jsx)(I.Z,{as:"h1",children:n})}),(0,i.jsx)(M.Z,{children:t})]})}var H=n("19572"),V=n("38154");let O={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function P(e){let{children:t}=e,n=function(){let{frontMatter:e,toc:t}=c(),n=(0,m.i)(),s=e.hide_table_of_contents,l=!s&&t.length>0,r=l?(0,i.jsx)(w,{}):void 0;return{hidden:s,mobile:r,desktop:l&&("desktop"===n||"ssr"===n)?(0,i.jsx)(E,{}):void 0}}(),{metadata:s}=c();return(0,i.jsxs)("div",{className:"row",children:[(0,i.jsxs)("div",{className:(0,u.Z)("col",!n.hidden&&O.docItemCol),children:[(0,i.jsx)(V.Z,{metadata:s}),(0,i.jsx)(v.Z,{}),(0,i.jsxs)("div",{className:O.docItemContainer,children:[(0,i.jsxs)("article",{children:[(0,i.jsx)(H.Z,{}),(0,i.jsx)(x.Z,{}),n.mobile,(0,i.jsx)(A,{children:t}),(0,i.jsx)(g,{})]}),(0,i.jsx)(b,{})]})]}),n.desktop&&(0,i.jsx)("div",{className:"col col--3",children:n.desktop})]})}function R(e){let t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,i.jsx)(o,{content:e.content,children:(0,i.jsxs)(l.FG,{className:t,children:[(0,i.jsx)(d,{}),(0,i.jsx)(P,{children:(0,i.jsx)(n,{})})]})})}},16583:function(e,t,n){n.d(t,{Z:function(){return r}});var i=n(85893);n(67294);var s=n(1822),l=n(15779);function r(e){let{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(l.Z,{...t,subLabel:(0,i.jsx)(s.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(l.Z,{...n,subLabel:(0,i.jsx)(s.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},6682:function(e,t,n){n.d(t,{Z:function(){return o}});var i=n(85893);n(67294);var s=n(74904),l=n(1822),r=n(50490),a=n(85302);function o(e){let{className:t}=e,n=(0,a.E)();return n.badge?(0,i.jsx)("span",{className:(0,s.Z)(t,r.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,i.jsx)(l.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},70271:function(e,t,n){n.d(t,{Z:function(){return x}});var i=n(85893);n(67294);var s=n(74904),l=n(93934),r=n(27544),a=n(1822),o=n(1652),c=n(50490),d=n(13908),u=n(85302);let m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(a.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(a.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){let t=m[e.versionMetadata.banner];return(0,i.jsx)(t,{...e})}function b(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,i.jsx)(a.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,i.jsx)("b",{children:(0,i.jsx)(r.Z,{to:n,onClick:s,children:(0,i.jsx)(a.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function v(e){let t,{className:n,versionMetadata:r}=e,{siteConfig:{title:a}}=(0,l.Z)(),{pluginId:u}=(0,o.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(u),{latestDocSuggestion:v,latestVersionSuggestion:x}=(0,o.Jo)(u);let f=v??(t=x).docs.find(e=>e.id===t.mainDocId);return(0,i.jsxs)("div",{className:(0,s.Z)(n,c.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,i.jsx)("div",{children:(0,i.jsx)(h,{siteTitle:a,versionMetadata:r})}),(0,i.jsx)("div",{className:"margin-top--md",children:(0,i.jsx)(b,{versionLabel:x.label,to:f.path,onClick:()=>m(x.name)})})]})}function x(e){let{className:t}=e,n=(0,u.E)();return n.banner?(0,i.jsx)(v,{className:t,versionMetadata:n}):null}},28669:function(e,t,n){n.d(t,{Z:()=>a});var i=n("85893");n("67294");var s=n("74904"),l=n("51515");let r="tableOfContents_bqdL";function a(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,s.Z)(r,"thin-scrollbar",t),children:(0,i.jsx)(l.Z,{...n,linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})})}},51515:function(e,t,n){n.d(t,{Z:()=>c});var i=n("85893"),s=n("67294"),l=n("45237");function r(e){let t=e.getBoundingClientRect();return t.top===t.bottom?r(e.parentNode):t}var a=n("27544");let o=s.memo(function e(t){let{toc:n,className:s,linkClassName:l,isChild:r}=t;return n.length?(0,i.jsx)("ul",{className:r?void 0:s,children:n.map(t=>(0,i.jsxs)("li",{children:[(0,i.jsx)(a.Z,{to:`#${t.id}`,className:l??void 0,dangerouslySetInnerHTML:{__html:t.value}}),(0,i.jsx)(e,{isChild:!0,toc:t.children,className:s,linkClassName:l})]},t.id))}):null});function c(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:d,maxHeadingLevel:u,...m}=e,h=(0,l.L)(),b=d??h.tableOfContents.minHeadingLevel,v=u??h.tableOfContents.maxHeadingLevel,x=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:i}=e;return(0,s.useMemo)(()=>(function e(t){let{toc:n,minHeadingLevel:i,maxHeadingLevel:s}=t;return n.flatMap(t=>{var n;let l=e({toc:t.children,minHeadingLevel:i,maxHeadingLevel:s});return(n=t).level>=i&&n.level<=s?[{...t,children:l}]:l})})({toc:function(e){let t=e.map(e=>({...e,parentIndex:-1,children:[]})),n=Array(7).fill(-1);t.forEach((e,t)=>{let i=n.slice(2,e.level);e.parentIndex=Math.max(...i),n[e.level]=t});let i=[];return t.forEach(e=>{let{parentIndex:n,...s}=e;n>=0?t[n].children.push(s):i.push(s)}),i}(t),minHeadingLevel:n,maxHeadingLevel:i}),[t,n,i])}({toc:t,minHeadingLevel:b,maxHeadingLevel:v});return!function(e){let t=(0,s.useRef)(void 0),n=function(){let e=(0,s.useRef)(0),{navbar:{hideOnScroll:t}}=(0,l.L)();return(0,s.useEffect)(()=>{e.current=t?0:document.querySelector(".navbar").clientHeight},[t]),e}();(0,s.useEffect)(()=>{if(!e)return()=>{};let{linkClassName:i,linkActiveClassName:s,minHeadingLevel:l,maxHeadingLevel:a}=e;function o(){var e;let o=(e=i,Array.from(document.getElementsByClassName(e))),c=function(e,t){let{anchorTopOffset:n}=t,i=e.find(e=>r(e).top>=n);if(i){var s;return(s=r(i)).top>0&&s.bottom/etc/samba/smb.conf
",id:"adding-custom-configuration-parameters-via-etcsambasmbconf",level:2},{value:"Example -- anonymous, read-write share outside of $HOME",id:"example----anonymous-read-write-share-outside-of-home",level:3},{value:"Links to the official Samba documentation",id:"links-to-the-official-samba-documentation",level:3},{value:"Full manual control of Samba (recommended only for experienced Samba admins)",id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",level:2}];function c(e){let n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"samba-file-sharing",children:"Samba file sharing"})}),"\n",(0,i.jsx)(n.p,{children:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol."}),"\n",(0,i.jsx)(n.h2,{id:"samba-on-solus",children:"Samba on Solus"}),"\n",(0,i.jsx)(n.p,{children:"To enable convenient file-sharing on Solus, we maintain a Solus-specific Samba configuration that out-of-the-box:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Supports Samba usershare functionality"}),"\n",(0,i.jsxs)(n.li,{children:["Enables sharing of ",(0,i.jsx)(n.em,{children:"$HOME"})," folders (manual user account activation needed)"]}),"\n",(0,i.jsx)(n.li,{children:"Is set up as a standalone server using the SMB2.0.2 protocol and up (>= Windows Vista/Server 2008)"}),"\n",(0,i.jsxs)(n.li,{children:["Advertises itself via ",(0,i.jsx)(n.em,{children:"Avahi"})," aka ",(0,i.jsx)(n.em,{children:"Apple Bonjour"})," / ",(0,i.jsx)(n.em,{children:"mDNS"})," / ",(0,i.jsx)(n.em,{children:"zeroconf"})," for macOS compatibility"]}),"\n",(0,i.jsxs)(n.li,{children:["Advertises itself via ",(0,i.jsx)(n.em,{children:"wsdd"})," aka ",(0,i.jsx)(n.em,{children:"Web Services Discovery Daemon"})," for Windows 7+ compatibility"]}),"\n",(0,i.jsx)(n.li,{children:"Disables sharing of printers via Samba (use IPP via CUPS instead)"}),"\n",(0,i.jsx)(n.li,{children:"Allows access only from IPv4 and IPv6 private and link-local (non-internet-routable) addresses"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"As of Samba 4.7.x, Solus disables the old, deprecated and insecure original SMB1/CIFS protocol by default."}),"\n",(0,i.jsxs)(n.p,{children:["For more information on this choice, please read ",(0,i.jsx)(n.a,{href:"https://techcommunity.microsoft.com/t5/storage-at-microsoft/stop-using-smb1/ba-p/425858",children:"this post regarding SMB1"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"As of Samba 4.11.x, the SMB1/CIFS protocol is officially deprecated upstream."}),"\n",(0,i.jsx)(n.h3,{id:"how-to-startstop-samba",children:"How to start/stop Samba"}),"\n",(0,i.jsx)(n.p,{children:"Please note that Samba does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Start Samba manually\nsudo systemctl start smb\n\n# Configure Samba to start automatically on each boot and immediately start the service\nsudo systemctl enable --now smb\n\n# Check whether Samba is running\nsudo systemctl status smb\n\n# Restart Samba manually\nsudo systemctl restart smb\n\n# Stop Samba manually\nsudo systemctl stop smb\n\n# Configure Samba to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now smb\n"})}),"\n",(0,i.jsx)(n.h3,{id:"enabling-windows-7-network-discovery-support",children:"Enabling Windows 7+ network discovery support"}),"\n",(0,i.jsxs)(n.p,{children:["The Web Services Discovery protocol is used by Windows 7+ clients to discover shares on other computers. Solus now includes the ",(0,i.jsx)(n.em,{children:"wsdd"})," service which provides support for the Web Services Discovery protocol."]}),"\n",(0,i.jsx)(n.p,{children:"When restarting wsdd, it may be necessary to also restart Samba."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Start wsdd manually (depends on the smb service)\nsudo systemctl start wsdd\n\n# Configure wsdd to start automatically on each boot and immediately start the service\nsudo systemctl enable --now wsdd\n\n# Check whether wsdd is running\nsudo systemctl status wsdd\n\n# Restart wsdd and Samba\nsudo systemctl restart wsdd smb\n\n# Stop wsdd manually\nsudo systemctl stop wsdd\n\n# Configure wsdd to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now wsdd\n"})}),"\n",(0,i.jsxs)(n.p,{children:["For more details on managing services on Solus with ",(0,i.jsx)(n.em,{children:"systemctl"}),", see ",(0,i.jsx)(n.code,{children:"man systemctl"})," which is part of the systemd system and service manager."]}),"\n",(0,i.jsx)(n.h3,{id:"accessing-samba-via-ipv6",children:"Accessing Samba via IPv6"}),"\n",(0,i.jsx)(n.p,{children:"In order to access a running Solus Samba server instance via IPv6, first verify that all relevant hosts (including the Samba host) are configured with an IPv6 link-local address."}),"\n",(0,i.jsx)(n.p,{children:"This can be verified in a terminal:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"$ ip addr\n\n2: enp2s0: /etc/samba/smb.conf
",id:"adding-custom-configuration-parameters-via-etcsambasmbconf",level:2},{value:"Example -- anonymous, read-write share outside of $HOME",id:"example----anonymous-read-write-share-outside-of-home",level:3},{value:"Links to the official Samba documentation",id:"links-to-the-official-samba-documentation",level:3},{value:"Full manual control of Samba (recommended only for experienced Samba admins)",id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"samba-file-sharing",children:"Samba file sharing"})}),"\n",(0,a.jsx)(n.p,{children:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol."}),"\n",(0,a.jsx)(n.h2,{id:"samba-on-solus",children:"Samba on Solus"}),"\n",(0,a.jsx)(n.p,{children:"To enable convenient file-sharing on Solus, we maintain a Solus-specific Samba configuration that out-of-the-box:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Supports Samba usershare functionality"}),"\n",(0,a.jsxs)(n.li,{children:["Enables sharing of ",(0,a.jsx)(n.em,{children:"$HOME"})," folders (manual user account activation needed)"]}),"\n",(0,a.jsx)(n.li,{children:"Is set up as a standalone server using the SMB2.0.2 protocol and up (>= Windows Vista/Server 2008)"}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"Avahi"})," aka ",(0,a.jsx)(n.em,{children:"Apple Bonjour"})," / ",(0,a.jsx)(n.em,{children:"mDNS"})," / ",(0,a.jsx)(n.em,{children:"zeroconf"})," for macOS compatibility"]}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"wsdd"})," aka ",(0,a.jsx)(n.em,{children:"Web Services Discovery Daemon"})," for Windows 7+ compatibility"]}),"\n",(0,a.jsx)(n.li,{children:"Disables sharing of printers via Samba (use IPP via CUPS instead)"}),"\n",(0,a.jsx)(n.li,{children:"Allows access only from IPv4 and IPv6 private and link-local (non-internet-routable) addresses"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.7.x, Solus disables the old, deprecated and insecure original SMB1/CIFS protocol by default."}),"\n",(0,a.jsxs)(n.p,{children:["For more information on this choice, please read ",(0,a.jsx)(n.a,{href:"https://techcommunity.microsoft.com/t5/storage-at-microsoft/stop-using-smb1/ba-p/425858",children:"this post regarding SMB1"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.11.x, the SMB1/CIFS protocol is officially deprecated upstream."}),"\n",(0,a.jsx)(n.h3,{id:"how-to-startstop-samba",children:"How to start/stop Samba"}),"\n",(0,a.jsx)(n.p,{children:"Please note that Samba does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start Samba manually\nsudo systemctl start smb\n\n# Configure Samba to start automatically on each boot and immediately start the service\nsudo systemctl enable --now smb\n\n# Check whether Samba is running\nsudo systemctl status smb\n\n# Restart Samba manually\nsudo systemctl restart smb\n\n# Stop Samba manually\nsudo systemctl stop smb\n\n# Configure Samba to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now smb\n"})}),"\n",(0,a.jsx)(n.h3,{id:"enabling-windows-7-network-discovery-support",children:"Enabling Windows 7+ network discovery support"}),"\n",(0,a.jsxs)(n.p,{children:["The Web Services Discovery protocol is used by Windows 7+ clients to discover shares on other computers. Solus now includes the ",(0,a.jsx)(n.em,{children:"wsdd"})," service which provides support for the Web Services Discovery protocol."]}),"\n",(0,a.jsx)(n.p,{children:"When restarting wsdd, it may be necessary to also restart Samba."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start wsdd manually (depends on the smb service)\nsudo systemctl start wsdd\n\n# Configure wsdd to start automatically on each boot and immediately start the service\nsudo systemctl enable --now wsdd\n\n# Check whether wsdd is running\nsudo systemctl status wsdd\n\n# Restart wsdd and Samba\nsudo systemctl restart wsdd smb\n\n# Stop wsdd manually\nsudo systemctl stop wsdd\n\n# Configure wsdd to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now wsdd\n"})}),"\n",(0,a.jsxs)(n.p,{children:["For more details on managing services on Solus with ",(0,a.jsx)(n.em,{children:"systemctl"}),", see ",(0,a.jsx)(n.code,{children:"man systemctl"})," which is part of the systemd system and service manager."]}),"\n",(0,a.jsx)(n.h3,{id:"accessing-samba-via-ipv6",children:"Accessing Samba via IPv6"}),"\n",(0,a.jsx)(n.p,{children:"In order to access a running Solus Samba server instance via IPv6, first verify that all relevant hosts (including the Samba host) are configured with an IPv6 link-local address."}),"\n",(0,a.jsx)(n.p,{children:"This can be verified in a terminal:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"$ ip addr\n\n2: enp2s0: eopkg check
shows broken packages",id:"eopkg-check-shows-broken-packages",level:3},{value:"Updated system and having issues",id:"updated-system-and-having-issues",level:2},{value:"Broken UI with Chromium applications",id:"broken-ui-with-chromium-applications",level:3},{value:"Boot into previous kernel",id:"boot-into-previous-kernel",level:3},{value:"Reverting updates",id:"reverting-updates",level:3},{value:"Boot failure",id:"boot-failure",level:2},{value:"Display manager won't start",id:"display-manager-wont-start",level:3},{value:"No Solus boot loader",id:"no-solus-boot-loader",level:3},{value:"Long boot time",id:"long-boot-time",level:2},{value:"Timeout on partition mount (90s)",id:"timeout-on-partition-mount-90s",level:3}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"troubleshooting-common-issues",children:"Troubleshooting Common Issues"})}),"\n",(0,s.jsx)(o.p,{children:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed."}),"\n",(0,s.jsxs)(o.p,{children:["First, perform a full system update on command line with ",(0,s.jsx)(o.code,{children:"sudo eopkg up"})," (or using the Software Center)."]}),"\n",(0,s.jsx)(o.p,{children:"Next, validate that packages are installed correctly and aren't missing files. Run this once, it will take some time. If there are no broken packages on your system, there will be no output. Otherwise, you will see packages be reinstalled."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs -r sudo eopkg it --reinstall\n"})}),"\n",(0,s.jsx)(o.p,{children:"Reboot the system and see if the issue is resolved."}),"\n",(0,s.jsx)(o.h2,{id:"issues-with-software-center-or-eopkg",children:"Issues with Software Center or eopkg"}),"\n",(0,s.jsx)(o.h3,{id:"cant-install-updates",children:"Can't install updates"}),"\n",(0,s.jsx)(o.p,{children:"If eopkg is interrupted, the database may become corrupted. When updating you will see a message similar to:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.code,{children:"30973, 'BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery - BDB0061 PANIC: Invalid argument'"})}),"\n",(0,s.jsxs)(o.p,{children:["To run database recovery, run ",(0,s.jsx)(o.code,{children:"sudo eopkg rdb"})," in the terminal and then updates should function correctly."]}),"\n",(0,s.jsxs)(o.h3,{id:"eopkg-check-shows-broken-packages",children:[(0,s.jsx)(o.code,{children:"eopkg check"})," shows broken packages"]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg check"})," checks the sha256 checksums of files on disk versus what was originally installed by the original ",(0,s.jsx)(o.code,{children:".eopkg"})," file. In some cases (for example ",(0,s.jsx)(o.code,{children:".pyc"})," files), these files will be modified in the normal operation of Solus. If after reinstalling a package it remains broken, then it's likely nothing to worry about (there are no exceptions made in ",(0,s.jsx)(o.code,{children:"eopkg check"})," for files that are expected to change from use). When reinstalling broken packages, (per above) it only needs to be run once."]}),"\n",(0,s.jsx)(o.h2,{id:"updated-system-and-having-issues",children:"Updated system and having issues"}),"\n",(0,s.jsx)(o.h3,{id:"broken-ui-with-chromium-applications",children:"Broken UI with Chromium applications"}),"\n",(0,s.jsxs)(o.p,{children:["There is an ",(0,s.jsx)(o.a,{href:"https://issues.chromium.org/issues/40267041",children:"upstream bug"})," with Chromium that causes it to try to use an invalid shader cache instead of rebuilding it, crashing the GPU process. The issue is now fixed in Chromium, but it may take some time for applications to update their Chromium version."]}),"\n",(0,s.jsx)(o.p,{children:"To fix applications exhibiting this problem, run these commands to remove the shader cache:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"find ~/.cache -name GPUCache -exec rm -rv {} +\nfind ~/.config -name GPUCache -exec rm -rv {} +\n"})}),"\n",(0,s.jsx)(o.p,{children:"And restart the application."}),"\n",(0,s.jsx)(o.h3,{id:"boot-into-previous-kernel",children:"Boot into previous kernel"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"clr-boot-manager"})," by default retains the latest installed kernel, plus the currently running kernel. This means that when you receive a kernel update, there are two kernels to boot into. Sometimes there are regressions that occur in the kernel, so you are able to boot into the previous kernel if the update has caused any hardware issues (for example failing to suspend when it worked previously). When booting via EFI, the boot menu can be shown by hitting space (repeatedly) during boot."]}),"\n",(0,s.jsx)(o.h3,{id:"reverting-updates",children:"Reverting updates"}),"\n",(0,s.jsxs)(o.p,{children:["If booting into the previous kernel doesn't solve the issue, there may be an issue with the package updates. It is possible to ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"revert the updates"})," (this would also confirm that the issue is in the selected updates)."]}),"\n",(0,s.jsx)(o.h2,{id:"boot-failure",children:"Boot failure"}),"\n",(0,s.jsxs)(o.p,{children:["If Solus partially boots, you can generally get to a TTY using ",(0,s.jsx)(o.code,{children:"Ctrl+Alt+F2"})," to login and be able to run commands just like using a terminal. This enables you to run some commands to identify or resolve the issue."]}),"\n",(0,s.jsx)(o.h3,{id:"display-manager-wont-start",children:"Display manager won't start"}),"\n",(0,s.jsx)(o.p,{children:"A common cause of not being able to boot is due to installing the NVIDIA drivers, but not booting into the latest kernel (the only kernel which has the drivers installed). Also ensure you have the correct driver version installed for your kernel. You can check if you have booted into the latest kernel by comparing the installed package with the booted kernel (instructions for both kernels)"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-lts | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-current | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.p,{children:"If the kernel version and release don't match from lines 2 and 3 of the output, then you aren't booting into the latest kernel and this is the likely cause of X not loading (particularly if you just installed the drivers). A couple of common reasons are:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["On a GRUB machine, a common cause for not booting the latest kernel is due to Solus not being the boot loader on the MBR. Make sure you are booting via the Solus boot loader (if possible), or update GRUB on the distro that own the boot loader, see ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/installation#legacybios-installation",children:"Legacy/BIOS installation"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Another possibility is that the ",(0,s.jsx)(o.code,{children:"ESP"})," has run out of space so the kernel cannot be copied over to it. You can debug why this isn't happening via ",(0,s.jsx)(o.code,{children:"sudo CBM_DEBUG=1 clr-boot-manager update"}),". This will output all information on the process, where it may be failing, or that it is working correctly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["If these two steps fail, you can't revert the installation of the drivers via ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"History and Rollback"})]}),"\n",(0,s.jsx)(o.h3,{id:"no-solus-boot-loader",children:"No Solus boot loader"}),"\n",(0,s.jsxs)(o.p,{children:["If the Solus boot loader is not functioning (this has been known to be broken by the odd update of a certain OS), the boot loader can be recreated via ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/boot-rescue",children:"Boot Rescue"})]}),"\n",(0,s.jsx)(o.h2,{id:"long-boot-time",children:"Long boot time"}),"\n",(0,s.jsx)(o.p,{children:"There are a number of factors that can contribute to a long boot time. The boot up messages can be viewed to look for any timeouts by looking at the timestamped journal."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo journalctl -b\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Notable commands to check the boot time are: ",(0,s.jsx)(o.code,{children:"systemd-analyze"})," (note that the firmware time is prior to Solus boot, so outside of our control) and ",(0,s.jsx)(o.code,{children:"systemd-analyze critical-chain"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"timeout-on-partition-mount-90s",children:"Timeout on partition mount (90s)"}),"\n",(0,s.jsxs)(o.p,{children:["If information about a device changes (UUID or mount path ",(0,s.jsx)(o.code,{children:"/dev/sda"}),"), this can cause ",(0,s.jsx)(o.code,{children:"systemd"})," to time out for 90 seconds creating a long boot process. Most frequently this happens with the swap file which can be shared across distros. Most of the devices mounted on boot will appear in ",(0,s.jsx)(o.code,{children:"/etc/fstab"})," or be a parameter in a file where configuring resume ",(0,s.jsx)(o.code,{children:"cat /etc/kernel/cmdline.d/*"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"cat /proc/cmdline"})," will show what parameters the kernel has booted with."]}),"\n",(0,s.jsxs)(o.p,{children:["If the devices don't match up with what's listed in ",(0,s.jsx)(o.code,{children:"ls /dev/disk/*/*"})," then it will cause a 90s timeout while it waits to see if it can be found. To fix this, you will need to remove the reference to the UUID or device path that no longer exists, or correct it to the new UUID label."]})]})}function d(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var s=t(67294);const n={},i=s.createContext(n);function r(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2b4abe09.e29d0b47.js b/assets/js/2b4abe09.e29d0b47.js
new file mode 100644
index 000000000..2394593bc
--- /dev/null
+++ b/assets/js/2b4abe09.e29d0b47.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3560"],{20587:function(e,o,t){t.r(o),t.d(o,{metadata:()=>s,contentTitle:()=>a,default:()=>d,assets:()=>l,toc:()=>h,frontMatter:()=>r});var s=JSON.parse('{"id":"user/troubleshooting/index","title":"Troubleshooting","description":"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed.","source":"@site/docs/user/troubleshooting/index.md","sourceDirName":"user/troubleshooting","slug":"/user/troubleshooting/","permalink":"/docs/user/troubleshooting/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Troubleshooting","summary":"Basic troubleshooting for some of the most common Solus problems."},"sidebar":"userSidebar","previous":{"title":"Open Broadcaster Software (OBS)","permalink":"/docs/user/software/web/obs"},"next":{"title":"Boot Rescue","permalink":"/docs/user/troubleshooting/boot-rescue"}}'),n=t("85893"),i=t("50065");let r={title:"Troubleshooting",summary:"Basic troubleshooting for some of the most common Solus problems."},a="Troubleshooting Common Issues",l={},h=[{value:"Issues with Software Center or eopkg",id:"issues-with-software-center-or-eopkg",level:2},{value:"Can't install updates",id:"cant-install-updates",level:3},{value:"eopkg check
shows broken packages",id:"eopkg-check-shows-broken-packages",level:3},{value:"Updated system and having issues",id:"updated-system-and-having-issues",level:2},{value:"Broken UI with Chromium applications",id:"broken-ui-with-chromium-applications",level:3},{value:"Boot into previous kernel",id:"boot-into-previous-kernel",level:3},{value:"Reverting updates",id:"reverting-updates",level:3},{value:"Boot failure",id:"boot-failure",level:2},{value:"Display manager won't start",id:"display-manager-wont-start",level:3},{value:"No Solus boot loader",id:"no-solus-boot-loader",level:3},{value:"Long boot time",id:"long-boot-time",level:2},{value:"Timeout on partition mount (90s)",id:"timeout-on-partition-mount-90s",level:3}];function c(e){let o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"troubleshooting-common-issues",children:"Troubleshooting Common Issues"})}),"\n",(0,n.jsx)(o.p,{children:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed."}),"\n",(0,n.jsxs)(o.p,{children:["First, perform a full system update on command line with ",(0,n.jsx)(o.code,{children:"sudo eopkg up"})," (or using the Software Center)."]}),"\n",(0,n.jsx)(o.p,{children:"Next, validate that packages are installed correctly and aren't missing files. Run this once, it will take some time. If there are no broken packages on your system, there will be no output. Otherwise, you will see packages be reinstalled."}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs -r sudo eopkg it --reinstall\n"})}),"\n",(0,n.jsx)(o.p,{children:"Reboot the system and see if the issue is resolved."}),"\n",(0,n.jsx)(o.h2,{id:"issues-with-software-center-or-eopkg",children:"Issues with Software Center or eopkg"}),"\n",(0,n.jsx)(o.h3,{id:"cant-install-updates",children:"Can't install updates"}),"\n",(0,n.jsx)(o.p,{children:"If eopkg is interrupted, the database may become corrupted. When updating you will see a message similar to:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.code,{children:"30973, 'BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery - BDB0061 PANIC: Invalid argument'"})}),"\n",(0,n.jsxs)(o.p,{children:["To run database recovery, run ",(0,n.jsx)(o.code,{children:"sudo eopkg rdb"})," in the terminal and then updates should function correctly."]}),"\n",(0,n.jsxs)(o.h3,{id:"eopkg-check-shows-broken-packages",children:[(0,n.jsx)(o.code,{children:"eopkg check"})," shows broken packages"]}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.code,{children:"eopkg check"})," checks the sha256 checksums of files on disk versus what was originally installed by the original ",(0,n.jsx)(o.code,{children:".eopkg"})," file. In some cases (for example ",(0,n.jsx)(o.code,{children:".pyc"})," files), these files will be modified in the normal operation of Solus. If after reinstalling a package it remains broken, then it's likely nothing to worry about (there are no exceptions made in ",(0,n.jsx)(o.code,{children:"eopkg check"})," for files that are expected to change from use). When reinstalling broken packages, (per above) it only needs to be run once."]}),"\n",(0,n.jsx)(o.h2,{id:"updated-system-and-having-issues",children:"Updated system and having issues"}),"\n",(0,n.jsx)(o.h3,{id:"broken-ui-with-chromium-applications",children:"Broken UI with Chromium applications"}),"\n",(0,n.jsxs)(o.p,{children:["There is an ",(0,n.jsx)(o.a,{href:"https://issues.chromium.org/issues/40267041",children:"upstream bug"})," with Chromium that causes it to try to use an invalid shader cache instead of rebuilding it, crashing the GPU process. The issue is now fixed in Chromium, but it may take some time for applications to update their Chromium version."]}),"\n",(0,n.jsx)(o.p,{children:"To fix applications exhibiting this problem, run these commands to remove the shader cache:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"find ~/.cache -name GPUCache -exec rm -rv {} +\nfind ~/.config -name GPUCache -exec rm -rv {} +\n"})}),"\n",(0,n.jsx)(o.p,{children:"And restart the application."}),"\n",(0,n.jsx)(o.h3,{id:"boot-into-previous-kernel",children:"Boot into previous kernel"}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.code,{children:"clr-boot-manager"})," by default retains the latest installed kernel, plus the currently running kernel. This means that when you receive a kernel update, there are two kernels to boot into. Sometimes there are regressions that occur in the kernel, so you are able to boot into the previous kernel if the update has caused any hardware issues (for example failing to suspend when it worked previously). When booting via EFI, the boot menu can be shown by hitting space (repeatedly) during boot."]}),"\n",(0,n.jsx)(o.h3,{id:"reverting-updates",children:"Reverting updates"}),"\n",(0,n.jsxs)(o.p,{children:["If booting into the previous kernel doesn't solve the issue, there may be an issue with the package updates. It is possible to ",(0,n.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"revert the updates"})," (this would also confirm that the issue is in the selected updates)."]}),"\n",(0,n.jsx)(o.h2,{id:"boot-failure",children:"Boot failure"}),"\n",(0,n.jsxs)(o.p,{children:["If Solus partially boots, you can generally get to a TTY using ",(0,n.jsx)(o.code,{children:"Ctrl+Alt+F2"})," to login and be able to run commands just like using a terminal. This enables you to run some commands to identify or resolve the issue."]}),"\n",(0,n.jsx)(o.h3,{id:"display-manager-wont-start",children:"Display manager won't start"}),"\n",(0,n.jsx)(o.p,{children:"A common cause of not being able to boot is due to installing the NVIDIA drivers, but not booting into the latest kernel (the only kernel which has the drivers installed). Also ensure you have the correct driver version installed for your kernel. You can check if you have booted into the latest kernel by comparing the installed package with the booted kernel (instructions for both kernels)"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-lts | head -n2; uname -a\n"})}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-current | head -n2; uname -a\n"})}),"\n",(0,n.jsx)(o.p,{children:"If the kernel version and release don't match from lines 2 and 3 of the output, then you aren't booting into the latest kernel and this is the likely cause of X not loading (particularly if you just installed the drivers). A couple of common reasons are:"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:["\n",(0,n.jsxs)(o.p,{children:["On a GRUB machine, a common cause for not booting the latest kernel is due to Solus not being the boot loader on the MBR. Make sure you are booting via the Solus boot loader (if possible), or update GRUB on the distro that own the boot loader, see ",(0,n.jsx)(o.a,{href:"/docs/user/troubleshooting/installation#legacybios-installation",children:"Legacy/BIOS installation"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(o.li,{children:["\n",(0,n.jsxs)(o.p,{children:["Another possibility is that the ",(0,n.jsx)(o.code,{children:"ESP"})," has run out of space so the kernel cannot be copied over to it. You can debug why this isn't happening via ",(0,n.jsx)(o.code,{children:"sudo CBM_DEBUG=1 clr-boot-manager update"}),". This will output all information on the process, where it may be failing, or that it is working correctly."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(o.p,{children:["If these two steps fail, you can't revert the installation of the drivers via ",(0,n.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"History and Rollback"})]}),"\n",(0,n.jsx)(o.h3,{id:"no-solus-boot-loader",children:"No Solus boot loader"}),"\n",(0,n.jsxs)(o.p,{children:["If the Solus boot loader is not functioning (this has been known to be broken by the odd update of a certain OS), the boot loader can be recreated via ",(0,n.jsx)(o.a,{href:"/docs/user/troubleshooting/boot-rescue",children:"Boot Rescue"})]}),"\n",(0,n.jsx)(o.h2,{id:"long-boot-time",children:"Long boot time"}),"\n",(0,n.jsx)(o.p,{children:"There are a number of factors that can contribute to a long boot time. The boot up messages can be viewed to look for any timeouts by looking at the timestamped journal."}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo journalctl -b\n"})}),"\n",(0,n.jsxs)(o.p,{children:["Notable commands to check the boot time are: ",(0,n.jsx)(o.code,{children:"systemd-analyze"})," (note that the firmware time is prior to Solus boot, so outside of our control) and ",(0,n.jsx)(o.code,{children:"systemd-analyze critical-chain"}),"."]}),"\n",(0,n.jsx)(o.h3,{id:"timeout-on-partition-mount-90s",children:"Timeout on partition mount (90s)"}),"\n",(0,n.jsxs)(o.p,{children:["If information about a device changes (UUID or mount path ",(0,n.jsx)(o.code,{children:"/dev/sda"}),"), this can cause ",(0,n.jsx)(o.code,{children:"systemd"})," to time out for 90 seconds creating a long boot process. Most frequently this happens with the swap file which can be shared across distros. Most of the devices mounted on boot will appear in ",(0,n.jsx)(o.code,{children:"/etc/fstab"})," or be a parameter in a file where configuring resume ",(0,n.jsx)(o.code,{children:"cat /etc/kernel/cmdline.d/*"}),"."]}),"\n",(0,n.jsxs)(o.p,{children:[(0,n.jsx)(o.code,{children:"cat /proc/cmdline"})," will show what parameters the kernel has booted with."]}),"\n",(0,n.jsxs)(o.p,{children:["If the devices don't match up with what's listed in ",(0,n.jsx)(o.code,{children:"ls /dev/disk/*/*"})," then it will cause a 90s timeout while it waits to see if it can be found. To fix this, you will need to remove the reference to the UUID or device path that no longer exists, or correct it to the new UUID label."]})]})}function d(e={}){let{wrapper:o}={...(0,i.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},50065:function(e,o,t){t.d(o,{Z:function(){return a},a:function(){return r}});var s=t(67294);let n={},i=s.createContext(n);function r(e){let o=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2b61a93c.58316b4c.js b/assets/js/2b61a93c.58316b4c.js
new file mode 100644
index 000000000..2b0631597
--- /dev/null
+++ b/assets/js/2b61a93c.58316b4c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9640"],{21534:function(e,t,n){n.r(t),n.d(t,{metadata:()=>i,contentTitle:()=>d,default:()=>u,assets:()=>a,toc:()=>l,frontMatter:()=>r});var i=JSON.parse('{"id":"user/editions/mate/index","title":"MATE","description":"The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post here","source":"@site/docs/user/editions/mate/index.md","sourceDirName":"user/editions/mate","slug":"/user/editions/mate/","permalink":"/docs/user/editions/mate/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"MATE","summary":"A quick introduction to the MATE Edition of Solus"},"sidebar":"userSidebar","previous":{"title":"Tips and Tricks","permalink":"/docs/user/editions/gnome/tips-and-tricks"},"next":{"title":"Configuration","permalink":"/docs/user/editions/mate/configuration"}}'),o=n("85893"),s=n("50065");let r={title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},d="MATE Desktop",a={},l=[];function c(e){let t={a:"a",admonition:"admonition",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"mate-desktop",children:"MATE Desktop"})}),"\n",(0,o.jsx)(t.admonition,{type:"caution",children:(0,o.jsxs)(t.p,{children:["The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post ",(0,o.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"here"})]})}),"\n",(0,o.jsx)(t.p,{children:"MATE Desktop is provided by the MATE Edition of Solus. They describe it as:"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"The MATE Desktop Environment is the continuation of GNOME 2. It provides an intuitive and attractive desktop environment using traditional metaphors for Linux and other Unix-like operating\xa0systems."}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://mate-desktop.org/",children:"Homepage"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://mate-desktop.org/blog/",children:"News"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://mate-desktop.org/community/",children:"Support"})}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.a,{href:"configuration",children:"Go to MATE Configuration"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.a,{href:"tips-and-tricks",children:"Go to MATE Tips and Tricks"})})]})}function u(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return d},a:function(){return r}});var i=n(67294);let o={},s=i.createContext(o);function r(e){let t=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2b61a93c.852b4fa1.js b/assets/js/2b61a93c.852b4fa1.js
deleted file mode 100644
index fe5b7e7fd..000000000
--- a/assets/js/2b61a93c.852b4fa1.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9897],{23065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var i=n(85893),s=n(11151);const o={title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},r="MATE Desktop",d={id:"user/editions/mate/index",title:"MATE",description:"The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post here",source:"@site/docs/user/editions/mate/index.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/",permalink:"/docs/user/editions/mate/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"}},a={},c=[];function l(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"mate-desktop",children:"MATE Desktop"})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post ",(0,i.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"here"})]})}),"\n",(0,i.jsx)(t.p,{children:"MATE Desktop is provided by the MATE Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"The MATE Desktop Environment is the continuation of GNOME 2. It provides an intuitive and attractive desktop environment using traditional metaphors for Linux and other Unix-like operating\xa0systems."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/",children:"Homepage"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/blog/",children:"News"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/community/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"configuration",children:"Go to MATE Configuration"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"tips-and-tricks",children:"Go to MATE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var i=n(67294);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2c3e84bd.3f7e7e11.js b/assets/js/2c3e84bd.3f7e7e11.js
new file mode 100644
index 000000000..d4dd795e3
--- /dev/null
+++ b/assets/js/2c3e84bd.3f7e7e11.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6133"],{95858:function(e,t,n){n.r(t),n.d(t,{metadata:()=>i,contentTitle:()=>a,default:()=>d,assets:()=>l,toc:()=>u,frontMatter:()=>r});var i=JSON.parse('{"id":"user/quick-start/installation/disks","title":"Disk Partitioning","description":"Solus provides multiple ways you can install onto your system.","source":"@site/docs/user/quick-start/installation/disks.md","sourceDirName":"user/quick-start/installation","slug":"/user/quick-start/installation/disks","permalink":"/docs/user/quick-start/installation/disks","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/disks.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Disk Partitioning","summary":"Overview of the partitioning that the installer can perform"},"sidebar":"userSidebar","previous":{"title":"Preparing to Install","permalink":"/docs/user/quick-start/installation/"},"next":{"title":"Booting with Secure Boot Enabled","permalink":"/docs/user/quick-start/installation/secure-boot"}}'),s=n("85893"),o=n("50065");let r={title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},a="Disk Partitioning",l={},u=[{value:"UEFI",id:"uefi",level:2}];function c(e){let t={br:"br",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"disk-partitioning",children:"Disk Partitioning"})}),"\n",(0,s.jsx)(t.p,{children:"Solus provides multiple ways you can install onto your system."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Whole Drive"}),(0,s.jsx)(t.br,{}),"\n","Solus can take up the entire drive, using traditional root partitions, or with LVM-managed root partitions."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Multi-boot"}),(0,s.jsx)(t.br,{}),"\n","You can install Solus next to your existing operating system, such as Windows. ",(0,s.jsx)(t.em,{children:"If you have multiple operating systems installed, we will choose the largest option."})]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Manual Partitioning"}),(0,s.jsx)(t.br,{}),"\n","You can manually configure your system. This is only recommend for advanced users which may desire to have a dedicated ",(0,s.jsx)(t.code,{children:"/home"})," partition. Note that if you manually configure your system, you will need to restart the Installer for those changes to apply appropriately.\n",(0,s.jsx)(t.strong,{children:"Note:"})," Legacy (BIOS) must use MBR partition table while Unified EFI (UEFI) must use GPT partition table."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Alongside these options, we also provide the ability to use full-disk encryption. For the obvious reason of it being full-disk, this assumes you are installing Solus onto the entire drive."}),"\n",(0,s.jsx)(t.h2,{id:"uefi",children:"UEFI"}),"\n",(0,s.jsx)(t.p,{children:"If you are using a system with UEFI, you may need to create an EFI System Partition, also referred to as an ESP. This is not necessary if you are enabling Solus to install onto the entire disk."}),"\n",(0,s.jsxs)(t.p,{children:["To create an EFI System Partition, open up GParted and create a FAT32 partition that is 1\xa0GB in size. Next, right-click on the partition and click Manage Flags. On the Manage Flags section, enable the ",(0,s.jsx)(t.code,{children:"boot"})," and ",(0,s.jsx)(t.code,{children:"esp"})," flags."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Notes:"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'Your system must be booted using Unified EFI (UEFI) mode, as opposed to a "legacy (BIOS) mode".'}),"\n",(0,s.jsx)(t.li,{children:"Your disk is required to be GPT formatted."}),"\n",(0,s.jsx)(t.li,{children:"If you cannot see your SSD drive, set the SATA configuration to AHCI."}),"\n"]})]})}function d(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return a},a:function(){return r}});var i=n(67294);let s={},o=i.createContext(s);function r(e){let t=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2c3e84bd.55228a2e.js b/assets/js/2c3e84bd.55228a2e.js
deleted file mode 100644
index 2668a3eb6..000000000
--- a/assets/js/2c3e84bd.55228a2e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8157],{12359:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=i(85893),s=i(11151);const o={title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},r="Disk Partitioning",a={id:"user/quick-start/installation/disks",title:"Disk Partitioning",description:"Solus provides multiple ways you can install onto your system.",source:"@site/docs/user/quick-start/installation/disks.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/disks",permalink:"/docs/user/quick-start/installation/disks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/disks.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},sidebar:"userSidebar",previous:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"},next:{title:"Booting with Secure Boot Enabled",permalink:"/docs/user/quick-start/installation/secure-boot"}},l={},c=[{value:"UEFI",id:"uefi",level:2}];function u(e){const t={br:"br",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"disk-partitioning",children:"Disk Partitioning"})}),"\n",(0,n.jsx)(t.p,{children:"Solus provides multiple ways you can install onto your system."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Whole Drive"}),(0,n.jsx)(t.br,{}),"\n","Solus can take up the entire drive, using traditional root partitions, or with LVM-managed root partitions."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Multi-boot"}),(0,n.jsx)(t.br,{}),"\n","You can install Solus next to your existing operating system, such as Windows. ",(0,n.jsx)(t.em,{children:"If you have multiple operating systems installed, we will choose the largest option."})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Manual Partitioning"}),(0,n.jsx)(t.br,{}),"\n","You can manually configure your system. This is only recommend for advanced users which may desire to have a dedicated ",(0,n.jsx)(t.code,{children:"/home"})," partition. Note that if you manually configure your system, you will need to restart the Installer for those changes to apply appropriately.\n",(0,n.jsx)(t.strong,{children:"Note:"})," Legacy (BIOS) must use MBR partition table while Unified EFI (UEFI) must use GPT partition table."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Alongside these options, we also provide the ability to use full-disk encryption. For the obvious reason of it being full-disk, this assumes you are installing Solus onto the entire drive."}),"\n",(0,n.jsx)(t.h2,{id:"uefi",children:"UEFI"}),"\n",(0,n.jsx)(t.p,{children:"If you are using a system with UEFI, you may need to create an EFI System Partition, also referred to as an ESP. This is not necessary if you are enabling Solus to install onto the entire disk."}),"\n",(0,n.jsxs)(t.p,{children:["To create an EFI System Partition, open up GParted and create a FAT32 partition that is 1\xa0GB in size. Next, right-click on the partition and click Manage Flags. On the Manage Flags section, enable the ",(0,n.jsx)(t.code,{children:"boot"})," and ",(0,n.jsx)(t.code,{children:"esp"})," flags."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Notes:"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:'Your system must be booted using Unified EFI (UEFI) mode, as opposed to a "legacy (BIOS) mode".'}),"\n",(0,n.jsx)(t.li,{children:"Your disk is required to be GPT formatted."}),"\n",(0,n.jsx)(t.li,{children:"If you cannot see your SSD drive, set the SATA configuration to AHCI."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3323.3aa8447b.js b/assets/js/3323.3aa8447b.js
deleted file mode 100644
index 103794e97..000000000
--- a/assets/js/3323.3aa8447b.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see 3323.3aa8447b.js.LICENSE.txt */
-(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3323],{8417:(e,t,r)=>{"use strict";r.d(t,{Z:()=>oe});var n=function(){function e(e){var t=this;this._insertTag=function(e){var r;r=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,r),t.tags.push(e)},this.isSpeedy=void 0===e.speedy||e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var t=e.prototype;return t.hydrate=function(e){e.forEach(this._insertTag)},t.insert=function(e){this.ctr%(this.isSpeedy?65e3:1)==0&&this._insertTag(function(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var r=function(e){if(e.sheet)return e.sheet;for(var t=0;t.eopkg
files",id:"install-the-eopkg-files",level:2},{value:"For updated packages: Return to the repository version",id:"for-updated-packages-return-to-the-repository-version",level:2},{value:"Remove the .eopkg
files",id:"remove-the-eopkg-files",level:2}];function d(e){let t={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"testing-a-package",children:"Testing a Package"})}),"\n",(0,n.jsx)(t.p,{children:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected."}),"\n",(0,n.jsxs)(t.p,{children:["You will use the ",(0,n.jsx)(t.code,{children:".eopkg"})," file(s) created by the build process for testing."]}),"\n",(0,n.jsxs)(t.h2,{id:"install-the-eopkg-files",children:["Install the ",(0,n.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,n.jsxs)(t.p,{children:["To install your new package, run the following command in the directory where you built the package. Include ",(0,n.jsx)(t.strong,{children:"all"})," ",(0,n.jsx)(t.code,{children:".eopkg"})," files that were built."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it *.eopkg\n"})}),"\n",(0,n.jsx)(t.p,{children:"Testing need not be very complicated. The goal is to ensure the package will reliably work for our users. Testing effort will depend on how complex the software is. At minimum, you want to ensure the application launches, and performs basic functionality as expected."}),"\n",(0,n.jsx)(t.p,{children:"For example, if you were updating a text editor, you would want to make sure you can open, create and save files. If you know of issues the package has had in the past, it's a good idea to test that as well to make sure there are no regressions. There are plenty of historical pull requests to review if you want more detail."}),"\n",(0,n.jsx)(t.h2,{id:"for-updated-packages-return-to-the-repository-version",children:"For updated packages: Return to the repository version"}),"\n",(0,n.jsxs)(t.p,{children:["It is a good idea to uninstall the package you built, and return to the repository version, once you are done testing. To do this, run the following command on the main application. For example, if you just built and tested ",(0,n.jsx)(t.code,{children:"tree"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it --reinstall tree\n"})}),"\n",(0,n.jsxs)(t.h2,{id:"remove-the-eopkg-files",children:["Remove the ",(0,n.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,n.jsxs)(t.p,{children:["Before you can submit your pull request, you need to remove the ",(0,n.jsx)(t.code,{children:".eopkg"})," files. All repository packages are built by a dedicated build server from the source files provided in your pull request."]}),"\n",(0,n.jsx)(t.p,{children:"To remove these files, run:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"go-task clean\n"})})]})}function u(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},50065:function(e,t,a){a.d(t,{Z:function(){return r},a:function(){return o}});var s=a(67294);let n={},i=s.createContext(n);function o(e){let t=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/45e9d313.a04ba549.js b/assets/js/45e9d313.a04ba549.js
deleted file mode 100644
index fead6649d..000000000
--- a/assets/js/45e9d313.a04ba549.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6114],{47124:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=a(85893),n=a(11151);const o={title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},i="Testing a Package",r={id:"packaging/testing-a-package",title:"Testing a Package",description:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected.",source:"@site/docs/packaging/testing-a-package.md",sourceDirName:"packaging",slug:"/packaging/testing-a-package",permalink:"/docs/packaging/testing-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/testing-a-package.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,sidebarPosition:5,frontMatter:{title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},sidebar:"packagingSidebar",previous:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"},next:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"}},l={},c=[{value:"Install the .eopkg
files",id:"install-the-eopkg-files",level:2},{value:"For updated packages: Return to the repository version",id:"for-updated-packages-return-to-the-repository-version",level:2},{value:"Remove the .eopkg
files",id:"remove-the-eopkg-files",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"testing-a-package",children:"Testing a Package"})}),"\n",(0,s.jsx)(t.p,{children:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected."}),"\n",(0,s.jsxs)(t.p,{children:["You will use the ",(0,s.jsx)(t.code,{children:".eopkg"})," file(s) created by the build process for testing."]}),"\n",(0,s.jsxs)(t.h2,{id:"install-the-eopkg-files",children:["Install the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["To install your new package, run the following command in the directory where you built the package. Include ",(0,s.jsx)(t.strong,{children:"all"})," ",(0,s.jsx)(t.code,{children:".eopkg"})," files that were built."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it *.eopkg\n"})}),"\n",(0,s.jsx)(t.p,{children:"Testing need not be very complicated. The goal is to ensure the package will reliably work for our users. Testing effort will depend on how complex the software is. At minimum, you want to ensure the application launches, and performs basic functionality as expected."}),"\n",(0,s.jsx)(t.p,{children:"For example, if you were updating a text editor, you would want to make sure you can open, create and save files. If you know of issues the package has had in the past, it's a good idea to test that as well to make sure there are no regressions. There are plenty of historical pull requests to review if you want more detail."}),"\n",(0,s.jsx)(t.h2,{id:"for-updated-packages-return-to-the-repository-version",children:"For updated packages: Return to the repository version"}),"\n",(0,s.jsxs)(t.p,{children:["It is a good idea to uninstall the package you built, and return to the repository version, once you are done testing. To do this, run the following command on the main application. For example, if you just built and tested ",(0,s.jsx)(t.code,{children:"tree"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it --reinstall tree\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"remove-the-eopkg-files",children:["Remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["Before you can submit your pull request, you need to remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files. All repository packages are built by a dedicated build server from the source files provided in your pull request."]}),"\n",(0,s.jsx)(t.p,{children:"To remove these files, run:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"go-task clean\n"})})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>r,a:()=>i});var s=a(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/46a65d96.32f1bce3.js b/assets/js/46a65d96.32f1bce3.js
deleted file mode 100644
index 012db6205..000000000
--- a/assets/js/46a65d96.32f1bce3.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8092],{82758:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>i,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=r(85893),t=r(11151);const n={title:"Repository Management",summary:"Repository Management"},d="Repository management",a={id:"user/package-management/repo-management",title:"Repository Management",description:"Solus offers two main software sources: stable (shannon) and unstable. The eopkg package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor.",source:"@site/docs/user/package-management/repo-management.md",sourceDirName:"user/package-management",slug:"/user/package-management/repo-management",permalink:"/docs/user/package-management/repo-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/repo-management.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Repository Management",summary:"Repository Management"},sidebar:"userSidebar",previous:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"},next:{title:"Privacy Policy",permalink:"/docs/user/privacy"}},i={},c=[{value:"Official repositories",id:"official-repositories",level:2},{value:"Repository management commands",id:"repository-management-commands",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"repository-management",children:"Repository management"})}),"\n",(0,o.jsxs)(s.p,{children:["Solus offers two main software sources: stable (shannon) and unstable. The ",(0,o.jsx)(s.code,{children:"eopkg"})," package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor."]}),"\n",(0,o.jsx)(s.h2,{id:"official-repositories",children:"Official repositories"}),"\n",(0,o.jsx)(s.p,{children:"The official Solus repositories are:"}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Repository"}),(0,o.jsx)(s.th,{children:"URL"}),(0,o.jsx)(s.th,{children:"Notes"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Stable (shannon)"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Default software source."})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Unstable"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Only use this source if build Solus packages or you test new software before it moves to the stable source."})]})]})]}),"\n",(0,o.jsxs)(s.admonition,{type:"danger",children:[(0,o.jsxs)(s.p,{children:["Updating your system while using the ",(0,o.jsx)(s.strong,{children:"unstable"})," source might be risky."]}),(0,o.jsxs)(s.p,{children:["Before updating, check the ",(0,o.jsx)(s.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:"#solus-packaging"})," Matrix room."]})]}),"\n",(0,o.jsx)(s.h2,{id:"repository-management-commands",children:"Repository management commands"}),"\n",(0,o.jsxs)(s.p,{children:["The following table lists the ",(0,o.jsx)(s.code,{children:"eopkg"})," commands you can use to manage your software sources."]}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Action"}),(0,o.jsx)(s.th,{children:"Command"}),(0,o.jsx)(s.th,{children:"Example"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Add a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo NAME URL"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo Example https://example.com/repo/eopkg-index.xml.xz"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Remove a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Enable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Disable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update all repositories"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"List repositories added to your system"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},11151:(e,s,r)=>{r.d(s,{Z:()=>a,a:()=>d});var o=r(67294);const t={},n=o.createContext(t);function d(e){const s=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(n.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/46a65d96.d66cb6de.js b/assets/js/46a65d96.d66cb6de.js
new file mode 100644
index 000000000..7c03c6a9d
--- /dev/null
+++ b/assets/js/46a65d96.d66cb6de.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9906"],{1658:function(e,s,r){r.r(s),r.d(s,{metadata:()=>t,contentTitle:()=>a,default:()=>h,assets:()=>i,toc:()=>c,frontMatter:()=>d});var t=JSON.parse('{"id":"user/package-management/repo-management","title":"Repository Management","description":"Solus offers two main software sources: stable (shannon) and unstable. The eopkg package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor.","source":"@site/docs/user/package-management/repo-management.md","sourceDirName":"user/package-management","slug":"/user/package-management/repo-management","permalink":"/docs/user/package-management/repo-management","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/repo-management.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Repository Management","summary":"Repository Management"},"sidebar":"userSidebar","previous":{"title":"History and Software Rollback","permalink":"/docs/user/package-management/history-and-rollback"},"next":{"title":"Privacy Policy","permalink":"/docs/user/privacy"}}'),n=r("85893"),o=r("50065");let d={title:"Repository Management",summary:"Repository Management"},a="Repository management",i={},c=[{value:"Official repositories",id:"official-repositories",level:2},{value:"Repository management commands",id:"repository-management-commands",level:2}];function l(e){let s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"repository-management",children:"Repository management"})}),"\n",(0,n.jsxs)(s.p,{children:["Solus offers two main software sources: stable (shannon) and unstable. The ",(0,n.jsx)(s.code,{children:"eopkg"})," package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor."]}),"\n",(0,n.jsx)(s.h2,{id:"official-repositories",children:"Official repositories"}),"\n",(0,n.jsx)(s.p,{children:"The official Solus repositories are:"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Repository"}),(0,n.jsx)(s.th,{children:"URL"}),(0,n.jsx)(s.th,{children:"Notes"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Stable (shannon)"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"})}),(0,n.jsx)(s.td,{children:"Default software source."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Unstable"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"})}),(0,n.jsx)(s.td,{children:"Only use this source if build Solus packages or you test new software before it moves to the stable source."})]})]})]}),"\n",(0,n.jsxs)(s.admonition,{type:"danger",children:[(0,n.jsxs)(s.p,{children:["Updating your system while using the ",(0,n.jsx)(s.strong,{children:"unstable"})," source might be risky."]}),(0,n.jsxs)(s.p,{children:["Before updating, check the ",(0,n.jsx)(s.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:"#solus-packaging"})," Matrix room."]})]}),"\n",(0,n.jsx)(s.h2,{id:"repository-management-commands",children:"Repository management commands"}),"\n",(0,n.jsxs)(s.p,{children:["The following table lists the ",(0,n.jsx)(s.code,{children:"eopkg"})," commands you can use to manage your software sources."]}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Action"}),(0,n.jsx)(s.th,{children:"Command"}),(0,n.jsx)(s.th,{children:"Example"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Add a repository"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg add-repo NAME URL"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg add-repo Example https://example.com/repo/eopkg-index.xml.xz"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Remove a repository"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg remove-repo NAME"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg remove-repo Example"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Enable a repository"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg enable-repo NAME"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg enable-repo Example"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Disable a repository"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg disable-repo NAME"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg disable-repo Example"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Update a repository"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg update-repo NAME"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg update-repo Example"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Update all repositories"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg update-repo"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"sudo eopkg update-repo"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"List repositories added to your system"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"eopkg list-repo"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"eopkg list-repo"})})]})]})]})]})}function h(e={}){let{wrapper:s}={...(0,o.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},50065:function(e,s,r){r.d(s,{Z:function(){return a},a:function(){return d}});var t=r(67294);let n={},o=t.createContext(n);function d(e){let s=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/47b97f63.a5802b6e.js b/assets/js/47b97f63.a5802b6e.js
new file mode 100644
index 000000000..fdb183e92
--- /dev/null
+++ b/assets/js/47b97f63.a5802b6e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4842"],{40552:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Compatibility","slug":"/category/compatibility","permalink":"/docs/category/compatibility","sidebar":"userSidebar","navigation":{"previous":{"title":"Hardware","permalink":"/docs/user/hardware/"},"next":{"title":"Laptops","permalink":"/docs/user/hardware/compatibility/laptops"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/47b97f63.dbbcd3f9.js b/assets/js/47b97f63.dbbcd3f9.js
deleted file mode 100644
index 3eb259341..000000000
--- a/assets/js/47b97f63.dbbcd3f9.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[834],{54517:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Compatibility","slug":"/category/compatibility","permalink":"/docs/category/compatibility","sidebar":"userSidebar","navigation":{"previous":{"title":"Hardware","permalink":"/docs/user/hardware/"},"next":{"title":"Laptops","permalink":"/docs/user/hardware/compatibility/laptops"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/4802fa93.68b985c8.js b/assets/js/4802fa93.68b985c8.js
deleted file mode 100644
index 4503975c0..000000000
--- a/assets/js/4802fa93.68b985c8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1774],{48815:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var n=o(85893),s=o(11151);const i={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},a=void 0,l={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},h=[{value:"The problem",id:"the-problem",level:2},{value:"Introducing the Solus MATE Transition Tool",id:"introducing-the-solus-mate-transition-tool",level:2},{value:"How the Mate Transition Tool is actually part of our Python2 work",id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]}),"\n",(0,n.jsx)(t.h2,{id:"the-problem",children:"The problem"}),"\n",(0,n.jsxs)(t.p,{children:["MATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of ",(0,n.jsx)(t.code,{children:"eopkg"})," commands. We're pretty sure our resident ",(0,n.jsx)(t.code,{children:"bash"})," script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know ",(0,n.jsx)(t.em,{children:"you"})," follow Solus news; after all, you're reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?"]}),"\n",(0,n.jsx)(t.h2,{id:"introducing-the-solus-mate-transition-tool",children:"Introducing the Solus MATE Transition Tool"}),"\n",(0,n.jsxs)(t.p,{children:["We're pleased to show off the ",(0,n.jsx)(t.em,{children:"MATE Transition Tool"}),", which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here's how MATE users will encounter the tool:"]}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsx)(t.p,{children:"These screenshots are current as of the publishing of this post, we may change things as we continue testing."})}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Users will get a notification on every start-up informing them that they need to transition away from MATE."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Notification: Solus Transition Service",src:o(64792).Z+"",width:"812",height:"333"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsx)(t.li,{children:"Clicking on that notification will launch the Solus MATE Transition Tool."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"MATE Transition Tool Launch",src:o(46311).Z+"",width:"1134",height:"673"})}),"\n",(0,n.jsxs)(t.ol,{start:"3",children:["\n",(0,n.jsx)(t.li,{children:"Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot"}),"\n",(0,n.jsx)(t.li,{children:"The tool removes itself after a successful transition."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Simple. At least, that's what we want users to think."}),"\n",(0,n.jsx)(t.h2,{id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",children:"How the Mate Transition Tool is actually part of our Python2 work"}),"\n",(0,n.jsxs)(t.p,{children:["The story of the MATE Transition Tool is actually tied up in our fight to drag ",(0,n.jsx)(t.code,{children:"eopkg"})," into the current decade. As I wrote previously, we're somewhat embarrassed by the amount of Solus tooling which ",(0,n.jsx)(t.em,{children:"still"})," relies on Python2. One such tool is the Solus Software Center ",(0,n.jsx)(t.code,{children:"solus-sc"}),". A while back, the team decided the sane thing to do was to ditch ",(0,n.jsx)(t.code,{children:"solus-sc"})," in favor of ",(0,n.jsx)(t.em,{children:"KDE Discover"})," and ",(0,n.jsx)(t.em,{children:"GNOME Software"})," . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is ",(0,n.jsx)(t.em,{children:"Discover"})," and ",(0,n.jsx)(t.em,{children:"Software"})," have no way to talk to our package manager ",(0,n.jsx)(t.code,{children:"eopkg"}),". We need an API. Luckily, other projects have encountered the same issue, leading to ",(0,n.jsx)(t.a,{href:"https://www.freedesktop.org/software/PackageKit/pk-intro.html",children:(0,n.jsx)(t.code,{children:"packagekit"})}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Joey has been doing the dirty work of bolting ",(0,n.jsx)(t.code,{children:"packagekit"})," support onto ",(0,n.jsx)(t.code,{children:"eopkg"}),", and saw an opportunity: If ",(0,n.jsx)(t.code,{children:"eopkg"})," could be upgraded to understand some of ",(0,n.jsx)(t.code,{children:"packagekit"}),", then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We're rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking ",(0,n.jsx)(t.code,{children:"solus-sc"})," off ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"the list."})]})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},46311:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/MTT-launch-9408fee2f5bfdf5d356638dab8047dd0.png"},64792:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/notification-1be98b16b9621bf36eac8d89defb71e6.png"},11151:(e,t,o)=>{o.d(t,{Z:()=>l,a:()=>a});var n=o(67294);const s={},i=n.createContext(s);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4802fa93.ee0589fc.js b/assets/js/4802fa93.ee0589fc.js
new file mode 100644
index 000000000..dc3d4c425
--- /dev/null
+++ b/assets/js/4802fa93.ee0589fc.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8397"],{13955:function(e,t,o){o.r(t),o.d(t,{assets:function(){return l},contentTitle:function(){return r},default:function(){return d},frontMatter:function(){return a},metadata:function(){return n},toc:function(){return h}});var n=o(82417),s=o(85893),i=o(50065);let a={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},r=void 0,l={authorsImageUrls:[void 0]},h=[{value:"The problem",id:"the-problem",level:2},{value:"Introducing the Solus MATE Transition Tool",id:"introducing-the-solus-mate-transition-tool",level:2},{value:"How the Mate Transition Tool is actually part of our Python2 work",id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",level:2}];function c(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Back in our ",(0,s.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,s.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]}),"\n",(0,s.jsx)(t.h2,{id:"the-problem",children:"The problem"}),"\n",(0,s.jsxs)(t.p,{children:["MATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of ",(0,s.jsx)(t.code,{children:"eopkg"})," commands. We're pretty sure our resident ",(0,s.jsx)(t.code,{children:"bash"})," script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know ",(0,s.jsx)(t.em,{children:"you"})," follow Solus news; after all, you're reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?"]}),"\n",(0,s.jsx)(t.h2,{id:"introducing-the-solus-mate-transition-tool",children:"Introducing the Solus MATE Transition Tool"}),"\n",(0,s.jsxs)(t.p,{children:["We're pleased to show off the ",(0,s.jsx)(t.em,{children:"MATE Transition Tool"}),", which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here's how MATE users will encounter the tool:"]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"These screenshots are current as of the publishing of this post, we may change things as we continue testing."})}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Users will get a notification on every start-up informing them that they need to transition away from MATE."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Notification: Solus Transition Service",src:o(35922).Z+"",width:"812",height:"333"})}),"\n",(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsx)(t.li,{children:"Clicking on that notification will launch the Solus MATE Transition Tool."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"MATE Transition Tool Launch",src:o(34898).Z+"",width:"1134",height:"673"})}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot"}),"\n",(0,s.jsx)(t.li,{children:"The tool removes itself after a successful transition."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Simple. At least, that's what we want users to think."}),"\n",(0,s.jsx)(t.h2,{id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",children:"How the Mate Transition Tool is actually part of our Python2 work"}),"\n",(0,s.jsxs)(t.p,{children:["The story of the MATE Transition Tool is actually tied up in our fight to drag ",(0,s.jsx)(t.code,{children:"eopkg"})," into the current decade. As I wrote previously, we're somewhat embarrassed by the amount of Solus tooling which ",(0,s.jsx)(t.em,{children:"still"})," relies on Python2. One such tool is the Solus Software Center ",(0,s.jsx)(t.code,{children:"solus-sc"}),". A while back, the team decided the sane thing to do was to ditch ",(0,s.jsx)(t.code,{children:"solus-sc"})," in favor of ",(0,s.jsx)(t.em,{children:"KDE Discover"})," and ",(0,s.jsx)(t.em,{children:"GNOME Software"})," . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is ",(0,s.jsx)(t.em,{children:"Discover"})," and ",(0,s.jsx)(t.em,{children:"Software"})," have no way to talk to our package manager ",(0,s.jsx)(t.code,{children:"eopkg"}),". We need an API. Luckily, other projects have encountered the same issue, leading to ",(0,s.jsx)(t.a,{href:"https://www.freedesktop.org/software/PackageKit/pk-intro.html",children:(0,s.jsx)(t.code,{children:"packagekit"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Joey has been doing the dirty work of bolting ",(0,s.jsx)(t.code,{children:"packagekit"})," support onto ",(0,s.jsx)(t.code,{children:"eopkg"}),", and saw an opportunity: If ",(0,s.jsx)(t.code,{children:"eopkg"})," could be upgraded to understand some of ",(0,s.jsx)(t.code,{children:"packagekit"}),", then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We're rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking ",(0,s.jsx)(t.code,{children:"solus-sc"})," off ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"the list."})]})]})}function d(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},34898:function(e,t,o){o.d(t,{Z:function(){return n}});let n=o.p+"assets/images/MTT-launch-9408fee2f5bfdf5d356638dab8047dd0.png"},35922:function(e,t,o){o.d(t,{Z:function(){return n}});let n=o.p+"assets/images/notification-1be98b16b9621bf36eac8d89defb71e6.png"},50065:function(e,t,o){o.d(t,{Z:function(){return r},a:function(){return a}});var n=o(67294);let s={},i=n.createContext(s);function a(e){let t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}},82417:function(e){e.exports=JSON.parse('{"permalink":"/blog/don\'t-call-me-mate-pal","source":"@site/devlog/2024-01-29-dont-call-me-mate.md","title":"Don\'t call me MATE, pal!","description":"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.","date":"2024-01-29T00:00:00.000Z","tags":[{"inline":true,"label":"MATE","permalink":"/blog/tags/mate"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":2.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"Don\'t call me MATE, pal!","slug":"don\'t-call-me-mate-pal","authors":"david","tags":["MATE","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"},"nextItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/49b71c16.970cd721.js b/assets/js/49b71c16.970cd721.js
new file mode 100644
index 000000000..e1af8ca82
--- /dev/null
+++ b/assets/js/49b71c16.970cd721.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["545"],{2872:function(e,n,i){i.r(n),i.d(n,{metadata:()=>s,contentTitle:()=>l,default:()=>h,assets:()=>d,toc:()=>r,frontMatter:()=>t});var s=JSON.parse('{"id":"packaging/packaging-practices","title":"Packaging Practices","description":"The primary goal of ypkg is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices.","source":"@site/docs/packaging/packaging-practices.md","sourceDirName":"packaging","slug":"/packaging/packaging-practices","permalink":"/docs/packaging/packaging-practices","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-practices.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Packaging Practices","summary":"Learning the best packaging practices"},"sidebar":"packagingSidebar","previous":{"title":"Package YAML","permalink":"/docs/packaging/package.yml"},"next":{"title":"Procedures","permalink":"/docs/category/procedures"}}'),a=i("85893"),c=i("50065");let t={title:"Packaging Practices",summary:"Learning the best packaging practices"},l="Packaging Practices",d={},r=[{value:"Package naming",id:"package-naming",level:2},{value:"The devel subpackage",id:"the-devel-subpackage",level:3},{value:"The docs subpackage",id:"the-docs-subpackage",level:3},{value:"The 32bit subpackage",id:"the-32bit-subpackage",level:3},{value:"The utils subpackage",id:"the-utils-subpackage",level:3},{value:"Maintenance",id:"maintenance",level:2},{value:"Licenses",id:"licenses",level:2},{value:"Build dependencies",id:"build-dependencies",level:2},{value:"Background",id:"background",level:3},{value:"Finding what package provides a pkgconfig dependency (if any)",id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",level:3},{value:"Using pkgconfig dependencies",id:"using-pkgconfig-dependencies",level:3},{value:"Using explicitly named dependencies",id:"using-explicitly-named-dependencies",level:3},{value:"Runtime dependencies",id:"runtime-dependencies",level:2},{value:"Check dependencies",id:"check-dependencies",level:2},{value:"Example",id:"example",level:3},{value:"Patching / extra files",id:"patching--extra-files",level:2},{value:"Applying a patch",id:"applying-a-patch",level:3},{value:"Handling multiple patches",id:"handling-multiple-patches",level:4},{value:"Installing extra files",id:"installing-extra-files",level:2},{value:"Patterns",id:"patterns",level:2},{value:"Replace / rename",id:"replace--rename",level:2}];function o(e){let n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"packaging-practices",children:"Packaging Practices"})}),"\n",(0,a.jsxs)(n.p,{children:["The primary goal of ",(0,a.jsx)(n.code,{children:"ypkg"})," is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices."]}),"\n",(0,a.jsx)(n.p,{children:"The next few sections will detail these."}),"\n",(0,a.jsx)(n.h2,{id:"package-naming",children:"Package naming"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ypkg"})," tool does not allow for custom subpackages or subpackage naming, and will enforce its own policy. This can be eased somewhat through the use of ",(0,a.jsx)(n.code,{children:"patterns"}),", however the available subpackage names are limited."]}),"\n",(0,a.jsxs)(n.p,{children:["We request you use (where possible) the upstream source name for your package. Subpackage names (when generated) are constructed by using the ",(0,a.jsx)(n.code,{children:"name"})," value first, then applying the subpackage name as such:"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"pkgname-$subpackage"})}),"\n",(0,a.jsxs)(n.p,{children:["Subpackages are fully automatic with ",(0,a.jsx)(n.code,{children:"ypkg"}),", and are created based on file patterns. All subpackages automatically depend on the main package, to ensure correct operation. In the following explanations, ",(0,a.jsx)(n.code,{children:"$lib"})," is used to refer to the host library directory, i.e. ",(0,a.jsx)(n.code,{children:"lib"})," or ",(0,a.jsx)(n.code,{children:"lib64"})," (or ",(0,a.jsx)(n.code,{children:"lib32"})," on ",(0,a.jsx)(n.code,{children:"emul32"})," builds)."]}),"\n",(0,a.jsx)(n.p,{children:"For the libraries / packages of the following programming languages, you should typically use the following template for it."}),"\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{children:"Language"}),(0,a.jsx)(n.th,{children:"Prefix"}),(0,a.jsx)(n.th,{children:"Example"})]})}),(0,a.jsxs)(n.tbody,{children:[(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Haskell"}),(0,a.jsx)(n.td,{children:(0,a.jsx)(n.code,{children:"haskell-"})}),(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.code,{children:"text-binary"})," would be ",(0,a.jsx)(n.code,{children:"haskell-text-binary"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Perl"}),(0,a.jsx)(n.td,{children:(0,a.jsx)(n.code,{children:"perl-"})}),(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.code,{children:"algorithm-diff"})," would be ",(0,a.jsx)(n.code,{children:"perl-algorithm-diff"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Python"}),(0,a.jsx)(n.td,{children:(0,a.jsx)(n.code,{children:"python-"})}),(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.code,{children:"wikipedia"})," would be ",(0,a.jsx)(n.code,{children:"python-wikipedia"})," ",(0,a.jsx)(n.strong,{children:"even if only Python3 is enabled"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Ruby"}),(0,a.jsx)(n.td,{children:(0,a.jsx)(n.code,{children:"ruby-"})}),(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.code,{children:"gssapi"})," would be ",(0,a.jsx)(n.code,{children:"ruby-gssapi"})]})]})]})]}),"\n",(0,a.jsx)(n.h3,{id:"the-devel-subpackage",children:"The devel subpackage"}),"\n",(0,a.jsxs)(n.p,{children:["This is invariably created for packages that provide libraries and development headers. The following rules will result in files being placed in a ",(0,a.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"/usr/include\n/usr/$lib/lib*.so\n/usr/$lib/lib*.a\n/usr/share/man/man3\n/usr/share/pkgconfig\n/usr/$lib/pkgconfig\n/usr/share/cmake\n/usr/share/vala\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Note that for some packages, ",(0,a.jsx)(n.code,{children:"/usr/$lib/lib*.so"})," files are not symlinks. In this instance, the main package will be broken with no library files present. This can quickly be determined by looking at the resulting ",(0,a.jsx)(n.code,{children:"pspec_*.xml"})," file generated after running the build.\nIf this happens, simply override with ",(0,a.jsx)(n.code,{children:"patterns"})," or set ",(0,a.jsx)(n.code,{children:"libsplit"})," to \u201Cno\u201D."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"A note on static archives"}),": Unless it is absolutely unavoidable, you should disable static libraries within your build. This is usually fixed by adding ",(0,a.jsx)(n.code,{children:"--disable-static"})," to your configure routine. If ",(0,a.jsx)(n.code,{children:"*.a"})," files are shown in your packaging request, it will be questioned, as they can pose a greater security risk if packages link against these static archives."]}),"\n",(0,a.jsx)(n.h3,{id:"the-docs-subpackage",children:"The docs subpackage"}),"\n",(0,a.jsxs)(n.p,{children:["Currently there is only one pattern which is forced into a ",(0,a.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"/usr/share/gtk-doc/html\n"})}),"\n",(0,a.jsxs)(n.p,{children:["If required, you can use ",(0,a.jsx)(n.code,{children:"patterns"})," to move other files into the ",(0,a.jsx)(n.code,{children:"docs"})," subpackage, reducing the size of the main package."]}),"\n",(0,a.jsx)(n.h3,{id:"the-32bit-subpackage",children:"The 32bit subpackage"}),"\n",(0,a.jsxs)(n.p,{children:["This subpackage is only generated during an ",(0,a.jsx)(n.code,{children:"emul32"})," build. The following paths will automatically be placed into a ",(0,a.jsx)(n.code,{children:"32bit"})," subpackage"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"/usr/lib32/lib*.so\n/usr/lib32/lib*.so.*\n/usr/lib32/lib*.a\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Note the same static archive rules apply to ",(0,a.jsx)(n.code,{children:"32bit"})," packages. These packages aren\u2019t as heavily split as we try to discourage their use, though they must be provided in some instances."]}),"\n",(0,a.jsx)(n.h3,{id:"the-utils-subpackage",children:"The utils subpackage"}),"\n",(0,a.jsxs)(n.p,{children:["This is not an automatic subpackage, you must use ",(0,a.jsx)(n.code,{children:"patterns"})," to utilize it. It is provided for instances that it may not be suitable to have binaries present, i.e. for a library package."]}),"\n",(0,a.jsx)(n.h2,{id:"maintenance",children:"Maintenance"}),"\n",(0,a.jsxs)(n.p,{children:["When submitting a changed ",(0,a.jsx)(n.code,{children:"package.yml"}),", it must be accompanied by its corresponding ",(0,a.jsx)(n.code,{children:"pspec_*.xml"})," file, which was generated at build time. This machine file allows the repository maintainers to evaluate the package condition."]}),"\n",(0,a.jsxs)(n.p,{children:["When providing a new version of a package, or a fix, always ensure you increment the ",(0,a.jsx)(n.code,{children:"release"})," number by 1. This ensures that users of your package are correctly updated to the latest version."]}),"\n",(0,a.jsxs)(n.p,{children:["Never submit a package without having first tested it, and ensuring it builds within ",(0,a.jsx)(n.code,{children:"solbuild"}),", a clean chroot environment."]}),"\n",(0,a.jsx)(n.h2,{id:"licenses",children:"Licenses"}),"\n",(0,a.jsxs)(n.p,{children:["All new packages or updates to packages should abide by the ",(0,a.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX 3.x"})," definitions, with the following policy:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"-only"})," licenses, such as ",(0,a.jsx)(n.code,{children:"GPL-2.0-only"}),", should ",(0,a.jsx)(n.strong,{children:"only be declared"}),' as such when the upstream explicitly states "only", otherwise it should always be ',(0,a.jsx)(n.code,{children:"-or-later"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"build-dependencies",children:"Build dependencies"}),"\n",(0,a.jsxs)(n.admonition,{type:"note",children:[(0,a.jsxs)(n.p,{children:["Build dependencies should be ordered according to the following rules in ",(0,a.jsx)(n.code,{children:"package.yml"}),":"]}),(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"pkgconfig"})," dependencies before explicitly named dependencies"]}),"\n",(0,a.jsxs)(n.li,{children:["Each of these two groups in so-called ASCIIbetical order (that is, alphabetical order with all uppercase letters before lowercase letters, and digits/punctuation before letters, ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ASCII#Character_order",children:"see here"}),")"]}),"\n"]}),(0,a.jsx)(n.p,{children:"Example:"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"builddeps :\n - pkgconfig(MYGUI)\n - pkgconfig(Qt5Core)\n - pkgconfig(ayatana-appindicator-0.1)\n - pkgconfig(dri)\n - pkgconfig(gtk+-3.0)\n - The-Powder-Toy\n - abcMIDI\n - abcm2ps\n - git\n - python-poetry\n - swig\n"})})]}),"\n",(0,a.jsx)(n.h3,{id:"background",children:"Background"}),"\n",(0,a.jsx)(n.p,{children:"Most software packages that you build will, in one way or another, depend on another software package to provide specific functionality. This is usually achieved by using a library."}),"\n",(0,a.jsx)(n.p,{children:"Any package that is submitted to our repositories is always built in a clean chroot environment. Therefore, any dependencies required to build that package in a reproducible and sane fashion must be listed."}),"\n",(0,a.jsxs)(n.p,{children:["This is achieved by populating the ",(0,a.jsx)(n.code,{children:"builddeps"})," key with a list of build dependencies. We support two kinds of build dependencies: explicitly named, or ",(0,a.jsx)(n.code,{children:"pkgconfig"})," dependencies."]}),"\n",(0,a.jsxs)(n.p,{children:["We prefer the use of ",(0,a.jsx)(n.code,{children:"pkgconfig"})," dependencies. Most modern software will use the ",(0,a.jsx)(n.code,{children:"pkg-config"})," tool (package configuration) to determine which files are required to build the current software. This may include compiler flags, library to link against and where the package headers are located."]}),"\n",(0,a.jsxs)(n.p,{children:["An obvious advantage to supporting ",(0,a.jsx)(n.code,{children:"pkgconfig"})," dependencies is that there is a 1:1 mapping between the name requested by the build and the name used within the ",(0,a.jsx)(n.code,{children:"package.yml"}),". Instead of trying to hunt down the package providing that dependency, you simply list the same name. Any package in the repository will export information about the ",(0,a.jsx)(n.code,{children:".pc"})," files (for ",(0,a.jsx)(n.code,{children:"pkg-config"}),") it contains, enabling you to use those as a build dependency."]}),"\n",(0,a.jsxs)(n.p,{children:["A secondary advantage is that this allows for easily switching or replacing a providing package. When no ",(0,a.jsx)(n.code,{children:"pkgconfig"})," name is available (some packages do not provide these, or it doesn\u2019t make sense for them to), you may use the explicit package name. Always ensure you select the correct package, i.e. the ",(0,a.jsx)(n.code,{children:"-devel"})," subpackage. This provides the necessary symlinks and headers to build packages."]}),"\n",(0,a.jsx)(n.h3,{id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",children:"Finding what package provides a pkgconfig dependency (if any)"}),"\n",(0,a.jsxs)(n.p,{children:["You can use ",(0,a.jsx)(n.code,{children:"go-task"})," to find packages that satisfy ",(0,a.jsx)(n.code,{children:"pkgconfig"})," dependencies. It can search for multiple dependencies at once."]}),"\n",(0,a.jsxs)(n.p,{children:["As an example, if you know a package has the build dependencies ",(0,a.jsx)(n.code,{children:"Qt5Core"})," and ",(0,a.jsx)(n.code,{children:"Qt6Core"}),", you would run:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"go-task pkgconfig -- Qt5Core Qt6Core\n"})}),"\n",(0,a.jsx)(n.p,{children:"This will output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"pkgconfig(Qt5Core) found in: qt5-base-devel\npkgconfig(Qt6Core) found in: qt6-base-devel\n"})}),"\n",(0,a.jsxs)(n.p,{children:["You can also determine if there are ",(0,a.jsx)(n.code,{children:"pkgconfigs"})," available from a ",(0,a.jsx)(n.code,{children:"-devel"})," package by doing ",(0,a.jsx)(n.code,{children:"eopkg info (name)"})," and looking for the ",(0,a.jsx)(n.code,{children:"Provides"})," key."]}),"\n",(0,a.jsx)(n.p,{children:"Example:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"eopkg info libgtk-3-devel\n"})}),"\n",(0,a.jsx)(n.p,{children:"In output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"Provides: pkgconfig(gtk+-3.0) pkgconfig(gdk-3.0) pkgconfig(gdk-wayland-3.0) pkgconfig(gail-3.0) pkgconfig(gdk-x11-3.0) pkgconfig(gtk+-unix-print-3.0)\npkgconfig(gtk+-wayland-3.0) pkgconfig(gtk+-x11-3.0)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"using-pkgconfig-dependencies",children:"Using pkgconfig dependencies"}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.code,{children:"builddeps"})," list, use the ",(0,a.jsx)(n.code,{children:"pkgconfig(name)"})," syntax. For example, to add ",(0,a.jsx)(n.code,{children:"gtk+-3.0"})," to the build dependencies, you would do the following:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - pkgconfig(gtk+-3.0)\n"})}),"\n",(0,a.jsxs)(n.p,{children:["At build time the appropriate provider package is selected, in this instance ",(0,a.jsx)(n.code,{children:"libgtk-3-devel"})]}),"\n",(0,a.jsx)(n.h3,{id:"using-explicitly-named-dependencies",children:"Using explicitly named dependencies"}),"\n",(0,a.jsxs)(n.p,{children:["When there is not a ",(0,a.jsx)(n.code,{children:"pkgconfig"})," dependency available, use an explicitly named dependency.\nSimply list the package name."]}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["When a ",(0,a.jsx)(n.code,{children:"pkgconfig"})," dependency is available you will be asked to use that instead."]})}),"\n",(0,a.jsx)(n.p,{children:"Example:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - stk-devel\n"})}),"\n",(0,a.jsx)(n.h2,{id:"runtime-dependencies",children:"Runtime dependencies"}),"\n",(0,a.jsxs)(n.p,{children:["Runtime dependencies are extra packages that a package needs in order to function correctly. A common example of this is other libraries. Solus ",(0,a.jsx)(n.code,{children:"eopkg"})," packages will automatically add any binary dependencies at runtime, so that you do not have to."]}),"\n",(0,a.jsxs)(n.p,{children:["All ",(0,a.jsx)(n.code,{children:"devel"})," subpackages automatically depend on their parent package. On top of this, if they provide a ",(0,a.jsx)(n.code,{children:".pc"})," pkg-config file, we export this information, and automatically determine the packages this particular package would need to be able to build against correctly. As such, the majority of dependencies for builds are automatically resolved."]}),"\n",(0,a.jsx)(n.p,{children:"In certain instances, binary dependencies aren\u2019t enough. An example of this might be an extra Python package, or a font, something that is not accounted for by binary checks."}),"\n",(0,a.jsxs)(n.p,{children:["To account for this, you may add extra explicit runtime dependencies to your package. These are taken from the optional ",(0,a.jsx)(n.code,{children:"rundeps"})," ypkg key."]}),"\n",(0,a.jsxs)(n.p,{children:["This key uses the ",(0,a.jsx)(n.code,{children:"dict(s)"})," type, and the default key is the current package ",(0,a.jsx)(n.code,{children:"name"}),". You may express a different subpackage to apply dependencies to by using that name as a key, i.e. ",(0,a.jsx)(n.code,{children:"devel"}),", or ",(0,a.jsx)(n.code,{children:"docs"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"This would add the \u201Cpython-gobject\u201D runtime dependency to the main package:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This would add the same dependency, as well as adding it to the ",(0,a.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel: python-gobject\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Remember this uses the ",(0,a.jsx)(n.code,{children:"dict(s)"})," type, which is very flexible. You can equally express this as follows (adding more deps as an example):"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel:\n - somepackage\n - someotherpackage\n"})}),"\n",(0,a.jsx)(n.h2,{id:"check-dependencies",children:"Check dependencies"}),"\n",(0,a.jsxs)(n.p,{children:["Check dependencies are a special kind of build dependency reserved for automatic package testing by ",(0,a.jsx)(n.code,{children:"solbuild"}),". Check dependencies should only be used during the ",(0,a.jsx)(n.code,{children:"check"})," build phase.\nWhen a package is part of an automatic build sequence, these dependencies will ",(0,a.jsx)(n.strong,{children:"not"})," be considered when determining build order."]}),"\n",(0,a.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,a.jsxs)(n.p,{children:["The package ",(0,a.jsx)(n.code,{children:"cbindgen"})," includes ",(0,a.jsx)(n.code,{children:"cython"})," in ",(0,a.jsx)(n.code,{children:"checkdeps"})," to run tests in the ",(0,a.jsx)(n.code,{children:"check"})," phase."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://github.com/getsolus/packages/blob/main/packages/c/cbindgen/package.yml",children:"cbindgen package.yml file"})}),"\n",(0,a.jsx)(n.h2,{id:"patching--extra-files",children:"Patching / extra files"}),"\n",(0,a.jsxs)(n.p,{children:["Files that may be required during the build can be accessed via the ",(0,a.jsx)(n.code,{children:"$pkgfiles"})," variable. Note that you must store your files in the ",(0,a.jsx)(n.code,{children:"./files"})," directory relative to your ",(0,a.jsx)(n.code,{children:"package.yml"})]}),"\n",(0,a.jsxs)(n.p,{children:["Both patches and extra files (such as systemd units) are stored in this directory. Note that if your patch is to address a ",(0,a.jsx)(n.strong,{children:"CVE"}),", you must use the following naming scheme: ",(0,a.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.patch"})]}),"\n",(0,a.jsxs)(n.p,{children:["Where ",(0,a.jsx)(n.code,{children:"xxxx-xxxx"})," is replaced with the full CVE ID. Complying with this simple rule ensures that we can know at any time the security status of packages when using tools such as ",(0,a.jsx)(n.code,{children:"cve-check-tool"}),"\nkept\nSolus tooling allows the use of ",(0,a.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.nopatch"})," (which isn't applied in the build) to indicate that a CVE has been validated as not applicable to the Solus package. This can be because another patch resolves this CVE, or there is a false positive via ",(0,a.jsx)(n.code,{children:"cve-check-tool"}),". The contents of the file can describe why it doesn't apply without requiring a patch (i.e. Resolved by cve-xxxx-xxxx.patch)."]}),"\n",(0,a.jsx)(n.h3,{id:"applying-a-patch",children:"Applying a patch"}),"\n",(0,a.jsxs)(n.p,{children:["It is common practice to apply the patch file(s) within the ",(0,a.jsx)(n.code,{children:"setup"})," section of your build staging. We can achieve this using the ",(0,a.jsx)(n.code,{children:"%patch"})," macro, and the ",(0,a.jsx)(n.code,{children:"$pkgfiles"})," variable. In this example, the required file is located at ",(0,a.jsx)(n.code,{children:"./files/0002-Sample-commit-2.patch"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"%patch -p1 -i $pkgfiles/0002-Sample-commit-2.patch\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Note you use the macro as you would normally use the ",(0,a.jsx)(n.code,{children:"patch"})," command, however use of the macro ensures it performs a clean batch-mode patch."]}),"\n",(0,a.jsxs)(n.p,{children:["If you are using compressed patches, i.e. for the ",(0,a.jsx)(n.code,{children:"bash"})," or ",(0,a.jsx)(n.code,{children:"readline"})," packages, you can pipe the call through ",(0,a.jsx)(n.code,{children:"zcat"})," or similar:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"zcat $pkgfiles/bash43-032.gz | %patch -p0\n"})}),"\n",(0,a.jsx)(n.h4,{id:"handling-multiple-patches",children:"Handling multiple patches"}),"\n",(0,a.jsxs)(n.p,{children:["In the event you need to apply multiple patches, such as a multitude of CVE patches, it may be sensible to use our ",(0,a.jsx)(n.code,{children:"%apply_patches"})," macro, which will apply all the patches listed in a ",(0,a.jsx)(n.code,{children:"series"})," file in your package's ",(0,a.jsx)(n.code,{children:"./files"})," folder. Example below:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch\nfix-silliness.patch\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Both of the files above will be applied using stripping number ",(0,a.jsx)(n.code,{children:"-p1"}),". If you need to use a different stripping number, like ",(0,a.jsx)(n.code,{children:"-p4"}),", you can write:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch -p4\nfix-silliness.patch\n"})}),"\n",(0,a.jsx)(n.h2,{id:"installing-extra-files",children:"Installing extra files"}),"\n",(0,a.jsxs)(n.p,{children:["We recommend using patches where possible first, as they ensure correct maintenance and will be updated across package versions. If you must install extra files into the directory, please use the ",(0,a.jsx)(n.code,{children:"install"})," command, ensuring you set the correct permissions. Again, files are accessible from the ",(0,a.jsx)(n.code,{children:"./files"})," directory, relative to ",(0,a.jsx)(n.code,{children:"package.yml"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["This is an example of installing a custom profile file, seen in the ",(0,a.jsx)(n.code,{children:"bash"})," package:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"install -m 0644 $pkgfiles/profile $installdir/etc/profile\n"})}),"\n",(0,a.jsx)(n.h2,{id:"patterns",children:"Patterns"}),"\n",(0,a.jsxs)(n.p,{children:["In most instances, ",(0,a.jsx)(n.code,{children:"ypkg"})," will assign the correct location for files, whether it be in the main ",(0,a.jsx)(n.code,{children:"name"})," package, or a subpackage. However there may be instances where the default does not match the intended behaviour."]}),"\n",(0,a.jsx)(n.p,{children:"In these instances it is possible to override the default assignment by way of patterns. These are simply a list of paths or globs to ensure a particular file, or set of files, end up in the desired location."}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"patterns"})," key expects a ",(0,a.jsx)(n.code,{children:"dict(s)"})," argument. The default key for each pattern is assumed to be the ",(0,a.jsx)(n.code,{children:"name"})," of the package, so omitting the name would place files into the main package. The value should be a path or pattern you wish to match, ensuring files go to a specific location."]}),"\n",(0,a.jsxs)(n.p,{children:["In this example from ",(0,a.jsx)(n.code,{children:"libjpeg-turbo"}),", we move all documentation into the ",(0,a.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"patterns:\n - docs: [/usr/share/man]\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This example, taken from the ",(0,a.jsx)(n.code,{children:"wayland"})," package, ensures the binaries from ",(0,a.jsx)(n.code,{children:"/usr/bin"})," and the directory ",(0,a.jsx)(n.code,{children:"/usr/share/wayland"})," are located in the ",(0,a.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"patterns:\n - devel:\n - /usr/bin\n - /usr/share/wayland\n"})}),"\n",(0,a.jsx)(n.h2,{id:"replace--rename",children:"Replace / rename"}),"\n",(0,a.jsxs)(n.p,{children:["In some situations, it may be required to replace one package with another, or to rename an existing package. In these instances you should coordinate with a repository maintainer to ensure the replaced package is marked ",(0,a.jsx)(n.strong,{children:"Obsolete"})," within the index. This will ensure correct upgrade paths for users."]}),"\n",(0,a.jsxs)(n.p,{children:["Note that to retire a package, you must also coordinate with a repository maintainer. An ",(0,a.jsx)(n.strong,{children:"Obsolete"})," package is removed by the package manager when the user upgrades. As such, correct upgrade paths need to be established."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"replaces"})," ypkg key uses the ",(0,a.jsx)(n.code,{children:"dict(s)"})," type, and the default key is assumed to be the current package ",(0,a.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In this example, we rename the ",(0,a.jsx)(n.code,{children:"libgeoclue*"})," packages to use the correct names, and ensure a working upgrade path."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"replaces:\n - devel: libgeoclue-devel\n - libgeoclue\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"name"})," of this package is ",(0,a.jsx)(n.code,{children:"geoclue"}),", and the new package names are now:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"geoclue"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"geoclue-devel"})}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Given the ",(0,a.jsx)(n.code,{children:"replaces"})," values above, ",(0,a.jsx)(n.code,{children:"geoclue"})," now replaces ",(0,a.jsx)(n.code,{children:"libgeoclue"}),", and ",(0,a.jsx)(n.code,{children:"geoclue-devel"})," replaces ",(0,a.jsx)(n.code,{children:"libgeoclue-devel"}),". This is entirely transparent to the user, with a seamless update replacing the old packages with the new renamed packages."]}),"\n",(0,a.jsxs)(n.p,{children:["The repository maintainer marked the old names as ",(0,a.jsx)(n.strong,{children:"Obsolete"})," in the index."]})]})}function h(e={}){let{wrapper:n}={...(0,c.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(o,{...e})}):o(e)}},50065:function(e,n,i){i.d(n,{Z:function(){return l},a:function(){return t}});var s=i(67294);let a={},c=s.createContext(a);function t(e){let n=s.useContext(c);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/49b71c16.eabd15cf.js b/assets/js/49b71c16.eabd15cf.js
deleted file mode 100644
index 5a1c46c15..000000000
--- a/assets/js/49b71c16.eabd15cf.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3783],{99937:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>d,toc:()=>r});var s=i(85893),a=i(11151);const c={title:"Packaging Practices",summary:"Learning the best packaging practices"},t="Packaging Practices",d={id:"packaging/packaging-practices",title:"Packaging Practices",description:"The primary goal of ypkg is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices.",source:"@site/docs/packaging/packaging-practices.md",sourceDirName:"packaging",slug:"/packaging/packaging-practices",permalink:"/docs/packaging/packaging-practices",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-practices.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Packaging Practices",summary:"Learning the best packaging practices"},sidebar:"packagingSidebar",previous:{title:"Package YAML",permalink:"/docs/packaging/package.yml"},next:{title:"Procedures",permalink:"/docs/category/procedures"}},l={},r=[{value:"Package naming",id:"package-naming",level:2},{value:"The devel subpackage",id:"the-devel-subpackage",level:3},{value:"The docs subpackage",id:"the-docs-subpackage",level:3},{value:"The 32bit subpackage",id:"the-32bit-subpackage",level:3},{value:"The utils subpackage",id:"the-utils-subpackage",level:3},{value:"Maintenance",id:"maintenance",level:2},{value:"Licenses",id:"licenses",level:2},{value:"Build dependencies",id:"build-dependencies",level:2},{value:"Background",id:"background",level:3},{value:"Finding what package provides a pkgconfig dependency (if any)",id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",level:3},{value:"Using pkgconfig dependencies",id:"using-pkgconfig-dependencies",level:3},{value:"Using explicitly named dependencies",id:"using-explicitly-named-dependencies",level:3},{value:"Runtime dependencies",id:"runtime-dependencies",level:2},{value:"Check dependencies",id:"check-dependencies",level:2},{value:"Example",id:"example",level:3},{value:"Patching / extra files",id:"patching--extra-files",level:2},{value:"Applying a patch",id:"applying-a-patch",level:3},{value:"Handling multiple patches",id:"handling-multiple-patches",level:4},{value:"Installing extra files",id:"installing-extra-files",level:2},{value:"Patterns",id:"patterns",level:2},{value:"Replace / rename",id:"replace--rename",level:2}];function o(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"packaging-practices",children:"Packaging Practices"})}),"\n",(0,s.jsxs)(n.p,{children:["The primary goal of ",(0,s.jsx)(n.code,{children:"ypkg"})," is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices."]}),"\n",(0,s.jsx)(n.p,{children:"The next few sections will detail these."}),"\n",(0,s.jsx)(n.h2,{id:"package-naming",children:"Package naming"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"ypkg"})," tool does not allow for custom subpackages or subpackage naming, and will enforce its own policy. This can be eased somewhat through the use of ",(0,s.jsx)(n.code,{children:"patterns"}),", however the available subpackage names are limited."]}),"\n",(0,s.jsxs)(n.p,{children:["We request you use (where possible) the upstream source name for your package. Subpackage names (when generated) are constructed by using the ",(0,s.jsx)(n.code,{children:"name"})," value first, then applying the subpackage name as such:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"pkgname-$subpackage"})}),"\n",(0,s.jsxs)(n.p,{children:["Subpackages are fully automatic with ",(0,s.jsx)(n.code,{children:"ypkg"}),", and are created based on file patterns. All subpackages automatically depend on the main package, to ensure correct operation. In the following explanations, ",(0,s.jsx)(n.code,{children:"$lib"})," is used to refer to the host library directory, i.e. ",(0,s.jsx)(n.code,{children:"lib"})," or ",(0,s.jsx)(n.code,{children:"lib64"})," (or ",(0,s.jsx)(n.code,{children:"lib32"})," on ",(0,s.jsx)(n.code,{children:"emul32"})," builds)."]}),"\n",(0,s.jsx)(n.p,{children:"For the libraries / packages of the following programming languages, you should typically use the following template for it."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Language"}),(0,s.jsx)(n.th,{children:"Prefix"}),(0,s.jsx)(n.th,{children:"Example"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Haskell"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"haskell-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"text-binary"})," would be ",(0,s.jsx)(n.code,{children:"haskell-text-binary"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Perl"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"perl-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"algorithm-diff"})," would be ",(0,s.jsx)(n.code,{children:"perl-algorithm-diff"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Python"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"python-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"wikipedia"})," would be ",(0,s.jsx)(n.code,{children:"python-wikipedia"})," ",(0,s.jsx)(n.strong,{children:"even if only Python3 is enabled"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Ruby"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ruby-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"gssapi"})," would be ",(0,s.jsx)(n.code,{children:"ruby-gssapi"})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"the-devel-subpackage",children:"The devel subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is invariably created for packages that provide libraries and development headers. The following rules will result in files being placed in a ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/include\n/usr/$lib/lib*.so\n/usr/$lib/lib*.a\n/usr/share/man/man3\n/usr/share/pkgconfig\n/usr/$lib/pkgconfig\n/usr/share/cmake\n/usr/share/vala\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that for some packages, ",(0,s.jsx)(n.code,{children:"/usr/$lib/lib*.so"})," files are not symlinks. In this instance, the main package will be broken with no library files present. This can quickly be determined by looking at the resulting ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file generated after running the build.\nIf this happens, simply override with ",(0,s.jsx)(n.code,{children:"patterns"})," or set ",(0,s.jsx)(n.code,{children:"libsplit"})," to \u201cno\u201d."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"A note on static archives"}),": Unless it is absolutely unavoidable, you should disable static libraries within your build. This is usually fixed by adding ",(0,s.jsx)(n.code,{children:"--disable-static"})," to your configure routine. If ",(0,s.jsx)(n.code,{children:"*.a"})," files are shown in your packaging request, it will be questioned, as they can pose a greater security risk if packages link against these static archives."]}),"\n",(0,s.jsx)(n.h3,{id:"the-docs-subpackage",children:"The docs subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["Currently there is only one pattern which is forced into a ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/share/gtk-doc/html\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If required, you can use ",(0,s.jsx)(n.code,{children:"patterns"})," to move other files into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage, reducing the size of the main package."]}),"\n",(0,s.jsx)(n.h3,{id:"the-32bit-subpackage",children:"The 32bit subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This subpackage is only generated during an ",(0,s.jsx)(n.code,{children:"emul32"})," build. The following paths will automatically be placed into a ",(0,s.jsx)(n.code,{children:"32bit"})," subpackage"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/lib32/lib*.so\n/usr/lib32/lib*.so.*\n/usr/lib32/lib*.a\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note the same static archive rules apply to ",(0,s.jsx)(n.code,{children:"32bit"})," packages. These packages aren\u2019t as heavily split as we try to discourage their use, though they must be provided in some instances."]}),"\n",(0,s.jsx)(n.h3,{id:"the-utils-subpackage",children:"The utils subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is not an automatic subpackage, you must use ",(0,s.jsx)(n.code,{children:"patterns"})," to utilize it. It is provided for instances that it may not be suitable to have binaries present, i.e. for a library package."]}),"\n",(0,s.jsx)(n.h2,{id:"maintenance",children:"Maintenance"}),"\n",(0,s.jsxs)(n.p,{children:["When submitting a changed ",(0,s.jsx)(n.code,{children:"package.yml"}),", it must be accompanied by its corresponding ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file, which was generated at build time. This machine file allows the repository maintainers to evaluate the package condition."]}),"\n",(0,s.jsxs)(n.p,{children:["When providing a new version of a package, or a fix, always ensure you increment the ",(0,s.jsx)(n.code,{children:"release"})," number by 1. This ensures that users of your package are correctly updated to the latest version."]}),"\n",(0,s.jsxs)(n.p,{children:["Never submit a package without having first tested it, and ensuring it builds within ",(0,s.jsx)(n.code,{children:"solbuild"}),", a clean chroot environment."]}),"\n",(0,s.jsx)(n.h2,{id:"licenses",children:"Licenses"}),"\n",(0,s.jsxs)(n.p,{children:["All new packages or updates to packages should abide by the ",(0,s.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX 3.x"})," definitions, with the following policy:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-only"})," licenses, such as ",(0,s.jsx)(n.code,{children:"GPL-2.0-only"}),", should ",(0,s.jsx)(n.strong,{children:"only be declared"}),' as such when the upstream explicitly states "only", otherwise it should always be ',(0,s.jsx)(n.code,{children:"-or-later"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"build-dependencies",children:"Build dependencies"}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.p,{children:["Build dependencies should be ordered according to the following rules in ",(0,s.jsx)(n.code,{children:"package.yml"}),":"]}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies before explicitly named dependencies"]}),"\n",(0,s.jsxs)(n.li,{children:["Each of these two groups in so-called ASCIIbetical order (that is, alphabetical order with all uppercase letters before lowercase letters, and digits/punctuation before letters, ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ASCII#Character_order",children:"see here"}),")"]}),"\n"]}),(0,s.jsx)(n.p,{children:"Example:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps :\n - pkgconfig(MYGUI)\n - pkgconfig(Qt5Core)\n - pkgconfig(ayatana-appindicator-0.1)\n - pkgconfig(dri)\n - pkgconfig(gtk+-3.0)\n - The-Powder-Toy\n - abcMIDI\n - abcm2ps\n - git\n - python-poetry\n - swig\n"})})]}),"\n",(0,s.jsx)(n.h3,{id:"background",children:"Background"}),"\n",(0,s.jsx)(n.p,{children:"Most software packages that you build will, in one way or another, depend on another software package to provide specific functionality. This is usually achieved by using a library."}),"\n",(0,s.jsx)(n.p,{children:"Any package that is submitted to our repositories is always built in a clean chroot environment. Therefore, any dependencies required to build that package in a reproducible and sane fashion must be listed."}),"\n",(0,s.jsxs)(n.p,{children:["This is achieved by populating the ",(0,s.jsx)(n.code,{children:"builddeps"})," key with a list of build dependencies. We support two kinds of build dependencies: explicitly named, or ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies."]}),"\n",(0,s.jsxs)(n.p,{children:["We prefer the use of ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. Most modern software will use the ",(0,s.jsx)(n.code,{children:"pkg-config"})," tool (package configuration) to determine which files are required to build the current software. This may include compiler flags, library to link against and where the package headers are located."]}),"\n",(0,s.jsxs)(n.p,{children:["An obvious advantage to supporting ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies is that there is a 1:1 mapping between the name requested by the build and the name used within the ",(0,s.jsx)(n.code,{children:"package.yml"}),". Instead of trying to hunt down the package providing that dependency, you simply list the same name. Any package in the repository will export information about the ",(0,s.jsx)(n.code,{children:".pc"})," files (for ",(0,s.jsx)(n.code,{children:"pkg-config"}),") it contains, enabling you to use those as a build dependency."]}),"\n",(0,s.jsxs)(n.p,{children:["A secondary advantage is that this allows for easily switching or replacing a providing package. When no ",(0,s.jsx)(n.code,{children:"pkgconfig"})," name is available (some packages do not provide these, or it doesn\u2019t make sense for them to), you may use the explicit package name. Always ensure you select the correct package, i.e. the ",(0,s.jsx)(n.code,{children:"-devel"})," subpackage. This provides the necessary symlinks and headers to build packages."]}),"\n",(0,s.jsx)(n.h3,{id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",children:"Finding what package provides a pkgconfig dependency (if any)"}),"\n",(0,s.jsxs)(n.p,{children:["You can use ",(0,s.jsx)(n.code,{children:"go-task"})," to find packages that satisfy ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. It can search for multiple dependencies at once."]}),"\n",(0,s.jsxs)(n.p,{children:["As an example, if you know a package has the build dependencies ",(0,s.jsx)(n.code,{children:"Qt5Core"})," and ",(0,s.jsx)(n.code,{children:"Qt6Core"}),", you would run:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task pkgconfig -- Qt5Core Qt6Core\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pkgconfig(Qt5Core) found in: qt5-base-devel\npkgconfig(Qt6Core) found in: qt6-base-devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can also determine if there are ",(0,s.jsx)(n.code,{children:"pkgconfigs"})," available from a ",(0,s.jsx)(n.code,{children:"-devel"})," package by doing ",(0,s.jsx)(n.code,{children:"eopkg info (name)"})," and looking for the ",(0,s.jsx)(n.code,{children:"Provides"})," key."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"eopkg info libgtk-3-devel\n"})}),"\n",(0,s.jsx)(n.p,{children:"In output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"Provides: pkgconfig(gtk+-3.0) pkgconfig(gdk-3.0) pkgconfig(gdk-wayland-3.0) pkgconfig(gail-3.0) pkgconfig(gdk-x11-3.0) pkgconfig(gtk+-unix-print-3.0)\npkgconfig(gtk+-wayland-3.0) pkgconfig(gtk+-x11-3.0)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-pkgconfig-dependencies",children:"Using pkgconfig dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"builddeps"})," list, use the ",(0,s.jsx)(n.code,{children:"pkgconfig(name)"})," syntax. For example, to add ",(0,s.jsx)(n.code,{children:"gtk+-3.0"})," to the build dependencies, you would do the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - pkgconfig(gtk+-3.0)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["At build time the appropriate provider package is selected, in this instance ",(0,s.jsx)(n.code,{children:"libgtk-3-devel"})]}),"\n",(0,s.jsx)(n.h3,{id:"using-explicitly-named-dependencies",children:"Using explicitly named dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["When there is not a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency available, use an explicitly named dependency.\nSimply list the package name."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["When a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency is available you will be asked to use that instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - stk-devel\n"})}),"\n",(0,s.jsx)(n.h2,{id:"runtime-dependencies",children:"Runtime dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Runtime dependencies are extra packages that a package needs in order to function correctly. A common example of this is other libraries. Solus ",(0,s.jsx)(n.code,{children:"eopkg"})," packages will automatically add any binary dependencies at runtime, so that you do not have to."]}),"\n",(0,s.jsxs)(n.p,{children:["All ",(0,s.jsx)(n.code,{children:"devel"})," subpackages automatically depend on their parent package. On top of this, if they provide a ",(0,s.jsx)(n.code,{children:".pc"})," pkg-config file, we export this information, and automatically determine the packages this particular package would need to be able to build against correctly. As such, the majority of dependencies for builds are automatically resolved."]}),"\n",(0,s.jsx)(n.p,{children:"In certain instances, binary dependencies aren\u2019t enough. An example of this might be an extra Python package, or a font, something that is not accounted for by binary checks."}),"\n",(0,s.jsxs)(n.p,{children:["To account for this, you may add extra explicit runtime dependencies to your package. These are taken from the optional ",(0,s.jsx)(n.code,{children:"rundeps"})," ypkg key."]}),"\n",(0,s.jsxs)(n.p,{children:["This key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is the current package ",(0,s.jsx)(n.code,{children:"name"}),". You may express a different subpackage to apply dependencies to by using that name as a key, i.e. ",(0,s.jsx)(n.code,{children:"devel"}),", or ",(0,s.jsx)(n.code,{children:"docs"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This would add the \u201cpython-gobject\u201d runtime dependency to the main package:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This would add the same dependency, as well as adding it to the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel: python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Remember this uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, which is very flexible. You can equally express this as follows (adding more deps as an example):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel:\n - somepackage\n - someotherpackage\n"})}),"\n",(0,s.jsx)(n.h2,{id:"check-dependencies",children:"Check dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Check dependencies are a special kind of build dependency reserved for automatic package testing by ",(0,s.jsx)(n.code,{children:"solbuild"}),". Check dependencies should only be used during the ",(0,s.jsx)(n.code,{children:"check"})," build phase.\nWhen a package is part of an automatic build sequence, these dependencies will ",(0,s.jsx)(n.strong,{children:"not"})," be considered when determining build order."]}),"\n",(0,s.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["The package ",(0,s.jsx)(n.code,{children:"cbindgen"})," includes ",(0,s.jsx)(n.code,{children:"cython"})," in ",(0,s.jsx)(n.code,{children:"checkdeps"})," to run tests in the ",(0,s.jsx)(n.code,{children:"check"})," phase."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/getsolus/packages/blob/main/packages/c/cbindgen/package.yml",children:"cbindgen package.yml file"})}),"\n",(0,s.jsx)(n.h2,{id:"patching--extra-files",children:"Patching / extra files"}),"\n",(0,s.jsxs)(n.p,{children:["Files that may be required during the build can be accessed via the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. Note that you must store your files in the ",(0,s.jsx)(n.code,{children:"./files"})," directory relative to your ",(0,s.jsx)(n.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(n.p,{children:["Both patches and extra files (such as systemd units) are stored in this directory. Note that if your patch is to address a ",(0,s.jsx)(n.strong,{children:"CVE"}),", you must use the following naming scheme: ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.patch"})]}),"\n",(0,s.jsxs)(n.p,{children:["Where ",(0,s.jsx)(n.code,{children:"xxxx-xxxx"})," is replaced with the full CVE ID. Complying with this simple rule ensures that we can know at any time the security status of packages when using tools such as ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),"\nkept\nSolus tooling allows the use of ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.nopatch"})," (which isn't applied in the build) to indicate that a CVE has been validated as not applicable to the Solus package. This can be because another patch resolves this CVE, or there is a false positive via ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),". The contents of the file can describe why it doesn't apply without requiring a patch (i.e. Resolved by cve-xxxx-xxxx.patch)."]}),"\n",(0,s.jsx)(n.h3,{id:"applying-a-patch",children:"Applying a patch"}),"\n",(0,s.jsxs)(n.p,{children:["It is common practice to apply the patch file(s) within the ",(0,s.jsx)(n.code,{children:"setup"})," section of your build staging. We can achieve this using the ",(0,s.jsx)(n.code,{children:"%patch"})," macro, and the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. In this example, the required file is located at ",(0,s.jsx)(n.code,{children:"./files/0002-Sample-commit-2.patch"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"%patch -p1 -i $pkgfiles/0002-Sample-commit-2.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note you use the macro as you would normally use the ",(0,s.jsx)(n.code,{children:"patch"})," command, however use of the macro ensures it performs a clean batch-mode patch."]}),"\n",(0,s.jsxs)(n.p,{children:["If you are using compressed patches, i.e. for the ",(0,s.jsx)(n.code,{children:"bash"})," or ",(0,s.jsx)(n.code,{children:"readline"})," packages, you can pipe the call through ",(0,s.jsx)(n.code,{children:"zcat"})," or similar:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"zcat $pkgfiles/bash43-032.gz | %patch -p0\n"})}),"\n",(0,s.jsx)(n.h4,{id:"handling-multiple-patches",children:"Handling multiple patches"}),"\n",(0,s.jsxs)(n.p,{children:["In the event you need to apply multiple patches, such as a multitude of CVE patches, it may be sensible to use our ",(0,s.jsx)(n.code,{children:"%apply_patches"})," macro, which will apply all the patches listed in a ",(0,s.jsx)(n.code,{children:"series"})," file in your package's ",(0,s.jsx)(n.code,{children:"./files"})," folder. Example below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch\nfix-silliness.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Both of the files above will be applied using stripping number ",(0,s.jsx)(n.code,{children:"-p1"}),". If you need to use a different stripping number, like ",(0,s.jsx)(n.code,{children:"-p4"}),", you can write:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch -p4\nfix-silliness.patch\n"})}),"\n",(0,s.jsx)(n.h2,{id:"installing-extra-files",children:"Installing extra files"}),"\n",(0,s.jsxs)(n.p,{children:["We recommend using patches where possible first, as they ensure correct maintenance and will be updated across package versions. If you must install extra files into the directory, please use the ",(0,s.jsx)(n.code,{children:"install"})," command, ensuring you set the correct permissions. Again, files are accessible from the ",(0,s.jsx)(n.code,{children:"./files"})," directory, relative to ",(0,s.jsx)(n.code,{children:"package.yml"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["This is an example of installing a custom profile file, seen in the ",(0,s.jsx)(n.code,{children:"bash"})," package:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"install -m 0644 $pkgfiles/profile $installdir/etc/profile\n"})}),"\n",(0,s.jsx)(n.h2,{id:"patterns",children:"Patterns"}),"\n",(0,s.jsxs)(n.p,{children:["In most instances, ",(0,s.jsx)(n.code,{children:"ypkg"})," will assign the correct location for files, whether it be in the main ",(0,s.jsx)(n.code,{children:"name"})," package, or a subpackage. However there may be instances where the default does not match the intended behaviour."]}),"\n",(0,s.jsx)(n.p,{children:"In these instances it is possible to override the default assignment by way of patterns. These are simply a list of paths or globs to ensure a particular file, or set of files, end up in the desired location."}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"patterns"})," key expects a ",(0,s.jsx)(n.code,{children:"dict(s)"})," argument. The default key for each pattern is assumed to be the ",(0,s.jsx)(n.code,{children:"name"})," of the package, so omitting the name would place files into the main package. The value should be a path or pattern you wish to match, ensuring files go to a specific location."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example from ",(0,s.jsx)(n.code,{children:"libjpeg-turbo"}),", we move all documentation into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - docs: [/usr/share/man]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This example, taken from the ",(0,s.jsx)(n.code,{children:"wayland"})," package, ensures the binaries from ",(0,s.jsx)(n.code,{children:"/usr/bin"})," and the directory ",(0,s.jsx)(n.code,{children:"/usr/share/wayland"})," are located in the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - devel:\n - /usr/bin\n - /usr/share/wayland\n"})}),"\n",(0,s.jsx)(n.h2,{id:"replace--rename",children:"Replace / rename"}),"\n",(0,s.jsxs)(n.p,{children:["In some situations, it may be required to replace one package with another, or to rename an existing package. In these instances you should coordinate with a repository maintainer to ensure the replaced package is marked ",(0,s.jsx)(n.strong,{children:"Obsolete"})," within the index. This will ensure correct upgrade paths for users."]}),"\n",(0,s.jsxs)(n.p,{children:["Note that to retire a package, you must also coordinate with a repository maintainer. An ",(0,s.jsx)(n.strong,{children:"Obsolete"})," package is removed by the package manager when the user upgrades. As such, correct upgrade paths need to be established."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"replaces"})," ypkg key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is assumed to be the current package ",(0,s.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example, we rename the ",(0,s.jsx)(n.code,{children:"libgeoclue*"})," packages to use the correct names, and ensure a working upgrade path."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"replaces:\n - devel: libgeoclue-devel\n - libgeoclue\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"name"})," of this package is ",(0,s.jsx)(n.code,{children:"geoclue"}),", and the new package names are now:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue-devel"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Given the ",(0,s.jsx)(n.code,{children:"replaces"})," values above, ",(0,s.jsx)(n.code,{children:"geoclue"})," now replaces ",(0,s.jsx)(n.code,{children:"libgeoclue"}),", and ",(0,s.jsx)(n.code,{children:"geoclue-devel"})," replaces ",(0,s.jsx)(n.code,{children:"libgeoclue-devel"}),". This is entirely transparent to the user, with a seamless update replacing the old packages with the new renamed packages."]}),"\n",(0,s.jsxs)(n.p,{children:["The repository maintainer marked the old names as ",(0,s.jsx)(n.strong,{children:"Obsolete"})," in the index."]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>t});var s=i(67294);const a={},c=s.createContext(a);function t(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4e87380c.14c405d8.js b/assets/js/4e87380c.14c405d8.js
new file mode 100644
index 000000000..00de37691
--- /dev/null
+++ b/assets/js/4e87380c.14c405d8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8570"],{90906:function(e){e.exports=JSON.parse('{"tag":{"label":"gnu","permalink":"/blog/tags/gnu","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/gnu","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/4e87380c.a121e477.js b/assets/js/4e87380c.a121e477.js
deleted file mode 100644
index 609cb7bc1..000000000
--- a/assets/js/4e87380c.a121e477.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2585],{68801:e=>{e.exports=JSON.parse('{"tag":{"label":"gnu","permalink":"/blog/tags/gnu","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/gnu","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/513b6405.64a20a0d.js b/assets/js/513b6405.64a20a0d.js
deleted file mode 100644
index ae3355abe..000000000
--- a/assets/js/513b6405.64a20a0d.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4278],{38033:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=s(85893),n=s(11151);const o={title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},r="Prepare for packaging",a={id:"packaging/prepare-for-packaging",title:"Prepare for Packaging",description:"Switch to the Unstable repository",source:"@site/docs/packaging/prepare-for-packaging.md",sourceDirName:"packaging",slug:"/packaging/prepare-for-packaging",permalink:"/docs/packaging/prepare-for-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/prepare-for-packaging.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,sidebarPosition:1,frontMatter:{title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},sidebar:"packagingSidebar",previous:{title:"Packaging Overview",permalink:"/docs/packaging/"},next:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"}},l={},c=[{value:"Switch to the Unstable repository",id:"switch-to-the-unstable-repository",level:2},{value:"Setting up the packager file",id:"setting-up-the-packager-file",level:2},{value:"Installing development tools",id:"installing-development-tools",level:2},{value:"Setting up a GitHub account and Git",id:"setting-up-a-github-account-and-git",level:2},{value:"Configure github-cli
.",id:"configure-github-cli",level:3},{value:"Git identity setup",id:"git-identity-setup",level:3},{value:"Setting up solbuild",id:"setting-up-solbuild",level:2},{value:"Updating solbuild",id:"updating-solbuild",level:3},{value:"Fork the getsolus/packages repository",id:"fork-the-getsoluspackages-repository",level:2},{value:"Clone your forked package repository",id:"clone-your-forked-package-repository",level:2},{value:"Initialize git hooks",id:"initialize-git-hooks",level:2},{value:"Set up repository helper functions (optional)",id:"set-up-repository-helper-functions-optional",level:2},{value:"bash",id:"bash",level:3},{value:"fish",id:"fish",level:3},{value:"zsh",id:"zsh",level:3},{value:"Building packages",id:"building-packages",level:2}];function d(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"prepare-for-packaging",children:"Prepare for packaging"})}),"\n",(0,t.jsx)(i.h2,{id:"switch-to-the-unstable-repository",children:"Switch to the Unstable repository"}),"\n",(0,t.jsx)(i.p,{children:'Packages need to be built and tested against the "unstable" repository. If you don\'t want to switch your primary system to unstable, you can do your packaging work in a VM. We have Virtual Machine Manager and other similar tools in the Solus repository.'}),"\n",(0,t.jsxs)(i.p,{children:["Refer to ",(0,t.jsx)(i.a,{href:"/docs/user/package-management/repo-management",children:"Repository Management"})," to see how to add and switch to unstable."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-the-packager-file",children:"Setting up the packager file"}),"\n",(0,t.jsx)(i.p,{children:"In order to utilize the build system, you must first set up a configuration file that has your packager details."}),"\n",(0,t.jsxs)(i.p,{children:["This file lives in the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder of your home directory. You will need to create the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder as well as the inner ",(0,t.jsx)(i.code,{children:"packager"})," file. Inside the packager file, you need two keys, ",(0,t.jsx)(i.code,{children:"Name"})," and ",(0,t.jsx)(i.code,{children:"Email"}),". This is used when generating the machine file so that the packager details are stored within the resulting binary package."]}),"\n",(0,t.jsxs)(i.p,{children:["Name and email address are mandatory. You must use your real first and last name(s) for accountability purposes.\nA ",(0,t.jsx)(i.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-ini",children:"[Packager]\nName=Your Name Here\nEmail=your.email@address\nMatrix=@username:matrix.org\n"})}),"\n",(0,t.jsx)(i.h2,{id:"installing-development-tools",children:"Installing development tools"}),"\n",(0,t.jsx)(i.p,{children:"We need to install a few things in order to get started with packaging:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"ent"})," is used by the ",(0,t.jsx)(i.code,{children:"go-task updatecheck"})," command to check for updated versions of packaged software"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"git"})," is used for version control of the Solus sources"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"github-cli"})," is used to make working with GitHub easier"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"go-task"})," is used by our build tools for scripting"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"jq"})," is used by our optional ",(0,t.jsx)(i.a,{href:"#set-up-repository-helper-functions-optional",children:"Helper Functions"})]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild"})," is a lightweight container environment for building packages repeatably"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild-config-unstable"})," sets up solbuild for working with the ",(0,t.jsx)(i.code,{children:"unstable"})," repository"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"ypkg"})," is the program that actually builds packages"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"yq"})," is used by the ",(0,t.jsx)(i.code,{children:"go-task add-monitoring"})," command to create new ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," files"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it ent git github-cli go-task jq solbuild solbuild-config-unstable ypkg yq\n"})}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-a-github-account-and-git",children:"Setting up a GitHub account and Git"}),"\n",(0,t.jsxs)(i.p,{children:["The Solus source repositories for the package repository currently reside on ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"}),". You will need a GitHub account to submit patches and file issues. You can create a GitHub account ",(0,t.jsx)(i.a,{href:"https://github.com/signup",children:"here"}),". Note that you will also need to set up ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa",children:"2FA"})," (two-factor authentication) for your account."]}),"\n",(0,t.jsxs)(i.h3,{id:"configure-github-cli",children:["Configure ",(0,t.jsx)(i.code,{children:"github-cli"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Once you have a GitHub account, you need to configure ",(0,t.jsx)(i.code,{children:"github-cli"})," to work with it. At minimum, you need to run ",(0,t.jsx)(i.code,{children:"gh auth login"}),". Have your GitHub credentials and 2FA (two-factor authentication) mechanism at hand."]}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/github-cli/github-cli/quickstart",children:"GitHub CLI quickstart"})," for some common uses of the tool."]}),"\n",(0,t.jsx)(i.h3,{id:"git-identity-setup",children:"Git identity setup"}),"\n",(0,t.jsxs)(i.p,{children:["If you have not used git before, you should set your git identity in your global git config file (",(0,t.jsx)(i.code,{children:"~/.gitconfig"}),"). Use the following commands:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'git config --global user.name "John Doe"\ngit config --global user.email johndoe@example.com\n'})}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup",children:"Git Book"})," for more first-time setup options."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-solbuild",children:"Setting up solbuild"}),"\n",(0,t.jsxs)(i.p,{children:["The ",(0,t.jsx)(i.code,{children:"solbuild"})," tool must first be initialized with a base image. All builds thereafter will use this as a base, and construct a temporary overlay root to save on time and disk space in builds."]}),"\n",(0,t.jsx)(i.p,{children:"Initialize solbuild via:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will take some time as it downloads and prepares the image."}),"\n",(0,t.jsx)(i.h3,{id:"updating-solbuild",children:"Updating solbuild"}),"\n",(0,t.jsx)(i.p,{children:"It is a good idea to keep the base image updated. It will help reduce build times by not having to repeatedly download updates to packages in the base image, and will strictly need to pull down the packages your build needs."}),"\n",(0,t.jsx)(i.p,{children:"To update solbuild, run:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild update\n"})}),"\n",(0,t.jsx)(i.h2,{id:"fork-the-getsoluspackages-repository",children:"Fork the getsolus/packages repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create your own fork of ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," using the GitHub web UI or ",(0,t.jsxs)(i.a,{href:"https://cli.github.com/manual/gh_repo_fork",children:[(0,t.jsx)(i.code,{children:"gh"})," cli tool"]})," from the ",(0,t.jsx)(i.code,{children:"github-cli"})," package. It will be forked to ",(0,t.jsx)(i.code,{children:"github.com/yourgithubaccount/packages"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"clone-your-forked-package-repository",children:"Clone your forked package repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create a local clone of the package repository you just forked. Here we are using the name ",(0,t.jsx)(i.code,{children:"solus-packages"})," and cloning it into our home directoy. The rest of the documentation will presume this structure. You can choose a different name and path but will have to make sure to replace it in every command that refers to the ",(0,t.jsx)(i.code,{children:"solus-packages"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gh repo clone packages ~/solus-packages\n"})}),"\n",(0,t.jsx)(i.h2,{id:"initialize-git-hooks",children:"Initialize git hooks"}),"\n",(0,t.jsx)(i.p,{children:"Initialize Git hooks for working with the repository by running:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"go-task -d ~/solus-packages init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This makes it easy to create commits in the correct format, and will warn you about issues with changes you commit."}),"\n",(0,t.jsx)(i.h2,{id:"set-up-repository-helper-functions-optional",children:"Set up repository helper functions (optional)"}),"\n",(0,t.jsx)(i.p,{children:"The helper functions are a collection of shell scripts that help you navigate the packages repository more quickly, and perform some specialized searches."}),"\n",(0,t.jsx)(i.p,{children:"After cloning your repository, create a symlink to source the helper functions for your shell. Then, start a new instance of the shell."}),"\n",(0,t.jsx)(i.h3,{id:"bash",children:"bash"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.bashrc.d\nln -s ~/solus-packages/common/Scripts/helpers.sh ~/.bashrc.d/solus-monorepo-helpers.sh\n"})}),"\n",(0,t.jsx)(i.h3,{id:"fish",children:"fish"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.config/fish/conf.d\nln -s ~/solus-packages/common/Scripts/helpers.fish ~/.config/fish/conf.d/solus.fish\n"})}),"\n",(0,t.jsx)(i.h3,{id:"zsh",children:"zsh"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'mkdir -p ~/.zshrc.d\nprintf "\\nfpath=(~/.zshrc.d \\$fpath)" >> ~/.zshrc\nsource ~/.zshrc\nln -s ~/solus-packages/common/Scripts/helpers.zsh ~/.zshrc.d/solus-monorepo-helpers.zsh\n'})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)(i.p,{children:"You should now have the following available from your shell:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Function"}),(0,t.jsx)(i.th,{children:"Description"}),(0,t.jsx)(i.th,{children:"Usage"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"cpesearch"})}),(0,t.jsxs)(i.td,{children:["Search for CPE Names for packages. For use when writing the ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," file for a package"]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"cpesearch search-term"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"goroot"})}),(0,t.jsx)(i.td,{children:"When in the Solus packages repository, change directory to the root directory."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"goroot"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotopkg"})}),(0,t.jsxs)(i.td,{children:["Change directory to any Solus package. You can type part of the package name then double press ",(0,t.jsx)(i.code,{children:"Tab"})," to get autocompletion for this function."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotopkg firefox"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotosoluspkgs"})}),(0,t.jsx)(i.td,{children:"Change directory to the Solus packages repository from anywhere on the filesystem."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotosoluspkgs"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatprovides"})}),(0,t.jsxs)(i.td,{children:["Find out what package provides a library by reading the ",(0,t.jsx)(i.code,{children:"abi_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatprovides libfoobar.so.1"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatuses"})}),(0,t.jsxs)(i.td,{children:["Find out what packages use a library by reading the ",(0,t.jsx)(i.code,{children:"abi_used_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatuses libfoobar.so.1"})})]})]})]}),"\n",(0,t.jsx)(i.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,t.jsxs)(i.p,{children:["Your system is now set up for package work.\nIf you are new to packaging, see ",(0,t.jsx)(i.a,{href:"/docs/packaging/your-first-package-update",children:"Your First Package Update"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,i,s)=>{s.d(i,{Z:()=>a,a:()=>r});var t=s(67294);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/513b6405.6e1fe729.js b/assets/js/513b6405.6e1fe729.js
new file mode 100644
index 000000000..ced5b5d8a
--- /dev/null
+++ b/assets/js/513b6405.6e1fe729.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4064"],{86663:function(e,i,s){s.r(i),s.d(i,{metadata:()=>t,contentTitle:()=>a,default:()=>h,assets:()=>l,toc:()=>c,frontMatter:()=>r});var t=JSON.parse('{"id":"packaging/prepare-for-packaging","title":"Prepare for Packaging","description":"Switch to the Unstable repository","source":"@site/docs/packaging/prepare-for-packaging.md","sourceDirName":"packaging","slug":"/packaging/prepare-for-packaging","permalink":"/docs/packaging/prepare-for-packaging","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/prepare-for-packaging.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"sidebarPosition":1,"frontMatter":{"title":"Prepare for Packaging","summary":"Quick guide on getting your system set up for packaging on Solus","sidebar_position":1},"sidebar":"packagingSidebar","previous":{"title":"Packaging Overview","permalink":"/docs/packaging/"},"next":{"title":"Update Your Development Environment","permalink":"/docs/packaging/update-dev-environment"}}'),n=s("85893"),o=s("50065");let r={title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},a="Prepare for packaging",l={},c=[{value:"Switch to the Unstable repository",id:"switch-to-the-unstable-repository",level:2},{value:"Setting up the packager file",id:"setting-up-the-packager-file",level:2},{value:"Installing development tools",id:"installing-development-tools",level:2},{value:"Setting up a GitHub account and Git",id:"setting-up-a-github-account-and-git",level:2},{value:"Configure github-cli
.",id:"configure-github-cli",level:3},{value:"Git identity setup",id:"git-identity-setup",level:3},{value:"Setting up solbuild",id:"setting-up-solbuild",level:2},{value:"Updating solbuild",id:"updating-solbuild",level:3},{value:"Fork the getsolus/packages repository",id:"fork-the-getsoluspackages-repository",level:2},{value:"Clone your forked package repository",id:"clone-your-forked-package-repository",level:2},{value:"Initialize git hooks",id:"initialize-git-hooks",level:2},{value:"Set up repository helper functions (optional)",id:"set-up-repository-helper-functions-optional",level:2},{value:"bash",id:"bash",level:3},{value:"fish",id:"fish",level:3},{value:"zsh",id:"zsh",level:3},{value:"Building packages",id:"building-packages",level:2}];function d(e){let i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"prepare-for-packaging",children:"Prepare for packaging"})}),"\n",(0,n.jsx)(i.h2,{id:"switch-to-the-unstable-repository",children:"Switch to the Unstable repository"}),"\n",(0,n.jsx)(i.p,{children:'Packages need to be built and tested against the "unstable" repository. If you don\'t want to switch your primary system to unstable, you can do your packaging work in a VM. We have Virtual Machine Manager and other similar tools in the Solus repository.'}),"\n",(0,n.jsxs)(i.p,{children:["Refer to ",(0,n.jsx)(i.a,{href:"/docs/user/package-management/repo-management",children:"Repository Management"})," to see how to add and switch to unstable."]}),"\n",(0,n.jsx)(i.h2,{id:"setting-up-the-packager-file",children:"Setting up the packager file"}),"\n",(0,n.jsx)(i.p,{children:"In order to utilize the build system, you must first set up a configuration file that has your packager details."}),"\n",(0,n.jsxs)(i.p,{children:["This file lives in the ",(0,n.jsx)(i.code,{children:".config/solus"})," folder of your home directory. You will need to create the ",(0,n.jsx)(i.code,{children:".config/solus"})," folder as well as the inner ",(0,n.jsx)(i.code,{children:"packager"})," file. Inside the packager file, you need two keys, ",(0,n.jsx)(i.code,{children:"Name"})," and ",(0,n.jsx)(i.code,{children:"Email"}),". This is used when generating the machine file so that the packager details are stored within the resulting binary package."]}),"\n",(0,n.jsxs)(i.p,{children:["Name and email address are mandatory. You must use your real first and last name(s) for accountability purposes.\nA ",(0,n.jsx)(i.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-ini",children:"[Packager]\nName=Your Name Here\nEmail=your.email@address\nMatrix=@username:matrix.org\n"})}),"\n",(0,n.jsx)(i.h2,{id:"installing-development-tools",children:"Installing development tools"}),"\n",(0,n.jsx)(i.p,{children:"We need to install a few things in order to get started with packaging:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"ent"})," is used by the ",(0,n.jsx)(i.code,{children:"go-task updatecheck"})," command to check for updated versions of packaged software"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"git"})," is used for version control of the Solus sources"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"github-cli"})," is used to make working with GitHub easier"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"go-task"})," is used by our build tools for scripting"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"jq"})," is used by our optional ",(0,n.jsx)(i.a,{href:"#set-up-repository-helper-functions-optional",children:"Helper Functions"})]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"solbuild"})," is a lightweight container environment for building packages repeatably"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"solbuild-config-unstable"})," sets up solbuild for working with the ",(0,n.jsx)(i.code,{children:"unstable"})," repository"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"ypkg"})," is the program that actually builds packages"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"yq"})," is used by the ",(0,n.jsx)(i.code,{children:"go-task add-monitoring"})," command to create new ",(0,n.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,n.jsx)(i.code,{children:"monitoring.yml"})})," files"]}),"\n"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it ent git github-cli go-task jq solbuild solbuild-config-unstable ypkg yq\n"})}),"\n",(0,n.jsx)(i.h2,{id:"setting-up-a-github-account-and-git",children:"Setting up a GitHub account and Git"}),"\n",(0,n.jsxs)(i.p,{children:["The Solus source repositories for the package repository currently reside on ",(0,n.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"}),". You will need a GitHub account to submit patches and file issues. You can create a GitHub account ",(0,n.jsx)(i.a,{href:"https://github.com/signup",children:"here"}),". Note that you will also need to set up ",(0,n.jsx)(i.a,{href:"https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa",children:"2FA"})," (two-factor authentication) for your account."]}),"\n",(0,n.jsxs)(i.h3,{id:"configure-github-cli",children:["Configure ",(0,n.jsx)(i.code,{children:"github-cli"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Once you have a GitHub account, you need to configure ",(0,n.jsx)(i.code,{children:"github-cli"})," to work with it. At minimum, you need to run ",(0,n.jsx)(i.code,{children:"gh auth login"}),". Have your GitHub credentials and 2FA (two-factor authentication) mechanism at hand."]}),"\n",(0,n.jsxs)(i.p,{children:["See the ",(0,n.jsx)(i.a,{href:"https://docs.github.com/en/github-cli/github-cli/quickstart",children:"GitHub CLI quickstart"})," for some common uses of the tool."]}),"\n",(0,n.jsx)(i.h3,{id:"git-identity-setup",children:"Git identity setup"}),"\n",(0,n.jsxs)(i.p,{children:["If you have not used git before, you should set your git identity in your global git config file (",(0,n.jsx)(i.code,{children:"~/.gitconfig"}),"). Use the following commands:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:'git config --global user.name "John Doe"\ngit config --global user.email johndoe@example.com\n'})}),"\n",(0,n.jsxs)(i.p,{children:["See the ",(0,n.jsx)(i.a,{href:"https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup",children:"Git Book"})," for more first-time setup options."]}),"\n",(0,n.jsx)(i.h2,{id:"setting-up-solbuild",children:"Setting up solbuild"}),"\n",(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.code,{children:"solbuild"})," tool must first be initialized with a base image. All builds thereafter will use this as a base, and construct a temporary overlay root to save on time and disk space in builds."]}),"\n",(0,n.jsx)(i.p,{children:"Initialize solbuild via:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"sudo solbuild init\n"})}),"\n",(0,n.jsx)(i.p,{children:"This will take some time as it downloads and prepares the image."}),"\n",(0,n.jsx)(i.h3,{id:"updating-solbuild",children:"Updating solbuild"}),"\n",(0,n.jsx)(i.p,{children:"It is a good idea to keep the base image updated. It will help reduce build times by not having to repeatedly download updates to packages in the base image, and will strictly need to pull down the packages your build needs."}),"\n",(0,n.jsx)(i.p,{children:"To update solbuild, run:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"sudo solbuild update\n"})}),"\n",(0,n.jsx)(i.h2,{id:"fork-the-getsoluspackages-repository",children:"Fork the getsolus/packages repository"}),"\n",(0,n.jsxs)(i.p,{children:["Create your own fork of ",(0,n.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," using the GitHub web UI or ",(0,n.jsxs)(i.a,{href:"https://cli.github.com/manual/gh_repo_fork",children:[(0,n.jsx)(i.code,{children:"gh"})," cli tool"]})," from the ",(0,n.jsx)(i.code,{children:"github-cli"})," package. It will be forked to ",(0,n.jsx)(i.code,{children:"github.com/yourgithubaccount/packages"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"clone-your-forked-package-repository",children:"Clone your forked package repository"}),"\n",(0,n.jsxs)(i.p,{children:["Create a local clone of the package repository you just forked. Here we are using the name ",(0,n.jsx)(i.code,{children:"solus-packages"})," and cloning it into our home directoy. The rest of the documentation will presume this structure. You can choose a different name and path but will have to make sure to replace it in every command that refers to the ",(0,n.jsx)(i.code,{children:"solus-packages"})," directory."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"gh repo clone packages ~/solus-packages\n"})}),"\n",(0,n.jsx)(i.h2,{id:"initialize-git-hooks",children:"Initialize git hooks"}),"\n",(0,n.jsx)(i.p,{children:"Initialize Git hooks for working with the repository by running:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"go-task -d ~/solus-packages init\n"})}),"\n",(0,n.jsx)(i.p,{children:"This makes it easy to create commits in the correct format, and will warn you about issues with changes you commit."}),"\n",(0,n.jsx)(i.h2,{id:"set-up-repository-helper-functions-optional",children:"Set up repository helper functions (optional)"}),"\n",(0,n.jsx)(i.p,{children:"The helper functions are a collection of shell scripts that help you navigate the packages repository more quickly, and perform some specialized searches."}),"\n",(0,n.jsx)(i.p,{children:"After cloning your repository, create a symlink to source the helper functions for your shell. Then, start a new instance of the shell."}),"\n",(0,n.jsx)(i.h3,{id:"bash",children:"bash"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.bashrc.d\nln -s ~/solus-packages/common/Scripts/helpers.sh ~/.bashrc.d/solus-monorepo-helpers.sh\n"})}),"\n",(0,n.jsx)(i.h3,{id:"fish",children:"fish"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.config/fish/conf.d\nln -s ~/solus-packages/common/Scripts/helpers.fish ~/.config/fish/conf.d/solus.fish\n"})}),"\n",(0,n.jsx)(i.h3,{id:"zsh",children:"zsh"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:'mkdir -p ~/.zshrc.d\nprintf "\\nfpath=(~/.zshrc.d \\$fpath)" >> ~/.zshrc\nsource ~/.zshrc\nln -s ~/solus-packages/common/Scripts/helpers.zsh ~/.zshrc.d/solus-monorepo-helpers.zsh\n'})}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsx)(i.p,{children:"You should now have the following available from your shell:"}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Function"}),(0,n.jsx)(i.th,{children:"Description"}),(0,n.jsx)(i.th,{children:"Usage"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"cpesearch"})}),(0,n.jsxs)(i.td,{children:["Search for CPE Names for packages. For use when writing the ",(0,n.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,n.jsx)(i.code,{children:"monitoring.yml"})})," file for a package"]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"cpesearch search-term"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"goroot"})}),(0,n.jsx)(i.td,{children:"When in the Solus packages repository, change directory to the root directory."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"goroot"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"gotopkg"})}),(0,n.jsxs)(i.td,{children:["Change directory to any Solus package. You can type part of the package name then double press ",(0,n.jsx)(i.code,{children:"Tab"})," to get autocompletion for this function."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"gotopkg firefox"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"gotosoluspkgs"})}),(0,n.jsx)(i.td,{children:"Change directory to the Solus packages repository from anywhere on the filesystem."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"gotosoluspkgs"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"whatprovides"})}),(0,n.jsxs)(i.td,{children:["Find out what package provides a library by reading the ",(0,n.jsx)(i.code,{children:"abi_libs"})," files."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"whatprovides libfoobar.so.1"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"whatuses"})}),(0,n.jsxs)(i.td,{children:["Find out what packages use a library by reading the ",(0,n.jsx)(i.code,{children:"abi_used_libs"})," files."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"whatuses libfoobar.so.1"})})]})]})]}),"\n",(0,n.jsx)(i.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,n.jsxs)(i.p,{children:["Your system is now set up for package work.\nIf you are new to packaging, see ",(0,n.jsx)(i.a,{href:"/docs/packaging/your-first-package-update",children:"Your First Package Update"}),"."]})]})}function h(e={}){let{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},50065:function(e,i,s){s.d(i,{Z:function(){return a},a:function(){return r}});var t=s(67294);let n={},o=t.createContext(n);function r(e){let i=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/528b6a6b.ddf2f8d1.js b/assets/js/528b6a6b.ddf2f8d1.js
new file mode 100644
index 000000000..68dfdbc58
--- /dev/null
+++ b/assets/js/528b6a6b.ddf2f8d1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9492"],{87049:function(e,s,t){t.r(s),t.d(s,{metadata:()=>r,contentTitle:()=>i,default:()=>c,assets:()=>u,toc:()=>l,frontMatter:()=>o});var r=JSON.parse('{"id":"user/software/utilities/ksysguard","title":"KSysGuard","description":"KSysGuard, also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup.","source":"@site/docs/user/software/utilities/ksysguard.md","sourceDirName":"user/software/utilities","slug":"/user/software/utilities/ksysguard","permalink":"/docs/user/software/utilities/ksysguard","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/ksysguard.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"KSysGuard","summary":"Quick Start guide to KSysGuard on Solus"},"sidebar":"userSidebar","previous":{"title":"Utilities","permalink":"/docs/category/utilities"},"next":{"title":"KDE Wallet","permalink":"/docs/user/software/utilities/kwallet"}}'),a=t("85893"),n=t("50065");let o={title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},i="KSysGuard",u={},l=[{value:"Installation",id:"installation",level:2},{value:"Use KSysGuard as a non-root user",id:"use-ksysguard-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function d(e){let s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,n.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"ksysguard",children:"KSysGuard"})}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"KSysGuard"}),", also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup."]}),"\n",(0,a.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsx)(s.p,{children:"KSysGuard is usually installed as part of the KDE Plasma Desktop environment, but can be installed from the Software Center or via terminal:"}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it ksysguard\n"})}),"\n",(0,a.jsx)(s.h2,{id:"use-ksysguard-as-a-non-root-user",children:"Use KSysGuard as a non-root user"}),"\n",(0,a.jsx)(s.p,{children:"The per process networking plugin requires elevated access to your system. To enable the plugin as non-root user, execute these commands:"}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:'sudo setcap "CAP_NET_RAW=+ep" "/usr/lib64/kf5/ksysguard/ksgrd_network_helper"\n'})}),"\n",(0,a.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsxs)(s.p,{children:["KSysGuard ",(0,a.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"User\u2019s Guide"})," or the KDE Help Centre (open khelp on your Plasma Desktop)."]})]})}function c(e={}){let{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},50065:function(e,s,t){t.d(s,{Z:function(){return i},a:function(){return o}});var r=t(67294);let a={},n=r.createContext(a);function o(e){let s=r.useContext(n);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/528b6a6b.f7c0a1da.js b/assets/js/528b6a6b.f7c0a1da.js
deleted file mode 100644
index 04b6fc7d0..000000000
--- a/assets/js/528b6a6b.f7c0a1da.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7822],{61661:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var r=t(85893),a=t(11151);const n={title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},o="KSysGuard",i={id:"user/software/utilities/ksysguard",title:"KSysGuard",description:"KSysGuard, also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup.",source:"@site/docs/user/software/utilities/ksysguard.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/ksysguard",permalink:"/docs/user/software/utilities/ksysguard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/ksysguard.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},sidebar:"userSidebar",previous:{title:"Utilities",permalink:"/docs/category/utilities"},next:{title:"KDE Wallet",permalink:"/docs/user/software/utilities/kwallet"}},u={},l=[{value:"Installation",id:"installation",level:2},{value:"Use KSysGuard as a non-root user",id:"use-ksysguard-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"ksysguard",children:"KSysGuard"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"KSysGuard"}),", also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup."]}),"\n",(0,r.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(s.p,{children:"KSysGuard is usually installed as part of the KDE Plasma Desktop environment, but can be installed from the Software Center or via terminal:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it ksysguard\n"})}),"\n",(0,r.jsx)(s.h2,{id:"use-ksysguard-as-a-non-root-user",children:"Use KSysGuard as a non-root user"}),"\n",(0,r.jsx)(s.p,{children:"The per process networking plugin requires elevated access to your system. To enable the plugin as non-root user, execute these commands:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'sudo setcap "CAP_NET_RAW=+ep" "/usr/lib64/kf5/ksysguard/ksgrd_network_helper"\n'})}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(s.p,{children:["KSysGuard ",(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"User\u2019s Guide"})," or the KDE Help Centre (open khelp on your Plasma Desktop)."]})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>o});var r=t(67294);const a={},n=r.createContext(a);function o(e){const s=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/533eefa9.13c88c49.js b/assets/js/533eefa9.13c88c49.js
new file mode 100644
index 000000000..57c00963a
--- /dev/null
+++ b/assets/js/533eefa9.13c88c49.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6813"],{64176:function(e,i,n){n.r(i),n.d(i,{metadata:()=>s,contentTitle:()=>o,default:()=>c,assets:()=>d,toc:()=>a,frontMatter:()=>r});var s=JSON.parse('{"id":"user/quick-start/installation/index","title":"Preparing to Install","description":"Before you start, make sure your system meets the minimum requirements.","source":"@site/docs/user/quick-start/installation/index.md","sourceDirName":"user/quick-start/installation","slug":"/user/quick-start/installation/","permalink":"/docs/user/quick-start/installation/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Preparing to Install","summary":"Installation Guide for multiple operating systems"},"sidebar":"userSidebar","previous":{"title":"Default Applications","permalink":"/docs/user/quick-start/default-applications"},"next":{"title":"Disk Partitioning","permalink":"/docs/user/quick-start/installation/disks"}}'),t=n("85893"),l=n("50065");let r={title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},o="Preparing to install",d={},a=[{value:"Getting the ISO",id:"getting-the-iso",level:2},{value:"Verifying the ISO",id:"verifying-the-iso",level:2},{value:"Linux and macOS",id:"linux-and-macos",level:3},{value:"Verifying the SHA256SUMS file signature",id:"verifying-the-sha256sums-file-signature",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum",level:4},{value:"Windows",id:"windows",level:3},{value:"Verifying signed SHA256SUM file",id:"verifying-signed-sha256sum-file",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum-1",level:4},{value:"Creating bootable media",id:"creating-bootable-media",level:2},{value:"Linux",id:"linux",level:3},{value:"DVD",id:"dvd",level:4},{value:"USB",id:"usb",level:4},{value:"GNOME MultiWriter",id:"gnome-multiwriter",level:5},{value:"KDE ISO Image Writer",id:"kde-iso-image-writer",level:4},{value:"Command-line",id:"command-line",level:5},{value:"Windows",id:"windows-1",level:3},{value:"DVD",id:"dvd-1",level:4},{value:"USB",id:"usb-1",level:4},{value:"macOS",id:"macos",level:3},{value:"DVD",id:"dvd-2",level:4},{value:"USB",id:"usb-2",level:4},{value:"Graphical tool",id:"graphical-tool",level:5},{value:"Command-line",id:"command-line-1",level:5},{value:"Boot the media",id:"boot-the-media",level:2}];function h(e){let i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"preparing-to-install",children:"Preparing to install"})}),"\n",(0,t.jsxs)(i.p,{children:["Before you start, make sure your system meets the ",(0,t.jsx)(i.a,{href:"/docs/user/quick-start/installation/system-requirements",children:"minimum requirements"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"The first step to installing Solus is getting the correct media. The Solus Project provides ISO images, which contain the contents of Solus for installing."}),"\n",(0,t.jsx)(i.h2,{id:"getting-the-iso",children:"Getting the ISO"}),"\n",(0,t.jsxs)(i.p,{children:["Download a Solus ISO by going to our ",(0,t.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"})," and picking an edition."]}),"\n",(0,t.jsx)(i.h2,{id:"verifying-the-iso",children:"Verifying the ISO"}),"\n",(0,t.jsx)(i.h3,{id:"linux-and-macos",children:"Linux and macOS"}),"\n",(0,t.jsxs)(i.p,{children:["Download the SHA256SUMS files for your chosen ISO edition: ",(0,t.jsx)(i.em,{children:"File"}),", ",(0,t.jsx)(i.em,{children:"Signed File"})," and ",(0,t.jsx)(i.em,{children:"Public Key"})," from the links next to the ",(0,t.jsx)(i.em,{children:"Download"})," buttons on our ",(0,t.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"Note:"})," You should download all these files to the same directory."]}),"\n",(0,t.jsx)(i.h4,{id:"verifying-the-sha256sums-file-signature",children:"Verifying the SHA256SUMS file signature"}),"\n",(0,t.jsx)(i.p,{children:"Import the Solus public key:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cd ~/path/to/download/directory\ngpg --import solus-releng-pub.gpg\n"})}),"\n",(0,t.jsx)(i.p,{children:"Verify the signed checksum file:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gpg --verify Solus-Budgie-Release-2024-10-14.iso.sha256sum.sign Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,t.jsx)(i.h4,{id:"verifying-the-iso-checksum",children:"Verifying the ISO checksum"}),"\n",(0,t.jsx)(i.p,{children:"Check that the computed hash of the downloaded ISO file matches the hash supplied by Solus:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sha256sum -c Solus-Budgie-Release-2024-10-14.iso.sha256sum | grep OK\n"})}),"\n",(0,t.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,t.jsx)(i.h4,{id:"verifying-signed-sha256sum-file",children:"Verifying signed SHA256SUM file"}),"\n",(0,t.jsxs)(i.p,{children:["On Windows, first install ",(0,t.jsx)(i.a,{href:"https://www.gpg4win.org/",children:"Gpg4win"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Now you can run the same ",(0,t.jsx)(i.code,{children:"gpg"})," commands from the the ",(0,t.jsx)(i.a,{href:"/docs/user/quick-start/installation/#verifying-the-sha256sums-file-signature",children:(0,t.jsx)(i.em,{children:"Verifyng the SHA256SUMS file signature"})})," section above."]}),"\n",(0,t.jsx)(i.h4,{id:"verifying-the-iso-checksum-1",children:"Verifying the ISO checksum"}),"\n",(0,t.jsx)(i.p,{children:"Launch powershell and compute the hash of the ISO file you just downloaded. You will have to manually compare the result to the hash in the SHA256SUMS file."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-powershell",children:"Get-FileHash C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso\ncat C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Alternatively, you can use a graphical program that can calculate SHA256 hashes like ",(0,t.jsx)(i.em,{children:"Rufus"})," or ",(0,t.jsx)(i.em,{children:"7-Zip"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"creating-bootable-media",children:"Creating bootable media"}),"\n",(0,t.jsx)(i.p,{children:"To make boot media, you will need:"}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Either a blank DVD or a USB drive larger than 2 GB."}),"\n",(0,t.jsx)(i.li,{children:"If using a USB, the ability to boot from the USB."}),"\n",(0,t.jsxs)(i.li,{children:["ISO file from the ",(0,t.jsx)(i.a,{href:"#getting-the-iso",children:"Getting the ISO"})," section."]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"There are many tools which can write our ISO image to DVDs or USB thumb drives. Chose from an option below."}),"\n",(0,t.jsx)(i.h3,{id:"linux",children:"Linux"}),"\n",(0,t.jsx)(i.h4,{id:"dvd",children:"DVD"}),"\n",(0,t.jsxs)(i.p,{children:["We recommend using ",(0,t.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/Brasero",children:"Brasero"})," for writing the ISO to a DVD."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Insert blank DVD (DVD-R or DVD+RW is suitable) into your DVD writer."}),"\n",(0,t.jsx)(i.li,{children:"Open Brasero."}),"\n",(0,t.jsx)(i.li,{children:"Select the option \u201CBurn image\u201D."}),"\n",(0,t.jsx)(i.li,{children:"Click the \u201CClick here to select a disc image\u201D button and using the file dialog, choose the ISO."}),"\n",(0,t.jsx)(i.li,{children:"Ensure the correct DVD is selected in the \u201CSelect a disc to write to\u201D."}),"\n",(0,t.jsx)(i.li,{children:'Click "Burn" and wait.'}),"\n",(0,t.jsx)(i.li,{children:'Upon seeing \u201CImage successfully burned to DVD\u201D, click "Close".'}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"usb",children:"USB"}),"\n",(0,t.jsxs)(i.p,{children:["We recommend using ",(0,t.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/MultiWriter",children:"GNOME MultiWriter"})," or ",(0,t.jsx)(i.a,{href:"https://apps.kde.org/isoimagewriter/",children:"ISO Image Writer"})," for KDE. Please note that UNetbootin will ",(0,t.jsx)(i.strong,{children:"not"})," work."]}),"\n",(0,t.jsx)(i.h5,{id:"gnome-multiwriter",children:"GNOME MultiWriter"}),"\n",(0,t.jsx)(i.p,{children:"Upon opening GNOME MultiWriter, you will likely be shown a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,t.jsx)(i.admonition,{type:"warning",children:(0,t.jsxs)(i.p,{children:["The ISO image will be written to ",(0,t.jsx)(i.em,{children:"all mounted USB drives"}),". Ensure that the only USB drive that is connected is the one you wish to write the ISO to."]})}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"MultiWriter Start",src:n(9581).Z+"",width:"706",height:"156"})}),"\n",(0,t.jsx)(i.p,{children:"If your USB drive is not mounted, you will be prompted with an image indicating to plug it in."}),"\n",(0,t.jsx)(i.p,{children:'Next, click the "Start Copying" button, and you will be prompted to select the ISO. Choose the ISO you downloaded in the "Getting the ISO" section. The USB will automatically be written to.'}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"MultiWriter Writing",src:n(65870).Z+"",width:"706",height:"156"})}),"\n",(0,t.jsx)(i.p,{children:"Upon completion, you will be prompted with the following dialog and your USB is now ready for use."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"MultiWriter Done",src:n(65492).Z+"",width:"706",height:"156"})}),"\n",(0,t.jsx)(i.h4,{id:"kde-iso-image-writer",children:"KDE ISO Image Writer"}),"\n",(0,t.jsx)(i.admonition,{type:"info",children:(0,t.jsx)(i.p,{children:"You will need both the ISO and sha256sums file for it saved in the same directory."})}),"\n",(0,t.jsx)(i.p,{children:"When you open ISO Image Writer, you will see a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"ImageWriter Start",src:n(74071).Z+"",width:"585",height:"446"})}),"\n",(0,t.jsx)(i.p,{children:"If there is no USB drive mounted, the USB drive field will be greyed out. Simply plug in the USB drive you want to use for the ISO, it will be auto-detected."}),"\n",(0,t.jsx)(i.p,{children:'Click on the top field "Write this ISO image:". Select the ISO image you downloaded in the "Getting the ISO" section.'}),"\n",(0,t.jsx)(i.p,{children:'You may see "Downloading ISO image". When this is done, click the Create button.'}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"ImageWriter Writing",src:n(64595).Z+"",width:"551",height:"430"})}),"\n",(0,t.jsx)(i.p,{children:"When the operation is finished, you will see the confirmation dialog. Your USB is now ready for use."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"ImageWriter Done",src:n(56443).Z+"",width:"585",height:"446"})}),"\n",(0,t.jsx)(i.h5,{id:"command-line",children:"Command-line"}),"\n",(0,t.jsxs)(i.p,{children:["For those comfortable with the command-line / terminal, we will walk you through using ",(0,t.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["First, insert the USB drive into your computer and open your Terminal. Proceed to type ",(0,t.jsx)(i.code,{children:"lsblk"})," into your Terminal. It should output something along the lines of:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 111.8G 0 disk\n\u251C\u2500sda1 8:1 0 350M 0 part\n\u251C\u2500sda2 8:2 0 39.7G 0 part\n\u2514\u2500sda3 8:3 0 71.8G 0 part /\nsdb 8:64 1 7.5G 0 disk\n\u251C\u2500sdb1 8:65 1 712M 0 part\n\u2514\u2500sdb2 8:66 1 17.2M 0 part\n"})}),"\n",(0,t.jsxs)(i.p,{children:["You will see one disk, in this case ",(0,t.jsx)(i.code,{children:"/dev/sdb"}),", that is roughly the size of the USB drive. Yours should be similar (difference being in size). Write this device down somewhere."]}),"\n",(0,t.jsxs)(i.p,{children:["Next, locate the downloaded ISO. It will most likely be in your Downloads folder. In the event that it is, type: ",(0,t.jsx)(i.code,{children:"cd ~/Downloads"})]}),"\n",(0,t.jsxs)(i.p,{children:["If it is ",(0,t.jsx)(i.strong,{children:"not"})," in your Downloads folder, use ",(0,t.jsx)(i.code,{children:"cd"})," to navigate to the correct directory."]}),"\n",(0,t.jsx)(i.admonition,{type:"danger",children:(0,t.jsxs)(i.p,{children:["This is where we overwrite the contents of your USB drive so please ensure you identified the correct drive in the ",(0,t.jsx)(i.code,{children:"lsblk"})," stage above. Selecting the wrong drive here will lead to its contents being overwritten. An example command is below, however you may need to replace ",(0,t.jsx)(i.code,{children:"sdb"})," with the drive we located above:"]})}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/sdb bs=4M status=progress oflag=sync && sudo eject /dev/sdb\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will write the contents of the ISO to the thumb drive so you can boot it and also make sure the data is synchronized so you can eject the USB safely."}),"\n",(0,t.jsx)(i.h3,{id:"windows-1",children:"Windows"}),"\n",(0,t.jsx)(i.h4,{id:"dvd-1",children:"DVD"}),"\n",(0,t.jsx)(i.p,{children:"You can easily burn an ISO image to a DVD, on Windows 7 and newer, by using Window's built-in file manager (Explorer)."}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open Windows' built-in file manager (Explorer)."}),"\n",(0,t.jsx)(i.li,{children:'Right click on the ISO image file and click "Burn disk image".'}),"\n",(0,t.jsx)(i.li,{children:"Select the correct disc burner."}),"\n",(0,t.jsx)(i.li,{children:'Click "Burn".'}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"usb-1",children:"USB"}),"\n",(0,t.jsxs)(i.p,{children:["You can easily burn an ISO image to a USB by using graphical tool ",(0,t.jsx)(i.a,{href:"https://rufus.ie/",children:"Rufus"}),"."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open Rufus."}),"\n",(0,t.jsx)(i.li,{children:"Ensure your device is correct by checking the contents of the Device dropdown."}),"\n",(0,t.jsx)(i.li,{children:"Click the CD icon found in the image below, and select the ISO."}),"\n",(0,t.jsx)(i.li,{children:'Untick all options except "Create a bootable disk using" and use the dropdown to select "DD Image".'}),"\n",(0,t.jsx)(i.li,{children:'Click "Start".'}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Rufus",src:n(3259).Z+"",width:"365",height:"518"})}),"\n",(0,t.jsx)(i.h3,{id:"macos",children:"macOS"}),"\n",(0,t.jsx)(i.h4,{id:"dvd-2",children:"DVD"}),"\n",(0,t.jsx)(i.p,{children:"Since OS X El Capitan (10.11), the easiest way to burn a DVD is:"}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Insert your DVD and open Finder."}),"\n",(0,t.jsx)(i.li,{children:"Right click on the ISO image."}),"\n",(0,t.jsx)(i.li,{children:"Click on \u201CBurn Disk Image \u2018Solus-Budgie-Release-2024-10-14.iso\u2019 to Disc\u2026\u201D"}),"\n",(0,t.jsx)(i.li,{children:"Then click \u201CBurn\u201D."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"macOS Burn DVD",src:n(87340).Z+"",width:"638",height:"343"})}),"\n",(0,t.jsx)(i.h4,{id:"usb-2",children:"USB"}),"\n",(0,t.jsx)(i.h5,{id:"graphical-tool",children:"Graphical tool"}),"\n",(0,t.jsxs)(i.p,{children:["One of the easiest ways to burn an ISO image to a USB thumb drive is by using a graphical tool called ",(0,t.jsx)(i.a,{href:"https://etcher.balena.io/",children:"Etcher"}),"."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open Etcher."}),"\n",(0,t.jsx)(i.li,{children:"Click on \u201CSelect image\u201D and then select the ISO and click \u201COpen\u201D."}),"\n",(0,t.jsx)(i.li,{children:"Etcher will automatically select your USB drive. If it has selected the wrong one, click \u201CChange\u201D and select the correct one."}),"\n",(0,t.jsx)(i.li,{children:"Click \u201CFlash!\u201D."}),"\n",(0,t.jsx)(i.li,{children:"You may be prompted for your macOS user password."}),"\n",(0,t.jsx)(i.li,{children:"Once Etcher has finished it is safe to remove the USB drive."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"You may see a message stating \u201CThe disk you inserted was not readable by this computer.\u201D once Etcher finishes. This can be ignored."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"macOS Etcher",src:n(61575).Z+"",width:"800",height:"380"})}),"\n",(0,t.jsx)(i.h5,{id:"command-line-1",children:"Command-line"}),"\n",(0,t.jsxs)(i.p,{children:["For those comfortable with the macOS Terminal app, we will walk you through using ",(0,t.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"First, insert the USB drive into your computer and open Terminal (found in Applications/Utilities)."}),"\n",(0,t.jsx)(i.p,{children:"Now you'll need to identify your USB drive by listing your storage devices with the following command:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"diskutil list\n"})}),"\n",(0,t.jsx)(i.p,{children:"You should see output similar to this:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"/dev/disk0 (internal, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *1.0 TB disk0\n 1: EFI EFI 209.7 MB disk0s1\n 2: Apple_HFS Macintosh HD 999.3 GB disk0s2\n 3: Apple_Boot Recovery HD 650.0 MB disk0s3\n\n/dev/disk1 (external, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *15.6 GB disk1\n 1: EFI EFI 209.7 MB disk1s1\n 2: Apple_HFS Ultra 15.3 GB disk1s2\n"})}),"\n",(0,t.jsxs)(i.p,{children:["From this output, we can see the USB drive is listed as ",(0,t.jsx)(i.code,{children:"/dev/disk1 (external, physical)"}),". In this example, the IDENTIFIER is ",(0,t.jsx)(i.code,{children:"disk1"}),". Please note, your USB drive may have a different identifier. You should be able to tell which is your USB drive by checking the name and size."]}),"\n",(0,t.jsxs)(i.p,{children:["macOS usually auto-mounts USB drives so you\u2019ll need to unmount it first before proceeding. Use the following command and replace ",(0,t.jsx)(i.code,{children:"IDENTIFIER"})," with the correct identifier we found in the ",(0,t.jsx)(i.code,{children:"diskutil list"})," step."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"diskutil unmountDisk /dev/IDENTIFIER\n"})}),"\n",(0,t.jsx)(i.p,{children:"Now navigate to the folder that has the downloaded ISO. This could be your Mac\u2019s Downloads folder. The following command will get you there:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cd ~/Downloads\n"})}),"\n",(0,t.jsx)(i.admonition,{type:"danger",children:(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"This next step is dangerous. Using the wrong drive identifier could result in data loss."})})}),"\n",(0,t.jsxs)(i.p,{children:["We will use the ",(0,t.jsx)(i.code,{children:"dd"})," command to write the contents of the ISO to the thumb drive. Replace ",(0,t.jsx)(i.code,{children:"IDENTIFIER"})," in the command below with your drive identifier. Note the extra ",(0,t.jsx)(i.code,{children:"r"})," before the identifier (i.e ",(0,t.jsx)(i.code,{children:"rdisk1"}),"). This is for raw mode, which along with bs=1m, makes the transfer faster."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/rIDENTIFIER bs=1m\n"})}),"\n",(0,t.jsx)(i.p,{children:"Be patient! After a few minutes you\u2019ll receive a message saying how much data was transferred. You can now safely eject the usb drive."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"diskutil eject /dev/IDENTIFIER\n"})}),"\n",(0,t.jsx)(i.h2,{id:"boot-the-media",children:"Boot the media"}),"\n",(0,t.jsx)(i.p,{children:"Now it is time to restart your computer to boot the DVD or USB. Most computers will automatically boot from DVDs and USB, however if you experience issues booting the media, you may need to select to boot from DVD or USB."}),"\n",(0,t.jsxs)(i.p,{children:["This is usually accessible by pressing ",(0,t.jsx)(i.code,{children:"F9"})," or ",(0,t.jsx)(i.code,{children:"F12"})," while your computer is booting. On some devices it may also be ",(0,t.jsx)(i.code,{children:"ESC"}),"."]}),"\n",(0,t.jsx)(i.p,{children:'Macs will boot to the "Startup Manager" by holding down the Option (Alt) key. The DVD or USB drive will most likely show up as "EFI Boot".'})]})}function c(e={}){let{wrapper:i}={...(0,l.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},65492:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/gmw_done-fdbb3bda7061afd0ca7f97b85c1cef18.jpg"},9581:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/gmw_start-c8e10b8e6f627b862f8f6344260db698.jpg"},65870:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/gmw_writing-1a2eb065ba3c61dd1371f89b2ab9f7c1.jpg"},74071:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/iiw_1_start-0457fdcee59f063744233653c88022f7.png"},64595:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/iiw_2_writing-61d90705ea2038df803e806657f7e20f.png"},56443:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/iiw_3_done-de4e8501e47d1073f945ae1aceb13995.png"},87340:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/mac-burn-dvd-0bef9578a58d61610854fc7c25e3496f.jpg"},61575:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/mac-etcher-2d28aaeb19eda12c960c6b09e81eceb2.jpg"},3259:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/rufus-6f16a561298400882bff901d61064e58.jpg"},50065:function(e,i,n){n.d(i,{Z:function(){return o},a:function(){return r}});var s=n(67294);let t={},l=s.createContext(t);function r(e){let i=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/533eefa9.b522d5bf.js b/assets/js/533eefa9.b522d5bf.js
deleted file mode 100644
index 9bca00793..000000000
--- a/assets/js/533eefa9.b522d5bf.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4002],{99023:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>a});var s=n(85893),t=n(11151);const l={title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},r="Preparing to install",o={id:"user/quick-start/installation/index",title:"Preparing to Install",description:"Before you start, make sure your system meets the minimum requirements.",source:"@site/docs/user/quick-start/installation/index.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/",permalink:"/docs/user/quick-start/installation/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},sidebar:"userSidebar",previous:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"},next:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"}},d={},a=[{value:"Getting the ISO",id:"getting-the-iso",level:2},{value:"Verifying the ISO",id:"verifying-the-iso",level:2},{value:"Linux and macOS",id:"linux-and-macos",level:3},{value:"Verifying the SHA256SUMS file signature",id:"verifying-the-sha256sums-file-signature",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum",level:4},{value:"Windows",id:"windows",level:3},{value:"Verifying signed SHA256SUM file",id:"verifying-signed-sha256sum-file",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum-1",level:4},{value:"Creating bootable media",id:"creating-bootable-media",level:2},{value:"Linux",id:"linux",level:3},{value:"DVD",id:"dvd",level:4},{value:"USB",id:"usb",level:4},{value:"GNOME MultiWriter",id:"gnome-multiwriter",level:5},{value:"KDE ISO Image Writer",id:"kde-iso-image-writer",level:4},{value:"Command-line",id:"command-line",level:5},{value:"Windows",id:"windows-1",level:3},{value:"DVD",id:"dvd-1",level:4},{value:"USB",id:"usb-1",level:4},{value:"macOS",id:"macos",level:3},{value:"DVD",id:"dvd-2",level:4},{value:"USB",id:"usb-2",level:4},{value:"Graphical tool",id:"graphical-tool",level:5},{value:"Command-line",id:"command-line-1",level:5},{value:"Boot the media",id:"boot-the-media",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"preparing-to-install",children:"Preparing to install"})}),"\n",(0,s.jsxs)(i.p,{children:["Before you start, make sure your system meets the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/system-requirements",children:"minimum requirements"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"The first step to installing Solus is getting the correct media. The Solus Project provides ISO images, which contain the contents of Solus for installing."}),"\n",(0,s.jsx)(i.h2,{id:"getting-the-iso",children:"Getting the ISO"}),"\n",(0,s.jsxs)(i.p,{children:["Download a Solus ISO by going to our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"})," and picking an edition."]}),"\n",(0,s.jsx)(i.h2,{id:"verifying-the-iso",children:"Verifying the ISO"}),"\n",(0,s.jsx)(i.h3,{id:"linux-and-macos",children:"Linux and macOS"}),"\n",(0,s.jsxs)(i.p,{children:["Download the SHA256SUMS files for your chosen ISO edition: ",(0,s.jsx)(i.em,{children:"File"}),", ",(0,s.jsx)(i.em,{children:"Signed File"})," and ",(0,s.jsx)(i.em,{children:"Public Key"})," from the links next to the ",(0,s.jsx)(i.em,{children:"Download"})," buttons on our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Note:"})," You should download all these files to the same directory."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-sha256sums-file-signature",children:"Verifying the SHA256SUMS file signature"}),"\n",(0,s.jsx)(i.p,{children:"Import the Solus public key:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/path/to/download/directory\ngpg --import solus-releng-pub.gpg\n"})}),"\n",(0,s.jsx)(i.p,{children:"Verify the signed checksum file:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"gpg --verify Solus-Budgie-Release-2024-10-14.iso.sha256sum.sign Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Check that the computed hash of the downloaded ISO file matches the hash supplied by Solus:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sha256sum -c Solus-Budgie-Release-2024-10-14.iso.sha256sum | grep OK\n"})}),"\n",(0,s.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"verifying-signed-sha256sum-file",children:"Verifying signed SHA256SUM file"}),"\n",(0,s.jsxs)(i.p,{children:["On Windows, first install ",(0,s.jsx)(i.a,{href:"https://www.gpg4win.org/",children:"Gpg4win"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Now you can run the same ",(0,s.jsx)(i.code,{children:"gpg"})," commands from the the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/#verifying-the-sha256sums-file-signature",children:(0,s.jsx)(i.em,{children:"Verifyng the SHA256SUMS file signature"})})," section above."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum-1",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Launch powershell and compute the hash of the ISO file you just downloaded. You will have to manually compare the result to the hash in the SHA256SUMS file."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-powershell",children:"Get-FileHash C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso\ncat C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Alternatively, you can use a graphical program that can calculate SHA256 hashes like ",(0,s.jsx)(i.em,{children:"Rufus"})," or ",(0,s.jsx)(i.em,{children:"7-Zip"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"creating-bootable-media",children:"Creating bootable media"}),"\n",(0,s.jsx)(i.p,{children:"To make boot media, you will need:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Either a blank DVD or a USB drive larger than 2 GB."}),"\n",(0,s.jsx)(i.li,{children:"If using a USB, the ability to boot from the USB."}),"\n",(0,s.jsxs)(i.li,{children:["ISO file from the ",(0,s.jsx)(i.a,{href:"#getting-the-iso",children:"Getting the ISO"})," section."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"There are many tools which can write our ISO image to DVDs or USB thumb drives. Chose from an option below."}),"\n",(0,s.jsx)(i.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(i.h4,{id:"dvd",children:"DVD"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/Brasero",children:"Brasero"})," for writing the ISO to a DVD."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert blank DVD (DVD-R or DVD+RW is suitable) into your DVD writer."}),"\n",(0,s.jsx)(i.li,{children:"Open Brasero."}),"\n",(0,s.jsx)(i.li,{children:"Select the option \u201cBurn image\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Click the \u201cClick here to select a disc image\u201d button and using the file dialog, choose the ISO."}),"\n",(0,s.jsx)(i.li,{children:"Ensure the correct DVD is selected in the \u201cSelect a disc to write to\u201d."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn" and wait.'}),"\n",(0,s.jsx)(i.li,{children:'Upon seeing \u201cImage successfully burned to DVD\u201d, click "Close".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/MultiWriter",children:"GNOME MultiWriter"})," or ",(0,s.jsx)(i.a,{href:"https://apps.kde.org/isoimagewriter/",children:"ISO Image Writer"})," for KDE. Please note that UNetbootin will ",(0,s.jsx)(i.strong,{children:"not"})," work."]}),"\n",(0,s.jsx)(i.h5,{id:"gnome-multiwriter",children:"GNOME MultiWriter"}),"\n",(0,s.jsx)(i.p,{children:"Upon opening GNOME MultiWriter, you will likely be shown a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["The ISO image will be written to ",(0,s.jsx)(i.em,{children:"all mounted USB drives"}),". Ensure that the only USB drive that is connected is the one you wish to write the ISO to."]})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Start",src:n(7173).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"If your USB drive is not mounted, you will be prompted with an image indicating to plug it in."}),"\n",(0,s.jsx)(i.p,{children:'Next, click the "Start Copying" button, and you will be prompted to select the ISO. Choose the ISO you downloaded in the "Getting the ISO" section. The USB will automatically be written to.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Writing",src:n(39115).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"Upon completion, you will be prompted with the following dialog and your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Done",src:n(69064).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.h4,{id:"kde-iso-image-writer",children:"KDE ISO Image Writer"}),"\n",(0,s.jsx)(i.admonition,{type:"info",children:(0,s.jsx)(i.p,{children:"You will need both the ISO and sha256sums file for it saved in the same directory."})}),"\n",(0,s.jsx)(i.p,{children:"When you open ISO Image Writer, you will see a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Start",src:n(8234).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.p,{children:"If there is no USB drive mounted, the USB drive field will be greyed out. Simply plug in the USB drive you want to use for the ISO, it will be auto-detected."}),"\n",(0,s.jsx)(i.p,{children:'Click on the top field "Write this ISO image:". Select the ISO image you downloaded in the "Getting the ISO" section.'}),"\n",(0,s.jsx)(i.p,{children:'You may see "Downloading ISO image". When this is done, click the Create button.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Writing",src:n(51213).Z+"",width:"551",height:"430"})}),"\n",(0,s.jsx)(i.p,{children:"When the operation is finished, you will see the confirmation dialog. Your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Done",src:n(46368).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the command-line / terminal, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["First, insert the USB drive into your computer and open your Terminal. Proceed to type ",(0,s.jsx)(i.code,{children:"lsblk"})," into your Terminal. It should output something along the lines of:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 111.8G 0 disk\n\u251c\u2500sda1 8:1 0 350M 0 part\n\u251c\u2500sda2 8:2 0 39.7G 0 part\n\u2514\u2500sda3 8:3 0 71.8G 0 part /\nsdb 8:64 1 7.5G 0 disk\n\u251c\u2500sdb1 8:65 1 712M 0 part\n\u2514\u2500sdb2 8:66 1 17.2M 0 part\n"})}),"\n",(0,s.jsxs)(i.p,{children:["You will see one disk, in this case ",(0,s.jsx)(i.code,{children:"/dev/sdb"}),", that is roughly the size of the USB drive. Yours should be similar (difference being in size). Write this device down somewhere."]}),"\n",(0,s.jsxs)(i.p,{children:["Next, locate the downloaded ISO. It will most likely be in your Downloads folder. In the event that it is, type: ",(0,s.jsx)(i.code,{children:"cd ~/Downloads"})]}),"\n",(0,s.jsxs)(i.p,{children:["If it is ",(0,s.jsx)(i.strong,{children:"not"})," in your Downloads folder, use ",(0,s.jsx)(i.code,{children:"cd"})," to navigate to the correct directory."]}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsxs)(i.p,{children:["This is where we overwrite the contents of your USB drive so please ensure you identified the correct drive in the ",(0,s.jsx)(i.code,{children:"lsblk"})," stage above. Selecting the wrong drive here will lead to its contents being overwritten. An example command is below, however you may need to replace ",(0,s.jsx)(i.code,{children:"sdb"})," with the drive we located above:"]})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/sdb bs=4M status=progress oflag=sync && sudo eject /dev/sdb\n"})}),"\n",(0,s.jsx)(i.p,{children:"This will write the contents of the ISO to the thumb drive so you can boot it and also make sure the data is synchronized so you can eject the USB safely."}),"\n",(0,s.jsx)(i.h3,{id:"windows-1",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-1",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"You can easily burn an ISO image to a DVD, on Windows 7 and newer, by using Window's built-in file manager (Explorer)."}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Windows' built-in file manager (Explorer)."}),"\n",(0,s.jsx)(i.li,{children:'Right click on the ISO image file and click "Burn disk image".'}),"\n",(0,s.jsx)(i.li,{children:"Select the correct disc burner."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb-1",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["You can easily burn an ISO image to a USB by using graphical tool ",(0,s.jsx)(i.a,{href:"https://rufus.ie/",children:"Rufus"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Rufus."}),"\n",(0,s.jsx)(i.li,{children:"Ensure your device is correct by checking the contents of the Device dropdown."}),"\n",(0,s.jsx)(i.li,{children:"Click the CD icon found in the image below, and select the ISO."}),"\n",(0,s.jsx)(i.li,{children:'Untick all options except "Create a bootable disk using" and use the dropdown to select "DD Image".'}),"\n",(0,s.jsx)(i.li,{children:'Click "Start".'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Rufus",src:n(93093).Z+"",width:"365",height:"518"})}),"\n",(0,s.jsx)(i.h3,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-2",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"Since OS X El Capitan (10.11), the easiest way to burn a DVD is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert your DVD and open Finder."}),"\n",(0,s.jsx)(i.li,{children:"Right click on the ISO image."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cBurn Disk Image \u2018Solus-Budgie-Release-2024-10-14.iso\u2019 to Disc\u2026\u201d"}),"\n",(0,s.jsx)(i.li,{children:"Then click \u201cBurn\u201d."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Burn DVD",src:n(54725).Z+"",width:"638",height:"343"})}),"\n",(0,s.jsx)(i.h4,{id:"usb-2",children:"USB"}),"\n",(0,s.jsx)(i.h5,{id:"graphical-tool",children:"Graphical tool"}),"\n",(0,s.jsxs)(i.p,{children:["One of the easiest ways to burn an ISO image to a USB thumb drive is by using a graphical tool called ",(0,s.jsx)(i.a,{href:"https://etcher.balena.io/",children:"Etcher"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Etcher."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cSelect image\u201d and then select the ISO and click \u201cOpen\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Etcher will automatically select your USB drive. If it has selected the wrong one, click \u201cChange\u201d and select the correct one."}),"\n",(0,s.jsx)(i.li,{children:"Click \u201cFlash!\u201d."}),"\n",(0,s.jsx)(i.li,{children:"You may be prompted for your macOS user password."}),"\n",(0,s.jsx)(i.li,{children:"Once Etcher has finished it is safe to remove the USB drive."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"You may see a message stating \u201cThe disk you inserted was not readable by this computer.\u201d once Etcher finishes. This can be ignored."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Etcher",src:n(74020).Z+"",width:"800",height:"380"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line-1",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the macOS Terminal app, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"First, insert the USB drive into your computer and open Terminal (found in Applications/Utilities)."}),"\n",(0,s.jsx)(i.p,{children:"Now you'll need to identify your USB drive by listing your storage devices with the following command:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil list\n"})}),"\n",(0,s.jsx)(i.p,{children:"You should see output similar to this:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"/dev/disk0 (internal, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *1.0 TB disk0\n 1: EFI EFI 209.7 MB disk0s1\n 2: Apple_HFS Macintosh HD 999.3 GB disk0s2\n 3: Apple_Boot Recovery HD 650.0 MB disk0s3\n\n/dev/disk1 (external, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *15.6 GB disk1\n 1: EFI EFI 209.7 MB disk1s1\n 2: Apple_HFS Ultra 15.3 GB disk1s2\n"})}),"\n",(0,s.jsxs)(i.p,{children:["From this output, we can see the USB drive is listed as ",(0,s.jsx)(i.code,{children:"/dev/disk1 (external, physical)"}),". In this example, the IDENTIFIER is ",(0,s.jsx)(i.code,{children:"disk1"}),". Please note, your USB drive may have a different identifier. You should be able to tell which is your USB drive by checking the name and size."]}),"\n",(0,s.jsxs)(i.p,{children:["macOS usually auto-mounts USB drives so you\u2019ll need to unmount it first before proceeding. Use the following command and replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," with the correct identifier we found in the ",(0,s.jsx)(i.code,{children:"diskutil list"})," step."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil unmountDisk /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.p,{children:"Now navigate to the folder that has the downloaded ISO. This could be your Mac\u2019s Downloads folder. The following command will get you there:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/Downloads\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"This next step is dangerous. Using the wrong drive identifier could result in data loss."})})}),"\n",(0,s.jsxs)(i.p,{children:["We will use the ",(0,s.jsx)(i.code,{children:"dd"})," command to write the contents of the ISO to the thumb drive. Replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," in the command below with your drive identifier. Note the extra ",(0,s.jsx)(i.code,{children:"r"})," before the identifier (i.e ",(0,s.jsx)(i.code,{children:"rdisk1"}),"). This is for raw mode, which along with bs=1m, makes the transfer faster."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/rIDENTIFIER bs=1m\n"})}),"\n",(0,s.jsx)(i.p,{children:"Be patient! After a few minutes you\u2019ll receive a message saying how much data was transferred. You can now safely eject the usb drive."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil eject /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.h2,{id:"boot-the-media",children:"Boot the media"}),"\n",(0,s.jsx)(i.p,{children:"Now it is time to restart your computer to boot the DVD or USB. Most computers will automatically boot from DVDs and USB, however if you experience issues booting the media, you may need to select to boot from DVD or USB."}),"\n",(0,s.jsxs)(i.p,{children:["This is usually accessible by pressing ",(0,s.jsx)(i.code,{children:"F9"})," or ",(0,s.jsx)(i.code,{children:"F12"})," while your computer is booting. On some devices it may also be ",(0,s.jsx)(i.code,{children:"ESC"}),"."]}),"\n",(0,s.jsx)(i.p,{children:'Macs will boot to the "Startup Manager" by holding down the Option (Alt) key. The DVD or USB drive will most likely show up as "EFI Boot".'})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},69064:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_done-fdbb3bda7061afd0ca7f97b85c1cef18.jpg"},7173:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_start-c8e10b8e6f627b862f8f6344260db698.jpg"},39115:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_writing-1a2eb065ba3c61dd1371f89b2ab9f7c1.jpg"},8234:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_1_start-0457fdcee59f063744233653c88022f7.png"},51213:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_2_writing-61d90705ea2038df803e806657f7e20f.png"},46368:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_3_done-de4e8501e47d1073f945ae1aceb13995.png"},54725:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-burn-dvd-0bef9578a58d61610854fc7c25e3496f.jpg"},74020:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-etcher-2d28aaeb19eda12c960c6b09e81eceb2.jpg"},93093:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/rufus-6f16a561298400882bff901d61064e58.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>o,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5685b4d8.92a85a9a.js b/assets/js/5685b4d8.92a85a9a.js
new file mode 100644
index 000000000..8974d6e6a
--- /dev/null
+++ b/assets/js/5685b4d8.92a85a9a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["709"],{29137:function(e,n,t){t.r(n),t.d(n,{metadata:()=>i,contentTitle:()=>c,default:()=>d,assets:()=>u,toc:()=>a,frontMatter:()=>s});var i=JSON.parse('{"id":"user/editions/xfce/configuration","title":"Configuration","description":"TODO: Add configuration snippets for XFCE","source":"@site/docs/user/editions/xfce/configuration.md","sourceDirName":"user/editions/xfce","slug":"/user/editions/xfce/configuration","permalink":"/docs/user/editions/xfce/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/configuration.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Configuration","summary":"Help for configuring XFCE on Solus"},"sidebar":"userSidebar","previous":{"title":"XFCE","permalink":"/docs/user/editions/xfce/"},"next":{"title":"Tips and Tricks","permalink":"/docs/user/editions/xfce/tips-and-tricks"}}'),o=t("85893"),r=t("50065");let s={title:"Configuration",summary:"Help for configuring XFCE on Solus"},c="Configuration",u={},a=[];function f(e){let n={h1:"h1",header:"header",p:"p",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(n.p,{children:"TODO: Add configuration snippets for XFCE"})]})}function d(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(f,{...e})}):f(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return c},a:function(){return s}});var i=t(67294);let o={},r=i.createContext(o);function s(e){let n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5685b4d8.fffedb97.js b/assets/js/5685b4d8.fffedb97.js
deleted file mode 100644
index 3cc7833b1..000000000
--- a/assets/js/5685b4d8.fffedb97.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1540],{17599:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(85893),i=t(11151);const r={title:"Configuration",summary:"Help for configuring XFCE on Solus"},s="Configuration",c={id:"user/editions/xfce/configuration",title:"Configuration",description:"TODO: Add configuration snippets for XFCE",source:"@site/docs/user/editions/xfce/configuration.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/configuration",permalink:"/docs/user/editions/xfce/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/configuration.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Configuration",summary:"Help for configuring XFCE on Solus"},sidebar:"userSidebar",previous:{title:"XFCE",permalink:"/docs/user/editions/xfce/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"}},u={},a=[];function d(e){const n={h1:"h1",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(n.p,{children:"TODO: Add configuration snippets for XFCE"})]})}function f(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(67294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5966.bb6949e9.js b/assets/js/5966.bb6949e9.js
deleted file mode 100644
index a518abfa5..000000000
--- a/assets/js/5966.bb6949e9.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5966],{58112:(e,t,a)=>{a.d(t,{n4:()=>c,Ne:()=>C,ci:()=>_,CS:()=>f,wj:()=>i,nO:()=>u,iZ:()=>x,cH:()=>M});var n=a(67294),s=a(20585),r=a(3675),l=a(85893);function i(){const e=(0,r.Z)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=n.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const r=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,l.jsx)(o.Provider,{value:r,children:t})}function u(){const e=(0,n.useContext)(o);if(null===e)throw new s.i6("BlogPostProvider");return e}var m=a(23466),h=a(75276);const d=e=>new Date(e).toISOString();function g(e){const t=e.map(v);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function f(e){const{siteConfig:t}=(0,h.Z)(),{withBaseUrl:a}=(0,m.Cg)(),{metadata:{blogDescription:n,blogTitle:s,permalink:r}}=e,l=`${t.url}${r}`;return{"@context":"https://schema.org","@type":"Blog","@id":l,mainEntityOfPage:l,headline:s,description:n,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:l,title:i,description:o,lastUpdatedAt:c}=r,u=n.image??s.image,m=s.keywords??[],h=`${t.url}${r.permalink}`,f=c?d(c):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:i,name:i,description:o,datePublished:l,...f?{dateModified:f}:{},...g(r.authors),...p(u,a,i),...m?{keywords:m}:{}}}(e.content,t,a)))}}function x(){const e=i(),{assets:t,metadata:a}=u(),{siteConfig:n}=(0,h.Z)(),{withBaseUrl:s}=(0,m.Cg)(),{date:r,title:l,description:o,frontMatter:c,lastUpdatedAt:f}=a,x=t.image??c.image,v=c.keywords??[],j=f?d(f):void 0,b=`${n.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":b,mainEntityOfPage:b,url:b,headline:l,name:l,description:o,datePublished:r,...j?{dateModified:j}:{},...g(a.authors),...p(x,s,l),...v?{keywords:v}:{},isPartOf:{"@type":"Blog","@id":`${n.url}${e.blogBasePath}`,name:e.blogTitle}}}function v(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var b=a(16550),w=a(38208),N=a(79113),k=a(51997);function M(e){const{pathname:t}=(0,b.TH)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.Mg)(e.permalink,t))}(e,t)))),[e,t])}function _(e){const t=(0,N.vM)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function C(e){let{items:t,ulClassName:a,liClassName:n,linkClassName:s,linkActiveClassName:r}=e;return(0,l.jsx)("ul",{className:a,children:t.map((e=>(0,l.jsx)("li",{className:n,children:(0,l.jsx)(w.Z,{isNavLink:!0,to:e.permalink,className:s,activeClassName:r,children:e.title})},e.permalink)))})}},68588:(e,t,a)=>{a.d(t,{Z:()=>j});a(67294);var n=a(36905),s=a(38208),r=a(85893);const l="githubSvg_Uu4N";const i="xSvg_y3PF";const o=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})},c={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},u={twitter:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 209",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 250",width:"1em",height:"1em",...e,className:(0,n.Z)(e.className,l),xmlns:"http://www.w3.org/2000/svg",style:{"--dark":"#000","--light":"#fff"},preserveAspectRatio:"xMidYMid",children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",...e,className:(0,n.Z)(e.className,i),style:{"--dark":"#000","--light":"#fff"},children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"}};function m(e){let{platform:t,link:a}=e;const{Icon:l,label:i}=u[m=t]??{Icon:o,label:m};var m;return(0,r.jsx)(s.Z,{className:c.authorSocialLink,href:a,title:i,children:(0,r.jsx)(l,{className:(0,n.Z)(c.authorSocialLink)})})}function h(e){let{author:t}=e;const a=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:c.authorSocials,children:a.map((e=>{let[t,a]=e;return(0,r.jsx)(m,{platform:t,link:a},t)}))})}var d=a(42704);const g={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function p(e){return e.href?(0,r.jsx)(s.Z,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function f(e){let{title:t}=e;return(0,r.jsx)("small",{className:g.authorTitle,title:t,children:t})}function x(e){let{name:t,as:a}=e;return a?(0,r.jsx)(d.Z,{as:a,className:g.authorName,children:t}):(0,r.jsx)("span",{className:g.authorName,children:t})}function v(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.Z)(g.authorBlogPostCount),children:t})}function j(e){let{as:t,author:a,className:s,count:l}=e;const{name:i,title:o,url:c,imageURL:u,email:m,page:d}=a,j=d?.permalink||c||m&&`mailto:${m}`||void 0;return(0,r.jsxs)("div",{className:(0,n.Z)("avatar margin-bottom--sm",s,g[`author-as-${t}`]),children:[u&&(0,r.jsx)(p,{href:j,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.Z)("avatar__photo",g.authorImage),src:u,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.Z)("avatar__intro",g.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(p,{href:j,children:(0,r.jsx)(x,{name:i,as:t})}),l&&(0,r.jsx)(v,{count:l})]}),!!o&&(0,r.jsx)(f,{title:o}),(0,r.jsx)(h,{author:a})]})]})}},50429:(e,t,a)=>{a.d(t,{Z:()=>L});var n=a(67294),s=a(36905),r=a(48714),l=a(62550),i=a(55361),o=a(58112),c=a(39581),u=a(42704),m=a(85893);function h(e){let{year:t,yearGroupHeadingClassName:a,children:n}=e;return(0,m.jsxs)("div",{role:"group",children:[(0,m.jsx)(u.Z,{as:"h3",className:a,children:t}),n]})}function d(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:n}=e;if((0,c.L)().blog.sidebar.groupByYear){const e=(0,o.ci)(t);return(0,m.jsx)(m.Fragment,{children:e.map((e=>{let[t,s]=e;return(0,m.jsx)(h,{year:t,yearGroupHeadingClassName:a,children:(0,m.jsx)(n,{items:s})},t)}))})}return(0,m.jsx)(n,{items:t})}const g=(0,n.memo)(d),p="sidebar_re4s",f="sidebarItemTitle_pO2u",x="sidebarItemList_Yudw",v="sidebarItem__DBe",j="sidebarItemLink_mo7H",b="sidebarItemLinkActive_I1ZP",w="yearGroupHeading_rMGB",N=e=>{let{items:t}=e;return(0,m.jsx)(o.Ne,{items:t,ulClassName:(0,s.Z)(x,"clean-list"),liClassName:v,linkClassName:j,linkActiveClassName:b})};function k(e){let{sidebar:t}=e;const a=(0,o.cH)(t.items);return(0,m.jsx)("aside",{className:"col col--3",children:(0,m.jsxs)("nav",{className:(0,s.Z)(p,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,m.jsx)("div",{className:(0,s.Z)(f,"margin-bottom--md"),children:t.title}),(0,m.jsx)(g,{items:a,ListComponent:N,yearGroupHeadingClassName:w})]})})}const M=(0,n.memo)(k);var _=a(5689);const C={yearGroupHeading:"yearGroupHeading_QT03"},Z=e=>{let{items:t}=e;return(0,m.jsx)(o.Ne,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function y(e){let{sidebar:t}=e;const a=(0,o.cH)(t.items);return(0,m.jsx)(g,{items:a,ListComponent:Z,yearGroupHeadingClassName:C.yearGroupHeading})}function P(e){return(0,m.jsx)(_.Zo,{component:y,props:e})}const B=(0,n.memo)(P);function I(e){let{sidebar:t}=e;const a=(0,l.i)();return t?.items.length?"mobile"===a?(0,m.jsx)(B,{sidebar:t}):(0,m.jsx)(M,{sidebar:t}):null}function L(e){const{sidebar:t,toc:a,children:n,...l}=e,i=t&&t.items.length>0;return(0,m.jsx)(r.Z,{...l,children:(0,m.jsx)("div",{className:"container margin-vert--lg",children:(0,m.jsxs)("div",{className:"row",children:[(0,m.jsx)(I,{sidebar:t}),(0,m.jsx)("main",{className:(0,s.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:n}),a&&(0,m.jsx)("div",{className:"col col--2",children:a})]})})})}},59676:(e,t,a)=>{a.d(t,{c:()=>c});var n=a(67294),s=a(75276);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,s.Z)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}}}]);
\ No newline at end of file
diff --git a/assets/js/5b7f3753.8147221e.js b/assets/js/5b7f3753.8147221e.js
deleted file mode 100644
index 538d9e7a9..000000000
--- a/assets/js/5b7f3753.8147221e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6413],{47512:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=n(85893),s=n(11151);const a={title:"Git Basics",summary:"Basic git commands for packaging"},r="Git Basics",c={id:"packaging/git-basics",title:"Git Basics",description:"Working with branches",source:"@site/docs/packaging/git-basics.md",sourceDirName:"packaging",slug:"/packaging/git-basics",permalink:"/docs/packaging/git-basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/git-basics.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Git Basics",summary:"Basic git commands for packaging"},sidebar:"packagingSidebar",previous:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"},next:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"}},o={},h=[{value:"Working with branches",id:"working-with-branches",level:2},{value:"Keeping your branch up to date with the main branch",id:"keeping-your-branch-up-to-date-with-the-main-branch",level:2},{value:"Adding files",id:"adding-files",level:2},{value:"Removing files",id:"removing-files",level:2},{value:"Renaming files",id:"renaming-files",level:2},{value:"Check the changes in your files",id:"check-the-changes-in-your-files",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Deleting your branch after a pull request is merged",id:"deleting-your-branch-after-a-pull-request-is-merged",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"git-basics",children:"Git Basics"})}),"\n",(0,t.jsx)(i.h2,{id:"working-with-branches",children:"Working with branches"}),"\n",(0,t.jsxs)(i.p,{children:["The recommended way to switch branches is ",(0,t.jsx)(i.code,{children:"git switch"}),".\nTo create a new branch use ",(0,t.jsx)(i.code,{children:"git switch -c"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"keeping-your-branch-up-to-date-with-the-main-branch",children:"Keeping your branch up to date with the main branch"}),"\n",(0,t.jsxs)(i.p,{children:["If there any new changes to the repository whilst you are still working on your branch you need to ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork",children:"sync your fork"}),".\nRun ",(0,t.jsx)(i.code,{children:"git fetch"}),", and ",(0,t.jsx)(i.code,{children:"git rebase origin/main"})," to pull the changes in.\nYou will need to fix any conflicts manually.\nYou can check your branch against main with ",(0,t.jsx)(i.code,{children:"git diff origin/main..my-branch"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"adding-files",children:"Adding files"}),"\n",(0,t.jsxs)(i.p,{children:["For every file you change or add, you must let git know about it: ",(0,t.jsx)(i.code,{children:"git add someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"removing-files",children:"Removing files"}),"\n",(0,t.jsxs)(i.p,{children:["For files that need to be removed, you must do so using git: ",(0,t.jsx)(i.code,{children:"git rm someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"renaming-files",children:"Renaming files"}),"\n",(0,t.jsxs)(i.p,{children:["Likewise, for renaming a file, you must do so via git: ",(0,t.jsx)(i.code,{children:"git mv someFile someFileName2"})]}),"\n",(0,t.jsx)(i.h2,{id:"check-the-changes-in-your-files",children:"Check the changes in your files"}),"\n",(0,t.jsx)(i.p,{children:"It's a good idea to review the changes you have made to each file. This is to make sure you're committing what you intend and to make sure it looks good. Do this before adding changed files."}),"\n",(0,t.jsxs)(i.p,{children:["To diff them all at once, useful for small changes, use ",(0,t.jsx)(i.code,{children:"git diff"}),".\nTo diff each file one at a time run ",(0,t.jsx)(i.code,{children:"git diff filename"})," on each one."]}),"\n",(0,t.jsx)(i.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Check your branch"})}),"\n",(0,t.jsxs)(i.p,{children:["Get the status of the branch with ",(0,t.jsx)(i.code,{children:"git status"}),". Make sure all the files you changed are staged, and that there are no untracked files. The git status should say your branch is clean."]}),"\n",(0,t.jsxs)(i.p,{children:["Now that you've tested and reviewed your change, when you're happy with it, it's time to commit your changes with ",(0,t.jsx)(i.code,{children:"git commit"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"deleting-your-branch-after-a-pull-request-is-merged",children:"Deleting your branch after a pull request is merged"}),"\n",(0,t.jsx)(i.p,{children:"Once your pull request has been accepted you can delete your working branches.\nFirst, change to the package directory, switch to the main branch, then delete your local and the remote branches."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit branch -D my-branch\ngit push -d origin my-branch\n"})})]})}function d(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>r});var t=n(67294);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5b7f3753.8b669d2a.js b/assets/js/5b7f3753.8b669d2a.js
new file mode 100644
index 000000000..44f9964c0
--- /dev/null
+++ b/assets/js/5b7f3753.8b669d2a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1157"],{76571:function(e,i,n){n.r(i),n.d(i,{metadata:()=>t,contentTitle:()=>c,default:()=>d,assets:()=>o,toc:()=>h,frontMatter:()=>r});var t=JSON.parse('{"id":"packaging/git-basics","title":"Git Basics","description":"Working with branches","source":"@site/docs/packaging/git-basics.md","sourceDirName":"packaging","slug":"/packaging/git-basics","permalink":"/docs/packaging/git-basics","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/git-basics.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Git Basics","summary":"Basic git commands for packaging"},"sidebar":"packagingSidebar","previous":{"title":"Appstream Metainfo","permalink":"/docs/packaging/appstream-metainfo"},"next":{"title":"Monitoring YAML","permalink":"/docs/packaging/monitoring.yml"}}'),s=n("85893"),a=n("50065");let r={title:"Git Basics",summary:"Basic git commands for packaging"},c="Git Basics",o={},h=[{value:"Working with branches",id:"working-with-branches",level:2},{value:"Keeping your branch up to date with the main branch",id:"keeping-your-branch-up-to-date-with-the-main-branch",level:2},{value:"Adding files",id:"adding-files",level:2},{value:"Removing files",id:"removing-files",level:2},{value:"Renaming files",id:"renaming-files",level:2},{value:"Check the changes in your files",id:"check-the-changes-in-your-files",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Deleting your branch after a pull request is merged",id:"deleting-your-branch-after-a-pull-request-is-merged",level:2}];function l(e){let i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"git-basics",children:"Git Basics"})}),"\n",(0,s.jsx)(i.h2,{id:"working-with-branches",children:"Working with branches"}),"\n",(0,s.jsxs)(i.p,{children:["The recommended way to switch branches is ",(0,s.jsx)(i.code,{children:"git switch"}),".\nTo create a new branch use ",(0,s.jsx)(i.code,{children:"git switch -c"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"keeping-your-branch-up-to-date-with-the-main-branch",children:"Keeping your branch up to date with the main branch"}),"\n",(0,s.jsxs)(i.p,{children:["If there any new changes to the repository whilst you are still working on your branch you need to ",(0,s.jsx)(i.a,{href:"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork",children:"sync your fork"}),".\nRun ",(0,s.jsx)(i.code,{children:"git fetch"}),", and ",(0,s.jsx)(i.code,{children:"git rebase origin/main"})," to pull the changes in.\nYou will need to fix any conflicts manually.\nYou can check your branch against main with ",(0,s.jsx)(i.code,{children:"git diff origin/main..my-branch"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"adding-files",children:"Adding files"}),"\n",(0,s.jsxs)(i.p,{children:["For every file you change or add, you must let git know about it: ",(0,s.jsx)(i.code,{children:"git add someFile"})]}),"\n",(0,s.jsx)(i.h2,{id:"removing-files",children:"Removing files"}),"\n",(0,s.jsxs)(i.p,{children:["For files that need to be removed, you must do so using git: ",(0,s.jsx)(i.code,{children:"git rm someFile"})]}),"\n",(0,s.jsx)(i.h2,{id:"renaming-files",children:"Renaming files"}),"\n",(0,s.jsxs)(i.p,{children:["Likewise, for renaming a file, you must do so via git: ",(0,s.jsx)(i.code,{children:"git mv someFile someFileName2"})]}),"\n",(0,s.jsx)(i.h2,{id:"check-the-changes-in-your-files",children:"Check the changes in your files"}),"\n",(0,s.jsx)(i.p,{children:"It's a good idea to review the changes you have made to each file. This is to make sure you're committing what you intend and to make sure it looks good. Do this before adding changed files."}),"\n",(0,s.jsxs)(i.p,{children:["To diff them all at once, useful for small changes, use ",(0,s.jsx)(i.code,{children:"git diff"}),".\nTo diff each file one at a time run ",(0,s.jsx)(i.code,{children:"git diff filename"})," on each one."]}),"\n",(0,s.jsx)(i.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"Check your branch"})}),"\n",(0,s.jsxs)(i.p,{children:["Get the status of the branch with ",(0,s.jsx)(i.code,{children:"git status"}),". Make sure all the files you changed are staged, and that there are no untracked files. The git status should say your branch is clean."]}),"\n",(0,s.jsxs)(i.p,{children:["Now that you've tested and reviewed your change, when you're happy with it, it's time to commit your changes with ",(0,s.jsx)(i.code,{children:"git commit"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"deleting-your-branch-after-a-pull-request-is-merged",children:"Deleting your branch after a pull request is merged"}),"\n",(0,s.jsx)(i.p,{children:"Once your pull request has been accepted you can delete your working branches.\nFirst, change to the package directory, switch to the main branch, then delete your local and the remote branches."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit branch -D my-branch\ngit push -d origin my-branch\n"})})]})}function d(e={}){let{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},50065:function(e,i,n){n.d(i,{Z:function(){return c},a:function(){return r}});var t=n(67294);let s={},a=t.createContext(s);function r(e){let i=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5e95c892.0f0e0eb4.js b/assets/js/5e95c892.0f0e0eb4.js
deleted file mode 100644
index 9ae6450cf..000000000
--- a/assets/js/5e95c892.0f0e0eb4.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9661],{14399:(e,s,r)=>{r.r(s),r.d(s,{default:()=>h});r(67294);var u=r(36905),c=r(96984),l=r(50563),n=r(18790),t=r(48714),a=r(85893);function h(e){return(0,a.jsx)(c.FG,{className:(0,u.Z)(l.k.wrapper.docsPages),children:(0,a.jsx)(t.Z,{children:(0,n.H)(e.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/5e95c892.c55661b1.js b/assets/js/5e95c892.c55661b1.js
new file mode 100644
index 000000000..eff172831
--- /dev/null
+++ b/assets/js/5e95c892.c55661b1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3432"],{1532:function(e,r,s){s.r(r),s.d(r,{default:function(){return o}});var n=s(85893);s(67294);var u=s(74904),c=s(81921),t=s(50490),l=s(18790),a=s(99757);function o(e){return(0,n.jsx)(c.FG,{className:(0,u.Z)(t.k.wrapper.docsPages),children:(0,n.jsx)(a.Z,{children:(0,l.H)(e.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/5efe994e.c42eb5a5.js b/assets/js/5efe994e.c42eb5a5.js
new file mode 100644
index 000000000..3325bf591
--- /dev/null
+++ b/assets/js/5efe994e.c42eb5a5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5015"],{35568:function(l){l.exports=JSON.parse('{"tag":{"label":"llvm","permalink":"/blog/tags/llvm","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/llvm","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/5efe994e.eb5044e0.js b/assets/js/5efe994e.eb5044e0.js
deleted file mode 100644
index 17acc9e4a..000000000
--- a/assets/js/5efe994e.eb5044e0.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1598],{83532:l=>{l.exports=JSON.parse('{"tag":{"label":"llvm","permalink":"/blog/tags/llvm","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/llvm","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/5f194406.500d2564.js b/assets/js/5f194406.500d2564.js
deleted file mode 100644
index c80ea5306..000000000
--- a/assets/js/5f194406.500d2564.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7607],{77882:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const o={title:"Community Guidelines",summary:"Community Guidelines"},r="Community guidelines",a={id:"user/contributing/community-guidelines",title:"Community Guidelines",description:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment.",source:"@site/docs/user/contributing/community-guidelines.md",sourceDirName:"user/contributing",slug:"/user/contributing/community-guidelines",permalink:"/docs/user/contributing/community-guidelines",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/community-guidelines.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Community Guidelines",summary:"Community Guidelines"},sidebar:"userSidebar",previous:{title:"Contributing",permalink:"/docs/category/contributing"},next:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"}},l={},d=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Harassment",id:"harassment",level:3},{value:"Language",id:"language",level:3},{value:"Media sharing",id:"media-sharing",level:3},{value:"Observe topic guidance",id:"observe-topic-guidance",level:3},{value:"Other",id:"other",level:3},{value:"Service-specific guidelines",id:"service-specific-guidelines",level:2},{value:"Repositories and issue trackers",id:"repositories-and-issue-trackers",level:3}];function u(e){const i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"community-guidelines",children:"Community guidelines"})}),"\n",(0,s.jsx)(i.p,{children:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment."}),"\n",(0,s.jsx)(i.p,{children:"Our guidelines apply to all services offered or used by the project, in addition to any terms of service of third-party services used by the project. Solus Staff reserves the right to either ban or terminate access, on a temporary or permanent basis, to members of the community which are found to be violating our guidelines."}),"\n",(0,s.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The guidelines laid out in this section apply to all services offered or used by the project, such as (but not limited to):"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Our package issue tracker"}),"\n",(0,s.jsx)(i.li,{children:"Any and all forums or organized communities, e.g. our Flarum forums or subreddit"}),"\n",(0,s.jsx)(i.li,{children:"Matrix, IRC, or any other officially supported means of communicating with the project and community members in real-time"}),"\n",(0,s.jsx)(i.li,{children:"Postings to social media pages / properties owned or used by the project."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"harassment",children:"Harassment"}),"\n",(0,s.jsx)(i.p,{children:"The project condemns any and all forms of harassment. Harassment by individuals in our community, whether in public (on services provided by or used by the project) or private (e.g. direct messages), to other members in our community, will result in the temporary or permanent banning of such individuals across any and all services provided by or used by the project."}),"\n",(0,s.jsx)(i.p,{children:"This extends to any and all events / venues sponsored or otherwise supported by the project. Harassment in such events or venues will result in the permanent banning of such individuals from future events and if necessary, the immediate removal of such individuals from any current events / venues."}),"\n",(0,s.jsx)(i.p,{children:"You are encouraged to reach out to a member of the Solus Staff should you be harassed by any member of our community so such matters may be addressed immediately."}),"\n",(0,s.jsx)(i.h3,{id:"language",children:"Language"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to engage in a manner which is respectful and avoids the use of language which is hateful, derogatory, or otherwise intentionally degrading. This includes (but is not limited to) language which could be classified as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Hateful towards individuals or groups based on:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Disabilities"}),"\n",(0,s.jsx)(i.li,{children:"Gender or gender identity"}),"\n",(0,s.jsx)(i.li,{children:"Religious beliefs"}),"\n",(0,s.jsx)(i.li,{children:"Sexual orientation"}),"\n",(0,s.jsx)(i.li,{children:"Race or nationality"}),"\n",(0,s.jsx)(i.li,{children:"Political affiliation"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.li,{children:"Sexual or otherwise lewd in nature"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Profane language which is not derogatory, hateful, or sexual in nature may be allowed in specific off-topic rooms or other locations permitted by the project. However, the Solus Staff moderation team reserves the right to request the immediate ceasing of the use of such language by any individual if it is deemed to be derogatory, hateful, sexual, or in a manner which is otherwise distasteful."}),"\n",(0,s.jsx)(i.h3,{id:"media-sharing",children:"Media sharing"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community shall not link / share media which is illegal, pornographic / sexual, or otherwise offensive in nature. This extends to sharing media which shows any illegal or otherwise harmful acts, such as acts of violence."}),"\n",(0,s.jsx)(i.h3,{id:"observe-topic-guidance",children:"Observe topic guidance"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should attempt to observe topic guidance when participating in various services offered or used by the project, such as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Ensuring support-related rooms / mediums remain free of development and off-topic discussions to maximize the community and Solus Staff\u2019s ability to respond and address issues or support requests."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring development rooms / mediums remain free of off-topic discussions which are not relevant to the development or progression of various development items relating to Solus."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring off-topic rooms / mediums remain free of heated discussions of polarizing issues or current events in order to keep these spaces inviting and enjoyable."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"other",children:"Other"}),"\n",(0,s.jsx)(i.p,{children:"The below guidelines do not fall into any specific category but should be observed by members of the community:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Continual repetition and/or advertisement of any products, services, or projects is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"Using bots or other automated ways of interaction, unless explicitly permitted by the project, is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"No spamming or flooding. This may result in temporary removals (for example: kicks in Matrix) or warnings, to prevent the continued spamming or flooding."}),"\n",(0,s.jsx)(i.li,{children:"Promotion of unofficial Solus communities or communication channels without prior permission is not allowed."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"service-specific-guidelines",children:"Service-specific guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The below mentioned guidelines apply to individual services provided or used by the project."}),"\n",(0,s.jsx)(i.h3,{id:"repositories-and-issue-trackers",children:"Repositories and issue trackers"}),"\n",(0,s.jsx)(i.p,{children:"Solus utilizes a number of repositories and issue trackers to facilitate the development of various items in our project and to address issues raised by our community through tasks / issue reports. These include, but are not limited to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Our ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/",children:"Documentation, Package, Software Center, and various tooling repositories"})]}),"\n",(0,s.jsxs)(i.li,{children:["Our package ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/issues",children:"issue tracker"})]}),"\n",(0,s.jsx)(i.li,{children:"All other issue trackers utilized by the project across repositories hosted in our GitHub organizations"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Maintain on-topic discussions as relevant to each individual task"}),"\n",(0,s.jsx)(i.li,{children:"Not engage in disruptive behavior such as the modification of tasks or task information which are not owned or assigned to the user. Please leave the general maintenance of tasks or requesting of specific information to individuals which are assigned to the task, or Solus Staff"}),"\n",(0,s.jsx)(i.li,{children:"Refrain from using the Development Tracker for general support queries, such as (but not limited to): installation assistance, package installation assistance, etc."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should remain mindful that all contributors to the project do so on a voluntary basis, in their free time, and should refrain from making demands or engaging in behavior which is not respectful."}),"\n",(0,s.jsx)(i.p,{children:"Solus Staff reserves the rights to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Close or lock tasks on a temporary or permanent basis"}),"\n",(0,s.jsx)(i.li,{children:"Disable the account of individuals which violate either general guidelines or \u201cDevelopment / Issue Trackers\u201d-specific guidelines."}),"\n",(0,s.jsx)(i.li,{children:"Make any finalized decisions in the interest of the project, continuation of our vision / objectives for the project or various software which we develop or support."}),"\n"]})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5f194406.6e7ff150.js b/assets/js/5f194406.6e7ff150.js
new file mode 100644
index 000000000..9727b59c7
--- /dev/null
+++ b/assets/js/5f194406.6e7ff150.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1862"],{57999:function(e,i,n){n.r(i),n.d(i,{metadata:()=>s,contentTitle:()=>a,default:()=>c,assets:()=>l,toc:()=>u,frontMatter:()=>o});var s=JSON.parse('{"id":"user/contributing/community-guidelines","title":"Community Guidelines","description":"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment.","source":"@site/docs/user/contributing/community-guidelines.md","sourceDirName":"user/contributing","slug":"/user/contributing/community-guidelines","permalink":"/docs/user/contributing/community-guidelines","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/community-guidelines.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Community Guidelines","summary":"Community Guidelines"},"sidebar":"userSidebar","previous":{"title":"Contributing","permalink":"/docs/category/contributing"},"next":{"title":"Getting Involved","permalink":"/docs/user/contributing/getting-involved"}}'),t=n("85893"),r=n("50065");let o={title:"Community Guidelines",summary:"Community Guidelines"},a="Community guidelines",l={},u=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Harassment",id:"harassment",level:3},{value:"Language",id:"language",level:3},{value:"Media sharing",id:"media-sharing",level:3},{value:"Observe topic guidance",id:"observe-topic-guidance",level:3},{value:"Other",id:"other",level:3},{value:"Service-specific guidelines",id:"service-specific-guidelines",level:2},{value:"Repositories and issue trackers",id:"repositories-and-issue-trackers",level:3}];function d(e){let i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"community-guidelines",children:"Community guidelines"})}),"\n",(0,t.jsx)(i.p,{children:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment."}),"\n",(0,t.jsx)(i.p,{children:"Our guidelines apply to all services offered or used by the project, in addition to any terms of service of third-party services used by the project. Solus Staff reserves the right to either ban or terminate access, on a temporary or permanent basis, to members of the community which are found to be violating our guidelines."}),"\n",(0,t.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,t.jsx)(i.p,{children:"The guidelines laid out in this section apply to all services offered or used by the project, such as (but not limited to):"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Our package issue tracker"}),"\n",(0,t.jsx)(i.li,{children:"Any and all forums or organized communities, e.g. our Flarum forums or subreddit"}),"\n",(0,t.jsx)(i.li,{children:"Matrix, IRC, or any other officially supported means of communicating with the project and community members in real-time"}),"\n",(0,t.jsx)(i.li,{children:"Postings to social media pages / properties owned or used by the project."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"harassment",children:"Harassment"}),"\n",(0,t.jsx)(i.p,{children:"The project condemns any and all forms of harassment. Harassment by individuals in our community, whether in public (on services provided by or used by the project) or private (e.g. direct messages), to other members in our community, will result in the temporary or permanent banning of such individuals across any and all services provided by or used by the project."}),"\n",(0,t.jsx)(i.p,{children:"This extends to any and all events / venues sponsored or otherwise supported by the project. Harassment in such events or venues will result in the permanent banning of such individuals from future events and if necessary, the immediate removal of such individuals from any current events / venues."}),"\n",(0,t.jsx)(i.p,{children:"You are encouraged to reach out to a member of the Solus Staff should you be harassed by any member of our community so such matters may be addressed immediately."}),"\n",(0,t.jsx)(i.h3,{id:"language",children:"Language"}),"\n",(0,t.jsx)(i.p,{children:"Members of the community are expected to engage in a manner which is respectful and avoids the use of language which is hateful, derogatory, or otherwise intentionally degrading. This includes (but is not limited to) language which could be classified as:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Hateful towards individuals or groups based on:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Disabilities"}),"\n",(0,t.jsx)(i.li,{children:"Gender or gender identity"}),"\n",(0,t.jsx)(i.li,{children:"Religious beliefs"}),"\n",(0,t.jsx)(i.li,{children:"Sexual orientation"}),"\n",(0,t.jsx)(i.li,{children:"Race or nationality"}),"\n",(0,t.jsx)(i.li,{children:"Political affiliation"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.li,{children:"Sexual or otherwise lewd in nature"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Profane language which is not derogatory, hateful, or sexual in nature may be allowed in specific off-topic rooms or other locations permitted by the project. However, the Solus Staff moderation team reserves the right to request the immediate ceasing of the use of such language by any individual if it is deemed to be derogatory, hateful, sexual, or in a manner which is otherwise distasteful."}),"\n",(0,t.jsx)(i.h3,{id:"media-sharing",children:"Media sharing"}),"\n",(0,t.jsx)(i.p,{children:"Members of the community shall not link / share media which is illegal, pornographic / sexual, or otherwise offensive in nature. This extends to sharing media which shows any illegal or otherwise harmful acts, such as acts of violence."}),"\n",(0,t.jsx)(i.h3,{id:"observe-topic-guidance",children:"Observe topic guidance"}),"\n",(0,t.jsx)(i.p,{children:"Members of the community should attempt to observe topic guidance when participating in various services offered or used by the project, such as:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Ensuring support-related rooms / mediums remain free of development and off-topic discussions to maximize the community and Solus Staff\u2019s ability to respond and address issues or support requests."}),"\n",(0,t.jsx)(i.li,{children:"Ensuring development rooms / mediums remain free of off-topic discussions which are not relevant to the development or progression of various development items relating to Solus."}),"\n",(0,t.jsx)(i.li,{children:"Ensuring off-topic rooms / mediums remain free of heated discussions of polarizing issues or current events in order to keep these spaces inviting and enjoyable."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"other",children:"Other"}),"\n",(0,t.jsx)(i.p,{children:"The below guidelines do not fall into any specific category but should be observed by members of the community:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Continual repetition and/or advertisement of any products, services, or projects is not allowed."}),"\n",(0,t.jsx)(i.li,{children:"Using bots or other automated ways of interaction, unless explicitly permitted by the project, is not allowed."}),"\n",(0,t.jsx)(i.li,{children:"No spamming or flooding. This may result in temporary removals (for example: kicks in Matrix) or warnings, to prevent the continued spamming or flooding."}),"\n",(0,t.jsx)(i.li,{children:"Promotion of unofficial Solus communities or communication channels without prior permission is not allowed."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"service-specific-guidelines",children:"Service-specific guidelines"}),"\n",(0,t.jsx)(i.p,{children:"The below mentioned guidelines apply to individual services provided or used by the project."}),"\n",(0,t.jsx)(i.h3,{id:"repositories-and-issue-trackers",children:"Repositories and issue trackers"}),"\n",(0,t.jsx)(i.p,{children:"Solus utilizes a number of repositories and issue trackers to facilitate the development of various items in our project and to address issues raised by our community through tasks / issue reports. These include, but are not limited to:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Our ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/",children:"Documentation, Package, Software Center, and various tooling repositories"})]}),"\n",(0,t.jsxs)(i.li,{children:["Our package ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages/issues",children:"issue tracker"})]}),"\n",(0,t.jsx)(i.li,{children:"All other issue trackers utilized by the project across repositories hosted in our GitHub organizations"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Members of the community are expected to:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Maintain on-topic discussions as relevant to each individual task"}),"\n",(0,t.jsx)(i.li,{children:"Not engage in disruptive behavior such as the modification of tasks or task information which are not owned or assigned to the user. Please leave the general maintenance of tasks or requesting of specific information to individuals which are assigned to the task, or Solus Staff"}),"\n",(0,t.jsx)(i.li,{children:"Refrain from using the Development Tracker for general support queries, such as (but not limited to): installation assistance, package installation assistance, etc."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Members of the community should remain mindful that all contributors to the project do so on a voluntary basis, in their free time, and should refrain from making demands or engaging in behavior which is not respectful."}),"\n",(0,t.jsx)(i.p,{children:"Solus Staff reserves the rights to:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Close or lock tasks on a temporary or permanent basis"}),"\n",(0,t.jsx)(i.li,{children:"Disable the account of individuals which violate either general guidelines or \u201CDevelopment / Issue Trackers\u201D-specific guidelines."}),"\n",(0,t.jsx)(i.li,{children:"Make any finalized decisions in the interest of the project, continuation of our vision / objectives for the project or various software which we develop or support."}),"\n"]})]})}function c(e={}){let{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},50065:function(e,i,n){n.d(i,{Z:function(){return a},a:function(){return o}});var s=n(67294);let t={},r=s.createContext(t);function o(e){let i=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6146d358.6a1e8ad3.js b/assets/js/6146d358.6a1e8ad3.js
deleted file mode 100644
index a2b31ce15..000000000
--- a/assets/js/6146d358.6a1e8ad3.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7798],{90800:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Contributing","slug":"/category/contributing","permalink":"/docs/category/contributing","sidebar":"userSidebar","navigation":{"previous":{"title":"Software Center","permalink":"/docs/user/quick-start/software-center/"},"next":{"title":"Community Guidelines","permalink":"/docs/user/contributing/community-guidelines"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/6146d358.f47249dd.js b/assets/js/6146d358.f47249dd.js
new file mode 100644
index 000000000..9f20e979c
--- /dev/null
+++ b/assets/js/6146d358.f47249dd.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2149"],{26527:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Contributing","slug":"/category/contributing","permalink":"/docs/category/contributing","sidebar":"userSidebar","navigation":{"previous":{"title":"Software Center","permalink":"/docs/user/quick-start/software-center/"},"next":{"title":"Community Guidelines","permalink":"/docs/user/contributing/community-guidelines"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/619.680b2fd2.js b/assets/js/619.680b2fd2.js
new file mode 100644
index 000000000..8c3d7f6a9
--- /dev/null
+++ b/assets/js/619.680b2fd2.js
@@ -0,0 +1 @@
+(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["619"],{83550:function(e,t,r){"use strict";r.d(t,{Z:()=>U});var n=function(){function e(e){var t=this;this._insertTag=function(e){var r;r=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,r),t.tags.push(e)},this.isSpeedy=void 0===e.speedy||e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var t=e.prototype;return t.hydrate=function(e){e.forEach(this._insertTag)},t.insert=function(e){if(this.ctr%(this.isSpeedy?65e3:1)==0){var t,r;this._insertTag((t=this,(r=document.createElement("style")).setAttribute("data-emotion",t.key),void 0!==t.nonce&&r.setAttribute("nonce",t.nonce),r.appendChild(document.createTextNode("")),r.setAttribute("data-s",""),r))}var n=this.tags[this.tags.length-1];if(this.isSpeedy){var i=function(e){if(e.sheet)return e.sheet;for(var t=0;tMAINTAINERS.md
file",id:"template-for-the-maintainersmd-file",level:2}];function l(e){let a={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.header,{children:(0,t.jsx)(a.h1,{id:"maintainership",children:"Maintainership"})}),"\n",(0,t.jsx)(a.p,{children:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards."}),"\n",(0,t.jsx)(a.h2,{id:"commitment",children:"Commitment"}),"\n",(0,t.jsx)(a.p,{children:"Each new package which is going to land in the Solus repository must have one or more maintainers. These individuals commit to:"}),"\n",(0,t.jsxs)(a.ul,{children:["\n",(0,t.jsx)(a.li,{children:"Update the package reasonably regularly, unless there are valid reasons to hold it back"}),"\n",(0,t.jsxs)(a.li,{children:["Ensure the ",(0,t.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"packaging file"})," adheres to the Solus ",(0,t.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"standards"})]}),"\n",(0,t.jsx)(a.li,{children:"Ensure the application or library is consistent with the Operating System aesthetics, file system conventions and the Solus philosophy in general"}),"\n"]}),"\n",(0,t.jsxs)(a.p,{children:["On the Solus side however, the community must not forget that maintainers are volunteers, which may or may not have a technical background. More experienced users are to engage new maintainers in a welcoming manner, e.g. by listing their errors and inviting them to fix them. (More on this in the ",(0,t.jsx)(a.a,{href:"/docs/user/contributing/community-guidelines#repositories-and-issue-trackers",children:"community guidelines"}),")"]}),"\n",(0,t.jsx)(a.p,{children:"The Solus Staff have the right to enforce certain practices, even when in contrast with maintainers' vision. It also has the right to ultimately accept or reject a patch."}),"\n",(0,t.jsx)(a.h2,{id:"stepping-in",children:"Stepping in"}),"\n",(0,t.jsxs)(a.p,{children:["To officially step in as the maintainer of a package, a ",(0,t.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be provided for accepted packages that are not yet included in the repository, or if the package predates the policy of requiring one. Instead, if a previously maintained package is marked by Solus Staff as needing a new maintainer, the ",(0,t.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be updated."]}),"\n",(0,t.jsx)(a.h2,{id:"updating-a-maintained-package",children:"Updating a maintained package"}),"\n",(0,t.jsx)(a.p,{children:"The procedure varies depending on whether or not the individual is the maintainer."}),"\n",(0,t.jsx)(a.h3,{id:"maintainers",children:"Maintainers"}),"\n",(0,t.jsxs)(a.p,{children:["Maintainers are free to ",(0,t.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"update a package"})," at their will, unless otherwise indicated by Solus Staff."]}),"\n",(0,t.jsx)(a.h3,{id:"non-maintainers",children:"Non-maintainers"}),"\n",(0,t.jsxs)(a.p,{children:["If a package is actively maintained, modifications should not occur and the individual should exercise patience when it comes to updates. In some cases, a maintainer may intentionally be holding back a package, or has simply not updated yet. If pertinent, the individual should file a ",(0,t.jsx)(a.a,{href:"/docs/packaging/procedures/request-a-package-update",children:"package update request"}),". Alternatively, the individual can reach the maintainers or Solus Staff via the Solus Packaging room on ",(0,t.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," and ask permission to update the package. It is also possible to submit an update and attach a message to it clarifying the intention of updating the package, although this is a special case reserved to e.g. security updates."]}),"\n",(0,t.jsxs)(a.h2,{id:"template-for-the-maintainersmd-file",children:["Template for the ",(0,t.jsx)(a.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,t.jsxs)(a.p,{children:["Presented here is the ",(0,t.jsx)(a.code,{children:"MAINTAINERS.md"})," file. This file must be provided verbatim alongside the other patch contents, and filled in with the maintainers' personal information. A ",(0,t.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended, while an email address is mandatory. Similar to the ",(0,t.jsx)(a.code,{children:".solus/packager"})," file used for packaging, the maintainers listed in ",(0,t.jsx)(a.code,{children:"MAINTAINERS.md"})," must use their real first and last name(s) for accountability purposes."]}),"\n",(0,t.jsxs)(a.p,{children:["The contact information section is a YAML list. If needed, more elements may be added, each per maintainer. Do not edit the file in any other way, including spacing, except ",(0,t.jsx)(a.em,{children:"Name"}),", ",(0,t.jsx)(a.em,{children:"Surname"})," and ",(0,t.jsx)(a.em,{children:"REPLACEME"})," placeholders."]}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"This file is used to indicate primary maintainership for this package. A package may list more than one maintainer to avoid bus factor issues. People on this list may be considered \u201Csubject-matter experts\u201D. Please note that Solus Staff may need to perform necessary rebuilds, upgrades, or security fixes as part of the normal maintenance of the Solus package repository. If you believe this package requires an update, follow documentation from https://help.getsol.us/docs/packaging/procedures/request-a-package-update. In the event that this package becomes insufficiently maintained, the Solus Staff reserves the right to request a new maintainer, or deprecate and remove this package from the repository entirely.\n\n- Name Surname\n - Matrix: REPLACEME\n - Email: REPLACEME\n"})})]})}function h(e={}){let{wrapper:a}={...(0,s.a)(),...e.components};return a?(0,t.jsx)(a,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},50065:function(e,a,i){i.d(a,{Z:function(){return o},a:function(){return r}});var n=i(67294);let t={},s=n.createContext(t);function r(e){let a=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/61c953b4.7b785f4a.js b/assets/js/61c953b4.7b785f4a.js
deleted file mode 100644
index 4881ff611..000000000
--- a/assets/js/61c953b4.7b785f4a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8032],{18421:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var n=i(85893),t=i(11151);const s={title:"Maintainership",summary:"Package maintainership"},r="Maintainership",o={id:"packaging/procedures/maintainership",title:"Maintainership",description:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards.",source:"@site/docs/packaging/procedures/maintainership.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/maintainership",permalink:"/docs/packaging/procedures/maintainership",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/maintainership.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Maintainership",summary:"Package maintainership"},sidebar:"packagingSidebar",previous:{title:"Procedures",permalink:"/docs/category/procedures"},next:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"}},c={},d=[{value:"Commitment",id:"commitment",level:2},{value:"Stepping in",id:"stepping-in",level:2},{value:"Updating a maintained package",id:"updating-a-maintained-package",level:2},{value:"Maintainers",id:"maintainers",level:3},{value:"Non-maintainers",id:"non-maintainers",level:3},{value:"Template for the MAINTAINERS.md
file",id:"template-for-the-maintainersmd-file",level:2}];function l(e){const a={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"maintainership",children:"Maintainership"})}),"\n",(0,n.jsx)(a.p,{children:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards."}),"\n",(0,n.jsx)(a.h2,{id:"commitment",children:"Commitment"}),"\n",(0,n.jsx)(a.p,{children:"Each new package which is going to land in the Solus repository must have one or more maintainers. These individuals commit to:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Update the package reasonably regularly, unless there are valid reasons to hold it back"}),"\n",(0,n.jsxs)(a.li,{children:["Ensure the ",(0,n.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"packaging file"})," adheres to the Solus ",(0,n.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"standards"})]}),"\n",(0,n.jsx)(a.li,{children:"Ensure the application or library is consistent with the Operating System aesthetics, file system conventions and the Solus philosophy in general"}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["On the Solus side however, the community must not forget that maintainers are volunteers, which may or may not have a technical background. More experienced users are to engage new maintainers in a welcoming manner, e.g. by listing their errors and inviting them to fix them. (More on this in the ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/community-guidelines#repositories-and-issue-trackers",children:"community guidelines"}),")"]}),"\n",(0,n.jsx)(a.p,{children:"The Solus Staff have the right to enforce certain practices, even when in contrast with maintainers' vision. It also has the right to ultimately accept or reject a patch."}),"\n",(0,n.jsx)(a.h2,{id:"stepping-in",children:"Stepping in"}),"\n",(0,n.jsxs)(a.p,{children:["To officially step in as the maintainer of a package, a ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be provided for accepted packages that are not yet included in the repository, or if the package predates the policy of requiring one. Instead, if a previously maintained package is marked by Solus Staff as needing a new maintainer, the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be updated."]}),"\n",(0,n.jsx)(a.h2,{id:"updating-a-maintained-package",children:"Updating a maintained package"}),"\n",(0,n.jsx)(a.p,{children:"The procedure varies depending on whether or not the individual is the maintainer."}),"\n",(0,n.jsx)(a.h3,{id:"maintainers",children:"Maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["Maintainers are free to ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"update a package"})," at their will, unless otherwise indicated by Solus Staff."]}),"\n",(0,n.jsx)(a.h3,{id:"non-maintainers",children:"Non-maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["If a package is actively maintained, modifications should not occur and the individual should exercise patience when it comes to updates. In some cases, a maintainer may intentionally be holding back a package, or has simply not updated yet. If pertinent, the individual should file a ",(0,n.jsx)(a.a,{href:"/docs/packaging/procedures/request-a-package-update",children:"package update request"}),". Alternatively, the individual can reach the maintainers or Solus Staff via the Solus Packaging room on ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," and ask permission to update the package. It is also possible to submit an update and attach a message to it clarifying the intention of updating the package, although this is a special case reserved to e.g. security updates."]}),"\n",(0,n.jsxs)(a.h2,{id:"template-for-the-maintainersmd-file",children:["Template for the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,n.jsxs)(a.p,{children:["Presented here is the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file. This file must be provided verbatim alongside the other patch contents, and filled in with the maintainers' personal information. A ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended, while an email address is mandatory. Similar to the ",(0,n.jsx)(a.code,{children:".solus/packager"})," file used for packaging, the maintainers listed in ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," must use their real first and last name(s) for accountability purposes."]}),"\n",(0,n.jsxs)(a.p,{children:["The contact information section is a YAML list. If needed, more elements may be added, each per maintainer. Do not edit the file in any other way, including spacing, except ",(0,n.jsx)(a.em,{children:"Name"}),", ",(0,n.jsx)(a.em,{children:"Surname"})," and ",(0,n.jsx)(a.em,{children:"REPLACEME"})," placeholders."]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"This file is used to indicate primary maintainership for this package. A package may list more than one maintainer to avoid bus factor issues. People on this list may be considered \u201csubject-matter experts\u201d. Please note that Solus Staff may need to perform necessary rebuilds, upgrades, or security fixes as part of the normal maintenance of the Solus package repository. If you believe this package requires an update, follow documentation from https://help.getsol.us/docs/packaging/procedures/request-a-package-update. In the event that this package becomes insufficiently maintained, the Solus Staff reserves the right to request a new maintainer, or deprecate and remove this package from the repository entirely.\n\n- Name Surname\n - Matrix: REPLACEME\n - Email: REPLACEME\n"})})]})}function h(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,a,i)=>{i.d(a,{Z:()=>o,a:()=>r});var n=i(67294);const t={},s=n.createContext(t);function r(e){const a=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/621db11d.87a9b056.js b/assets/js/621db11d.87a9b056.js
new file mode 100644
index 000000000..53451ce37
--- /dev/null
+++ b/assets/js/621db11d.87a9b056.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9854"],{52273:function(t,e,s){s.r(e),s.d(e,{default:()=>f});var r=s("85893");s("67294");var o=s("74904"),a=s("81921"),n=s("50490"),l=s("20332"),u=s("30928"),i=s("49868"),h=s("52068"),c=s("91941");let g={authorListItem:"authorListItem_n3yI"};function p(t){let{author:e}=t;return(0,r.jsx)("li",{className:g.authorListItem,children:(0,r.jsx)(c.Z,{as:"h2",author:e,count:e.count})})}function d(t){let{authors:e}=t;return(0,r.jsx)("section",{className:(0,o.Z)("margin-vert--lg",g.authorsListSection),children:(0,r.jsx)("ul",{children:e.map(t=>(0,r.jsx)(p,{author:t},t.key))})})}function f(t){let{authors:e,sidebar:s}=t,c=(0,l.HV)();return(0,r.jsxs)(a.FG,{className:(0,o.Z)(n.k.wrapper.blogPages,n.k.page.blogAuthorsListPage),children:[(0,r.jsx)(a.d,{title:c}),(0,r.jsx)(i.Z,{tag:"blog_authors_list"}),(0,r.jsxs)(u.Z,{sidebar:s,children:[(0,r.jsx)(h.Z,{as:"h1",children:c}),(0,r.jsx)(d,{authors:e})]})]})}},20332:function(t,e,s){s.d(e,{HV:function(){return i},J$:function(){return c},Wi:function(){return l},ds:function(){return u},fw:function(){return h}});var r=s(85893);s(67294);var o=s(1822),a=s(67984);function n(){let{selectMessage:t}=(0,a.c)();return e=>t(e,(0,o.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:e}))}function l(t){let e=n();return(0,o.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:e(t.count),tagName:t.label})}function u(t){let e=n();return(0,o.I)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:e(t.count),authorName:t.name||t.key})}let i=()=>(0,o.I)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function h(){return(0,r.jsx)(o.Z,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}function c(){return(0,r.jsx)(o.Z,{id:"theme.blog.author.noPosts",description:"The text for authors with 0 blog post",children:"This author has not written any posts yet."})}}}]);
\ No newline at end of file
diff --git a/assets/js/621db11d.e79b5237.js b/assets/js/621db11d.e79b5237.js
deleted file mode 100644
index 9f61dd4db..000000000
--- a/assets/js/621db11d.e79b5237.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3940],{44995:(t,e,s)=>{s.r(e),s.d(e,{default:()=>m});s(67294);var a=s(36905),o=s(96984),r=s(50563),l=s(77514),n=s(50429),u=s(62362),i=s(42704),h=s(68588);const c={authorListItem:"authorListItem_n3yI"};var g=s(85893);function p(t){let{author:e}=t;return(0,g.jsx)("li",{className:c.authorListItem,children:(0,g.jsx)(h.Z,{as:"h2",author:e,count:e.count})})}function d(t){let{authors:e}=t;return(0,g.jsx)("section",{className:(0,a.Z)("margin-vert--lg",c.authorsListSection),children:(0,g.jsx)("ul",{children:e.map((t=>(0,g.jsx)(p,{author:t},t.key)))})})}function m(t){let{authors:e,sidebar:s}=t;const h=(0,l.HV)();return(0,g.jsxs)(o.FG,{className:(0,a.Z)(r.k.wrapper.blogPages,r.k.page.blogAuthorsListPage),children:[(0,g.jsx)(o.d,{title:h}),(0,g.jsx)(u.Z,{tag:"blog_authors_list"}),(0,g.jsxs)(n.Z,{sidebar:s,children:[(0,g.jsx)(i.Z,{as:"h1",children:h}),(0,g.jsx)(d,{authors:e})]})]})}},77514:(t,e,s)=>{s.d(e,{HV:()=>i,Wi:()=>n,ds:()=>u,fw:()=>h});s(67294);var a=s(55361),o=s(59676),r=s(85893);function l(){const{selectMessage:t}=(0,o.c)();return e=>t(e,(0,a.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:e}))}function n(t){const e=l();return(0,a.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:e(t.count),tagName:t.label})}function u(t){const e=l();return(0,a.I)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:e(t.count),authorName:t.name||t.key})}const i=()=>(0,a.I)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function h(){return(0,r.jsx)(a.Z,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}}}]);
\ No newline at end of file
diff --git a/assets/js/62d70de2.11c6a7b7.js b/assets/js/62d70de2.11c6a7b7.js
deleted file mode 100644
index aafec698e..000000000
--- a/assets/js/62d70de2.11c6a7b7.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[818],{5230:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Virtualization","slug":"/category/virtualization","permalink":"/docs/category/virtualization","sidebar":"userSidebar","navigation":{"previous":{"title":"KDE Wallet","permalink":"/docs/user/software/utilities/kwallet"},"next":{"title":"VirtualBox","permalink":"/docs/user/software/virtualization/virtualbox"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/62d70de2.347fe47c.js b/assets/js/62d70de2.347fe47c.js
new file mode 100644
index 000000000..14dcaee70
--- /dev/null
+++ b/assets/js/62d70de2.347fe47c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3372"],{18119:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Virtualization","slug":"/category/virtualization","permalink":"/docs/category/virtualization","sidebar":"userSidebar","navigation":{"previous":{"title":"KDE Wallet","permalink":"/docs/user/software/utilities/kwallet"},"next":{"title":"VirtualBox","permalink":"/docs/user/software/virtualization/virtualbox"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/633d53d7.7abdbd1e.js b/assets/js/633d53d7.7abdbd1e.js
new file mode 100644
index 000000000..029280cfc
--- /dev/null
+++ b/assets/js/633d53d7.7abdbd1e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8011"],{68574:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Procedures","slug":"/category/procedures","permalink":"/docs/category/procedures","sidebar":"packagingSidebar","navigation":{"previous":{"title":"Packaging Practices","permalink":"/docs/packaging/packaging-practices"},"next":{"title":"Maintainership","permalink":"/docs/packaging/procedures/maintainership"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/633d53d7.9280c3c1.js b/assets/js/633d53d7.9280c3c1.js
deleted file mode 100644
index 9009f4225..000000000
--- a/assets/js/633d53d7.9280c3c1.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[425],{30080:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Procedures","slug":"/category/procedures","permalink":"/docs/category/procedures","sidebar":"packagingSidebar","navigation":{"previous":{"title":"Packaging Practices","permalink":"/docs/packaging/packaging-practices"},"next":{"title":"Maintainership","permalink":"/docs/packaging/procedures/maintainership"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/64699048.6d2870b9.js b/assets/js/64699048.6d2870b9.js
new file mode 100644
index 000000000..943673218
--- /dev/null
+++ b/assets/js/64699048.6d2870b9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9311"],{27444:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,contentTitle:()=>i,default:()=>u,assets:()=>a,toc:()=>d,frontMatter:()=>l});var s=JSON.parse('{"id":"user/software/development/index","title":"Development","description":"Solus provides a stable foundation for creating, testing, and deploying applications.","source":"@site/docs/user/software/development/index.md","sourceDirName":"user/software/development","slug":"/user/software/development/","permalink":"/docs/user/software/development/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Development","summary":"Installation of development software on Solus"},"sidebar":"userSidebar","previous":{"title":"Desktops","permalink":"/docs/user/software/desktops/"},"next":{"title":"Containers","permalink":"/docs/user/software/development/containers"}}'),o=t("85893"),r=t("50065");let l={title:"Development",summary:"Installation of development software on Solus"},i="Development",a={},d=[{value:"Getting started",id:"getting-started",level:2}];function c(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,o.jsx)(n.p,{children:"Solus provides a stable foundation for creating, testing, and deploying applications."}),"\n",(0,o.jsx)(n.p,{children:"You can install tools such as text editors, programming languages, compilers, and version control systems. Solus also supports containerization and virtualization technologies."}),"\n",(0,o.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,o.jsxs)(n.p,{children:["If you want to compile and develop software using Solus, we recommend installing the ",(0,o.jsx)(n.code,{children:"system.devel"})," component."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install -c system.devel\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"system.devel"})," component installs libraries and packages for software development, such as ",(0,o.jsx)(n.code,{children:"clang"}),", ",(0,o.jsx)(n.code,{children:"gcc"}),", and ",(0,o.jsx)(n.code,{children:"make"}),"."]}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"containers",children:(0,o.jsx)(n.strong,{children:"Containers"})})}),"\n",(0,o.jsx)(n.p,{children:"Install and configure containerization software on Solus."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"java",children:(0,o.jsx)(n.strong,{children:"Java"})})}),"\n",(0,o.jsx)(n.p,{children:"Learn how to install, run, and manage Java on Solus."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"postgresql",children:(0,o.jsx)(n.strong,{children:"PostgreSQL"})})}),"\n",(0,o.jsx)(n.p,{children:"A quick guide to using PostgreSQL on Solus."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"r-and-rstudio",children:(0,o.jsx)(n.strong,{children:"R and RStudio"})})}),"\n",(0,o.jsx)(n.p,{children:"Quick start guide for R and RStudio on Solus."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"rust",children:(0,o.jsx)(n.strong,{children:"Rust"})})}),"\n",(0,o.jsx)(n.p,{children:"A quick guide to getting set up for Rust development on Solus."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"web",children:(0,o.jsx)(n.strong,{children:"Web Development"})})}),"\n",(0,o.jsx)(n.p,{children:"Install and configure different web development tools on Solus."})]})}function u(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return i},a:function(){return l}});var s=t(67294);let o={},r=s.createContext(o);function l(e){let n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/64699048.80dc9cf5.js b/assets/js/64699048.80dc9cf5.js
deleted file mode 100644
index 97d1e28b4..000000000
--- a/assets/js/64699048.80dc9cf5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2151],{87063:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=t(85893),o=t(11151);const r={title:"Development",summary:"Installation of development software on Solus"},l="Development",i={id:"user/software/development/index",title:"Development",description:"Solus provides a stable foundation for creating, testing, and deploying applications.",source:"@site/docs/user/software/development/index.md",sourceDirName:"user/software/development",slug:"/user/software/development/",permalink:"/docs/user/software/development/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Development",summary:"Installation of development software on Solus"},sidebar:"userSidebar",previous:{title:"Desktops",permalink:"/docs/user/software/desktops/"},next:{title:"Containers",permalink:"/docs/user/software/development/containers"}},a={},d=[{value:"Getting started",id:"getting-started",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,s.jsx)(n.p,{children:"Solus provides a stable foundation for creating, testing, and deploying applications."}),"\n",(0,s.jsx)(n.p,{children:"You can install tools such as text editors, programming languages, compilers, and version control systems. Solus also supports containerization and virtualization technologies."}),"\n",(0,s.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,s.jsxs)(n.p,{children:["If you want to compile and develop software using Solus, we recommend installing the ",(0,s.jsx)(n.code,{children:"system.devel"})," component."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install -c system.devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"system.devel"})," component installs libraries and packages for software development, such as ",(0,s.jsx)(n.code,{children:"clang"}),", ",(0,s.jsx)(n.code,{children:"gcc"}),", and ",(0,s.jsx)(n.code,{children:"make"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"containers",children:(0,s.jsx)(n.strong,{children:"Containers"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure containerization software on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"java",children:(0,s.jsx)(n.strong,{children:"Java"})})}),"\n",(0,s.jsx)(n.p,{children:"Learn how to install, run, and manage Java on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"postgresql",children:(0,s.jsx)(n.strong,{children:"PostgreSQL"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to using PostgreSQL on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"r-and-rstudio",children:(0,s.jsx)(n.strong,{children:"R and RStudio"})})}),"\n",(0,s.jsx)(n.p,{children:"Quick start guide for R and RStudio on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"rust",children:(0,s.jsx)(n.strong,{children:"Rust"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to getting set up for Rust development on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"web",children:(0,s.jsx)(n.strong,{children:"Web Development"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure different web development tools on Solus."})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>l});var s=t(67294);const o={},r=s.createContext(o);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6614.fed91556.js b/assets/js/6614.fed91556.js
deleted file mode 100644
index e76878b01..000000000
--- a/assets/js/6614.fed91556.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6614],{81782:(e,t,a)=>{a.d(t,{Z:()=>P});a(67294);var s=a(36905),n=a(58112),l=a(85893);function r(e){let{children:t,className:a}=e;return(0,l.jsx)("article",{className:a,children:t})}var i=a(38208);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:r}=(0,n.nO)(),{permalink:c,title:d}=a,u=r?"h1":"h2";return(0,l.jsx)(u,{className:(0,s.Z)(o.title,t),children:r?d:(0,l.jsx)(i.Z,{to:c,children:d})})}var d=a(55361),u=a(59676),m=a(14852);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.c)();return t=>{const a=Math.ceil(t);return e(a,(0,d.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,l.jsx)(l.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,l.jsx)("time",{dateTime:t,children:a})}function x(){return(0,l.jsx)(l.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,n.nO)(),{date:r,readingTime:i}=a,o=(0,m.P)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,l.jsxs)("div",{className:(0,s.Z)(h.container,"margin-vert--md",t),children:[(0,l.jsx)(p,{date:r,formattedDate:(c=r,o.format(new Date(c)))}),void 0!==i&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(x,{}),(0,l.jsx)(g,{readingTime:i})]})]});var c}var f=a(68588);const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function Z(e){let{className:t}=e;const{metadata:{authors:a},assets:r}=(0,n.nO)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,l.jsx)("div",{className:(0,s.Z)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,l.jsx)("div",{className:(0,s.Z)(!i&&(o?"col col--12":"col col--6"),i?v.imageOnlyAuthorCol:v.authorCol),children:(0,l.jsx)(f.Z,{author:{...e,imageURL:r.authorsImageUrls[t]??e.imageURL}})},t)))})}function b(){return(0,l.jsxs)("header",{children:[(0,l.jsx)(c,{}),(0,l.jsx)(j,{}),(0,l.jsx)(Z,{})]})}var N=a(48820),y=a(38507);function U(e){let{children:t,className:a}=e;const{isBlogPostPage:r}=(0,n.nO)();return(0,l.jsx)("div",{id:r?N.uR:void 0,className:(0,s.Z)("markdown",a),children:(0,l.jsx)(y.Z,{children:t})})}var _=a(50563),w=a(62978),T=a(32223);function k(){return(0,l.jsx)("b",{children:(0,l.jsx)(d.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function C(e){const{blogPostTitle:t,...a}=e;return(0,l.jsx)(i.Z,{"aria-label":(0,d.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,l.jsx)(k,{})})}function A(){const{metadata:e,isBlogPostPage:t}=(0,n.nO)(),{tags:a,title:r,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,u=!t&&o,m=a.length>0;if(!(m||u||i))return null;if(t){const e=!!(i||d||c);return(0,l.jsxs)("footer",{className:"docusaurus-mt-lg",children:[m&&(0,l.jsx)("div",{className:(0,s.Z)("row","margin-top--sm",_.k.blog.blogFooterEditMetaRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(T.Z,{tags:a})})}),e&&(0,l.jsx)(w.Z,{className:(0,s.Z)("margin-top--sm",_.k.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,l.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[m&&(0,l.jsx)("div",{className:(0,s.Z)("col",{"col--9":u}),children:(0,l.jsx)(T.Z,{tags:a})}),u&&(0,l.jsx)("div",{className:(0,s.Z)("col text--right",{"col--3":m}),children:(0,l.jsx)(C,{blogPostTitle:r,to:e.permalink})})]})}function P(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.nO)();return e?void 0:"margin-bottom--xl"}();return(0,l.jsxs)(r,{className:(0,s.Z)(i,a),children:[(0,l.jsx)(b,{}),(0,l.jsx)(U,{children:t}),(0,l.jsx)(A,{})]})}},62978:(e,t,a)=>{a.d(t,{Z:()=>x});a(67294);var s=a(36905),n=a(55361),l=a(50563),r=a(38208);const i={iconEdit:"iconEdit_Z9Sw"};var o=a(85893);function c(e){let{className:t,...a}=e;return(0,o.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.Z)(i.iconEdit,t),"aria-hidden":"true",...a,children:(0,o.jsx)("g",{children:(0,o.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,o.jsxs)(r.Z,{to:t,className:l.k.common.editThisPage,children:[(0,o.jsx)(c,{}),(0,o.jsx)(n.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=a(14852);function m(e){let{lastUpdatedAt:t}=e;const a=new Date(t),s=(0,u.P)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(a);return(0,o.jsx)(n.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,o.jsx)("b",{children:(0,o.jsx)("time",{dateTime:a.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,o.jsx)(n.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,o.jsx)("b",{children:t})},children:" by {user}"})}function g(e){let{lastUpdatedAt:t,lastUpdatedBy:a}=e;return(0,o.jsxs)("span",{className:l.k.common.lastUpdated,children:[(0,o.jsx)(n.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,o.jsx)(m,{lastUpdatedAt:t}):"",byUser:a?(0,o.jsx)(h,{lastUpdatedBy:a}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const p={lastUpdated:"lastUpdated_JAkA"};function x(e){let{className:t,editUrl:a,lastUpdatedAt:n,lastUpdatedBy:l}=e;return(0,o.jsxs)("div",{className:(0,s.Z)("row",t),children:[(0,o.jsx)("div",{className:"col",children:a&&(0,o.jsx)(d,{editUrl:a})}),(0,o.jsx)("div",{className:(0,s.Z)("col",p.lastUpdated),children:(n||l)&&(0,o.jsx)(g,{lastUpdatedAt:n,lastUpdatedBy:l})})]})}},38507:(e,t,a)=>{a.d(t,{Z:()=>A});var s=a(67294),n=a(11151),l=a(79722),r=a(17573),i=a(85893);function o(e){return(0,i.jsx)("code",{...e})}var c=a(38208);var d=a(36905),u=a(788),m=a(79202),h=a(45025),g=a(93841);const p={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function x(e){return!!e&&("SUMMARY"===e.tagName||x(e.parentElement))}function j(e,t){return!!e&&(e===t||j(e.parentElement,t))}function f(e){let{summary:t,children:a,...n}=e;(0,m.Z)().collectAnchor(n.id);const l=(0,h.Z)(),r=(0,s.useRef)(null),{collapsed:o,setCollapsed:c}=(0,g.u)({initialState:!n.open}),[d,f]=(0,s.useState)(n.open),v=s.isValidElement(t)?t:(0,i.jsx)("summary",{children:t??"Details"});return(0,i.jsxs)("details",{...n,ref:r,open:d,"data-collapsed":o,className:(0,u.Z)(p.details,l&&p.isBrowser,n.className),onMouseDown:e=>{x(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;x(t)&&j(t,r.current)&&(e.preventDefault(),o?(c(!1),f(!0)):c(!0))},children:[v,(0,i.jsx)(g.z,{lazy:!1,collapsed:o,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{c(e),f(!e)},children:(0,i.jsx)("div",{className:p.collapsibleContent,children:a})})]})}const v={details:"details_b_Ee"},Z="alert alert--info";function b(e){let{...t}=e;return(0,i.jsx)(f,{...t,className:(0,d.Z)(Z,v.details,t.className)})}function N(e){const t=s.Children.toArray(e.children),a=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),n=(0,i.jsx)(i.Fragment,{children:t.filter((e=>e!==a))});return(0,i.jsx)(b,{...e,summary:a,children:n})}var y=a(42704);function U(e){return(0,i.jsx)(y.Z,{...e})}const _={containsTaskList:"containsTaskList_mC6p"};function w(e){if(void 0!==e)return(0,d.Z)(e,e?.includes("contains-task-list")&&_.containsTaskList)}const T={img:"img_ev3q"};var k=a(20906);const C={Head:l.Z,details:N,Details:N,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,i.jsx)(o,{...e}):(0,i.jsx)(r.Z,{...e})},a:function(e){return(0,i.jsx)(c.Z,{...e})},pre:function(e){return(0,i.jsx)(i.Fragment,{children:e.children})},ul:function(e){return(0,i.jsx)("ul",{...e,className:w(e.className)})},li:function(e){return(0,m.Z)().collectAnchor(e.id),(0,i.jsx)("li",{...e})},img:function(e){return(0,i.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,d.Z)(t,T.img))});var t},h1:e=>(0,i.jsx)(U,{as:"h1",...e}),h2:e=>(0,i.jsx)(U,{as:"h2",...e}),h3:e=>(0,i.jsx)(U,{as:"h3",...e}),h4:e=>(0,i.jsx)(U,{as:"h4",...e}),h5:e=>(0,i.jsx)(U,{as:"h5",...e}),h6:e=>(0,i.jsx)(U,{as:"h6",...e}),admonition:k.Z,mermaid:()=>null};function A(e){let{children:t}=e;return(0,i.jsx)(n.Z,{components:C,children:t})}},60968:(e,t,a)=>{a.d(t,{Z:()=>r});a(67294);var s=a(36905),n=a(38208),l=a(85893);function r(e){const{permalink:t,title:a,subLabel:r,isNext:i}=e;return(0,l.jsxs)(n.Z,{className:(0,s.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[r&&(0,l.jsx)("div",{className:"pagination-nav__sublabel",children:r}),(0,l.jsx)("div",{className:"pagination-nav__label",children:a})]})}},96194:(e,t,a)=>{a.d(t,{Z:()=>i});a(67294);var s=a(36905),n=a(38208);const l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(85893);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,r.jsxs)(n.Z,{href:t,title:o,className:(0,s.Z)(l.tag,i?l.tagWithCount:l.tagRegular),children:[a,i&&(0,r.jsx)("span",{children:i})]})}},32223:(e,t,a)=>{a.d(t,{Z:()=>o});a(67294);var s=a(36905),n=a(55361),l=a(96194);const r={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(85893);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.Z)(r.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:r.tag,children:(0,i.jsx)(l.Z,{...e})},e.permalink)))})]})}},14852:(e,t,a)=>{a.d(t,{P:()=>n});var s=a(75276);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.Z)(),a=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.Z)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:a,...e})}}}]);
\ No newline at end of file
diff --git a/assets/js/6787574e.5501c302.js b/assets/js/6787574e.5501c302.js
new file mode 100644
index 000000000..8011de9ba
--- /dev/null
+++ b/assets/js/6787574e.5501c302.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7192"],{99023:function(e,t,s){s.r(t),s.d(t,{metadata:()=>r,contentTitle:()=>d,default:()=>l,assets:()=>a,toc:()=>c,frontMatter:()=>i});var r=JSON.parse('{"id":"user/intro","title":"Welcome","description":"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with.","source":"@site/docs/user/intro.md","sourceDirName":"user","slug":"/user/intro","permalink":"/docs/user/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/intro.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"sidebarPosition":0,"frontMatter":{"title":"Welcome","summary":"Front page of the Help Center","sidebar_position":0},"sidebar":"userSidebar","next":{"title":"Quick Start","permalink":"/docs/category/quick-start"}}'),n=s("85893"),o=s("50065");let i={title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},d="Welcome",a={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"Support channels",id:"support-channels",level:2}];function h(e){let t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"welcome",children:"Welcome"})}),"\n",(0,n.jsx)(t.p,{children:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with."}),"\n",(0,n.jsx)(t.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,n.jsx)(t.p,{children:"We organized the help center into sections to help you navigate the contents easily:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Section"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/category/quick-start",children:"Quick Start"})}),(0,n.jsx)(t.td,{children:"If you're new to Solus, this section will set you on the right track. Find documentation on system requirements, installing Solus, software management, the boot process, and troubleshooting."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/category/contributing",children:"Contributing"})}),(0,n.jsx)(t.td,{children:"Find how you can contribute to Solus, whether you're a beginner or an experienced Linux and Solus user."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/user/editions/",children:"Editions"})}),(0,n.jsx)(t.td,{children:"Understand the different editions of Solus: differences between editions, configuration tasks, and helpful tips and tricks."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/user/hardware/",children:"Hardware"})}),(0,n.jsx)(t.td,{children:"Solus supports most hardware out-of-the-box, but there are exceptions. This section focuses on those exceptions and how to get the most out of your hardware."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package management"})}),(0,n.jsx)(t.td,{children:"Learn how to install software and manage the repositories of your Solus system."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/user/privacy",children:"Privacy policy"})}),(0,n.jsx)(t.td,{children:"Understand our privacy policy: Learn how we handle your data, and how to contact us for privacy concerns."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/category/software/",children:"Software"})}),(0,n.jsx)(t.td,{children:"Getting started and configuration guides for the software packages included in Solus."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"/docs/user/troubleshooting/",children:"Troubleshooting"})}),(0,n.jsx)(t.td,{children:"Learn how to diagnose and fix problems you might have with Solus."})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"support-channels",children:"Support channels"}),"\n",(0,n.jsx)(t.p,{children:"If you need help with something not covered in the help center, there are various channels where you can seek support from the Solus team or other Solus users."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Channel"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Forums"})}),(0,n.jsx)(t.td,{children:"Our Flarum-powered forums are easy to use from any device and are a great resource for getting support."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Matrix"})}),(0,n.jsxs)(t.td,{children:["Matrix is a great way to discuss issues and development in real-time. Learn how to access Solus' Matrix space ",(0,n.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"here"}),"."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject",children:"Reddit"})}),(0,n.jsx)(t.td,{children:"If you are a Redditor, our subreddit has a similar purpose to the forums."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://issues.getsol.us",children:"Issue tracker"})}),(0,n.jsx)(t.td,{children:"If you have issues with your Solus system, or any of our software packages doesn't work as expected, consider filing a bug report on our issue tracker."})]})]})]}),"\n",(0,n.jsx)(t.admonition,{title:"Important",type:"caution",children:(0,n.jsx)(t.p,{children:"Volunteers around the world build and maintain Solus. Due to time zone differences there might not always be people to answer your questions immediately."})})]})}function l(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},50065:function(e,t,s){s.d(t,{Z:function(){return d},a:function(){return i}});var r=s(67294);let n={},o=r.createContext(n);function i(e){let t=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6787574e.ccc44262.js b/assets/js/6787574e.ccc44262.js
deleted file mode 100644
index cd70006f9..000000000
--- a/assets/js/6787574e.ccc44262.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4500],{26240:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=s(85893),n=s(11151);const o={title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},i="Welcome",d={id:"user/intro",title:"Welcome",description:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with.",source:"@site/docs/user/intro.md",sourceDirName:"user",slug:"/user/intro",permalink:"/docs/user/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/intro.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,sidebarPosition:0,frontMatter:{title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},sidebar:"userSidebar",next:{title:"Quick Start",permalink:"/docs/category/quick-start"}},a={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"Support channels",id:"support-channels",level:2}];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"welcome",children:"Welcome"})}),"\n",(0,r.jsx)(t.p,{children:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with."}),"\n",(0,r.jsx)(t.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,r.jsx)(t.p,{children:"We organized the help center into sections to help you navigate the contents easily:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Section"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/quick-start",children:"Quick Start"})}),(0,r.jsx)(t.td,{children:"If you're new to Solus, this section will set you on the right track. Find documentation on system requirements, installing Solus, software management, the boot process, and troubleshooting."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/contributing",children:"Contributing"})}),(0,r.jsx)(t.td,{children:"Find how you can contribute to Solus, whether you're a beginner or an experienced Linux and Solus user."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/editions/",children:"Editions"})}),(0,r.jsx)(t.td,{children:"Understand the different editions of Solus: differences between editions, configuration tasks, and helpful tips and tricks."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/hardware/",children:"Hardware"})}),(0,r.jsx)(t.td,{children:"Solus supports most hardware out-of-the-box, but there are exceptions. This section focuses on those exceptions and how to get the most out of your hardware."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package management"})}),(0,r.jsx)(t.td,{children:"Learn how to install software and manage the repositories of your Solus system."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/privacy",children:"Privacy policy"})}),(0,r.jsx)(t.td,{children:"Understand our privacy policy: Learn how we handle your data, and how to contact us for privacy concerns."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/software/",children:"Software"})}),(0,r.jsx)(t.td,{children:"Getting started and configuration guides for the software packages included in Solus."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/troubleshooting/",children:"Troubleshooting"})}),(0,r.jsx)(t.td,{children:"Learn how to diagnose and fix problems you might have with Solus."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"support-channels",children:"Support channels"}),"\n",(0,r.jsx)(t.p,{children:"If you need help with something not covered in the help center, there are various channels where you can seek support from the Solus team or other Solus users."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Channel"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Forums"})}),(0,r.jsx)(t.td,{children:"Our Flarum-powered forums are easy to use from any device and are a great resource for getting support."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Matrix"})}),(0,r.jsxs)(t.td,{children:["Matrix is a great way to discuss issues and development in real-time. Learn how to access Solus' Matrix space ",(0,r.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"here"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject",children:"Reddit"})}),(0,r.jsx)(t.td,{children:"If you are a Redditor, our subreddit has a similar purpose to the forums."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://issues.getsol.us",children:"Issue tracker"})}),(0,r.jsx)(t.td,{children:"If you have issues with your Solus system, or any of our software packages doesn't work as expected, consider filing a bug report on our issue tracker."})]})]})]}),"\n",(0,r.jsx)(t.admonition,{title:"Important",type:"caution",children:(0,r.jsx)(t.p,{children:"Volunteers around the world build and maintain Solus. Due to time zone differences there might not always be people to answer your questions immediately."})})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>i});var r=s(67294);const n={},o=r.createContext(n);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6873f895.b8b4b2c1.js b/assets/js/6873f895.b8b4b2c1.js
deleted file mode 100644
index 6c7463a2d..000000000
--- a/assets/js/6873f895.b8b4b2c1.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8849],{83781:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var s=t(85893),i=t(11151);const r={title:"Solus Style Guide",summary:"Guidance for writing Solus content"},o="Solus style guide",l={id:"user/contributing/style",title:"Solus Style Guide",description:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content.",source:"@site/docs/user/contributing/style.md",sourceDirName:"user/contributing",slug:"/user/contributing/style",permalink:"/docs/user/contributing/style",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/style.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Solus Style Guide",summary:"Guidance for writing Solus content"},sidebar:"userSidebar",previous:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"},next:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"}},d={},a=[{value:"General writing style",id:"general-writing-style",level:2},{value:"Linux-specific terms",id:"linux-specific-terms",level:2},{value:"Specific guidance",id:"specific-guidance",level:2},{value:"Admonitions",id:"admonitions",level:3},{value:"Code blocks",id:"code-blocks",level:2},{value:"Commands",id:"commands",level:3},{value:"Common Solus terms",id:"common-solus-terms",level:3},{value:"Markdown formatting",id:"markdown-formatting",level:3},{value:"Package names",id:"package-names",level:2},{value:"Spelling",id:"spelling",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"solus-style-guide",children:"Solus style guide"})}),"\n",(0,s.jsx)(n.p,{children:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Existing help center topics might not follow our style guide yet."})}),"\n",(0,s.jsx)(n.h2,{id:"general-writing-style",children:"General writing style"}),"\n",(0,s.jsxs)(n.p,{children:["Use the ",(0,s.jsx)(n.a,{href:"https://developers.google.com/style",children:"Google developer documentation style guide"})," for general writing style, grammar, and formatting."]}),"\n",(0,s.jsx)(n.p,{children:"Some useful pages:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/text-formatting",children:"Text formatting summary"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/procedures",children:"Procedures"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/timeless-documentation",children:"Timeless documentation"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/word-list",children:"Word list"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"linux-specific-terms",children:"Linux-specific terms"}),"\n",(0,s.jsxs)(n.p,{children:["If you are unsure of how to use a common Linux term, refer to the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#glossary-terms-conventions",children:"Glossary of terms and conventions"})," from the ",(0,s.jsx)(n.em,{children:"Red Hat supplementary style guide for documentation"})]}),"\n",(0,s.jsx)(n.h2,{id:"specific-guidance",children:"Specific guidance"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"In alphabetical order, not order of importance."})}),"\n",(0,s.jsx)(n.h3,{id:"admonitions",children:"Admonitions"}),"\n",(0,s.jsxs)(n.p,{children:["This section is based on the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#admonitions",children:"Red Hat supplementary style guide"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Admonitions should draw the reader\u2019s attention to certain information. Keep admonitions to a minimum, and avoid placing multiple admonitions close to one another. If multiple admonitions are necessary, restructure the information by moving the less-important statements into the flow of the main content. See the ",(0,s.jsx)(n.a,{href:"https://docusaurus.io/docs/markdown-features/admonitions",children:"Docusaurus documentation"})," to learn the correct syntax."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Note"}),(0,s.jsx)(n.td,{children:"Additional guidance or advice that improves product configuration, performance, or supportability"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Tip"}),(0,s.jsx)(n.td,{children:"Recommendations, suggestions, and alternative methods that might not be obvious. Tips are not essential to using the product."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Info"}),(0,s.jsx)(n.td,{children:"General information about the topic at hand that may be useful or relevant to user."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Important"}),(0,s.jsx)(n.td,{children:"Advisory information essential to the completion of a task or default configuration settings. Users must not disregard this information."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Warning"}),(0,s.jsx)(n.td,{children:"Information that warns the user to proceed with caution. Warning emphasizes a course of action\u2019s potential downsides."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Danger"}),(0,s.jsx)(n.td,{children:"Information about imminent system damage, data loss, or a support-related issue if the user disregards this admonition. If available, offer information to avoid the problem in the future or state where to find more information."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"code-blocks",children:"Code blocks"}),"\n",(0,s.jsx)(n.p,{children:"Code blocks must indicate the programming language of the code snippet."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:'```js\nconsole.log("Hello, world!");\n```\n'})}),"\n",(0,s.jsx)(n.h3,{id:"commands",children:"Commands"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Commands as part of procedures must be inside code blocks with ",(0,s.jsx)(n.code,{children:"bash"}),' as the language type. This ensures users get a "copy to clipboard" button.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When needed, indicate the directory where users need to move before executing the command."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"```bash\ncd ~/path/to/directory\nsudo somecommand\n```\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"common-solus-terms",children:"Common Solus terms"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Solus","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Prefer ",(0,s.jsx)(n.em,{children:"Solus"})," rather than ",(0,s.jsx)(n.em,{children:"Solus Project"}),". Don't use ",(0,s.jsx)(n.em,{children:"Solus OS"})," or ",(0,s.jsx)(n.em,{children:"Solus Linux"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The names of the different editions of Solus are:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Solus Budgie"}),"\n",(0,s.jsx)(n.li,{children:"Solus GNOME"}),"\n",(0,s.jsx)(n.li,{children:"Solus Plasma"}),"\n",(0,s.jsx)(n.li,{children:"Solus XFCE"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Repositories","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using terms such as ",(0,s.jsx)(n.em,{children:"repo"}),", or ",(0,s.jsx)(n.em,{children:"monorepo"}),", use the specific repository name instead."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages repository", instead of "The monorepo".'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Dev Tracker","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using the term ",(0,s.jsx)(n.em,{children:"Dev Tracker"}),"."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages issue tracker", instead of "The dev tracker"'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["eopkg","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're referring to the application or package, use \"",(0,s.jsx)(n.code,{children:"eopkg"}),'" with inline code formatting (see below)']}),"\n",(0,s.jsxs)(n.li,{children:["If you're referring to package files, use \"",(0,s.jsx)(n.code,{children:".eopkg"}),'" with inline code formatting, including the period but no wildcard']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"markdown-formatting",children:"Markdown formatting"}),"\n",(0,s.jsxs)(n.p,{children:["Write content using ",(0,s.jsx)(n.a,{href:"https://www.markdownguide.org/cheat-sheet/",children:"Markdown formatting"}),", use ",(0,s.jsx)(n.a,{href:"https://prettier.io/",children:"Prettier"})," to enforce consistent formatting."]}),"\n",(0,s.jsx)(n.h2,{id:"package-names",children:"Package names"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The name of packages in the Solus repository must use inline code formatting."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"To install `caddy`, use the Software Center or execute the following command:\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"When referring to the name of a product or project, use the name the authors use."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Examples: ",(0,s.jsx)(n.em,{children:"RetroArch"}),", and ",(0,s.jsx)(n.em,{children:"Code::Blocks"})]}),"\n",(0,s.jsx)(n.h3,{id:"spelling",children:"Spelling"}),"\n",(0,s.jsxs)(n.p,{children:["We prefer American spelling over British spelling. When in doubt about the spelling of a word, see the ",(0,s.jsx)(n.a,{href:"https://www.merriam-webster.com/",children:"Merriam-Webster dictionary"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6873f895.cdfc1918.js b/assets/js/6873f895.cdfc1918.js
new file mode 100644
index 000000000..6b7b5ec51
--- /dev/null
+++ b/assets/js/6873f895.cdfc1918.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5243"],{34479:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,contentTitle:()=>l,default:()=>h,assets:()=>d,toc:()=>a,frontMatter:()=>o});var s=JSON.parse('{"id":"user/contributing/style","title":"Solus Style Guide","description":"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don\'t want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content.","source":"@site/docs/user/contributing/style.md","sourceDirName":"user/contributing","slug":"/user/contributing/style","permalink":"/docs/user/contributing/style","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/style.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Solus Style Guide","summary":"Guidance for writing Solus content"},"sidebar":"userSidebar","previous":{"title":"Getting Involved","permalink":"/docs/user/contributing/getting-involved"},"next":{"title":"Testing an ISO","permalink":"/docs/user/contributing/testing-an-iso"}}'),i=t("85893"),r=t("50065");let o={title:"Solus Style Guide",summary:"Guidance for writing Solus content"},l="Solus style guide",d={},a=[{value:"General writing style",id:"general-writing-style",level:2},{value:"Linux-specific terms",id:"linux-specific-terms",level:2},{value:"Specific guidance",id:"specific-guidance",level:2},{value:"Admonitions",id:"admonitions",level:3},{value:"Code blocks",id:"code-blocks",level:2},{value:"Commands",id:"commands",level:3},{value:"Common Solus terms",id:"common-solus-terms",level:3},{value:"Markdown formatting",id:"markdown-formatting",level:3},{value:"Package names",id:"package-names",level:2},{value:"Spelling",id:"spelling",level:3}];function c(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"solus-style-guide",children:"Solus style guide"})}),"\n",(0,i.jsx)(n.p,{children:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Existing help center topics might not follow our style guide yet."})}),"\n",(0,i.jsx)(n.h2,{id:"general-writing-style",children:"General writing style"}),"\n",(0,i.jsxs)(n.p,{children:["Use the ",(0,i.jsx)(n.a,{href:"https://developers.google.com/style",children:"Google developer documentation style guide"})," for general writing style, grammar, and formatting."]}),"\n",(0,i.jsx)(n.p,{children:"Some useful pages:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://developers.google.com/style/text-formatting",children:"Text formatting summary"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://developers.google.com/style/procedures",children:"Procedures"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://developers.google.com/style/timeless-documentation",children:"Timeless documentation"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://developers.google.com/style/word-list",children:"Word list"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"linux-specific-terms",children:"Linux-specific terms"}),"\n",(0,i.jsxs)(n.p,{children:["If you are unsure of how to use a common Linux term, refer to the ",(0,i.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#glossary-terms-conventions",children:"Glossary of terms and conventions"})," from the ",(0,i.jsx)(n.em,{children:"Red Hat supplementary style guide for documentation"})]}),"\n",(0,i.jsx)(n.h2,{id:"specific-guidance",children:"Specific guidance"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"In alphabetical order, not order of importance."})}),"\n",(0,i.jsx)(n.h3,{id:"admonitions",children:"Admonitions"}),"\n",(0,i.jsxs)(n.p,{children:["This section is based on the ",(0,i.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#admonitions",children:"Red Hat supplementary style guide"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Admonitions should draw the reader\u2019s attention to certain information. Keep admonitions to a minimum, and avoid placing multiple admonitions close to one another. If multiple admonitions are necessary, restructure the information by moving the less-important statements into the flow of the main content. See the ",(0,i.jsx)(n.a,{href:"https://docusaurus.io/docs/markdown-features/admonitions",children:"Docusaurus documentation"})," to learn the correct syntax."]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Note"}),(0,i.jsx)(n.td,{children:"Additional guidance or advice that improves product configuration, performance, or supportability"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Tip"}),(0,i.jsx)(n.td,{children:"Recommendations, suggestions, and alternative methods that might not be obvious. Tips are not essential to using the product."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Info"}),(0,i.jsx)(n.td,{children:"General information about the topic at hand that may be useful or relevant to user."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Important"}),(0,i.jsx)(n.td,{children:"Advisory information essential to the completion of a task or default configuration settings. Users must not disregard this information."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Warning"}),(0,i.jsx)(n.td,{children:"Information that warns the user to proceed with caution. Warning emphasizes a course of action\u2019s potential downsides."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Danger"}),(0,i.jsx)(n.td,{children:"Information about imminent system damage, data loss, or a support-related issue if the user disregards this admonition. If available, offer information to avoid the problem in the future or state where to find more information."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"code-blocks",children:"Code blocks"}),"\n",(0,i.jsx)(n.p,{children:"Code blocks must indicate the programming language of the code snippet."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-md",children:'```js\nconsole.log("Hello, world!");\n```\n'})}),"\n",(0,i.jsx)(n.h3,{id:"commands",children:"Commands"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Commands as part of procedures must be inside code blocks with ",(0,i.jsx)(n.code,{children:"bash"}),' as the language type. This ensures users get a "copy to clipboard" button.']}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When needed, indicate the directory where users need to move before executing the command."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-md",children:"```bash\ncd ~/path/to/directory\nsudo somecommand\n```\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"common-solus-terms",children:"Common Solus terms"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Solus","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Prefer ",(0,i.jsx)(n.em,{children:"Solus"})," rather than ",(0,i.jsx)(n.em,{children:"Solus Project"}),". Don't use ",(0,i.jsx)(n.em,{children:"Solus OS"})," or ",(0,i.jsx)(n.em,{children:"Solus Linux"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["The names of the different editions of Solus are:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Solus Budgie"}),"\n",(0,i.jsx)(n.li,{children:"Solus GNOME"}),"\n",(0,i.jsx)(n.li,{children:"Solus Plasma"}),"\n",(0,i.jsx)(n.li,{children:"Solus XFCE"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Repositories","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Avoid using terms such as ",(0,i.jsx)(n.em,{children:"repo"}),", or ",(0,i.jsx)(n.em,{children:"monorepo"}),", use the specific repository name instead."]}),"\n",(0,i.jsx)(n.li,{children:'Example: "The packages repository", instead of "The monorepo".'}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Dev Tracker","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Avoid using the term ",(0,i.jsx)(n.em,{children:"Dev Tracker"}),"."]}),"\n",(0,i.jsx)(n.li,{children:'Example: "The packages issue tracker", instead of "The dev tracker"'}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["eopkg","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["If you're referring to the application or package, use \"",(0,i.jsx)(n.code,{children:"eopkg"}),'" with inline code formatting (see below)']}),"\n",(0,i.jsxs)(n.li,{children:["If you're referring to package files, use \"",(0,i.jsx)(n.code,{children:".eopkg"}),'" with inline code formatting, including the period but no wildcard']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"markdown-formatting",children:"Markdown formatting"}),"\n",(0,i.jsxs)(n.p,{children:["Write content using ",(0,i.jsx)(n.a,{href:"https://www.markdownguide.org/cheat-sheet/",children:"Markdown formatting"}),", use ",(0,i.jsx)(n.a,{href:"https://prettier.io/",children:"Prettier"})," to enforce consistent formatting."]}),"\n",(0,i.jsx)(n.h2,{id:"package-names",children:"Package names"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The name of packages in the Solus repository must use inline code formatting."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-md",children:"To install `caddy`, use the Software Center or execute the following command:\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"When referring to the name of a product or project, use the name the authors use."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Examples: ",(0,i.jsx)(n.em,{children:"RetroArch"}),", and ",(0,i.jsx)(n.em,{children:"Code::Blocks"})]}),"\n",(0,i.jsx)(n.h3,{id:"spelling",children:"Spelling"}),"\n",(0,i.jsxs)(n.p,{children:["We prefer American spelling over British spelling. When in doubt about the spelling of a word, see the ",(0,i.jsx)(n.a,{href:"https://www.merriam-webster.com/",children:"Merriam-Webster dictionary"}),"."]})]})}function h(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return l},a:function(){return o}});var s=t(67294);let i={},r=s.createContext(i);function o(e){let n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6875c492.49d5c80f.js b/assets/js/6875c492.49d5c80f.js
new file mode 100644
index 000000000..c63532201
--- /dev/null
+++ b/assets/js/6875c492.49d5c80f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["83"],{40043:function(e,t,n){n.d(t,{Z:function(){return a}});var r=n(85893);n(67294);var i=n(1822),s=n(15779);function a(e){let{metadata:t}=e,{previousPage:n,nextPage:a}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,i.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,r.jsx)(s.Z,{permalink:n,title:(0,r.jsx)(i.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),a&&(0,r.jsx)(s.Z,{permalink:a,title:(0,r.jsx)(i.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},35825:function(e,t,n){n.d(t,{Z:()=>I});var r=n("85893");n("67294");var i=n("74904"),s=n("75700");function a(e){let{children:t,className:n}=e;return(0,r.jsx)("article",{className:n,children:t})}var l=n("27544");let o="title_f1Hy";function c(e){let{className:t}=e,{metadata:n,isBlogPostPage:a}=(0,s.nO)(),{permalink:c,title:u}=n;return(0,r.jsx)(a?"h1":"h2",{className:(0,i.Z)(o,t),children:a?u:(0,r.jsx)(l.Z,{to:c,children:u})})}var u=n("1822"),d=n("67984"),h=n("28291");let g="container_mt6G";function m(e){let{readingTime:t}=e,n=function(){let{selectMessage:e}=(0,d.c)();return t=>{let n=Math.ceil(t);return e(n,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:n}))}}();return(0,r.jsx)(r.Fragment,{children:n(t)})}function p(e){let{date:t,formattedDate:n}=e;return(0,r.jsx)("time",{dateTime:t,children:n})}function f(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function x(e){let t,{className:n}=e,{metadata:a}=(0,s.nO)(),{date:l,readingTime:o}=a,c=(0,h.P)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,i.Z)(g,"margin-vert--md",n),children:[(0,r.jsx)(p,{date:l,formattedDate:(t=l,c.format(new Date(t)))}),void 0!==o&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(f,{}),(0,r.jsx)(m,{readingTime:o})]})]})}var j=n("91941");let b={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function Z(e){let{className:t}=e,{metadata:{authors:n},assets:a}=(0,s.nO)();if(0===n.length)return null;let l=n.every(e=>{let{name:t}=e;return!t}),o=1===n.length;return(0,r.jsx)("div",{className:(0,i.Z)("margin-top--md margin-bottom--sm",l?b.imageOnlyAuthorRow:"row",t),children:n.map((e,t)=>(0,r.jsx)("div",{className:(0,i.Z)(!l&&(o?"col col--12":"col col--6"),l?b.imageOnlyAuthorCol:b.authorCol),children:(0,r.jsx)(j.Z,{author:{...e,imageURL:a.authorsImageUrls[t]??e.imageURL}})},t))})}function v(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(x,{}),(0,r.jsx)(Z,{})]})}var T=n("3062"),w=n("27913");function y(e){let{children:t,className:n}=e,{isBlogPostPage:a}=(0,s.nO)();return(0,r.jsx)("div",{id:a?T.blogPostContainerID:void 0,className:(0,i.Z)("markdown",n),children:(0,r.jsx)(w.Z,{children:t})})}var N=n("50490"),k=n("57216"),O=n("50905");function _(){return(0,r.jsx)("b",{children:(0,r.jsx)(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function A(e){let{blogPostTitle:t,...n}=e;return(0,r.jsx)(l.Z,{"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...n,children:(0,r.jsx)(_,{})})}function P(){let{metadata:e,isBlogPostPage:t}=(0,s.nO)(),{tags:n,title:a,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:u}=e,d=!t&&o,h=n.length>0;if(!(h||d||l))return null;if(!t)return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[h&&(0,r.jsx)("div",{className:(0,i.Z)("col",{"col--9":d}),children:(0,r.jsx)(O.Z,{tags:n})}),d&&(0,r.jsx)("div",{className:(0,i.Z)("col text--right",{"col--3":h}),children:(0,r.jsx)(A,{blogPostTitle:a,to:e.permalink})})]});{let e=!!(l||u||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[h&&(0,r.jsx)("div",{className:(0,i.Z)("row","margin-top--sm",N.k.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(O.Z,{tags:n})})}),e&&(0,r.jsx)(k.Z,{className:(0,i.Z)("margin-top--sm",N.k.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:u,lastUpdatedBy:c})]})}}function I(e){let{children:t,className:n}=e,l=function(){let{isBlogPostPage:e}=(0,s.nO)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(a,{className:(0,i.Z)(l,n),children:[(0,r.jsx)(v,{}),(0,r.jsx)(y,{children:t}),(0,r.jsx)(P,{})]})}},30955:function(e,t,n){n.d(t,{Z:function(){return a}});var r=n(85893);n(67294);var i=n(75700),s=n(35825);function a(e){let{items:t,component:n=s.Z}=e;return(0,r.jsx)(r.Fragment,{children:t.map(e=>{let{content:t}=e;return(0,r.jsx)(i.n4,{content:t,children:(0,r.jsx)(n,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)})})}},97559:function(e,t,n){n.r(t),n.d(t,{default:function(){return j}});var r=n(85893);n(67294);var i=n(74904),s=n(1822),a=n(81921),l=n(50490),o=n(20332),c=n(27544),u=n(30928),d=n(40043),h=n(49868),g=n(30955),m=n(43672),p=n(52068);function f(e){let{tag:t}=e,n=(0,o.Wi)(t);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.d,{title:n,description:t.description}),(0,r.jsx)(h.Z,{tag:"blog_tags_posts"})]})}function x(e){let{tag:t,items:n,sidebar:i,listMetadata:a}=e,l=(0,o.Wi)(t);return(0,r.jsxs)(u.Z,{sidebar:i,children:[t.unlisted&&(0,r.jsx)(m.Z,{}),(0,r.jsxs)("header",{className:"margin-bottom--xl",children:[(0,r.jsx)(p.Z,{as:"h1",children:l}),t.description&&(0,r.jsx)("p",{children:t.description}),(0,r.jsx)(c.Z,{href:t.allTagsPath,children:(0,r.jsx)(s.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,r.jsx)(g.Z,{items:n}),(0,r.jsx)(d.Z,{metadata:a})]})}function j(e){return(0,r.jsxs)(a.FG,{className:(0,i.Z)(l.k.wrapper.blogPages,l.k.page.blogTagPostListPage),children:[(0,r.jsx)(f,{...e}),(0,r.jsx)(x,{...e})]})}},43672:function(e,t,n){n.d(t,{Z:function(){return c}});var r=n(85893);n(67294);var i=n(74904),s=n(72372),a=n(50490),l=n(77793);function o(e){let{className:t}=e;return(0,r.jsx)(l.Z,{type:"caution",title:(0,r.jsx)(s.cI,{}),className:(0,i.Z)(t,a.k.common.unlistedBanner),children:(0,r.jsx)(s.eU,{})})}function c(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.T$,{}),(0,r.jsx)(o,{...e})]})}},20332:function(e,t,n){n.d(t,{HV:function(){return c},J$:function(){return d},Wi:function(){return l},ds:function(){return o},fw:function(){return u}});var r=n(85893);n(67294);var i=n(1822),s=n(67984);function a(){let{selectMessage:e}=(0,s.c)();return t=>e(t,(0,i.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function l(e){let t=a();return(0,i.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function o(e){let t=a();return(0,i.I)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:t(e.count),authorName:e.name||e.key})}let c=()=>(0,i.I)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function u(){return(0,r.jsx)(i.Z,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}function d(){return(0,r.jsx)(i.Z,{id:"theme.blog.author.noPosts",description:"The text for authors with 0 blog post",children:"This author has not written any posts yet."})}},72372:function(e,t,n){n.d(t,{T$:function(){return o},cI:function(){return a},eU:function(){return l},ht:function(){return c},xo:function(){return u}});var r=n(85893);n(67294);var i=n(1822),s=n(50777);function a(){return(0,r.jsx)(i.Z,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,r.jsx)(i.Z,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,r.jsx)(s.Z,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,r.jsx)(i.Z,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function u(){return(0,r.jsx)(i.Z,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]);
\ No newline at end of file
diff --git a/assets/js/6875c492.b58fb002.js b/assets/js/6875c492.b58fb002.js
deleted file mode 100644
index c51cb6547..000000000
--- a/assets/js/6875c492.b58fb002.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8610],{17091:(e,t,n)=>{n.d(t,{Z:()=>r});n(67294);var s=n(55361),i=n(60968),a=n(85893);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,a.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,a.jsx)(i.Z,{permalink:n,title:(0,a.jsx)(s.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),r&&(0,a.jsx)(i.Z,{permalink:r,title:(0,a.jsx)(s.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},82957:(e,t,n)=>{n.d(t,{Z:()=>r});n(67294);var s=n(58112),i=n(81782),a=n(85893);function r(e){let{items:t,component:n=i.Z}=e;return(0,a.jsx)(a.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,a.jsx)(s.n4,{content:t,children:(0,a.jsx)(n,{children:(0,a.jsx)(t,{})})},t.metadata.permalink)}))})}},23966:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});n(67294);var s=n(36905),i=n(55361),a=n(96984),r=n(50563),l=n(77514),o=n(38208),c=n(50429),d=n(17091),g=n(62362),h=n(82957),u=n(40591),p=n(42704),m=n(85893);function x(e){let{tag:t}=e;const n=(0,l.Wi)(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(a.d,{title:n,description:t.description}),(0,m.jsx)(g.Z,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:a}=e;const r=(0,l.Wi)(t);return(0,m.jsxs)(c.Z,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(u.Z,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(p.Z,{as:"h1",children:r}),t.description&&(0,m.jsx)("p",{children:t.description}),(0,m.jsx)(o.Z,{href:t.allTagsPath,children:(0,m.jsx)(i.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(h.Z,{items:n}),(0,m.jsx)(d.Z,{metadata:a})]})}function f(e){return(0,m.jsxs)(a.FG,{className:(0,s.Z)(r.k.wrapper.blogPages,r.k.page.blogTagPostListPage),children:[(0,m.jsx)(x,{...e}),(0,m.jsx)(b,{...e})]})}},40591:(e,t,n)=>{n.d(t,{Z:()=>c});n(67294);var s=n(36905),i=n(64827),a=n(50563),r=n(20906),l=n(85893);function o(e){let{className:t}=e;return(0,l.jsx)(r.Z,{type:"caution",title:(0,l.jsx)(i.cI,{}),className:(0,s.Z)(t,a.k.common.unlistedBanner),children:(0,l.jsx)(i.eU,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.T$,{}),(0,l.jsx)(o,{...e})]})}},77514:(e,t,n)=>{n.d(t,{HV:()=>c,Wi:()=>l,ds:()=>o,fw:()=>d});n(67294);var s=n(55361),i=n(59676),a=n(85893);function r(){const{selectMessage:e}=(0,i.c)();return t=>e(t,(0,s.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function l(e){const t=r();return(0,s.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function o(e){const t=r();return(0,s.I)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:t(e.count),authorName:e.name||e.key})}const c=()=>(0,s.I)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function d(){return(0,a.jsx)(s.Z,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}},64827:(e,t,n)=>{n.d(t,{T$:()=>o,cI:()=>r,eU:()=>l,ht:()=>c,xo:()=>d});n(67294);var s=n(55361),i=n(79722),a=n(85893);function r(){return(0,a.jsx)(s.Z,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,a.jsx)(s.Z,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,a.jsx)(i.Z,{children:(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,a.jsx)(s.Z,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,a.jsx)(s.Z,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]);
\ No newline at end of file
diff --git a/assets/js/6937.dcb23d21.js b/assets/js/6937.dcb23d21.js
deleted file mode 100644
index a00b5ee72..000000000
--- a/assets/js/6937.dcb23d21.js
+++ /dev/null
@@ -1 +0,0 @@
-(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6937],{20906:(e,t,n)=>{"use strict";n.d(t,{Z:()=>I});var o=n(67294),s=n(85893);function c(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),c=t.filter((e=>e!==n)),r=n?.props.children;return{mdxAdmonitionTitle:r,rest:c.length>0?(0,s.jsx)(s.Fragment,{children:c}):null}}(e.children),c=e.title??t;return{...e,...c&&{title:c},children:n}}var r=n(36905),a=n(55361),i=n(50563);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:o}=e;return(0,s.jsx)("div",{className:(0,r.Z)(i.k.common.admonition,i.k.common.admonitionType(t),l.admonition,n),children:o})}function u(e){let{icon:t,title:n}=e;return(0,s.jsxs)("div",{className:l.admonitionHeading,children:[(0,s.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,s.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:o,children:c,className:r}=e;return(0,s.jsxs)(d,{type:t,className:r,children:[o||n?(0,s.jsx)(u,{title:o,icon:n}):null,(0,s.jsx)(m,{children:c})]})}function p(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const f={icon:(0,s.jsx)(p,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function b(e){return(0,s.jsx)(h,{...f,...e,className:(0,r.Z)("alert alert--secondary",e.className),children:e.children})}function g(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const x={icon:(0,s.jsx)(g,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function j(e){return(0,s.jsx)(h,{...x,...e,className:(0,r.Z)("alert alert--success",e.className),children:e.children})}function v(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const k={icon:(0,s.jsx)(v,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function N(e){return(0,s.jsx)(h,{...k,...e,className:(0,r.Z)("alert alert--info",e.className),children:e.children})}function y(e){return(0,s.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const B={icon:(0,s.jsx)(y,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,s.jsx)(C,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const L={icon:(0,s.jsx)(y,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const E={...{note:b,tip:j,info:N,warning:function(e){return(0,s.jsx)(h,{...B,...e,className:(0,r.Z)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,s.jsx)(h,{...w,...e,className:(0,r.Z)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,s.jsx)(b,{title:"secondary",...e}),important:e=>(0,s.jsx)(N,{title:"important",...e}),success:e=>(0,s.jsx)(j,{title:"success",...e}),caution:function(e){return(0,s.jsx)(h,{...L,...e,className:(0,r.Z)("alert alert--warning",e.className),children:e.children})}}};function I(e){const t=c(e),n=(o=t.type,E[o]||(console.warn(`No admonition component found for admonition type "${o}". Using Info as fallback.`),E.info));var o;return(0,s.jsx)(n,{...t})}},17573:(e,t,n)=>{"use strict";n.d(t,{Z:()=>R});var o=n(67294),s=n(45025),c=n(36905),r=n(61503),a=n(39581);function i(){const{prism:e}=(0,a.L)(),{colorMode:t}=(0,r.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var l=n(50563),d=n(87594),u=n.n(d);const m=/title=(?["'])(?.*?)\1/,h=/\{(? [\d,-]+)\}/,p={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},f={...p,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},b=Object.keys(p);function g(e,t){const n=e.map((e=>{const{start:n,end:o}=f[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function x(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:s,metastring:c}=t;if(c&&h.test(c)){const e=c.match(h).groups.range;if(0===s.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${c}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=s[0].className,o=u()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const r=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(b,t)}}(o,s),a=n.split("\n"),i=Object.fromEntries(s.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(s.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(s.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let u=0;u void 0!==e));l[t]?i[l[t]].range+=`${u},`:d[t]?i[d[t]].start=u:m[t]&&(i[m[t]].range+=`${i[m[t]].start}-${u-1},`),a.splice(u,1)}n=a.join("\n");const p={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;u()(n).forEach((e=>{p[e]??=[],p[e].push(t)}))})),{lineClassNames:p,code:n}}const j={codeBlockContainer:"codeBlockContainer_Ckt0"};var v=n(85893);function k(e){let{as:t,...n}=e;const o=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,s]=e;const c=t[o];c&&"string"==typeof s&&(n[c]=s)})),n}(i());return(0,v.jsx)(t,{...n,style:o,className:(0,c.Z)(n.className,j.codeBlockContainer,l.k.common.codeBlock)})}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function y(e){let{children:t,className:n}=e;return(0,v.jsx)(k,{as:"pre",tabIndex:0,className:(0,c.Z)(N.codeBlockStandalone,"thin-scrollbar",n),children:(0,v.jsx)("code",{className:N.codeBlockLines,children:t})})}var B=n(20585);const C={attributes:!0,characterData:!0,childList:!0,subtree:!0};function w(e,t){const[n,s]=(0,o.useState)(),c=(0,o.useCallback)((()=>{s(e.current?.closest("[role=tabpanel][hidden]"))}),[e,s]);(0,o.useEffect)((()=>{c()}),[c]),function(e,t,n){void 0===n&&(n=C);const s=(0,B.zX)(t),c=(0,B.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(s);return e&&t.observe(e,c),()=>t.disconnect()}),[e,s,c])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(14965);const E={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function I(e){let{line:t,classNames:n,showLineNumbers:o,getLineProps:s,getTokenProps:r}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const a=s({line:t,className:(0,c.Z)(n,o&&E.codeLine)}),i=t.map(((e,t)=>(0,v.jsx)("span",{...r({token:e})},t)));return(0,v.jsxs)("span",{...a,children:[o?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)("span",{className:E.codeLineNumber}),(0,v.jsx)("span",{className:E.codeLineContent,children:i})]}):i,(0,v.jsx)("br",{})]})}var T=n(55361);function _(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function Z(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const A={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function M(e){let{code:t,className:n}=e;const[s,r]=(0,o.useState)(!1),a=(0,o.useRef)(void 0),i=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),s=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const c=document.getSelection(),r=c.rangeCount>0&&c.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let a=!1;try{a=document.execCommand("copy")}catch{}o.remove(),r&&(c.removeAllRanges(),c.addRange(r)),s&&s.focus()}(t),r(!0),a.current=window.setTimeout((()=>{r(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(a.current)),[]),(0,v.jsx)("button",{type:"button","aria-label":s?(0,T.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,T.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,T.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.Z)("clean-btn",n,A.copyButton,s&&A.copyButtonCopied),onClick:i,children:(0,v.jsxs)("span",{className:A.copyButtonIcons,"aria-hidden":"true",children:[(0,v.jsx)(_,{className:A.copyButtonIcon}),(0,v.jsx)(Z,{className:A.copyButtonSuccessIcon})]})})}function S(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const z={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function H(e){let{className:t,onClick:n,isEnabled:o}=e;const s=(0,T.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,v.jsx)("button",{type:"button",onClick:n,className:(0,c.Z)("clean-btn",t,o&&z.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,v.jsx)(S,{className:z.wordWrapButtonIcon,"aria-hidden":"true"})})}function $(e){let{children:t,className:n="",metastring:s,title:r,showLineNumbers:l,language:d}=e;const{prism:{defaultLanguage:u,magicComments:h}}=(0,a.L)(),p=function(e){return e?.toLowerCase()}(d??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=i(),b=function(){const[e,t]=(0,o.useState)(!1),[n,s]=(0,o.useState)(!1),c=(0,o.useRef)(null),r=(0,o.useCallback)((()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[c,e]),a=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");s(n)}),[c]);return w(c,a),(0,o.useEffect)((()=>{a()}),[e,a]),(0,o.useEffect)((()=>(window.addEventListener("resize",a,{passive:!0}),()=>{window.removeEventListener("resize",a)})),[a]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:r}}(),g=function(e){return e?.match(m)?.groups.title??""}(s)||r,{lineClassNames:j,code:y}=x(t,{metastring:s,language:p,magicComments:h}),B=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(s);return(0,v.jsxs)(k,{as:"div",className:(0,c.Z)(n,p&&!n.includes(`language-${p}`)&&`language-${p}`),children:[g&&(0,v.jsx)("div",{className:N.codeBlockTitle,children:g}),(0,v.jsxs)("div",{className:N.codeBlockContent,children:[(0,v.jsx)(L.y$,{theme:f,code:y,language:p??"text",children:e=>{let{className:t,style:n,tokens:o,getLineProps:s,getTokenProps:r}=e;return(0,v.jsx)("pre",{tabIndex:0,ref:b.codeBlockRef,className:(0,c.Z)(t,N.codeBlock,"thin-scrollbar"),style:n,children:(0,v.jsx)("code",{className:(0,c.Z)(N.codeBlockLines,B&&N.codeBlockLinesWithNumbering),children:o.map(((e,t)=>(0,v.jsx)(I,{line:e,getLineProps:s,getTokenProps:r,classNames:j[t],showLineNumbers:B},t)))})})}}),(0,v.jsxs)("div",{className:N.buttonGroup,children:[(b.isEnabled||b.isCodeScrollable)&&(0,v.jsx)(H,{className:N.codeButton,onClick:()=>b.toggle(),isEnabled:b.isEnabled}),(0,v.jsx)(M,{className:N.codeButton,code:y})]})]})]})}function R(e){let{children:t,...n}=e;const c=(0,s.Z)(),r=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),a="string"==typeof r?$:y;return(0,v.jsx)(a,{...n,children:r},String(c))}},87594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,s,c]=t;if(o&&c){o=parseInt(o),c=parseInt(c);const e=o {"use strict";n.d(t,{Z:()=>a,a:()=>r});var o=n(67294);const s={},c=o.createContext(s);function r(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6cfe09a0.82bdd5bd.js b/assets/js/6cfe09a0.82bdd5bd.js deleted file mode 100644 index 55c4cc469..000000000 --- a/assets/js/6cfe09a0.82bdd5bd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1174],{67189:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=s(85893),r=s(11151);const i={title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},o="TigerVNC",a={id:"user/software/networking/tigervnc",title:"TigerVNC",description:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet.",source:"@site/docs/user/software/networking/tigervnc.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/tigervnc",permalink:"/docs/user/software/networking/tigervnc",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/tigervnc.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},sidebar:"userSidebar",previous:{title:"Samba File Sharing",permalink:"/docs/user/software/networking/samba"},next:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Initial setup of vncserver",id:"initial-setup-of-vncserver",level:3},{value:"Configuration for your desktops",id:"configuration-for-your-desktops",level:3},{value:"Budgie",id:"budgie",level:3},{value:"GNOME",id:"gnome",level:3},{value:"MATE",id:"mate",level:3},{value:"Plasma",id:"plasma",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tigervnc",children:"TigerVNC"})}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet."}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC can be installed either from the Software Center or via terminal. The terminal command to run it is:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install tigervnc\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.h3,{id:"initial-setup-of-vncserver",children:"Initial setup of vncserver"}),"\n",(0,t.jsx)(n.p,{children:"For the initial setup of vncserver for TigerVNC you have to open a terminal and run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver\n"})}),"\n",(0,t.jsxs)(n.p,{children:["While this setup you will be asked for setting up a ",(0,t.jsx)(n.strong,{children:"password"})," and if you'd like to setup a ",(0,t.jsx)(n.strong,{children:"view-only mode"}),", please do it accordingly your desire."]}),"\n",(0,t.jsx)(n.p,{children:"After the initial setup you have to stop the vncserver process, for this please type inside the terminal"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver -kill :1\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configuration-for-your-desktops",children:"Configuration for your desktops"}),"\n",(0,t.jsxs)(n.p,{children:["Every Desktop needs a different Setup, you find the vncserver config under",(0,t.jsx)(n.code,{children:"$HOME/.vnc/xstartup"})," open the file with your desired editor and change bash script inside the file with the following information for your Desktop."]}),"\n",(0,t.jsx)(n.h3,{id:"budgie",children:"Budgie"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\ngnome-session --session=budgie-desktop &\nbudgie-wm &\nbudgie-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"gnome",children:"GNOME"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexport XKL_XMODMAP_DISABLE=1\n\ngnome-session &\ngnome-panel &\ngnome-settings-daemon &\nmetacity &\nnautilus &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"mate",children:"MATE"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\nmate-session &\nmate-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"plasma",children:"Plasma"}),"\n",(0,t.jsxs)(n.p,{children:["Plasma desktop is not supported at the moment. Please use the software ",(0,t.jsx)(n.code,{children:"x11vnc"})," for vncserver support on Plasma."]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>o});var t=s(67294);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6cfe09a0.f301a118.js b/assets/js/6cfe09a0.f301a118.js new file mode 100644 index 000000000..a45e1f984 --- /dev/null +++ b/assets/js/6cfe09a0.f301a118.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7170"],{61435:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,contentTitle:()=>a,default:()=>u,assets:()=>l,toc:()=>c,frontMatter:()=>o});var s=JSON.parse('{"id":"user/software/networking/tigervnc","title":"TigerVNC","description":"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet.","source":"@site/docs/user/software/networking/tigervnc.md","sourceDirName":"user/software/networking","slug":"/user/software/networking/tigervnc","permalink":"/docs/user/software/networking/tigervnc","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/tigervnc.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"TigerVNC","summary":"A quick start guide to using TigerVNC on Solus"},"sidebar":"userSidebar","previous":{"title":"Samba File Sharing","permalink":"/docs/user/software/networking/samba"},"next":{"title":"Wireshark","permalink":"/docs/user/software/networking/wireshark"}}'),r=t("85893"),i=t("50065");let o={title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},a="TigerVNC",l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Initial setup of vncserver",id:"initial-setup-of-vncserver",level:3},{value:"Configuration for your desktops",id:"configuration-for-your-desktops",level:3},{value:"Budgie",id:"budgie",level:3},{value:"GNOME",id:"gnome",level:3},{value:"MATE",id:"mate",level:3},{value:"Plasma",id:"plasma",level:3}];function d(e){let n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"tigervnc",children:"TigerVNC"})}),"\n",(0,r.jsx)(n.p,{children:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet."}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.p,{children:"TigerVNC can be installed either from the Software Center or via terminal. The terminal command to run it is:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install tigervnc\n"})}),"\n",(0,r.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(n.h3,{id:"initial-setup-of-vncserver",children:"Initial setup of vncserver"}),"\n",(0,r.jsx)(n.p,{children:"For the initial setup of vncserver for TigerVNC you have to open a terminal and run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"vncserver\n"})}),"\n",(0,r.jsxs)(n.p,{children:["While this setup you will be asked for setting up a ",(0,r.jsx)(n.strong,{children:"password"})," and if you'd like to setup a ",(0,r.jsx)(n.strong,{children:"view-only mode"}),", please do it accordingly your desire."]}),"\n",(0,r.jsx)(n.p,{children:"After the initial setup you have to stop the vncserver process, for this please type inside the terminal"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"vncserver -kill :1\n"})}),"\n",(0,r.jsx)(n.h3,{id:"configuration-for-your-desktops",children:"Configuration for your desktops"}),"\n",(0,r.jsxs)(n.p,{children:["Every Desktop needs a different Setup, you find the vncserver config under",(0,r.jsx)(n.code,{children:"$HOME/.vnc/xstartup"})," open the file with your desired editor and change bash script inside the file with the following information for your Desktop."]}),"\n",(0,r.jsx)(n.h3,{id:"budgie",children:"Budgie"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\ngnome-session --session=budgie-desktop &\nbudgie-wm &\nbudgie-panel &\n"})}),"\n",(0,r.jsx)(n.h3,{id:"gnome",children:"GNOME"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexport XKL_XMODMAP_DISABLE=1\n\ngnome-session &\ngnome-panel &\ngnome-settings-daemon &\nmetacity &\nnautilus &\n"})}),"\n",(0,r.jsx)(n.h3,{id:"mate",children:"MATE"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\nmate-session &\nmate-panel &\n"})}),"\n",(0,r.jsx)(n.h3,{id:"plasma",children:"Plasma"}),"\n",(0,r.jsxs)(n.p,{children:["Plasma desktop is not supported at the moment. Please use the software ",(0,r.jsx)(n.code,{children:"x11vnc"})," for vncserver support on Plasma."]})]})}function u(e={}){let{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return a},a:function(){return o}});var s=t(67294);let r={},i=s.createContext(r);function o(e){let n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7071adf5.47fc74c7.js b/assets/js/7071adf5.47fc74c7.js deleted file mode 100644 index cf5ab641e..000000000 --- a/assets/js/7071adf5.47fc74c7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4796],{31386:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const t={title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},a="Troubleshooting for Packagers",c={id:"packaging/troubleshooting-packaging",title:"Troubleshooting for Packagers",description:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms.",source:"@site/docs/packaging/troubleshooting-packaging.md",sourceDirName:"packaging",slug:"/packaging/troubleshooting-packaging",permalink:"/docs/packaging/troubleshooting-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/troubleshooting-packaging.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},sidebar:"packagingSidebar",previous:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"},next:{title:"Your First Package Update",permalink:"/docs/packaging/your-first-package-update"}},r={},l=[{value:"Asking for help",id:"asking-for-help",level:2},{value:"Common Issues",id:"common-issues",level:2},{value:""Error downloading https://github.com/project/blah/1.2.3.tar.gz: checksum mismatch"",id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",level:3},{value:""Failed to build packages err="Failed to fetch source https://github.com/project/blah.git#{commit ref here}, reason: exit status 1\\n"",id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",level:3},{value:""mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"",id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",level:3},{value:"Solbuild is eating up all my disk space",id:"solbuild-is-eating-up-all-my-disk-space",level:3},{value:"An old package using %configure
doesn't build",id:"an-old-package-using-configure-doesnt-build",level:3},{value:"Something is wrong with my solbuild profile",id:"something-is-wrong-with-my-solbuild-profile",level:3},{value:"Git commands fail and complain about package checks",id:"git-commands-fail-and-complain-about-package-checks",level:3}];function d(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"troubleshooting-for-packagers",children:"Troubleshooting for Packagers"})}),"\n",(0,i.jsx)(o.p,{children:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms."}),"\n",(0,i.jsx)(o.h2,{id:"asking-for-help",children:"Asking for help"}),"\n",(0,i.jsxs)(o.p,{children:["When you run into a problem that you don't know how to fix you should ask for help in the ",(0,i.jsx)(o.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Solus Packaging Matrix room"}),". But first you should send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file and ",(0,i.jsx)(o.code,{children:"solbuild"})," output to somewhere others can see it; we recommend you use ",(0,i.jsx)(o.a,{href:"https://gist.github.com/",children:"GitHub Gists"}),". These commands assume you have set up ",(0,i.jsx)(o.code,{children:"github-cli"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["If you would rather not use Gists, use a pastebin site like ",(0,i.jsx)(o.a,{href:"https://bpa.st/",children:"bpaste"})]}),"\n",(0,i.jsxs)(o.p,{children:["Send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file in the current directory to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"cat package.yml | gh gist create --public\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& gh gist create --public\n"})}),"\n",(0,i.jsx)(o.p,{children:(0,i.jsxs)(o.em,{children:["Note: the usual ",(0,i.jsx)(o.code,{children:"solbuild"})," output will not be shown when this command is running, and it will take at least a few seconds"]})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a new ",(0,i.jsx)(o.code,{children:"output.txt"})," file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& tee output.txt\n"})}),"\n",(0,i.jsx)(o.h2,{id:"common-issues",children:"Common Issues"}),"\n",(0,i.jsxs)(o.h3,{id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",children:['"Error downloading ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah/1.2.3.tar.gz",children:"https://github.com/project/blah/1.2.3.tar.gz"}),': checksum mismatch"']}),"\n",(0,i.jsxs)(o.p,{children:["Your ",(0,i.jsx)(o.code,{children:"source"})," tarball does not match the checksum next to it in ",(0,i.jsx)(o.code,{children:"package.yml"}),". You should use ",(0,i.jsx)(o.code,{children:"go-task new"})," or ",(0,i.jsx)(o.code,{children:"go-task update"})," to write the correct checksum automatically."]}),"\n",(0,i.jsxs)(o.h3,{id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",children:['"Failed to build packages err="Failed to fetch source ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah.git#%7Bcommit",children:"https://github.com/project/blah.git#{commit"}),' ref here}, reason: exit status 1\\n"']}),"\n",(0,i.jsxs)(o.p,{children:["If your build fails immediately this message, and you are using a ",(0,i.jsx)(o.strong,{children:"git source"}),", you should clear the ",(0,i.jsx)(o.code,{children:"solbuild"})," git sources cache:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo rm -rf /var/lib/solbuild/sources/git\n"})}),"\n",(0,i.jsx)(o.h3,{id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",children:'"mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"'}),"\n",(0,i.jsxs)(o.p,{children:["If you interrupt a build sometimes ",(0,i.jsx)(o.code,{children:"solbuild"})," does not unmount cleanly, and you will need to unmount manually:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo umount -f /var/lib/solbuild/roots/unstable-x86_64\n"})}),"\n",(0,i.jsx)(o.h3,{id:"solbuild-is-eating-up-all-my-disk-space",children:"Solbuild is eating up all my disk space"}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"solbuild"})," cache at ",(0,i.jsx)(o.code,{children:"/var/cache/solbuild"}),' can grow to tens of gigabytes easily. Recover that disk space by running the "delete cache (',(0,i.jsx)(o.code,{children:"dc"}),')" command:']}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo solbuild dc\n"})}),"\n",(0,i.jsxs)(o.h3,{id:"an-old-package-using-configure-doesnt-build",children:["An old package using ",(0,i.jsx)(o.code,{children:"%configure"})," doesn't build"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Replace ",(0,i.jsx)(o.code,{children:"%configure"})," with ",(0,i.jsx)(o.code,{children:"%reconfigure"})," and try again."]}),"\n",(0,i.jsxs)(o.li,{children:["If ",(0,i.jsx)(o.code,{children:"%reconfigure"})," produces the error ",(0,i.jsx)(o.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),", then use the new ",(0,i.jsx)(o.code,{children:"%configure_no_runstatedir"})," macro"]}),"\n"]}),"\n",(0,i.jsx)(o.h3,{id:"something-is-wrong-with-my-solbuild-profile",children:"Something is wrong with my solbuild profile"}),"\n",(0,i.jsxs)(o.p,{children:["Try running ",(0,i.jsx)(o.code,{children:"go-task solbuild-reset"}),". This will delete the solbuild cache and profile, then download and initialize a fresh copy of the default unstable profile."]}),"\n",(0,i.jsx)(o.h3,{id:"git-commands-fail-and-complain-about-package-checks",children:"Git commands fail and complain about package checks"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"git commit --amend\nWRN packages/q/qqwing/package.yml:1: Package release is not incremented by 1\nERR packages/q/qqwing/pspec_x86_64.xml:1: Package release is not incremented by 1\nPackage checks failed: /home/user/solus-packages/common/CI/package_checks.py packages/q/qqwing/package.yml packages/q/qqwing/pspec_x86_64.xml\n"})}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Solus uses pre-commit hooks to check for simple errors. Right now, certain ",(0,i.jsx)(o.code,{children:"git"})," commands can fail, particularly ",(0,i.jsx)(o.code,{children:"git commit --amend"})," and ",(0,i.jsx)(o.code,{children:"git commit --fixup"})]}),"\n",(0,i.jsxs)(o.li,{children:["You can bypass the pre-commit hooks by adding the ",(0,i.jsx)(o.code,{children:"no-verify"})," option, for example: ",(0,i.jsx)(o.code,{children:"git commit --amend --no-verify"}),". Checks will still be run by GitHub after a Pull Request is created."]}),"\n"]})]})}function u(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,s)=>{s.d(o,{Z:()=>c,a:()=>a});var i=s(67294);const n={},t=i.createContext(n);function a(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7071adf5.484f9146.js b/assets/js/7071adf5.484f9146.js new file mode 100644 index 000000000..fe6623350 --- /dev/null +++ b/assets/js/7071adf5.484f9146.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2882"],{92098:function(e,o,s){s.r(o),s.d(o,{metadata:()=>i,contentTitle:()=>c,default:()=>u,assets:()=>r,toc:()=>l,frontMatter:()=>a});var i=JSON.parse('{"id":"packaging/troubleshooting-packaging","title":"Troubleshooting for Packagers","description":"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms.","source":"@site/docs/packaging/troubleshooting-packaging.md","sourceDirName":"packaging","slug":"/packaging/troubleshooting-packaging","permalink":"/docs/packaging/troubleshooting-packaging","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/troubleshooting-packaging.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Troubleshooting for Packagers","summary":"Common packaging issues and how to fix them"},"sidebar":"packagingSidebar","previous":{"title":"Translation instructions","permalink":"/docs/packaging/translation-instructions"},"next":{"title":"Your First Package Update","permalink":"/docs/packaging/your-first-package-update"}}'),n=s("85893"),t=s("50065");let a={title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},c="Troubleshooting for Packagers",r={},l=[{value:"Asking for help",id:"asking-for-help",level:2},{value:"Common Issues",id:"common-issues",level:2},{value:""Error downloading https://github.com/project/blah/1.2.3.tar.gz: checksum mismatch"",id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",level:3},{value:""Failed to build packages err="Failed to fetch source https://github.com/project/blah.git#{commit ref here}, reason: exit status 1\\n"",id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",level:3},{value:""mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"",id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",level:3},{value:"Solbuild is eating up all my disk space",id:"solbuild-is-eating-up-all-my-disk-space",level:3},{value:"An old package using%configure
doesn't build",id:"an-old-package-using-configure-doesnt-build",level:3},{value:"Something is wrong with my solbuild profile",id:"something-is-wrong-with-my-solbuild-profile",level:3},{value:"Git commands fail and complain about package checks",id:"git-commands-fail-and-complain-about-package-checks",level:3}];function d(e){let o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"troubleshooting-for-packagers",children:"Troubleshooting for Packagers"})}),"\n",(0,n.jsx)(o.p,{children:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms."}),"\n",(0,n.jsx)(o.h2,{id:"asking-for-help",children:"Asking for help"}),"\n",(0,n.jsxs)(o.p,{children:["When you run into a problem that you don't know how to fix you should ask for help in the ",(0,n.jsx)(o.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Solus Packaging Matrix room"}),". But first you should send the ",(0,n.jsx)(o.code,{children:"package.yml"})," file and ",(0,n.jsx)(o.code,{children:"solbuild"})," output to somewhere others can see it; we recommend you use ",(0,n.jsx)(o.a,{href:"https://gist.github.com/",children:"GitHub Gists"}),". These commands assume you have set up ",(0,n.jsx)(o.code,{children:"github-cli"}),"."]}),"\n",(0,n.jsxs)(o.p,{children:["If you would rather not use Gists, use a pastebin site like ",(0,n.jsx)(o.a,{href:"https://bpa.st/",children:"bpaste"})]}),"\n",(0,n.jsxs)(o.p,{children:["Send the ",(0,n.jsx)(o.code,{children:"package.yml"})," file in the current directory to a public Gist:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat package.yml | gh gist create --public\n"})}),"\n",(0,n.jsxs)(o.p,{children:["Send the output of ",(0,n.jsx)(o.code,{children:"solbuild"})," to a public Gist:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"go-task |& gh gist create --public\n"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsxs)(o.em,{children:["Note: the usual ",(0,n.jsx)(o.code,{children:"solbuild"})," output will not be shown when this command is running, and it will take at least a few seconds"]})}),"\n",(0,n.jsxs)(o.p,{children:["Send the output of ",(0,n.jsx)(o.code,{children:"solbuild"})," to a new ",(0,n.jsx)(o.code,{children:"output.txt"})," file:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"go-task |& tee output.txt\n"})}),"\n",(0,n.jsx)(o.h2,{id:"common-issues",children:"Common Issues"}),"\n",(0,n.jsxs)(o.h3,{id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",children:['"Error downloading ',(0,n.jsx)(o.a,{href:"https://github.com/project/blah/1.2.3.tar.gz",children:"https://github.com/project/blah/1.2.3.tar.gz"}),': checksum mismatch"']}),"\n",(0,n.jsxs)(o.p,{children:["Your ",(0,n.jsx)(o.code,{children:"source"})," tarball does not match the checksum next to it in ",(0,n.jsx)(o.code,{children:"package.yml"}),". You should use ",(0,n.jsx)(o.code,{children:"go-task new"})," or ",(0,n.jsx)(o.code,{children:"go-task update"})," to write the correct checksum automatically."]}),"\n",(0,n.jsxs)(o.h3,{id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",children:['"Failed to build packages err="Failed to fetch source ',(0,n.jsx)(o.a,{href:"https://github.com/project/blah.git#%7Bcommit",children:"https://github.com/project/blah.git#{commit"}),' ref here}, reason: exit status 1\\n"']}),"\n",(0,n.jsxs)(o.p,{children:["If your build fails immediately this message, and you are using a ",(0,n.jsx)(o.strong,{children:"git source"}),", you should clear the ",(0,n.jsx)(o.code,{children:"solbuild"})," git sources cache:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo rm -rf /var/lib/solbuild/sources/git\n"})}),"\n",(0,n.jsx)(o.h3,{id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",children:'"mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"'}),"\n",(0,n.jsxs)(o.p,{children:["If you interrupt a build sometimes ",(0,n.jsx)(o.code,{children:"solbuild"})," does not unmount cleanly, and you will need to unmount manually:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo umount -f /var/lib/solbuild/roots/unstable-x86_64\n"})}),"\n",(0,n.jsx)(o.h3,{id:"solbuild-is-eating-up-all-my-disk-space",children:"Solbuild is eating up all my disk space"}),"\n",(0,n.jsxs)(o.p,{children:["The ",(0,n.jsx)(o.code,{children:"solbuild"})," cache at ",(0,n.jsx)(o.code,{children:"/var/cache/solbuild"}),' can grow to tens of gigabytes easily. Recover that disk space by running the "delete cache (',(0,n.jsx)(o.code,{children:"dc"}),')" command:']}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo solbuild dc\n"})}),"\n",(0,n.jsxs)(o.h3,{id:"an-old-package-using-configure-doesnt-build",children:["An old package using ",(0,n.jsx)(o.code,{children:"%configure"})," doesn't build"]}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:["Replace ",(0,n.jsx)(o.code,{children:"%configure"})," with ",(0,n.jsx)(o.code,{children:"%reconfigure"})," and try again."]}),"\n",(0,n.jsxs)(o.li,{children:["If ",(0,n.jsx)(o.code,{children:"%reconfigure"})," produces the error ",(0,n.jsx)(o.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),", then use the new ",(0,n.jsx)(o.code,{children:"%configure_no_runstatedir"})," macro"]}),"\n"]}),"\n",(0,n.jsx)(o.h3,{id:"something-is-wrong-with-my-solbuild-profile",children:"Something is wrong with my solbuild profile"}),"\n",(0,n.jsxs)(o.p,{children:["Try running ",(0,n.jsx)(o.code,{children:"go-task solbuild-reset"}),". This will delete the solbuild cache and profile, then download and initialize a fresh copy of the default unstable profile."]}),"\n",(0,n.jsx)(o.h3,{id:"git-commands-fail-and-complain-about-package-checks",children:"Git commands fail and complain about package checks"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"git commit --amend\nWRN packages/q/qqwing/package.yml:1: Package release is not incremented by 1\nERR packages/q/qqwing/pspec_x86_64.xml:1: Package release is not incremented by 1\nPackage checks failed: /home/user/solus-packages/common/CI/package_checks.py packages/q/qqwing/package.yml packages/q/qqwing/pspec_x86_64.xml\n"})}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:["Solus uses pre-commit hooks to check for simple errors. Right now, certain ",(0,n.jsx)(o.code,{children:"git"})," commands can fail, particularly ",(0,n.jsx)(o.code,{children:"git commit --amend"})," and ",(0,n.jsx)(o.code,{children:"git commit --fixup"})]}),"\n",(0,n.jsxs)(o.li,{children:["You can bypass the pre-commit hooks by adding the ",(0,n.jsx)(o.code,{children:"no-verify"})," option, for example: ",(0,n.jsx)(o.code,{children:"git commit --amend --no-verify"}),". Checks will still be run by GitHub after a Pull Request is created."]}),"\n"]})]})}function u(e={}){let{wrapper:o}={...(0,t.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},50065:function(e,o,s){s.d(o,{Z:function(){return c},a:function(){return a}});var i=s(67294);let n={},t=i.createContext(n);function a(e){let o=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7167.2229f351.js b/assets/js/7167.2229f351.js new file mode 100644 index 000000000..987aa0897 --- /dev/null +++ b/assets/js/7167.2229f351.js @@ -0,0 +1 @@ +(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7167"],{87594:function(e,t){function n(e){let t,n=[];for(let o of e.split(",").map(e=>e.trim()))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,s]=t;if(o&&s){o=parseInt(o);let e=o<(s=parseInt(s))?1:-1;("-"===r||".."===r||"\u2025"===r)&&(s+=e);for(let t=o;t!==s;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},77793:function(e,t,n){"use strict";n.d(t,{Z:()=>N});var o=n("85893"),r=n("67294"),s=n("74904"),c=n("1822"),a=n("50490");let l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function i(e){let{type:t,className:n,children:r}=e;return(0,o.jsx)("div",{className:(0,s.Z)(a.k.common.admonition,a.k.common.admonitionType(t),l.admonition,n),children:r})}function d(e){let{icon:t,title:n}=e;return(0,o.jsxs)("div",{className:l.admonitionHeading,children:[(0,o.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function u(e){let{children:t}=e;return t?(0,o.jsx)("div",{className:l.admonitionContent,children:t}):null}function m(e){let{type:t,icon:n,title:r,children:s,className:c}=e;return(0,o.jsxs)(i,{type:t,className:c,children:[r||n?(0,o.jsx)(d,{title:r,icon:n}):null,(0,o.jsx)(u,{children:s})]})}let h={icon:(0,o.jsx)(function(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})},{}),title:(0,o.jsx)(c.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function f(e){return(0,o.jsx)(m,{...h,...e,className:(0,s.Z)("alert alert--secondary",e.className),children:e.children})}let p={icon:(0,o.jsx)(function(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})},{}),title:(0,o.jsx)(c.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function b(e){return(0,o.jsx)(m,{...p,...e,className:(0,s.Z)("alert alert--success",e.className),children:e.children})}let x={icon:(0,o.jsx)(function(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})},{}),title:(0,o.jsx)(c.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function j(e){return(0,o.jsx)(m,{...x,...e,className:(0,s.Z)("alert alert--info",e.className),children:e.children})}function g(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}let v={icon:(0,o.jsx)(g,{}),title:(0,o.jsx)(c.Z,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})},y={icon:(0,o.jsx)(function(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})},{}),title:(0,o.jsx)(c.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})},k={icon:(0,o.jsx)(g,{}),title:(0,o.jsx)(c.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})},B={note:f,tip:b,info:j,warning:function(e){return(0,o.jsx)(m,{...v,...e,className:(0,s.Z)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(m,{...y,...e,className:(0,s.Z)("alert alert--danger",e.className),children:e.children})},secondary:e=>(0,o.jsx)(f,{title:"secondary",...e}),important:e=>(0,o.jsx)(j,{title:"important",...e}),success:e=>(0,o.jsx)(b,{title:"success",...e}),caution:function(e){return(0,o.jsx)(m,{...k,...e,className:(0,s.Z)("alert alert--warning",e.className),children:e.children})}};function N(e){let t=function(e){let{mdxAdmonitionTitle:t,rest:n}=function(e){let t=r.Children.toArray(e),n=t.find(e=>r.isValidElement(e)&&"mdxAdmonitionTitle"===e.type),s=t.filter(e=>e!==n);return{mdxAdmonitionTitle:n?.props.children,rest:s.length>0?(0,o.jsx)(o.Fragment,{children:s}):null}}(e.children),s=e.title??t;return{...e,...s&&{title:s},children:n}}(e),n=function(e){let t=B[e];return t?t:(console.warn(`No admonition component found for admonition type "${e}". Using Info as fallback.`),B.info)}(t.type);return(0,o.jsx)(n,{...t})}},84404:function(e,t,n){"use strict";n.d(t,{Z:()=>S});var o=n("85893"),r=n("67294"),s=n("13341"),c=n("74904"),a=n("96818"),l=n("45237");function i(){let{prism:e}=(0,l.L)(),{colorMode:t}=(0,a.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n("50490"),u=n("87594"),m=n.n(u);let h=/title=(?["'])(?.*?)\1/,f=/\{(? [\d,-]+)\}/,p={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},b={...p,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},x=Object.keys(p);function j(e,t){let n=e.map(e=>{let{start:n,end:o}=b[e];return`(?:${n}\\s*(${t.flatMap(e=>[e.line,e.block?.start,e.block?.end].filter(Boolean)).join("|")})\\s*${o})`}).join("|");return RegExp(`^\\s*(?:${n})\\s*$`)}let g="codeBlockContainer_Ckt0";function v(e){let{as:t,...n}=e,r=function(e){let t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach(e=>{let[o,r]=e,s=t[o];s&&"string"==typeof r&&(n[s]=r)}),n}(i());return(0,o.jsx)(t,{...n,style:r,className:(0,c.Z)(n.className,g,d.k.common.codeBlock)})}let y={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function k(e){let{children:t,className:n}=e;return(0,o.jsx)(v,{as:"pre",tabIndex:0,className:(0,c.Z)(y.codeBlockStandalone,"thin-scrollbar",n),children:(0,o.jsx)("code",{className:y.codeBlockLines,children:t})})}var B=n("57100");let N={attributes:!0,characterData:!0,childList:!0,subtree:!0};var w=n("43359");let C={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function L(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:s,getTokenProps:a}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");let l=s({line:t,className:(0,c.Z)(n,r&&C.codeLine)}),i=t.map((e,t)=>(0,o.jsx)("span",{...a({token:e})},t));return(0,o.jsxs)("span",{...l,children:[r?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("span",{className:C.codeLineNumber}),(0,o.jsx)("span",{className:C.codeLineContent,children:i})]}):i,(0,o.jsx)("br",{})]})}var E=n("1822");function I(e){return(0,o.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,o.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function _(e){return(0,o.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}let Z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function T(e){let{code:t,className:n}=e,[s,a]=(0,r.useState)(!1),l=(0,r.useRef)(void 0),i=(0,r.useCallback)(()=>{!function(e){let{target:t=document.body}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("string"!=typeof e)throw TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);let n=document.createElement("textarea"),o=document.activeElement;n.value=e,n.setAttribute("readonly",""),n.style.contain="strict",n.style.position="absolute",n.style.left="-9999px",n.style.fontSize="12pt";let r=document.getSelection(),s=r.rangeCount>0&&r.getRangeAt(0);t.append(n),n.select(),n.selectionStart=0,n.selectionEnd=e.length;let c=!1;try{c=document.execCommand("copy")}catch{}n.remove(),s&&(r.removeAllRanges(),r.addRange(s)),o&&o.focus()}(t),a(!0),l.current=window.setTimeout(()=>{a(!1)},1e3)},[t]);return(0,r.useEffect)(()=>()=>window.clearTimeout(l.current),[]),(0,o.jsx)("button",{type:"button","aria-label":s?(0,E.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,E.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,E.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.Z)("clean-btn",n,Z.copyButton,s&&Z.copyButtonCopied),onClick:i,children:(0,o.jsxs)("span",{className:Z.copyButtonIcons,"aria-hidden":"true",children:[(0,o.jsx)(I,{className:Z.copyButtonIcon}),(0,o.jsx)(_,{className:Z.copyButtonSuccessIcon})]})})}function z(e){return(0,o.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,o.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}let A={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function H(e){let{className:t,onClick:n,isEnabled:r}=e,s=(0,E.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,o.jsx)("button",{type:"button",onClick:n,className:(0,c.Z)("clean-btn",t,r&&A.wordWrapButtonEnabled),"aria-label":s,title:s,children:(0,o.jsx)(z,{className:A.wordWrapButtonIcon,"aria-hidden":"true"})})}function M(e){var t,n,s;let{children:a,className:d="",metastring:u,title:p,showLineNumbers:b,language:g}=e,{prism:{defaultLanguage:k,magicComments:C}}=(0,l.L)();let E=(t=g??function(e){let t=e.split(" ").find(e=>e.startsWith("language-"));return t?.replace(/language-/,"")}(d)??k,t?.toLowerCase()),I=i(),_=function(){let[e,t]=(0,r.useState)(!1),[n,o]=(0,r.useState)(!1),s=(0,r.useRef)(null),c=(0,r.useCallback)(()=>{let n=s.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t(e=>!e)},[s,e]),a=(0,r.useCallback)(()=>{let{scrollWidth:e,clientWidth:t}=s.current;o(e>t||s.current.querySelector("code").hasAttribute("style"))},[s]);return!function(e,t){let[n,o]=(0,r.useState)(),s=(0,r.useCallback)(()=>{o(e.current?.closest("[role=tabpanel][hidden]"))},[e,o]);(0,r.useEffect)(()=>{s()},[s]),!function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:N,o=(0,B.zX)(t),s=(0,B.Ql)(n);(0,r.useEffect)(()=>{let t=new MutationObserver(o);return e&&t.observe(e,s),()=>t.disconnect()},[e,o,s])}(n,e=>{e.forEach(e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),s())})},{attributes:!0,characterData:!1,childList:!1,subtree:!1})}(s,a),(0,r.useEffect)(()=>{a()},[e,a]),(0,r.useEffect)(()=>(window.addEventListener("resize",a,{passive:!0}),()=>{window.removeEventListener("resize",a)}),[a]),{codeBlockRef:s,isEnabled:e,isCodeScrollable:n,toggle:c}}();let Z=(n=u,(n?.match(h)?.groups.title??"")||p),{lineClassNames:z,code:A}=function(e,t){let n=e.replace(/\n$/,""),{language:o,magicComments:r,metastring:s}=t;if(s&&f.test(s)){let e=s.match(f).groups.range;if(0===r.length)throw Error(`A highlight range has been given in code block's metastring (\`\`\` ${s}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);let t=r[0].className;return{lineClassNames:Object.fromEntries(m()(e).filter(e=>e>0).map(e=>[e-1,[t]])),code:n}}if(void 0===o)return{lineClassNames:{},code:n};let c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return j(["js","jsBlock"],t);case"jsx":case"tsx":return j(["js","jsBlock","jsx"],t);case"html":return j(["js","jsBlock","html"],t);case"python":case"py":case"bash":return j(["bash"],t);case"markdown":case"md":return j(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return j(["tex"],t);case"lua":case"haskell":case"sql":return j(["lua"],t);case"wasm":return j(["wasm"],t);case"vb":case"vba":case"visual-basic":return j(["vb","rem"],t);case"vbnet":return j(["vbnet","rem"],t);case"batch":return j(["rem"],t);case"basic":return j(["rem","f90"],t);case"fsharp":return j(["js","ml"],t);case"ocaml":case"sml":return j(["ml"],t);case"fortran":return j(["f90"],t);case"cobol":return j(["cobol"],t);default:return j(x,t)}}(o,r),a=n.split("\n"),l=Object.fromEntries(r.map(e=>[e.className,{start:0,range:""}])),i=Object.fromEntries(r.filter(e=>e.line).map(e=>{let{className:t,line:n}=e;return[n,t]})),d=Object.fromEntries(r.filter(e=>e.block).map(e=>{let{className:t,block:n}=e;return[n.start,t]})),u=Object.fromEntries(r.filter(e=>e.block).map(e=>{let{className:t,block:n}=e;return[n.end,t]}));for(let e=0;e void 0!==e);i[n]?l[i[n]].range+=`${e},`:d[n]?l[d[n]].start=e:u[n]&&(l[u[n]].range+=`${l[u[n]].start}-${e-1},`),a.splice(e,1)}n=a.join("\n");let h={};return Object.entries(l).forEach(e=>{let[t,{range:n}]=e;m()(n).forEach(e=>{h[e]??=[],h[e].push(t)})}),{lineClassNames:h,code:n}}(a,{metastring:u,language:E,magicComments:C});let M=b??(s=u,!!s?.includes("showLineNumbers"));return(0,o.jsxs)(v,{as:"div",className:(0,c.Z)(d,E&&!d.includes(`language-${E}`)&&`language-${E}`),children:[Z&&(0,o.jsx)("div",{className:y.codeBlockTitle,children:Z}),(0,o.jsxs)("div",{className:y.codeBlockContent,children:[(0,o.jsx)(w.y$,{theme:I,code:A,language:E??"text",children:e=>{let{className:t,style:n,tokens:r,getLineProps:s,getTokenProps:a}=e;return(0,o.jsx)("pre",{tabIndex:0,ref:_.codeBlockRef,className:(0,c.Z)(t,y.codeBlock,"thin-scrollbar"),style:n,children:(0,o.jsx)("code",{className:(0,c.Z)(y.codeBlockLines,M&&y.codeBlockLinesWithNumbering),children:r.map((e,t)=>(0,o.jsx)(L,{line:e,getLineProps:s,getTokenProps:a,classNames:z[t],showLineNumbers:M},t))})})}}),(0,o.jsxs)("div",{className:y.buttonGroup,children:[(_.isEnabled||_.isCodeScrollable)&&(0,o.jsx)(H,{className:y.codeButton,onClick:()=>_.toggle(),isEnabled:_.isEnabled}),(0,o.jsx)(T,{className:y.codeButton,code:A})]})]})]})}function S(e){var t;let{children:n,...c}=e,a=(0,s.Z)();let l=(t=n,r.Children.toArray(t).some(e=>(0,r.isValidElement)(e))?t:Array.isArray(t)?t.join(""):t);return(0,o.jsx)("string"==typeof l?M:k,{...c,children:l},String(a))}},50065:function(e,t,n){"use strict";n.d(t,{Z:function(){return a},a:function(){return c}});var o=n(67294);let r={},s=o.createContext(r);function c(e){let t=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72054e31.129ae3b7.js b/assets/js/72054e31.129ae3b7.js new file mode 100644 index 000000000..6fe045e0a --- /dev/null +++ b/assets/js/72054e31.129ae3b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9277"],{89814:function(e,i,n){n.r(i),n.d(i,{assets:function(){return o},contentTitle:function(){return a},default:function(){return h},frontMatter:function(){return r},metadata:function(){return s},toc:function(){return d}});var s=n(56021),t=n(85893),l=n(50065);let r={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},a="Cual es la causa",o={authorsImageUrls:[void 0]},d=[{value:"Let's Start Obvious",id:"lets-start-obvious",level:2},{value:"PGO is great, except, when it isn't.",id:"pgo-is-great-except-when-it-isnt",level:2},{value:"256 Vector Units go brrrrrr...",id:"256-vector-units-go-brrrrrr",level:2},{value:"Something about perf
to the rescue",id:"something-about-perf-to-the-rescue",level:2},{value:"Choosing Wisely",id:"choosing-wisely",level:2},{value:"Adjusting the Benchmark",id:"adjusting-the-benchmark",level:2},{value:"Partial Profiling",id:"partial-profiling",level:3},{value:"I Zee a Purty lil' Package",id:"i-zee-a-purty-lil-package",level:2},{value:"Squeezing more from zlib-ng",id:"squeezing-more-from-zlib-ng",level:2}];function c(e){let i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(i.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,t.jsx)(i.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]}),"\n",(0,t.jsx)(i.p,{children:"Linux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements."}),"\n",(0,t.jsxs)(i.p,{children:["Part of the problem is, a packager's time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for ",(0,t.jsx)(i.em,{children:"all"})," packages, such as enabling ",(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Interprocedural_optimization",children:"LTO"})," by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as ",(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Profile-guided_optimization",children:"PGO"})," without too much faffing around on a ",(0,t.jsx)(i.em,{children:"targeted"})," package."]}),"\n",(0,t.jsx)(i.p,{children:"The benefits of such an approach are:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Can target the performance of a specific package to benefit ",(0,t.jsx)(i.em,{children:"all"})," users"]}),"\n",(0,t.jsx)(i.li,{children:"A compiler optimization may improve one package, but may not apply globally to all packages."}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"The downsides are such:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Requires additional packager time to benchmark and experiment with different optimization strategies."}),"\n",(0,t.jsxs)(i.li,{children:["Requires the packager to ",(0,t.jsx)(i.em,{children:"choose"})," and invest time into improving performance of a package."]}),"\n",(0,t.jsx)(i.li,{children:"Requires the packager to find an appropriate benchmark to test the package against."}),"\n",(0,t.jsx)(i.li,{children:"Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck."}),"\n"]}),"\n",(0,t.jsx)(i.h1,{id:"optimization-techniques-available",children:"Optimization Techniques Available"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["speed:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["As simple as it gets really, build a package with ",(0,t.jsx)(i.code,{children:"-O3"})," instead of ",(0,t.jsx)(i.code,{children:"-O2"})," as well as any other flags deemed worthy to be included as part of the ",(0,t.jsx)(i.code,{children:"speed"})," flags. The main drawback of this is that ",(0,t.jsx)(i.code,{children:"-O3"})," is not guaranteed to produce faster results than building with ",(0,t.jsx)(i.code,{children:"-O2"})," and typically will produce bigger binaries. The days of ",(0,t.jsx)(i.code,{children:"-O3"})," outright breaking your program in weird unexpected ways is largely behind us."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["LTO:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Compared to some other distributions ",(0,t.jsx)(i.code,{children:"-flto"})," is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["Clang:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Not strictly an optimization, but, building a package with ",(0,t.jsx)(i.code,{children:"clang"})," instead of ",(0,t.jsx)(i.code,{children:"gcc"})," and ",(0,t.jsx)(i.code,{children:"ld.ldd"})," to link instead of the infamous ",(0,t.jsx)(i.code,{children:"ld.bfd"})," may provide a faster package out of the box. You'll have to be careful of subtle ABI differences if building with ",(0,t.jsx)(i.code,{children:"clang"}),". If in doubt, and, ",(0,t.jsx)(i.code,{children:"clang"})," is the obvious choice, perform safety rebuilds on all reverse dependencies of the package."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["PGO:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["BOLT:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:['Binary optimization and layout tool. You can think of this as "post-link PGO" where you instrument a binary with ',(0,t.jsx)(i.code,{children:"bolt"})," to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Regardless, that's enough word spaghetti, let's look at the process to actually optimize a package."}),"\n",(0,t.jsx)(i.h1,{id:"optimizing-a-package",children:"Optimizing a Package"}),"\n",(0,t.jsxs)(i.p,{children:["Right, to begin with we'll have to start on choosing an actual package to benchmark and optimize. I've heard the ",(0,t.jsx)(i.code,{children:".webp"})," file format is becoming increasingly common on the web, slowly replacing ",(0,t.jsx)(i.code,{children:".png"})," and ",(0,t.jsx)(i.code,{children:".jpg"})," file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for ",(0,t.jsx)(i.code,{children:".webp"})," files would benefit any user using a web browser casually browsing the web."]}),"\n",(0,t.jsxs)(i.p,{children:["Let's have a look at the ",(0,t.jsx)(i.code,{children:"package.yml"})," build recipe for ",(0,t.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-yaml",children:"name : libwebp\nversion : 1.3.2\nrelease : 25\nsource :\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\nhomepage : https://developers.google.com/speed/webp/\nlicense : BSD-3-Clause\ncomponent : multimedia.codecs\nsummary : A new image format for the web\ndescription: |\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\nemul32 : yes\npatterns :\n - devel : /usr/share/man\nbuilddeps :\n - pkgconfig32(glu)\n - pkgconfig32(glut)\n - pkgconfig32(libpng)\n - pkgconfig32(libtiff-4)\n - pkgconfig32(libturbojpeg)\n - pkgconfig32(zlib)\n - giflib-devel\nsetup : |\n %reconfigure --disable-static --enable-everything\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Okay, looks to be a quite simple affair. A simple configure, make, make install as well as ",(0,t.jsx)(i.code,{children:"emul32"})," being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We'll begin by looking at the ",(0,t.jsx)(i.code,{children:"pspec_x86_64.xml"})," file which lists all the files produced from the ",(0,t.jsx)(i.code,{children:"package.yml"})," recipe as well as some metadata."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-xml",children:'libwebp \nA new image format for the web \nWebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\n \nmultimedia.codecs \n\n /usr/bin/cwebp \n/usr/bin/dwebp \n/usr/bin/gif2webp \n/usr/bin/img2webp \n/usr/bin/vwebp \n/usr/bin/webpinfo \n/usr/bin/webpmux \n'})}),"\n",(0,t.jsxs)(i.p,{children:["Perfect, we have ",(0,t.jsx)(i.code,{children:"dwebp"})," and ",(0,t.jsx)(i.code,{children:"cwebp"})," binaries available in the main package, which from a guess can be used to decode and encode ",(0,t.jsx)(i.code,{children:".webp"})," files. Let's try it out."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"$ dwebp -h\nUsage: dwebp in_file [options] [-o out_file]\n\nDecodes the WebP image file to PNG format [Default].\nNote: Animated WebP files are not supported.\n$ cwebp -h\nUsage:\n\n cwebp [options] -q quality input.png -o output.webp\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Awesome, these binaries do exactly what we need to benchmark ",(0,t.jsx)(i.code,{children:"libwebp"}),", but, we are also indirectly testing ",(0,t.jsx)(i.code,{children:"libpng"})," as well for this benchmark, we'll have to keep an eye out for that."]}),"\n",(0,t.jsxs)(i.p,{children:["One extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don't link against their own libraries and end up being self-contained. Run ",(0,t.jsx)(i.code,{children:"ldd"})," to verify."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n linux-vdso.so.1 (0x00007ffed8733000)\n libwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\n libwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\n libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\n libc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\n libsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\n libm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\n libz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\n /usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Awesome in this case both ",(0,t.jsx)(i.code,{children:"dwebp"})," and ",(0,t.jsx)(i.code,{children:"cwebp"})," link against ",(0,t.jsx)(i.code,{children:"libwebp.so"})," so we can be confident that any performance improvements will be applicable to all packages in the repository linking against ",(0,t.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Let's grab a couple of ",(0,t.jsx)(i.code,{children:".webp"})," files from ",(0,t.jsx)(i.a,{href:"https://developers.google.com/speed/webp/gallery1",children:"here"})," to test with. We'll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more."]}),"\n",(0,t.jsxs)(i.p,{children:["Now having done the prep work, lets actually benchmark the damn thing using ",(0,t.jsx)(i.code,{children:"hyperfine"})," for the time being."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03C3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03C3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\n'})}),"\n",(0,t.jsx)(i.p,{children:"There, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss."}),"\n",(0,t.jsx)(i.h2,{id:"lets-start-obvious",children:"Let's Start Obvious"}),"\n",(0,t.jsxs)(i.p,{children:["Let's start basic, enabling the ",(0,t.jsx)(i.code,{children:"speed"})," optimization which basically builds with ",(0,t.jsx)(i.code,{children:"-O3"})," instead of ",(0,t.jsx)(i.code,{children:"-O2"})," as well as any other flags that are deemed to be worthy to be part of the ",(0,t.jsx)(i.code,{children:"speed"})," group. As well as, the ",(0,t.jsx)(i.code,{children:"lto"})," optimization which builds with link time optimization allowing for inter-procedural optimizations to take place."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-yaml",children:"optimize:\n - speed\n - lto\n"})}),"\n",(0,t.jsx)(i.p,{children:"Moment of truth..."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03C3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03C3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\n'})}),"\n",(0,t.jsx)(i.p,{children:"Well okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore..."}),"\n",(0,t.jsx)(i.h2,{id:"pgo-is-great-except-when-it-isnt",children:"PGO is great, except, when it isn't."}),"\n",(0,t.jsxs)(i.p,{children:["Next step is to explore PGO (Profile Guided Optimization). For our ",(0,t.jsx)(i.code,{children:"libwebp"})," package, looks like we already hit a bit of a snafu. There's no test suite included in the tarball! That's a bit of a disappointment as a test suite such as ",(0,t.jsx)(i.code,{children:"make check"})," is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built ",(0,t.jsx)(i.code,{children:"dwebp"})," and ",(0,t.jsx)(i.code,{children:"cwebp"})," binaries as a suitable workload for PGO."]}),"\n",(0,t.jsx)(i.p,{children:"Luckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-yaml",children:"profile : |\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\n ./examples/cwebp test_png.png -o /dev/null\n"})}),"\n",(0,t.jsx)(i.p,{children:"After specifying that, 6 builds will now be performed instead of 2:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["emul32:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,t.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,t.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["x86_64:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,t.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,t.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"For this relatively small package it increases the build time from 1m1.672s to 1m42.199s"}),"\n",(0,t.jsx)(i.p,{children:"The next moment of truth..."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03C3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03C3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\n'})}),"\n",(0,t.jsxs)(i.p,{children:["Well... That's interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of ",(0,t.jsx)(i.code,{children:"profile count data file not found [-Wmissing-profile]"})," warning messages during the optimized build indicating to us our profiling workload isn't comprehensive enough and doesn't cover enough code paths. The lack of a handy ",(0,t.jsx)(i.code,{children:"make check"})," that could be used as a profiling workload is really hurting us here. For now, let's put a pin in exploring PGO, it isn't a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us."]}),"\n",(0,t.jsx)(i.h2,{id:"256-vector-units-go-brrrrrr",children:"256 Vector Units go brrrrrr..."}),"\n",(0,t.jsxs)(i.p,{children:["The next obvious step is to explore ",(0,t.jsx)(i.code,{children:"glibc"})," hardware capabilities. For those unaware both ",(0,t.jsx)(i.code,{children:"clang"})," and ",(0,t.jsx)(i.code,{children:"gnu"})," compilers provide ",(0,t.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,t.jsx)(i.code,{children:"x86_64-v3"})," and ",(0,t.jsx)(i.code,{children:"x86_64-v4"})," micro-architecture build options on top of the baseline of ",(0,t.jsx)(i.code,{children:"x86_64"}),". These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, ",(0,t.jsx)(i.code,{children:"-sse4.2"})," for ",(0,t.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,t.jsx)(i.code,{children:"-avx2"})," for ",(0,t.jsx)(i.code,{children:"x86_64-v3"}),", and ",(0,t.jsx)(i.code,{children:"-avx512"})," for ",(0,t.jsx)(i.code,{children:"x86_64-v4"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Whilst that's great 'n all, if a program is built with ",(0,t.jsx)(i.code,{children:"x86_64-v3"})," and gains an additional ~10% uplift in performance, it's no good if a ",(0,t.jsx)(i.code,{children:"x86_64-v2"})," compatible cpu can't run it. Luckily the ",(0,t.jsx)(i.code,{children:"glibc"})," loader that's found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they're installed and supported."]}),"\n",(0,t.jsxs)(i.p,{children:["On top of all that, the ",(0,t.jsx)(i.code,{children:"package.yml"})," format provides an incredibly simple way of providing ",(0,t.jsx)(i.code,{children:"x86_64-v3"})," built libraries by enabling the ",(0,t.jsx)(i.code,{children:"avx2 : yes"})," flag."]}),"\n",(0,t.jsxs)(i.p,{children:["With ",(0,t.jsx)(i.code,{children:"avx2 : yes"})," enabled in the ",(0,t.jsx)(i.code,{children:"libwebp"})," package three builds are performed."]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"emul32"}),"\n",(0,t.jsx)(i.li,{children:"x86_64-v3"}),"\n",(0,t.jsx)(i.li,{children:"x86_64"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["We now see these additional files in the ",(0,t.jsx)(i.code,{children:"pspec_x86_64.xml"})," file"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-diff",children:'+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13 \n'})}),"\n",(0,t.jsxs)(i.p,{children:["Let's rerun ",(0,t.jsx)(i.code,{children:"lld"})," on ",(0,t.jsx)(i.code,{children:"dwebp"})," after installing the new package and..."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n linux-vdso.so.1 (0x00007ffeab5b1000)\n libwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\n libwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\n libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\n libc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\n libsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\n libm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\n libz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\n /usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\n"})}),"\n",(0,t.jsxs)(i.p,{children:["We can crucially see that ",(0,t.jsx)(i.code,{children:"dwebp"})," is now loading the ",(0,t.jsx)(i.code,{children:"x86-64-v3"})," built ",(0,t.jsx)(i.code,{children:"libwebp.so"})," lib from ",(0,t.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8"}),", success! Let's what our performance looks like."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03C3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03C3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\n'})}),"\n",(0,t.jsx)(i.p,{children:"Let's recap so far:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Optimization"}),(0,t.jsx)(i.th,{children:"Decode"}),(0,t.jsx)(i.th,{children:"Encode"}),(0,t.jsx)(i.th,{children:"Size"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Baseline"}),(0,t.jsx)(i.td,{children:"202.2 ms"}),(0,t.jsx)(i.td,{children:"1.399 s"}),(0,t.jsx)(i.td,{children:"1.33 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO"}),(0,t.jsx)(i.td,{children:"200.0 ms"}),(0,t.jsx)(i.td,{children:"1.353 s"}),(0,t.jsx)(i.td,{children:"1.73 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO + PGO"}),(0,t.jsxs)(i.td,{children:["204.1 ms ","\u26A0\uFE0F"]}),(0,t.jsx)(i.td,{children:"1.349 s"}),(0,t.jsx)(i.td,{children:"1.07 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO + x86_64-v3"}),(0,t.jsx)(i.td,{children:"198.2 ms"}),(0,t.jsx)(i.td,{children:"1.313 s"}),(0,t.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,t.jsxs)(i.p,{children:["Whilst we're still getting an additional speedup it isn't really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in ",(0,t.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/"})," just ain't worth it. This hints that either the compiler optimizations aren't really effective here or we're being bottle-necked by something else."]}),"\n",(0,t.jsxs)(i.p,{children:["So far, we've been benchmarking fairly simply using ",(0,t.jsx)(i.code,{children:"hyperfine"}),", let's swap that out for ",(0,t.jsx)(i.code,{children:"perf"})," so we can get a callgraph."]}),"\n",(0,t.jsxs)(i.h2,{id:"something-about-perf-to-the-rescue",children:["Something about ",(0,t.jsx)(i.code,{children:"perf"})," to the rescue"]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null"})}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.code,{children:"perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null"})}),"\n",(0,t.jsxs)(i.p,{children:["Let's look at ",(0,t.jsx)(i.code,{children:"dwebp"})," first with ",(0,t.jsx)(i.code,{children:"perf report -i dwebp.data"}),"."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Perf report dwebp",src:n(56495).Z+"",width:"1254",height:"676"})}),"\n",(0,t.jsxs)(i.p,{children:["Well god damn, literally all of our time is being spent in ",(0,t.jsx)(i.code,{children:"libz.so"})," it's no wonder our compiler optimizations were hardly improving performance."]}),"\n",(0,t.jsxs)(i.p,{children:["Let's also look at the ",(0,t.jsx)(i.code,{children:"cwebp"})," report, we've generally been getting better results from it."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Perf report cwebp",src:n(53065).Z+"",width:"1254",height:"676"})}),"\n",(0,t.jsxs)(i.p,{children:["Okay, much more of our time is being spent in ",(0,t.jsx)(i.code,{children:"libwebp.so"})," itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in ",(0,t.jsx)(i.code,{children:"libz"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"choosing-wisely",children:"Choosing Wisely"}),"\n",(0,t.jsxs)(i.p,{children:["You may remember early on, when I said we are also indirectly testing ",(0,t.jsx)(i.code,{children:"libpng"}),". Well... after some more digging, that's exactly what's happening here. Re-running the ",(0,t.jsx)(i.code,{children:"dwebp"})," binary it says this"]}),"\n",(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:"Decodes the WebP image file to PNG format"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["Turns out, it's more accurate to say we are ",(0,t.jsx)(i.em,{children:"directly"})," testing ",(0,t.jsx)(i.code,{children:"libpng"})," and by extension ",(0,t.jsx)(i.code,{children:"zlib"}),". It isn't ",(0,t.jsx)(i.code,{children:"libwebp"})," that's spending all of its time in ",(0,t.jsx)(i.code,{children:"libz.so"}),", it's ",(0,t.jsx)(i.code,{children:"libpng"}),"! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they're doing."]}),"\n",(0,t.jsx)(i.p,{children:"However, the good news about this little snafu is:"}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"dwebp"})," can be used to translate to another image format such as ",(0,t.jsx)(i.code,{children:".yuv"})," that'll more accurately remove the bottleneck from ",(0,t.jsx)(i.code,{children:"libz.so"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:["We now know that ",(0,t.jsx)(i.code,{children:"libpng"})," has a huge bottleneck in ",(0,t.jsx)(i.code,{children:"libz.so"})," and speeding up ",(0,t.jsx)(i.code,{children:"zlib"})," ",(0,t.jsx)(i.em,{children:"should"})," dramatically speed up ",(0,t.jsx)(i.code,{children:"libpng"})," performance."]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"adjusting-the-benchmark",children:"Adjusting the Benchmark"}),"\n",(0,t.jsxs)(i.p,{children:["After reverting the ",(0,t.jsx)(i.code,{children:"libwebp"})," package to the baseline let's use our adjusted decoding benchmark."]}),"\n",(0,t.jsxs)(i.p,{children:["We'll now use ",(0,t.jsx)(i.code,{children:"dwebp ~/3.webp -yuv -o /dev/null"})," for a decoding test, let's run that with ",(0,t.jsx)(i.code,{children:"perf"})," to ensure we're exclusively testing ",(0,t.jsx)(i.code,{children:"libwebp.so"})," here."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Perf report dwebp to yuv",src:n(48283).Z+"",width:"1254",height:"676"})}),"\n",(0,t.jsxs)(i.p,{children:["Okay that's awesome, no ",(0,t.jsx)(i.code,{children:"libpng.so"})," or ",(0,t.jsx)(i.code,{children:"libz.so"})," to mess with our tests!"]}),"\n",(0,t.jsx)(i.p,{children:"Let's reapply our optimizations, keeping those which apply an uplift"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Optimization"}),(0,t.jsx)(i.th,{children:"Decode"}),(0,t.jsx)(i.th,{children:"Size"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Baseline"}),(0,t.jsx)(i.td,{children:"14.7 ms"}),(0,t.jsx)(i.td,{children:"1.33 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed"}),(0,t.jsx)(i.td,{children:"14.5 ms"}),(0,t.jsx)(i.td,{children:"1.56 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"LTO"}),(0,t.jsx)(i.td,{children:"14.6 ms"}),(0,t.jsx)(i.td,{children:"1.40 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"PGO"}),(0,t.jsxs)(i.td,{children:["18.0 ms ","\u26A0\uFE0F"]}),(0,t.jsx)(i.td,{children:"1.07 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"x86-64-v3"}),(0,t.jsx)(i.td,{children:"12.7 ms"}),(0,t.jsx)(i.td,{children:"2.35 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,t.jsx)(i.td,{children:"12.3 ms"}),(0,t.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,t.jsx)(i.p,{children:"Okay, this is great, whilst we aren't getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we're getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size."}),"\n",(0,t.jsx)(i.h3,{id:"partial-profiling",children:"Partial Profiling"}),"\n",(0,t.jsxs)(i.p,{children:["Once again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn't very comprehensive due to the bunch of ",(0,t.jsx)(i.code,{children:"-Wmissing-profile"})," warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that's part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn't matter is small. However, what happens when you can't craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that ",(0,t.jsx)(i.code,{children:"-fprofile-partial-training"}),". GCC docs state that:"]}),"\n",(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:"In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code."}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["Okay, let's try it out, all we need to do is specify in our ",(0,t.jsx)(i.code,{children:"package.yml"})," recipe."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-yaml",children:'environment: |\n if [[ -n ${PGO_USE_BUILD} ]]; then\n export CFLAGS="${CFLAGS} -fprofile-partial-training"\n export CXXFLAGS="${CXXFLAGS} -fprofile-partial-training"\n fi\n'})}),"\n",(0,t.jsx)(i.p,{children:"And the results:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Optimization"}),(0,t.jsx)(i.th,{children:"Decode"}),(0,t.jsx)(i.th,{children:"Size"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,t.jsx)(i.td,{children:"12.3 ms"}),(0,t.jsx)(i.td,{children:"3.17 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO + x86-64-v3 + Partial PGO"}),(0,t.jsx)(i.td,{children:"12.5 ms"}),(0,t.jsx)(i.td,{children:"3.13 MB"})]})]})]}),"\n",(0,t.jsx)(i.p,{children:"Well, it was worth a try. This highlights how useless PGO can be when you don't or can't provide it a good workload. Interestingly, we don't get the size bloat that was promised, in fact, the opposite."}),"\n",(0,t.jsx)(i.h1,{id:"final-libwebp-results",children:"Final libwebp Results"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Benchmark"}),(0,t.jsx)(i.th,{children:"Time Before"}),(0,t.jsx)(i.th,{children:"Time After"}),(0,t.jsx)(i.th,{children:"Size Before"}),(0,t.jsx)(i.th,{children:"Size After"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:'"dwebp ~/3.webp -yuv -o /dev/null"'}),(0,t.jsx)(i.td,{children:"14.5 ms"}),(0,t.jsx)(i.td,{children:"12.3 ms"}),(0,t.jsx)(i.td,{children:"1.33 MB"}),(0,t.jsx)(i.td,{children:"3.17 MB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:'"cwebp ~/PNG_Test.png -o /dev/null"'}),(0,t.jsx)(i.td,{children:"1.399 s"}),(0,t.jsx)(i.td,{children:"1.313 s"}),(0,t.jsx)(i.td,{children:"--"}),(0,t.jsx)(i.td,{children:"--"})]})]})]}),"\n",(0,t.jsx)(i.p,{children:"In the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It's possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level."}),"\n",(0,t.jsx)(i.h1,{id:"next-generation-side-quest",children:'"Next-Generation" Side Quest'}),"\n",(0,t.jsxs)(i.p,{children:["Now, you probably remember earlier due to our unrepresentative benchmark we found out that ",(0,t.jsx)(i.code,{children:"libpng"})," is getting highly bottlenecked by ",(0,t.jsx)(i.code,{children:"libz.so"}),". This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using."]}),"\n",(0,t.jsxs)(i.p,{children:["Zlib is widely employed throughout the ecosystem and, as such you'd think it would be highly-optimized for performance. However, that isn't really the case. Zlib is written in an old-fashioned way of C and tries to be ",(0,t.jsx)(i.em,{children:"extremely"})," portable; supporting dozens of systems that have fallen out of common use. As such, it's hard to apply architecture specific optimizations that wouldn't break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success."]}),"\n",(0,t.jsxs)(i.p,{children:["However, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to ",(0,t.jsx)(i.a,{href:"https://github.com/zlib-ng/zlib-ng/",children:"zlib-ng"}),". When built in compatible mode, it promises to be API compatible with canonical zlib and ",(0,t.jsx)(i.em,{children:"tries"})," to be as ABI compatible as possible."]}),"\n",(0,t.jsxs)(i.p,{children:["Let's just go for it, replacing Solus' ",(0,t.jsx)(i.code,{children:"zlib"})," package with zlib-ng built in compatible mode. It's a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?"]}),"\n",(0,t.jsx)(i.h2,{id:"i-zee-a-purty-lil-package",children:"I Zee a Purty lil' Package"}),"\n",(0,t.jsxs)(i.p,{children:["Well that was simple. Here's what our zlib-ng ",(0,t.jsx)(i.code,{children:"package.yml"})," recipe looks like."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-yaml",children:"name : zlib\nversion : 2.1.5\nrelease : 28\nsource :\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\nhomepage : https://github.com/zlib-ng/zlib-ng\nlicense : ZLIB\ncomponent : system.base\nsummary : zlib replacement with optimizations for next generation systems.\ndescription:\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\ndevel : yes\nemul32 : yes\nsetup : |\n %cmake_ninja \\\n -DZLIB_COMPAT=ON \\\n -DWITH_GTEST=OFF \\\n -DBUILD_SHARED_LIBS=ON \\\n -DINSTALL_LIB_DIR=%libdir%\nbuild : |\n %ninja_build\ninstall : |\n %ninja_install\ncheck : |\n %ninja_check\n"})}),"\n",(0,t.jsxs)(i.p,{children:["After building it, all the files seem to be in the right place and the test suite is passing. Let's just install it overwriting our canonical ",(0,t.jsx)(i.code,{children:"zlib"})," package and hope our system doesn't die... I think the word is YOLO."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03C3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\n...\n$ $ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03C3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\n'})}),"\n",(0,t.jsx)(i.p,{children:"Well, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time."}),"\n",(0,t.jsxs)(i.p,{children:["We need to find a more contained ",(0,t.jsx)(i.code,{children:"libpng"})," benchmark here that removes the ",(0,t.jsx)(i.code,{children:"libwebp"})," stuff to really confirm the findings here. After some sleuthing the ",(0,t.jsx)(i.code,{children:"libpng"})," source repository has a ",(0,t.jsx)(i.a,{href:"https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c",children:"pngtopng.c"})," file we can compile to use the system libpng library."]}),"\n",(0,t.jsxs)(i.p,{children:["Changing the header from ",(0,t.jsx)(i.code,{children:'#include "../../png.h"'})," to ",(0,t.jsx)(i.code,{children:"#include"})," then running ",(0,t.jsx)(i.code,{children:"gcc -Ofast pngtopng.c -lpng16 -o pngtopng"})," to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: ",(0,t.jsx)(i.code,{children:"./pngtopng ~/PNG_Test.png /dev/null"})," for our benchmark."]}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Library"}),(0,t.jsx)(i.th,{children:"Time"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"zlib (canonical)"}),(0,t.jsx)(i.td,{children:"1.464 s"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"zlib-ng (compat)"}),(0,t.jsx)(i.td,{children:"896.6 ms"})]})]})]}),"\n",(0,t.jsxs)(i.p,{children:["Well. This is pretty much inline with our flawed ",(0,t.jsx)(i.code,{children:"dwebp"})," benchmark from earlier. Swapping out zlib almost halves ",(0,t.jsx)(i.code,{children:"libpng"})," decoding time."]}),"\n",(0,t.jsx)(i.h2,{id:"squeezing-more-from-zlib-ng",children:"Squeezing more from zlib-ng"}),"\n",(0,t.jsxs)(i.p,{children:["However, we're not done yet. We still have our compiler optimizations available to us to squeeze more performance from ",(0,t.jsx)(i.code,{children:"zlib-ng"}),"."]}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Optimization"}),(0,t.jsx)(i.th,{children:"Decode"}),(0,t.jsx)(i.th,{children:"Size"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Baseline"}),(0,t.jsx)(i.td,{children:"896.6 ms"}),(0,t.jsx)(i.td,{children:"141.00 KB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed"}),(0,t.jsx)(i.td,{children:"883.6 ms"}),(0,t.jsx)(i.td,{children:"182.00 KB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"LTO"}),(0,t.jsx)(i.td,{children:"892.7 ms"}),(0,t.jsx)(i.td,{children:"133.00 KB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"PGO"}),(0,t.jsx)(i.td,{children:"894.6 ms"}),(0,t.jsx)(i.td,{children:"141.00 KB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"x86-64-v3"}),(0,t.jsx)(i.td,{children:"892.5 ms"}),(0,t.jsx)(i.td,{children:"295.00 KB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO"}),(0,t.jsx)(i.td,{children:"882.6 ms"}),(0,t.jsx)(i.td,{children:"170.00 KB"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Speed + LTO + PGO + x86-64-v3"}),(0,t.jsx)(i.td,{children:"882.5 ms"}),(0,t.jsx)(i.td,{children:"250.00 KB"})]})]})]}),"\n",(0,t.jsx)(i.p,{children:"It looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it's only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it's so performant right out of the gate."}),"\n",(0,t.jsx)(i.h1,{id:"final-words",children:"Final Words"}),"\n",(0,t.jsx)(i.p,{children:"We've shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it'll be good material for a future blog post."}),"\n",(0,t.jsx)(i.p,{children:"Some other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind."}),"\n",(0,t.jsxs)(i.p,{children:["Regardless, I hope the story of how ",(0,t.jsx)(i.code,{children:"libwebp"})," was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."]})]})}function h(e={}){let{wrapper:i}={...(0,l.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},53065:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/perf_report_cwebp_png-baafb78e8e4527d10a5a1ded232c2bde.webp"},56495:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/perf_report_dwebp_png-c0f9529294b3efe6743a980866abdf15.webp"},48283:function(e,i,n){n.d(i,{Z:function(){return s}});let s=n.p+"assets/images/perf_report_dwebp_yuv-36ad3f6052746d5ea55acce6cbe72b6f.webp"},50065:function(e,i,n){n.d(i,{Z:function(){return a},a:function(){return r}});var s=n(67294);let t={},l=s.createContext(t);function r(e){let i=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}},56021:function(e){e.exports=JSON.parse('{"permalink":"/blog/solus-optimizing-packages","source":"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md","title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","date":"2024-02-09T00:00:00.000Z","tags":[{"inline":true,"label":"pgo","permalink":"/blog/tags/pgo"},{"inline":true,"label":"lto","permalink":"/blog/tags/lto"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"},{"inline":true,"label":"packaging","permalink":"/blog/tags/packaging"},{"inline":true,"label":"optimization","permalink":"/blog/tags/optimization"},{"inline":true,"label":"3","permalink":"/blog/tags/3"},{"inline":true,"label":"clang","permalink":"/blog/tags/clang"},{"inline":true,"label":"gnu","permalink":"/blog/tags/gnu"},{"inline":true,"label":"llvm","permalink":"/blog/tags/llvm"},{"inline":true,"label":"glibc","permalink":"/blog/tags/glibc"},{"inline":true,"label":"hwcaps","permalink":"/blog/tags/hwcaps"},{"inline":true,"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3"}],"readingTime":22.32,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","slug":"solus-optimizing-packages","authors":"joey","tags":["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Clean, clean, clean!","permalink":"/blog/clean-clean-clean"},"nextItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"}}')}}]); \ No newline at end of file diff --git a/assets/js/72054e31.855d44cc.js b/assets/js/72054e31.855d44cc.js deleted file mode 100644 index e9c58be36..000000000 --- a/assets/js/72054e31.855d44cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7135],{83888:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const l={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},r="Cual es la causa",a={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Clean, clean, clean!",permalink:"/blog/clean-clean-clean"},nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},o={authorsImageUrls:[void 0]},d=[{value:"Let's Start Obvious",id:"lets-start-obvious",level:2},{value:"PGO is great, except, when it isn't.",id:"pgo-is-great-except-when-it-isnt",level:2},{value:"256 Vector Units go brrrrrr...",id:"256-vector-units-go-brrrrrr",level:2},{value:"Something about perf
to the rescue",id:"something-about-perf-to-the-rescue",level:2},{value:"Choosing Wisely",id:"choosing-wisely",level:2},{value:"Adjusting the Benchmark",id:"adjusting-the-benchmark",level:2},{value:"Partial Profiling",id:"partial-profiling",level:3},{value:"I Zee a Purty lil' Package",id:"i-zee-a-purty-lil-package",level:2},{value:"Squeezing more from zlib-ng",id:"squeezing-more-from-zlib-ng",level:2}];function c(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]}),"\n",(0,s.jsx)(i.p,{children:"Linux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements."}),"\n",(0,s.jsxs)(i.p,{children:["Part of the problem is, a packager's time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for ",(0,s.jsx)(i.em,{children:"all"})," packages, such as enabling ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Interprocedural_optimization",children:"LTO"})," by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Profile-guided_optimization",children:"PGO"})," without too much faffing around on a ",(0,s.jsx)(i.em,{children:"targeted"})," package."]}),"\n",(0,s.jsx)(i.p,{children:"The benefits of such an approach are:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Can target the performance of a specific package to benefit ",(0,s.jsx)(i.em,{children:"all"})," users"]}),"\n",(0,s.jsx)(i.li,{children:"A compiler optimization may improve one package, but may not apply globally to all packages."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The downsides are such:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Requires additional packager time to benchmark and experiment with different optimization strategies."}),"\n",(0,s.jsxs)(i.li,{children:["Requires the packager to ",(0,s.jsx)(i.em,{children:"choose"})," and invest time into improving performance of a package."]}),"\n",(0,s.jsx)(i.li,{children:"Requires the packager to find an appropriate benchmark to test the package against."}),"\n",(0,s.jsx)(i.li,{children:"Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck."}),"\n"]}),"\n",(0,s.jsx)(i.h1,{id:"optimization-techniques-available",children:"Optimization Techniques Available"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["speed:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["As simple as it gets really, build a package with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags deemed worthy to be included as part of the ",(0,s.jsx)(i.code,{children:"speed"})," flags. The main drawback of this is that ",(0,s.jsx)(i.code,{children:"-O3"})," is not guaranteed to produce faster results than building with ",(0,s.jsx)(i.code,{children:"-O2"})," and typically will produce bigger binaries. The days of ",(0,s.jsx)(i.code,{children:"-O3"})," outright breaking your program in weird unexpected ways is largely behind us."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["LTO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Compared to some other distributions ",(0,s.jsx)(i.code,{children:"-flto"})," is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Clang:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Not strictly an optimization, but, building a package with ",(0,s.jsx)(i.code,{children:"clang"})," instead of ",(0,s.jsx)(i.code,{children:"gcc"})," and ",(0,s.jsx)(i.code,{children:"ld.ldd"})," to link instead of the infamous ",(0,s.jsx)(i.code,{children:"ld.bfd"})," may provide a faster package out of the box. You'll have to be careful of subtle ABI differences if building with ",(0,s.jsx)(i.code,{children:"clang"}),". If in doubt, and, ",(0,s.jsx)(i.code,{children:"clang"})," is the obvious choice, perform safety rebuilds on all reverse dependencies of the package."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["PGO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["BOLT:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['Binary optimization and layout tool. You can think of this as "post-link PGO" where you instrument a binary with ',(0,s.jsx)(i.code,{children:"bolt"})," to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Regardless, that's enough word spaghetti, let's look at the process to actually optimize a package."}),"\n",(0,s.jsx)(i.h1,{id:"optimizing-a-package",children:"Optimizing a Package"}),"\n",(0,s.jsxs)(i.p,{children:["Right, to begin with we'll have to start on choosing an actual package to benchmark and optimize. I've heard the ",(0,s.jsx)(i.code,{children:".webp"})," file format is becoming increasingly common on the web, slowly replacing ",(0,s.jsx)(i.code,{children:".png"})," and ",(0,s.jsx)(i.code,{children:".jpg"})," file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for ",(0,s.jsx)(i.code,{children:".webp"})," files would benefit any user using a web browser casually browsing the web."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's have a look at the ",(0,s.jsx)(i.code,{children:"package.yml"})," build recipe for ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : libwebp\nversion : 1.3.2\nrelease : 25\nsource :\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\nhomepage : https://developers.google.com/speed/webp/\nlicense : BSD-3-Clause\ncomponent : multimedia.codecs\nsummary : A new image format for the web\ndescription: |\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\nemul32 : yes\npatterns :\n - devel : /usr/share/man\nbuilddeps :\n - pkgconfig32(glu)\n - pkgconfig32(glut)\n - pkgconfig32(libpng)\n - pkgconfig32(libtiff-4)\n - pkgconfig32(libturbojpeg)\n - pkgconfig32(zlib)\n - giflib-devel\nsetup : |\n %reconfigure --disable-static --enable-everything\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, looks to be a quite simple affair. A simple configure, make, make install as well as ",(0,s.jsx)(i.code,{children:"emul32"})," being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We'll begin by looking at the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file which lists all the files produced from the ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe as well as some metadata."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-xml",children:'libwebp \nA new image format for the web \nWebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\n \nmultimedia.codecs \n\n /usr/bin/cwebp \n/usr/bin/dwebp \n/usr/bin/gif2webp \n/usr/bin/img2webp \n/usr/bin/vwebp \n/usr/bin/webpinfo \n/usr/bin/webpmux \n'})}),"\n",(0,s.jsxs)(i.p,{children:["Perfect, we have ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," binaries available in the main package, which from a guess can be used to decode and encode ",(0,s.jsx)(i.code,{children:".webp"})," files. Let's try it out."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ dwebp -h\nUsage: dwebp in_file [options] [-o out_file]\n\nDecodes the WebP image file to PNG format [Default].\nNote: Animated WebP files are not supported.\n$ cwebp -h\nUsage:\n\n cwebp [options] -q quality input.png -o output.webp\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Awesome, these binaries do exactly what we need to benchmark ",(0,s.jsx)(i.code,{children:"libwebp"}),", but, we are also indirectly testing ",(0,s.jsx)(i.code,{children:"libpng"})," as well for this benchmark, we'll have to keep an eye out for that."]}),"\n",(0,s.jsxs)(i.p,{children:["One extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don't link against their own libraries and end up being self-contained. Run ",(0,s.jsx)(i.code,{children:"ldd"})," to verify."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n\tlinux-vdso.so.1 (0x00007ffed8733000)\n\tlibwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\n\tlibwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\n\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\n\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\n\tlibsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\n\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\n\tlibz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\n\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Awesome in this case both ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," link against ",(0,s.jsx)(i.code,{children:"libwebp.so"})," so we can be confident that any performance improvements will be applicable to all packages in the repository linking against ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's grab a couple of ",(0,s.jsx)(i.code,{children:".webp"})," files from ",(0,s.jsx)(i.a,{href:"https://developers.google.com/speed/webp/gallery1",children:"here"})," to test with. We'll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more."]}),"\n",(0,s.jsxs)(i.p,{children:["Now having done the prep work, lets actually benchmark the damn thing using ",(0,s.jsx)(i.code,{children:"hyperfine"})," for the time being."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"There, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss."}),"\n",(0,s.jsx)(i.h2,{id:"lets-start-obvious",children:"Let's Start Obvious"}),"\n",(0,s.jsxs)(i.p,{children:["Let's start basic, enabling the ",(0,s.jsx)(i.code,{children:"speed"})," optimization which basically builds with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags that are deemed to be worthy to be part of the ",(0,s.jsx)(i.code,{children:"speed"})," group. As well as, the ",(0,s.jsx)(i.code,{children:"lto"})," optimization which builds with link time optimization allowing for inter-procedural optimizations to take place."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"optimize:\n - speed\n - lto\n"})}),"\n",(0,s.jsx)(i.p,{children:"Moment of truth..."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Well okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore..."}),"\n",(0,s.jsx)(i.h2,{id:"pgo-is-great-except-when-it-isnt",children:"PGO is great, except, when it isn't."}),"\n",(0,s.jsxs)(i.p,{children:["Next step is to explore PGO (Profile Guided Optimization). For our ",(0,s.jsx)(i.code,{children:"libwebp"})," package, looks like we already hit a bit of a snafu. There's no test suite included in the tarball! That's a bit of a disappointment as a test suite such as ",(0,s.jsx)(i.code,{children:"make check"})," is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," binaries as a suitable workload for PGO."]}),"\n",(0,s.jsx)(i.p,{children:"Luckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"profile : |\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\n ./examples/cwebp test_png.png -o /dev/null\n"})}),"\n",(0,s.jsx)(i.p,{children:"After specifying that, 6 builds will now be performed instead of 2:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["emul32:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,s.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,s.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["x86_64:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,s.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,s.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"For this relatively small package it increases the build time from 1m1.672s to 1m42.199s"}),"\n",(0,s.jsx)(i.p,{children:"The next moment of truth..."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\n'})}),"\n",(0,s.jsxs)(i.p,{children:["Well... That's interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of ",(0,s.jsx)(i.code,{children:"profile count data file not found [-Wmissing-profile]"})," warning messages during the optimized build indicating to us our profiling workload isn't comprehensive enough and doesn't cover enough code paths. The lack of a handy ",(0,s.jsx)(i.code,{children:"make check"})," that could be used as a profiling workload is really hurting us here. For now, let's put a pin in exploring PGO, it isn't a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us."]}),"\n",(0,s.jsx)(i.h2,{id:"256-vector-units-go-brrrrrr",children:"256 Vector Units go brrrrrr..."}),"\n",(0,s.jsxs)(i.p,{children:["The next obvious step is to explore ",(0,s.jsx)(i.code,{children:"glibc"})," hardware capabilities. For those unaware both ",(0,s.jsx)(i.code,{children:"clang"})," and ",(0,s.jsx)(i.code,{children:"gnu"})," compilers provide ",(0,s.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," and ",(0,s.jsx)(i.code,{children:"x86_64-v4"})," micro-architecture build options on top of the baseline of ",(0,s.jsx)(i.code,{children:"x86_64"}),". These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, ",(0,s.jsx)(i.code,{children:"-sse4.2"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,s.jsx)(i.code,{children:"-avx2"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v3"}),", and ",(0,s.jsx)(i.code,{children:"-avx512"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v4"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Whilst that's great 'n all, if a program is built with ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," and gains an additional ~10% uplift in performance, it's no good if a ",(0,s.jsx)(i.code,{children:"x86_64-v2"})," compatible cpu can't run it. Luckily the ",(0,s.jsx)(i.code,{children:"glibc"})," loader that's found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they're installed and supported."]}),"\n",(0,s.jsxs)(i.p,{children:["On top of all that, the ",(0,s.jsx)(i.code,{children:"package.yml"})," format provides an incredibly simple way of providing ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," built libraries by enabling the ",(0,s.jsx)(i.code,{children:"avx2 : yes"})," flag."]}),"\n",(0,s.jsxs)(i.p,{children:["With ",(0,s.jsx)(i.code,{children:"avx2 : yes"})," enabled in the ",(0,s.jsx)(i.code,{children:"libwebp"})," package three builds are performed."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"emul32"}),"\n",(0,s.jsx)(i.li,{children:"x86_64-v3"}),"\n",(0,s.jsx)(i.li,{children:"x86_64"}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["We now see these additional files in the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-diff",children:'+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3 \n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13 \n'})}),"\n",(0,s.jsxs)(i.p,{children:["Let's rerun ",(0,s.jsx)(i.code,{children:"lld"})," on ",(0,s.jsx)(i.code,{children:"dwebp"})," after installing the new package and..."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n\tlinux-vdso.so.1 (0x00007ffeab5b1000)\n\tlibwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\n\tlibwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\n\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\n\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\n\tlibsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\n\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\n\tlibz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\n\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["We can crucially see that ",(0,s.jsx)(i.code,{children:"dwebp"})," is now loading the ",(0,s.jsx)(i.code,{children:"x86-64-v3"})," built ",(0,s.jsx)(i.code,{children:"libwebp.so"})," lib from ",(0,s.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8"}),", success! Let's what our performance looks like."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Let's recap so far:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Encode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"202.2 ms"}),(0,s.jsx)(i.td,{children:"1.399 s"}),(0,s.jsx)(i.td,{children:"1.33 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO"}),(0,s.jsx)(i.td,{children:"200.0 ms"}),(0,s.jsx)(i.td,{children:"1.353 s"}),(0,s.jsx)(i.td,{children:"1.73 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + PGO"}),(0,s.jsxs)(i.td,{children:["204.1 ms ","\u26a0\ufe0f"]}),(0,s.jsx)(i.td,{children:"1.349 s"}),(0,s.jsx)(i.td,{children:"1.07 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86_64-v3"}),(0,s.jsx)(i.td,{children:"198.2 ms"}),(0,s.jsx)(i.td,{children:"1.313 s"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,s.jsxs)(i.p,{children:["Whilst we're still getting an additional speedup it isn't really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in ",(0,s.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/"})," just ain't worth it. This hints that either the compiler optimizations aren't really effective here or we're being bottle-necked by something else."]}),"\n",(0,s.jsxs)(i.p,{children:["So far, we've been benchmarking fairly simply using ",(0,s.jsx)(i.code,{children:"hyperfine"}),", let's swap that out for ",(0,s.jsx)(i.code,{children:"perf"})," so we can get a callgraph."]}),"\n",(0,s.jsxs)(i.h2,{id:"something-about-perf-to-the-rescue",children:["Something about ",(0,s.jsx)(i.code,{children:"perf"})," to the rescue"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null"})}),"\n",(0,s.jsxs)(i.p,{children:["Let's look at ",(0,s.jsx)(i.code,{children:"dwebp"})," first with ",(0,s.jsx)(i.code,{children:"perf report -i dwebp.data"}),"."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report dwebp",src:n(58916).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Well god damn, literally all of our time is being spent in ",(0,s.jsx)(i.code,{children:"libz.so"})," it's no wonder our compiler optimizations were hardly improving performance."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's also look at the ",(0,s.jsx)(i.code,{children:"cwebp"})," report, we've generally been getting better results from it."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report cwebp",src:n(85370).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, much more of our time is being spent in ",(0,s.jsx)(i.code,{children:"libwebp.so"})," itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in ",(0,s.jsx)(i.code,{children:"libz"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"choosing-wisely",children:"Choosing Wisely"}),"\n",(0,s.jsxs)(i.p,{children:["You may remember early on, when I said we are also indirectly testing ",(0,s.jsx)(i.code,{children:"libpng"}),". Well... after some more digging, that's exactly what's happening here. Re-running the ",(0,s.jsx)(i.code,{children:"dwebp"})," binary it says this"]}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"Decodes the WebP image file to PNG format"}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Turns out, it's more accurate to say we are ",(0,s.jsx)(i.em,{children:"directly"})," testing ",(0,s.jsx)(i.code,{children:"libpng"})," and by extension ",(0,s.jsx)(i.code,{children:"zlib"}),". It isn't ",(0,s.jsx)(i.code,{children:"libwebp"})," that's spending all of its time in ",(0,s.jsx)(i.code,{children:"libz.so"}),", it's ",(0,s.jsx)(i.code,{children:"libpng"}),"! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they're doing."]}),"\n",(0,s.jsx)(i.p,{children:"However, the good news about this little snafu is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dwebp"})," can be used to translate to another image format such as ",(0,s.jsx)(i.code,{children:".yuv"})," that'll more accurately remove the bottleneck from ",(0,s.jsx)(i.code,{children:"libz.so"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["We now know that ",(0,s.jsx)(i.code,{children:"libpng"})," has a huge bottleneck in ",(0,s.jsx)(i.code,{children:"libz.so"})," and speeding up ",(0,s.jsx)(i.code,{children:"zlib"})," ",(0,s.jsx)(i.em,{children:"should"})," dramatically speed up ",(0,s.jsx)(i.code,{children:"libpng"})," performance."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"adjusting-the-benchmark",children:"Adjusting the Benchmark"}),"\n",(0,s.jsxs)(i.p,{children:["After reverting the ",(0,s.jsx)(i.code,{children:"libwebp"})," package to the baseline let's use our adjusted decoding benchmark."]}),"\n",(0,s.jsxs)(i.p,{children:["We'll now use ",(0,s.jsx)(i.code,{children:"dwebp ~/3.webp -yuv -o /dev/null"})," for a decoding test, let's run that with ",(0,s.jsx)(i.code,{children:"perf"})," to ensure we're exclusively testing ",(0,s.jsx)(i.code,{children:"libwebp.so"})," here."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report dwebp to yuv",src:n(29503).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay that's awesome, no ",(0,s.jsx)(i.code,{children:"libpng.so"})," or ",(0,s.jsx)(i.code,{children:"libz.so"})," to mess with our tests!"]}),"\n",(0,s.jsx)(i.p,{children:"Let's reapply our optimizations, keeping those which apply an uplift"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"14.7 ms"}),(0,s.jsx)(i.td,{children:"1.33 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed"}),(0,s.jsx)(i.td,{children:"14.5 ms"}),(0,s.jsx)(i.td,{children:"1.56 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"LTO"}),(0,s.jsx)(i.td,{children:"14.6 ms"}),(0,s.jsx)(i.td,{children:"1.40 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"PGO"}),(0,s.jsxs)(i.td,{children:["18.0 ms ","\u26a0\ufe0f"]}),(0,s.jsx)(i.td,{children:"1.07 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.7 ms"}),(0,s.jsx)(i.td,{children:"2.35 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"Okay, this is great, whilst we aren't getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we're getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size."}),"\n",(0,s.jsx)(i.h3,{id:"partial-profiling",children:"Partial Profiling"}),"\n",(0,s.jsxs)(i.p,{children:["Once again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn't very comprehensive due to the bunch of ",(0,s.jsx)(i.code,{children:"-Wmissing-profile"})," warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that's part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn't matter is small. However, what happens when you can't craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that ",(0,s.jsx)(i.code,{children:"-fprofile-partial-training"}),". GCC docs state that:"]}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code."}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Okay, let's try it out, all we need to do is specify in our ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:'environment: |\n if [[ -n ${PGO_USE_BUILD} ]]; then\n export CFLAGS="${CFLAGS} -fprofile-partial-training"\n export CXXFLAGS="${CXXFLAGS} -fprofile-partial-training"\n fi\n'})}),"\n",(0,s.jsx)(i.p,{children:"And the results:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3 + Partial PGO"}),(0,s.jsx)(i.td,{children:"12.5 ms"}),(0,s.jsx)(i.td,{children:"3.13 MB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"Well, it was worth a try. This highlights how useless PGO can be when you don't or can't provide it a good workload. Interestingly, we don't get the size bloat that was promised, in fact, the opposite."}),"\n",(0,s.jsx)(i.h1,{id:"final-libwebp-results",children:"Final libwebp Results"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Benchmark"}),(0,s.jsx)(i.th,{children:"Time Before"}),(0,s.jsx)(i.th,{children:"Time After"}),(0,s.jsx)(i.th,{children:"Size Before"}),(0,s.jsx)(i.th,{children:"Size After"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:'"dwebp ~/3.webp -yuv -o /dev/null"'}),(0,s.jsx)(i.td,{children:"14.5 ms"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"1.33 MB"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:'"cwebp ~/PNG_Test.png -o /dev/null"'}),(0,s.jsx)(i.td,{children:"1.399 s"}),(0,s.jsx)(i.td,{children:"1.313 s"}),(0,s.jsx)(i.td,{children:"--"}),(0,s.jsx)(i.td,{children:"--"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"In the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It's possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level."}),"\n",(0,s.jsx)(i.h1,{id:"next-generation-side-quest",children:'"Next-Generation" Side Quest'}),"\n",(0,s.jsxs)(i.p,{children:["Now, you probably remember earlier due to our unrepresentative benchmark we found out that ",(0,s.jsx)(i.code,{children:"libpng"})," is getting highly bottlenecked by ",(0,s.jsx)(i.code,{children:"libz.so"}),". This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using."]}),"\n",(0,s.jsxs)(i.p,{children:["Zlib is widely employed throughout the ecosystem and, as such you'd think it would be highly-optimized for performance. However, that isn't really the case. Zlib is written in an old-fashioned way of C and tries to be ",(0,s.jsx)(i.em,{children:"extremely"})," portable; supporting dozens of systems that have fallen out of common use. As such, it's hard to apply architecture specific optimizations that wouldn't break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success."]}),"\n",(0,s.jsxs)(i.p,{children:["However, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to ",(0,s.jsx)(i.a,{href:"https://github.com/zlib-ng/zlib-ng/",children:"zlib-ng"}),". When built in compatible mode, it promises to be API compatible with canonical zlib and ",(0,s.jsx)(i.em,{children:"tries"})," to be as ABI compatible as possible."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's just go for it, replacing Solus' ",(0,s.jsx)(i.code,{children:"zlib"})," package with zlib-ng built in compatible mode. It's a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?"]}),"\n",(0,s.jsx)(i.h2,{id:"i-zee-a-purty-lil-package",children:"I Zee a Purty lil' Package"}),"\n",(0,s.jsxs)(i.p,{children:["Well that was simple. Here's what our zlib-ng ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe looks like."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : zlib\nversion : 2.1.5\nrelease : 28\nsource :\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\nhomepage : https://github.com/zlib-ng/zlib-ng\nlicense : ZLIB\ncomponent : system.base\nsummary : zlib replacement with optimizations for next generation systems.\ndescription:\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\ndevel : yes\nemul32 : yes\nsetup : |\n %cmake_ninja \\\n -DZLIB_COMPAT=ON \\\n -DWITH_GTEST=OFF \\\n -DBUILD_SHARED_LIBS=ON \\\n -DINSTALL_LIB_DIR=%libdir%\nbuild : |\n %ninja_build\ninstall : |\n %ninja_install\ncheck : |\n %ninja_check\n"})}),"\n",(0,s.jsxs)(i.p,{children:["After building it, all the files seem to be in the right place and the test suite is passing. Let's just install it overwriting our canonical ",(0,s.jsx)(i.code,{children:"zlib"})," package and hope our system doesn't die... I think the word is YOLO."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\n...\n$ $ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Well, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time."}),"\n",(0,s.jsxs)(i.p,{children:["We need to find a more contained ",(0,s.jsx)(i.code,{children:"libpng"})," benchmark here that removes the ",(0,s.jsx)(i.code,{children:"libwebp"})," stuff to really confirm the findings here. After some sleuthing the ",(0,s.jsx)(i.code,{children:"libpng"})," source repository has a ",(0,s.jsx)(i.a,{href:"https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c",children:"pngtopng.c"})," file we can compile to use the system libpng library."]}),"\n",(0,s.jsxs)(i.p,{children:["Changing the header from ",(0,s.jsx)(i.code,{children:'#include "../../png.h"'})," to ",(0,s.jsx)(i.code,{children:"#include"})," then running ",(0,s.jsx)(i.code,{children:"gcc -Ofast pngtopng.c -lpng16 -o pngtopng"})," to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: ",(0,s.jsx)(i.code,{children:"./pngtopng ~/PNG_Test.png /dev/null"})," for our benchmark."]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Library"}),(0,s.jsx)(i.th,{children:"Time"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"zlib (canonical)"}),(0,s.jsx)(i.td,{children:"1.464 s"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"zlib-ng (compat)"}),(0,s.jsx)(i.td,{children:"896.6 ms"})]})]})]}),"\n",(0,s.jsxs)(i.p,{children:["Well. This is pretty much inline with our flawed ",(0,s.jsx)(i.code,{children:"dwebp"})," benchmark from earlier. Swapping out zlib almost halves ",(0,s.jsx)(i.code,{children:"libpng"})," decoding time."]}),"\n",(0,s.jsx)(i.h2,{id:"squeezing-more-from-zlib-ng",children:"Squeezing more from zlib-ng"}),"\n",(0,s.jsxs)(i.p,{children:["However, we're not done yet. We still have our compiler optimizations available to us to squeeze more performance from ",(0,s.jsx)(i.code,{children:"zlib-ng"}),"."]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"896.6 ms"}),(0,s.jsx)(i.td,{children:"141.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed"}),(0,s.jsx)(i.td,{children:"883.6 ms"}),(0,s.jsx)(i.td,{children:"182.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"LTO"}),(0,s.jsx)(i.td,{children:"892.7 ms"}),(0,s.jsx)(i.td,{children:"133.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"PGO"}),(0,s.jsx)(i.td,{children:"894.6 ms"}),(0,s.jsx)(i.td,{children:"141.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"x86-64-v3"}),(0,s.jsx)(i.td,{children:"892.5 ms"}),(0,s.jsx)(i.td,{children:"295.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO"}),(0,s.jsx)(i.td,{children:"882.6 ms"}),(0,s.jsx)(i.td,{children:"170.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + PGO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"882.5 ms"}),(0,s.jsx)(i.td,{children:"250.00 KB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"It looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it's only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it's so performant right out of the gate."}),"\n",(0,s.jsx)(i.h1,{id:"final-words",children:"Final Words"}),"\n",(0,s.jsx)(i.p,{children:"We've shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it'll be good material for a future blog post."}),"\n",(0,s.jsx)(i.p,{children:"Some other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind."}),"\n",(0,s.jsxs)(i.p,{children:["Regardless, I hope the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."]})]})}function h(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},85370:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_cwebp_png-baafb78e8e4527d10a5a1ded232c2bde.webp"},58916:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_dwebp_png-c0f9529294b3efe6743a980866abdf15.webp"},29503:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_dwebp_yuv-36ad3f6052746d5ea55acce6cbe72b6f.webp"},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72f2f84e.26590b14.js b/assets/js/72f2f84e.26590b14.js new file mode 100644 index 000000000..bd6a5d384 --- /dev/null +++ b/assets/js/72f2f84e.26590b14.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["698"],{57017:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Utilities","slug":"/category/utilities","permalink":"/docs/category/utilities","sidebar":"userSidebar","navigation":{"previous":{"title":"Snap","permalink":"/docs/user/software/third-party/snap"},"next":{"title":"KSysGuard","permalink":"/docs/user/software/utilities/ksysguard"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/72f2f84e.3511f922.js b/assets/js/72f2f84e.3511f922.js deleted file mode 100644 index efbf02250..000000000 --- a/assets/js/72f2f84e.3511f922.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[794],{23343:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Utilities","slug":"/category/utilities","permalink":"/docs/category/utilities","sidebar":"userSidebar","navigation":{"previous":{"title":"Snap","permalink":"/docs/user/software/third-party/snap"},"next":{"title":"KSysGuard","permalink":"/docs/user/software/utilities/ksysguard"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/74470af4.017d0ea6.js b/assets/js/74470af4.017d0ea6.js deleted file mode 100644 index 6f0f90ed8..000000000 --- a/assets/js/74470af4.017d0ea6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1896],{5893:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var s=r(85893),n=r(11151);const o={title:"VirtualBox",summary:"Quick start guide for VirtualBox on Solus"},i="VirtualBox",l={id:"user/software/virtualization/virtualbox",title:"VirtualBox",description:"VirtualBox is an x86 and x86_64 virtualization software package developed by Oracle.",source:"@site/docs/user/software/virtualization/virtualbox.md",sourceDirName:"user/software/virtualization",slug:"/user/software/virtualization/virtualbox",permalink:"/docs/user/software/virtualization/virtualbox",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/virtualization/virtualbox.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"VirtualBox",summary:"Quick start guide for VirtualBox on Solus"},sidebar:"userSidebar",previous:{title:"Virtualization",permalink:"/docs/category/virtualization"},next:{title:"Web",permalink:"/docs/category/web"}},a={},d=[{value:"Before you start",id:"before-you-start",level:2},{value:"Remove prior installation",id:"remove-prior-installation",level:3},{value:"Update your system",id:"update-your-system",level:3},{value:"Determine which kernel you are using",id:"determine-which-kernel-you-are-using",level:3},{value:"Solus as host",id:"solus-as-host",level:2},{value:"Solus as guest",id:"solus-as-guest",level:2},{value:"Extra configuration",id:"extra-configuration",level:2},{value:"USB controller",id:"usb-controller",level:4},{value:"Shared folders",id:"shared-folders",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"virtualbox",children:"VirtualBox"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://www.virtualbox.org/",children:"VirtualBox"})," is an x86 and x86_64 virtualization software package developed by Oracle."]}),"\n",(0,s.jsx)(t.h2,{id:"before-you-start",children:"Before you start"}),"\n",(0,s.jsxs)(t.p,{children:["This section applies to new installations for both ",(0,s.jsx)(t.strong,{children:"Host"})," and ",(0,s.jsx)(t.strong,{children:"Guest"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"remove-prior-installation",children:"Remove prior installation"}),"\n",(0,s.jsxs)(t.p,{children:["It is important to uninstall any version of VirtualBox (or VirtualBox Guest Additions) that ",(0,s.jsx)(t.strong,{children:"was not"})," installed from the Software Center or there will be conflicts that will prevent the application to work.\nThis can usually be done by executing the following command from a terminal:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo /opt/VirtualBox/uninstall.sh\n"})}),"\n",(0,s.jsx)(t.h3,{id:"update-your-system",children:"Update your system"}),"\n",(0,s.jsx)(t.p,{children:"Ensure your system is up-to-date. This is very important because VirtualBox installs some kernel modules and the application will not work if your kernel is outdated."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,s.jsx)(t.h3,{id:"determine-which-kernel-you-are-using",children:"Determine which kernel you are using"}),"\n",(0,s.jsxs)(t.p,{children:["Solus support both a ",(0,s.jsx)(t.code,{children:"current"})," and ",(0,s.jsx)(t.code,{children:"lts"})," kernel. It is important to install the version that corresponds to your kernel."]}),"\n",(0,s.jsx)(t.p,{children:"If you aren't sure which kernel you are running, run the following in terminal:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,s.jsxs)(t.p,{children:["You will either have a ",(0,s.jsx)(t.code,{children:".current"})," or ",(0,s.jsx)(t.code,{children:".lts"})," suffix. Examples: ",(0,s.jsx)(t.code,{children:"5.13.1-187.current"})," or ",(0,s.jsx)(t.code,{children:"4.14.237-175.lts"})]}),"\n",(0,s.jsx)(t.h2,{id:"solus-as-host",children:"Solus as host"}),"\n",(0,s.jsx)(t.p,{children:"VirtualBox is available in the Software Center, select the package that matches your kernel."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"virtualbox"}),(0,s.jsx)(t.th,{children:"virtualbox-current"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,s.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,s.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,s.jsx)(t.strong,{children:"linux-current"})," kernel"]})]})})]}),"\n",(0,s.jsxs)(t.p,{children:["You ",(0,s.jsx)(t.strong,{children:"must"})," reboot your computer before running VirtualBox for the first time."]}),"\n",(0,s.jsx)(t.h2,{id:"solus-as-guest",children:"Solus as guest"}),"\n",(0,s.jsx)(t.p,{children:"VirtualBox Guest Additions are available in the Software Center, select the package that matches kernel version on the Solus virtual machine."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"virtualbox-guest"}),(0,s.jsx)(t.th,{children:"virtualbox-guest-common"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["VirtualBox guest modules for the ",(0,s.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,s.jsxs)(t.td,{children:["Install this package if the ",(0,s.jsx)(t.strong,{children:"linux-current"})," kernel is used"]})]})})]}),"\n",(0,s.jsxs)(t.p,{children:["You ",(0,s.jsx)(t.strong,{children:"must"})," reboot your virtual machine to load the newly installed modules"]}),"\n",(0,s.jsx)(t.h2,{id:"extra-configuration",children:"Extra configuration"}),"\n",(0,s.jsx)(t.h4,{id:"usb-controller",children:"USB controller"}),"\n",(0,s.jsxs)(t.p,{children:["If you want to use USB 2.0 or 3.0 in your virtual machine (and your hardware supports it), you have to install the ",(0,s.jsx)(t.a,{href:"https://www.virtualbox.org/manual/ch01.html#intro-installing",children:"extension pack"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Note: Access to USB is granted by the user group ",(0,s.jsx)(t.code,{children:"vboxusers"})," on the ",(0,s.jsx)(t.strong,{children:"Host"})," operating system. You can add yourself to this group with the following command"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxusers\n"})}),"\n",(0,s.jsx)(t.h4,{id:"shared-folders",children:"Shared folders"}),"\n",(0,s.jsx)(t.p,{children:"Share folders let you access files from the host system from within a guest machine."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Note:"})," auto-mounted shared folders are mounted into the ",(0,s.jsx)(t.code,{children:"/media"})," directory, along with the prefix ",(0,s.jsx)(t.code,{children:"sf_"}),". For example, the shared folder ",(0,s.jsx)(t.code,{children:"myfiles"})," would be mounted to ",(0,s.jsx)(t.code,{children:"/media/sf_myfiles"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Access to the shared folders is only granted to the user group ",(0,s.jsx)(t.code,{children:"vboxsf"})," on the ",(0,s.jsx)(t.strong,{children:"Guest"})," operating system."]}),"\n",(0,s.jsx)(t.p,{children:"Execute these commands to set the permissions and add yourself to the group"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxsf\n"})}),"\n",(0,s.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"VBOX Kernel",src:r(74848).Z+"",width:"500",height:"336"})}),"\n",(0,s.jsxs)(t.p,{children:["The Error ",(0,s.jsx)(t.code,{children:"Kernel driver not installed (rc=-1908)"})," may occur if"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The computer was not restarted before launching VirtualBox for the first time"}),"\n",(0,s.jsx)(t.li,{children:"The computer is not booted on the latest kernel. Make sure to apply the updates from the Software Center and restart your machine."}),"\n",(0,s.jsx)(t.li,{children:"The wrong VirtualBox package was installed. Please check the instructions just above to install the correct package for your kernel."}),"\n",(0,s.jsx)(t.li,{children:"VirtualBox was manually installed and it conflicts with the version installed from the Solus Repository."}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},74848:(e,t,r)=>{r.d(t,{Z:()=>s});const s=r.p+"assets/images/vbox-kernel-85eb11034e02dafe61706f4d967580fe.png"},11151:(e,t,r)=>{r.d(t,{Z:()=>l,a:()=>i});var s=r(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/74470af4.5551336b.js b/assets/js/74470af4.5551336b.js new file mode 100644 index 000000000..938b58b58 --- /dev/null +++ b/assets/js/74470af4.5551336b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6327"],{86728:function(e,t,r){r.r(t),r.d(t,{metadata:()=>s,contentTitle:()=>i,default:()=>h,assets:()=>a,toc:()=>d,frontMatter:()=>l});var s=JSON.parse('{"id":"user/software/virtualization/virtualbox","title":"VirtualBox","description":"VirtualBox is an x86 and x86_64 virtualization software package developed by Oracle.","source":"@site/docs/user/software/virtualization/virtualbox.md","sourceDirName":"user/software/virtualization","slug":"/user/software/virtualization/virtualbox","permalink":"/docs/user/software/virtualization/virtualbox","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/virtualization/virtualbox.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"VirtualBox","summary":"Quick start guide for VirtualBox on Solus"},"sidebar":"userSidebar","previous":{"title":"Virtualization","permalink":"/docs/category/virtualization"},"next":{"title":"Web","permalink":"/docs/category/web"}}'),n=r("85893"),o=r("50065");let l={title:"VirtualBox",summary:"Quick start guide for VirtualBox on Solus"},i="VirtualBox",a={},d=[{value:"Before you start",id:"before-you-start",level:2},{value:"Remove prior installation",id:"remove-prior-installation",level:3},{value:"Update your system",id:"update-your-system",level:3},{value:"Determine which kernel you are using",id:"determine-which-kernel-you-are-using",level:3},{value:"Solus as host",id:"solus-as-host",level:2},{value:"Solus as guest",id:"solus-as-guest",level:2},{value:"Extra configuration",id:"extra-configuration",level:2},{value:"USB controller",id:"usb-controller",level:4},{value:"Shared folders",id:"shared-folders",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2}];function u(e){let t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"virtualbox",children:"VirtualBox"})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://www.virtualbox.org/",children:"VirtualBox"})," is an x86 and x86_64 virtualization software package developed by Oracle."]}),"\n",(0,n.jsx)(t.h2,{id:"before-you-start",children:"Before you start"}),"\n",(0,n.jsxs)(t.p,{children:["This section applies to new installations for both ",(0,n.jsx)(t.strong,{children:"Host"})," and ",(0,n.jsx)(t.strong,{children:"Guest"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"remove-prior-installation",children:"Remove prior installation"}),"\n",(0,n.jsxs)(t.p,{children:["It is important to uninstall any version of VirtualBox (or VirtualBox Guest Additions) that ",(0,n.jsx)(t.strong,{children:"was not"})," installed from the Software Center or there will be conflicts that will prevent the application to work.\nThis can usually be done by executing the following command from a terminal:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"sudo /opt/VirtualBox/uninstall.sh\n"})}),"\n",(0,n.jsx)(t.h3,{id:"update-your-system",children:"Update your system"}),"\n",(0,n.jsx)(t.p,{children:"Ensure your system is up-to-date. This is very important because VirtualBox installs some kernel modules and the application will not work if your kernel is outdated."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,n.jsx)(t.h3,{id:"determine-which-kernel-you-are-using",children:"Determine which kernel you are using"}),"\n",(0,n.jsxs)(t.p,{children:["Solus support both a ",(0,n.jsx)(t.code,{children:"current"})," and ",(0,n.jsx)(t.code,{children:"lts"})," kernel. It is important to install the version that corresponds to your kernel."]}),"\n",(0,n.jsx)(t.p,{children:"If you aren't sure which kernel you are running, run the following in terminal:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,n.jsxs)(t.p,{children:["You will either have a ",(0,n.jsx)(t.code,{children:".current"})," or ",(0,n.jsx)(t.code,{children:".lts"})," suffix. Examples: ",(0,n.jsx)(t.code,{children:"5.13.1-187.current"})," or ",(0,n.jsx)(t.code,{children:"4.14.237-175.lts"})]}),"\n",(0,n.jsx)(t.h2,{id:"solus-as-host",children:"Solus as host"}),"\n",(0,n.jsx)(t.p,{children:"VirtualBox is available in the Software Center, select the package that matches your kernel."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"virtualbox"}),(0,n.jsx)(t.th,{children:"virtualbox-current"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,n.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,n.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,n.jsx)(t.strong,{children:"linux-current"})," kernel"]})]})})]}),"\n",(0,n.jsxs)(t.p,{children:["You ",(0,n.jsx)(t.strong,{children:"must"})," reboot your computer before running VirtualBox for the first time."]}),"\n",(0,n.jsx)(t.h2,{id:"solus-as-guest",children:"Solus as guest"}),"\n",(0,n.jsx)(t.p,{children:"VirtualBox Guest Additions are available in the Software Center, select the package that matches kernel version on the Solus virtual machine."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"virtualbox-guest"}),(0,n.jsx)(t.th,{children:"virtualbox-guest-common"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["VirtualBox guest modules for the ",(0,n.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,n.jsxs)(t.td,{children:["Install this package if the ",(0,n.jsx)(t.strong,{children:"linux-current"})," kernel is used"]})]})})]}),"\n",(0,n.jsxs)(t.p,{children:["You ",(0,n.jsx)(t.strong,{children:"must"})," reboot your virtual machine to load the newly installed modules"]}),"\n",(0,n.jsx)(t.h2,{id:"extra-configuration",children:"Extra configuration"}),"\n",(0,n.jsx)(t.h4,{id:"usb-controller",children:"USB controller"}),"\n",(0,n.jsxs)(t.p,{children:["If you want to use USB 2.0 or 3.0 in your virtual machine (and your hardware supports it), you have to install the ",(0,n.jsx)(t.a,{href:"https://www.virtualbox.org/manual/ch01.html#intro-installing",children:"extension pack"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Note: Access to USB is granted by the user group ",(0,n.jsx)(t.code,{children:"vboxusers"})," on the ",(0,n.jsx)(t.strong,{children:"Host"})," operating system. You can add yourself to this group with the following command"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxusers\n"})}),"\n",(0,n.jsx)(t.h4,{id:"shared-folders",children:"Shared folders"}),"\n",(0,n.jsx)(t.p,{children:"Share folders let you access files from the host system from within a guest machine."}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Note:"})," auto-mounted shared folders are mounted into the ",(0,n.jsx)(t.code,{children:"/media"})," directory, along with the prefix ",(0,n.jsx)(t.code,{children:"sf_"}),". For example, the shared folder ",(0,n.jsx)(t.code,{children:"myfiles"})," would be mounted to ",(0,n.jsx)(t.code,{children:"/media/sf_myfiles"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Access to the shared folders is only granted to the user group ",(0,n.jsx)(t.code,{children:"vboxsf"})," on the ",(0,n.jsx)(t.strong,{children:"Guest"})," operating system."]}),"\n",(0,n.jsx)(t.p,{children:"Execute these commands to set the permissions and add yourself to the group"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxsf\n"})}),"\n",(0,n.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"VBOX Kernel",src:r(65240).Z+"",width:"500",height:"336"})}),"\n",(0,n.jsxs)(t.p,{children:["The Error ",(0,n.jsx)(t.code,{children:"Kernel driver not installed (rc=-1908)"})," may occur if"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The computer was not restarted before launching VirtualBox for the first time"}),"\n",(0,n.jsx)(t.li,{children:"The computer is not booted on the latest kernel. Make sure to apply the updates from the Software Center and restart your machine."}),"\n",(0,n.jsx)(t.li,{children:"The wrong VirtualBox package was installed. Please check the instructions just above to install the correct package for your kernel."}),"\n",(0,n.jsx)(t.li,{children:"VirtualBox was manually installed and it conflicts with the version installed from the Solus Repository."}),"\n"]})]})}function h(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},65240:function(e,t,r){r.d(t,{Z:function(){return s}});let s=r.p+"assets/images/vbox-kernel-85eb11034e02dafe61706f4d967580fe.png"},50065:function(e,t,r){r.d(t,{Z:function(){return i},a:function(){return l}});var s=r(67294);let n={},o=s.createContext(n);function l(e){let t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/75c41d11.97b0873a.js b/assets/js/75c41d11.97b0873a.js deleted file mode 100644 index c347d8cd3..000000000 --- a/assets/js/75c41d11.97b0873a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3337],{75584:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var r=s(85893),n=s(11151);const i={title:"Tips and Tricks",summary:"Helpful tips and tricks for using XFCE on Solus"},o="Tips and Tricks",c={id:"user/editions/xfce/tips-and-tricks",title:"Tips and Tricks",description:"XFCE Keyboard Shortcuts",source:"@site/docs/user/editions/xfce/tips-and-tricks.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/tips-and-tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using XFCE on Solus"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/xfce/configuration"},next:{title:"Hardware",permalink:"/docs/user/hardware/"}},d={},a=[{value:"XFCE Keyboard Shortcuts",id:"xfce-keyboard-shortcuts",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,r.jsx)(t.h2,{id:"xfce-keyboard-shortcuts",children:"XFCE Keyboard Shortcuts"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to XFCE users"})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>o});var r=s(67294);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/75c41d11.b31164a6.js b/assets/js/75c41d11.b31164a6.js new file mode 100644 index 000000000..1bf52550f --- /dev/null +++ b/assets/js/75c41d11.b31164a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4998"],{94341:function(e,t,s){s.r(t),s.d(t,{metadata:()=>r,contentTitle:()=>c,default:()=>l,assets:()=>d,toc:()=>a,frontMatter:()=>o});var r=JSON.parse('{"id":"user/editions/xfce/tips-and-tricks","title":"Tips and Tricks","description":"XFCE Keyboard Shortcuts","source":"@site/docs/user/editions/xfce/tips-and-tricks.md","sourceDirName":"user/editions/xfce","slug":"/user/editions/xfce/tips-and-tricks","permalink":"/docs/user/editions/xfce/tips-and-tricks","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/tips-and-tricks.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Tips and Tricks","summary":"Helpful tips and tricks for using XFCE on Solus"},"sidebar":"userSidebar","previous":{"title":"Configuration","permalink":"/docs/user/editions/xfce/configuration"},"next":{"title":"Hardware","permalink":"/docs/user/hardware/"}}'),n=s("85893"),i=s("50065");let o={title:"Tips and Tricks",summary:"Helpful tips and tricks for using XFCE on Solus"},c="Tips and Tricks",d={},a=[{value:"XFCE Keyboard Shortcuts",id:"xfce-keyboard-shortcuts",level:2}];function u(e){let t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(t.h2,{id:"xfce-keyboard-shortcuts",children:"XFCE Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to XFCE users"})]})}function l(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},50065:function(e,t,s){s.d(t,{Z:function(){return c},a:function(){return o}});var r=s(67294);let n={},i=r.createContext(n);function o(e){let t=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7734.0f69c48a.js b/assets/js/7734.0f69c48a.js deleted file mode 100644 index 69dc534ce..000000000 --- a/assets/js/7734.0f69c48a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7734],{96325:(e,t,n)=>{n.d(t,{Z:()=>l});n(67294);var s=n(36905),i=n(55361),o=n(42704),r=n(85893);function l(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,s.Z)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(o.Z,{as:"h1",className:"hero__title",children:(0,r.jsx)(i.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(i.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(i.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},57734:(e,t,n)=>{n.r(t),n.d(t,{default:()=>a});n(67294);var s=n(55361),i=n(96984),o=n(48714),r=n(96325),l=n(85893);function a(){const e=(0,s.I)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.d,{title:e}),(0,l.jsx)(o.Z,{children:(0,l.jsx)(r.Z,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/793c86b2.06954f0a.js b/assets/js/793c86b2.06954f0a.js deleted file mode 100644 index ec3d80881..000000000 --- a/assets/js/793c86b2.06954f0a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[168],{41426:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>h,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>t});var i=s(85893),l=s(11151);const o={title:"Command Line",summary:"Installation and configuration of popular command line programs on Solus"},h="Command Line",a={id:"user/software/command-line/index",title:"Command Line",description:"Changing Shell",source:"@site/docs/user/software/command-line/index.md",sourceDirName:"user/software/command-line",slug:"/user/software/command-line/",permalink:"/docs/user/software/command-line/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/command-line/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Command Line",summary:"Installation and configuration of popular command line programs on Solus"},sidebar:"userSidebar",previous:{title:"DroidCam",permalink:"/docs/user/software/camera/droidcam"},next:{title:"Configuration File Locations",permalink:"/docs/user/software/configuration_files"}},r={},t=[{value:"Changing Shell",id:"changing-shell",level:2},{value:"Installation",id:"installation",level:3},{value:"Switching",id:"switching",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"fzf",id:"fzf",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Fuzzy Auto-Completion",id:"fuzzy-auto-completion",level:3},{value:"Bash",id:"bash",level:4},{value:"Zsh",id:"zsh",level:4},{value:"Key Bindings",id:"key-bindings",level:3},{value:"Bash",id:"bash-1",level:4},{value:"Fish",id:"fish",level:4},{value:"Zsh",id:"zsh-1",level:4},{value:"Powerline Shell Prompt",id:"powerline-shell-prompt",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Shell Prompts",id:"shell-prompts",level:3},{value:"Bash",id:"bash-2",level:4},{value:"Busybox and dash",id:"busybox-and-dash",level:4},{value:"Fish",id:"fish-1",level:4},{value:"Zsh",id:"zsh-2",level:4}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"command-line",children:"Command Line"})}),"\n",(0,i.jsx)(n.h2,{id:"changing-shell",children:"Changing Shell"}),"\n",(0,i.jsx)(n.p,{children:"When using a terminal session to perform command-line activities, a Unix shell is used to interpret commands. The default shell on Solus is Bash, however changing your shell may enable additional features and functionality."}),"\n",(0,i.jsxs)(n.p,{children:["Solus makes available other shells via our repository, with a full list available in ",(0,i.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Common shells, aside from Bash, are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"http://gondor.apana.org.au/~herbert/dash/",children:"DASH"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://fishshell.com/",children:"fish"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://zsh.sourceforge.io/",children:"zsh"})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["In order to use a shell different from Bash, you may need to install the respective package for the shell to be able to work. You will find those packages in the Software Center within the ",(0,i.jsx)(n.em,{children:"System utilities"})," category, or via the command-line with ",(0,i.jsx)(n.code,{children:"sudo eopkg install "}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install fish\n"})}),"\n",(0,i.jsx)(n.h3,{id:"switching",children:"Switching"}),"\n",(0,i.jsxs)(n.p,{children:["To switch to another shell, first install the appropriate package, followed by the command ",(0,i.jsx)(n.code,{children:"chsh"})," (change shell) to change the shell for your user session, using the path provided in ",(0,i.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Lastly you need to log out and back in again for the change to take effect."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For zsh: ",(0,i.jsx)(n.code,{children:"chsh -s /bin/zsh"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For fish: ",(0,i.jsx)(n.code,{children:"chsh -s /usr/bin/fish"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.p,{children:["If the default shell is not changed, you must add the shell to ",(0,i.jsx)(n.code,{children:"/etc/shells"})," via the command ",(0,i.jsx)(n.code,{children:"sh"})," with ",(0,i.jsx)(n.code,{children:"sudo"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For zsh: ",(0,i.jsx)(n.code,{children:'echo "/bin/zsh" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For fish: ",(0,i.jsx)(n.code,{children:'echo "/usr/bin/fish" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"fzf",children:"fzf"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"fzf"})," is a general-purpose command-line fuzzy finder. It can be used as an interactive Unix filter with any list: files, command history, processes, hostnames, bookmarks, git commits, etc."]}),"\n",(0,i.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["The fzf project consists of the following components: an ",(0,i.jsx)(n.code,{children:"fzf"})," executable, an ",(0,i.jsx)(n.code,{children:"fzf-tmux"})," script for launching fzf in a tmux pane, shell extensions (including key bindings and command-line fuzzy auto-completion), and a vim/Neovim plugin file. They are all available in the ",(0,i.jsx)(n.code,{children:"fzf"})," package in the Software Center or via eopkg in a terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it fzf\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The shell extensions are not enabled by default after the ",(0,i.jsx)(n.code,{children:"fzf"})," package is installed. The procedures to enable these features are described below. For more tips and examples on the usage of ",(0,i.jsx)(n.code,{children:"fzf"}),", visit its ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"GitHub repository"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf/wiki/examples",children:"Wiki pages"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"fuzzy-auto-completion",children:"Fuzzy Auto-Completion"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh",children:"Fuzzy completion"})," for files and directories can be triggered by a trigger sequence (",(0,i.jsx)(n.code,{children:"**"})," by default) followed by the ",(0,i.jsx)(n.code,{children:"TAB"})," key for ",(0,i.jsx)(n.code,{children:"bash"})," and ",(0,i.jsx)(n.code,{children:"zsh"}),". To enable this feature, add the following lines to the shell configuration file depending on the shell you use (",(0,i.jsx)(n.code,{children:"~/.bashrc"})," for ",(0,i.jsx)(n.code,{children:"bash"})," and ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," for ",(0,i.jsx)(n.code,{children:"zsh"}),")."]}),"\n",(0,i.jsx)(n.h4,{id:"bash",children:"Bash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/bash-completion/completions/fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,i.jsx)(n.h4,{id:"zsh",children:"Zsh"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/zsh/site-functions/_fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,i.jsx)(n.h3,{id:"key-bindings",children:"Key Bindings"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"fzf"})," can use specific ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf#key-bindings-for-command-line",children:"key bindings"})," to trigger a search over a list of files, command history and directories and paste the result onto the command-line. Follow these steps to set up the key bindings for your favorite shell."]}),"\n",(0,i.jsx)(n.h4,{id:"bash-1",children:"Bash"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following content to ",(0,i.jsx)(n.code,{children:"~/.bashrc"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.bash\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fish",children:"Fish"}),"\n",(0,i.jsx)(n.p,{children:"First create the following directory if it does not already exist:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir -p $HOME/.config/fish/functions\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"cd"})," into this directory and make a file ",(0,i.jsx)(n.code,{children:"fish_user_key_bindings.fish"})," with the following content:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"function fish_user_key_bindings\n fzf_key_bindings\nend\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then create the following symlink:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"ln -s /usr/share/fzf/key-bindings.fish $HOME/.config/fish/functions/fzf_key_bindings.fish\n"})}),"\n",(0,i.jsx)(n.h4,{id:"zsh-1",children:"Zsh"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following content to ",(0,i.jsx)(n.code,{children:"~/.zshrc"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.zsh\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,i.jsx)(n.h2,{id:"powerline-shell-prompt",children:"Powerline Shell Prompt"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/powerline",children:"Powerline"})," is a statusline plugin for vim, and provides statuslines and prompts for several other applications, including zsh, bash, tmux, IPython, Awesome and Qtile."]}),"\n",(0,i.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["Powerline has two components, the plugin system itself ",(0,i.jsx)(n.code,{children:"powerline"})," and the\nfonts ",(0,i.jsx)(n.code,{children:"powerline-fonts"}),". Both are available in the Software Center or via ",(0,i.jsx)(n.code,{children:"eopkg"})," in a terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it powerline powerline-fonts\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To get powerline working inside your terminal, you need to add the following commands to the ",(0,i.jsx)(n.code,{children:".bashrc"})," inside your ",(0,i.jsx)(n.code,{children:"$HOME"})," directory."]}),"\n",(0,i.jsx)(n.h3,{id:"shell-prompts",children:"Shell Prompts"}),"\n",(0,i.jsx)(n.p,{children:"The Powerline daemon is not running automatically by any of the bindings. It is advised to add the following before any other powerline-related code in the shell configuration file"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\n"})}),"\n",(0,i.jsx)(n.h4,{id:"bash-2",children:"Bash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\nPOWERLINE_BASH_CONTINUATION=1\nPOWERLINE_BASH_SELECT=1\nsource /usr/lib/python3.11/site-packages/powerline/bindings/bash/powerline.sh\n"})}),"\n",(0,i.jsx)(n.h4,{id:"busybox-and-dash",children:"Busybox and dash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/shell/powerline.sh\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fish-1",children:"Fish"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'set fish_function_path $fish_function_path "/usr/lib/python3.11/site-packages/powerline/bindings/fish/"\n'})}),"\n",(0,i.jsx)(n.h4,{id:"zsh-2",children:"Zsh"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/zsh/powerline.zsh\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Read more about powerline on its ",(0,i.jsx)(n.a,{href:"https://powerline.readthedocs.io/en/master/usage.html#shell-prompts-requirements",children:"docs website"})]})]})}function c(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>h});var i=s(67294);const l={},o=i.createContext(l);function h(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:h(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/793c86b2.b1f96949.js b/assets/js/793c86b2.b1f96949.js new file mode 100644 index 000000000..3b12dcf6a --- /dev/null +++ b/assets/js/793c86b2.b1f96949.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1318"],{73426:function(e,n,s){s.r(n),s.d(n,{metadata:()=>i,contentTitle:()=>h,default:()=>c,assets:()=>r,toc:()=>t,frontMatter:()=>a});var i=JSON.parse('{"id":"user/software/command-line/index","title":"Command Line","description":"Changing Shell","source":"@site/docs/user/software/command-line/index.md","sourceDirName":"user/software/command-line","slug":"/user/software/command-line/","permalink":"/docs/user/software/command-line/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/command-line/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Command Line","summary":"Installation and configuration of popular command line programs on Solus"},"sidebar":"userSidebar","previous":{"title":"DroidCam","permalink":"/docs/user/software/camera/droidcam"},"next":{"title":"Configuration File Locations","permalink":"/docs/user/software/configuration_files"}}'),l=s("85893"),o=s("50065");let a={title:"Command Line",summary:"Installation and configuration of popular command line programs on Solus"},h="Command Line",r={},t=[{value:"Changing Shell",id:"changing-shell",level:2},{value:"Installation",id:"installation",level:3},{value:"Switching",id:"switching",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"fzf",id:"fzf",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Fuzzy Auto-Completion",id:"fuzzy-auto-completion",level:3},{value:"Bash",id:"bash",level:4},{value:"Zsh",id:"zsh",level:4},{value:"Key Bindings",id:"key-bindings",level:3},{value:"Bash",id:"bash-1",level:4},{value:"Fish",id:"fish",level:4},{value:"Zsh",id:"zsh-1",level:4},{value:"Powerline Shell Prompt",id:"powerline-shell-prompt",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Shell Prompts",id:"shell-prompts",level:3},{value:"Bash",id:"bash-2",level:4},{value:"Busybox and dash",id:"busybox-and-dash",level:4},{value:"Fish",id:"fish-1",level:4},{value:"Zsh",id:"zsh-2",level:4}];function d(e){let n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"command-line",children:"Command Line"})}),"\n",(0,l.jsx)(n.h2,{id:"changing-shell",children:"Changing Shell"}),"\n",(0,l.jsx)(n.p,{children:"When using a terminal session to perform command-line activities, a Unix shell is used to interpret commands. The default shell on Solus is Bash, however changing your shell may enable additional features and functionality."}),"\n",(0,l.jsxs)(n.p,{children:["Solus makes available other shells via our repository, with a full list available in ",(0,l.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Common shells, aside from Bash, are:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"http://gondor.apana.org.au/~herbert/dash/",children:"DASH"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://fishshell.com/",children:"fish"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://zsh.sourceforge.io/",children:"zsh"})}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,l.jsxs)(n.p,{children:["In order to use a shell different from Bash, you may need to install the respective package for the shell to be able to work. You will find those packages in the Software Center within the ",(0,l.jsx)(n.em,{children:"System utilities"})," category, or via the command-line with ",(0,l.jsx)(n.code,{children:"sudo eopkg install "}),"."]}),"\n",(0,l.jsx)(n.p,{children:"Example:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install fish\n"})}),"\n",(0,l.jsx)(n.h3,{id:"switching",children:"Switching"}),"\n",(0,l.jsxs)(n.p,{children:["To switch to another shell, first install the appropriate package, followed by the command ",(0,l.jsx)(n.code,{children:"chsh"})," (change shell) to change the shell for your user session, using the path provided in ",(0,l.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Lastly you need to log out and back in again for the change to take effect."]}),"\n",(0,l.jsx)(n.p,{children:"Example:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["For zsh: ",(0,l.jsx)(n.code,{children:"chsh -s /bin/zsh"})]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["For fish: ",(0,l.jsx)(n.code,{children:"chsh -s /usr/bin/fish"})]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,l.jsxs)(n.p,{children:["If the default shell is not changed, you must add the shell to ",(0,l.jsx)(n.code,{children:"/etc/shells"})," via the command ",(0,l.jsx)(n.code,{children:"sh"})," with ",(0,l.jsx)(n.code,{children:"sudo"}),"."]}),"\n",(0,l.jsx)(n.p,{children:"Example:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["For zsh: ",(0,l.jsx)(n.code,{children:'echo "/bin/zsh" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["For fish: ",(0,l.jsx)(n.code,{children:'echo "/usr/bin/fish" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"fzf",children:"fzf"}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"fzf"})," is a general-purpose command-line fuzzy finder. It can be used as an interactive Unix filter with any list: files, command history, processes, hostnames, bookmarks, git commits, etc."]}),"\n",(0,l.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,l.jsxs)(n.p,{children:["The fzf project consists of the following components: an ",(0,l.jsx)(n.code,{children:"fzf"})," executable, an ",(0,l.jsx)(n.code,{children:"fzf-tmux"})," script for launching fzf in a tmux pane, shell extensions (including key bindings and command-line fuzzy auto-completion), and a vim/Neovim plugin file. They are all available in the ",(0,l.jsx)(n.code,{children:"fzf"})," package in the Software Center or via eopkg in a terminal:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it fzf\n"})}),"\n",(0,l.jsxs)(n.p,{children:["The shell extensions are not enabled by default after the ",(0,l.jsx)(n.code,{children:"fzf"})," package is installed. The procedures to enable these features are described below. For more tips and examples on the usage of ",(0,l.jsx)(n.code,{children:"fzf"}),", visit its ",(0,l.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"GitHub repository"})," and ",(0,l.jsx)(n.a,{href:"https://github.com/junegunn/fzf/wiki/examples",children:"Wiki pages"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"fuzzy-auto-completion",children:"Fuzzy Auto-Completion"}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh",children:"Fuzzy completion"})," for files and directories can be triggered by a trigger sequence (",(0,l.jsx)(n.code,{children:"**"})," by default) followed by the ",(0,l.jsx)(n.code,{children:"TAB"})," key for ",(0,l.jsx)(n.code,{children:"bash"})," and ",(0,l.jsx)(n.code,{children:"zsh"}),". To enable this feature, add the following lines to the shell configuration file depending on the shell you use (",(0,l.jsx)(n.code,{children:"~/.bashrc"})," for ",(0,l.jsx)(n.code,{children:"bash"})," and ",(0,l.jsx)(n.code,{children:"~/.zshrc"})," for ",(0,l.jsx)(n.code,{children:"zsh"}),")."]}),"\n",(0,l.jsx)(n.h4,{id:"bash",children:"Bash"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/bash-completion/completions/fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,l.jsx)(n.h4,{id:"zsh",children:"Zsh"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/zsh/site-functions/_fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,l.jsx)(n.h3,{id:"key-bindings",children:"Key Bindings"}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"fzf"})," can use specific ",(0,l.jsx)(n.a,{href:"https://github.com/junegunn/fzf#key-bindings-for-command-line",children:"key bindings"})," to trigger a search over a list of files, command history and directories and paste the result onto the command-line. Follow these steps to set up the key bindings for your favorite shell."]}),"\n",(0,l.jsx)(n.h4,{id:"bash-1",children:"Bash"}),"\n",(0,l.jsxs)(n.p,{children:["Add the following content to ",(0,l.jsx)(n.code,{children:"~/.bashrc"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.bash\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,l.jsx)(n.h4,{id:"fish",children:"Fish"}),"\n",(0,l.jsx)(n.p,{children:"First create the following directory if it does not already exist:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"mkdir -p $HOME/.config/fish/functions\n"})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"cd"})," into this directory and make a file ",(0,l.jsx)(n.code,{children:"fish_user_key_bindings.fish"})," with the following content:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"function fish_user_key_bindings\n fzf_key_bindings\nend\n"})}),"\n",(0,l.jsx)(n.p,{children:"Then create the following symlink:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"ln -s /usr/share/fzf/key-bindings.fish $HOME/.config/fish/functions/fzf_key_bindings.fish\n"})}),"\n",(0,l.jsx)(n.h4,{id:"zsh-1",children:"Zsh"}),"\n",(0,l.jsxs)(n.p,{children:["Add the following content to ",(0,l.jsx)(n.code,{children:"~/.zshrc"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.zsh\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,l.jsx)(n.h2,{id:"powerline-shell-prompt",children:"Powerline Shell Prompt"}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.a,{href:"https://github.com/powerline",children:"Powerline"})," is a statusline plugin for vim, and provides statuslines and prompts for several other applications, including zsh, bash, tmux, IPython, Awesome and Qtile."]}),"\n",(0,l.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,l.jsxs)(n.p,{children:["Powerline has two components, the plugin system itself ",(0,l.jsx)(n.code,{children:"powerline"})," and the\nfonts ",(0,l.jsx)(n.code,{children:"powerline-fonts"}),". Both are available in the Software Center or via ",(0,l.jsx)(n.code,{children:"eopkg"})," in a terminal:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it powerline powerline-fonts\n"})}),"\n",(0,l.jsxs)(n.p,{children:["To get powerline working inside your terminal, you need to add the following commands to the ",(0,l.jsx)(n.code,{children:".bashrc"})," inside your ",(0,l.jsx)(n.code,{children:"$HOME"})," directory."]}),"\n",(0,l.jsx)(n.h3,{id:"shell-prompts",children:"Shell Prompts"}),"\n",(0,l.jsx)(n.p,{children:"The Powerline daemon is not running automatically by any of the bindings. It is advised to add the following before any other powerline-related code in the shell configuration file"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\n"})}),"\n",(0,l.jsx)(n.h4,{id:"bash-2",children:"Bash"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\nPOWERLINE_BASH_CONTINUATION=1\nPOWERLINE_BASH_SELECT=1\nsource /usr/lib/python3.11/site-packages/powerline/bindings/bash/powerline.sh\n"})}),"\n",(0,l.jsx)(n.h4,{id:"busybox-and-dash",children:"Busybox and dash"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/shell/powerline.sh\n"})}),"\n",(0,l.jsx)(n.h4,{id:"fish-1",children:"Fish"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'set fish_function_path $fish_function_path "/usr/lib/python3.11/site-packages/powerline/bindings/fish/"\n'})}),"\n",(0,l.jsx)(n.h4,{id:"zsh-2",children:"Zsh"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/zsh/powerline.zsh\n"})}),"\n",(0,l.jsxs)(n.p,{children:["Read more about powerline on its ",(0,l.jsx)(n.a,{href:"https://powerline.readthedocs.io/en/master/usage.html#shell-prompts-requirements",children:"docs website"})]})]})}function c(e={}){let{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}},50065:function(e,n,s){s.d(n,{Z:function(){return h},a:function(){return a}});var i=s(67294);let l={},o=i.createContext(l);function a(e){let n=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function h(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:a(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7a24477a.cb1e3345.js b/assets/js/7a24477a.cb1e3345.js new file mode 100644 index 000000000..f23475b3c --- /dev/null +++ b/assets/js/7a24477a.cb1e3345.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1990"],{20095:function(e,t,i){i.r(t),i.d(t,{metadata:()=>n,contentTitle:()=>l,default:()=>h,assets:()=>a,toc:()=>u,frontMatter:()=>r});var n=JSON.parse('{"id":"user/contributing/getting-involved","title":"Getting Involved","description":"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out.","source":"@site/docs/user/contributing/getting-involved.md","sourceDirName":"user/contributing","slug":"/user/contributing/getting-involved","permalink":"/docs/user/contributing/getting-involved","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/getting-involved.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Getting Involved","summary":"Getting involved with the Solus community"},"sidebar":"userSidebar","previous":{"title":"Community Guidelines","permalink":"/docs/user/contributing/community-guidelines"},"next":{"title":"Solus Style Guide","permalink":"/docs/user/contributing/style"}}'),s=i("85893"),o=i("50065");let r={title:"Getting Involved",summary:"Getting involved with the Solus community"},l="Getting Involved",a={},u=[{value:"Engaging with the community",id:"engaging-with-the-community",level:2},{value:"Community guidelines",id:"community-guidelines",level:3},{value:"Community forums",id:"community-forums",level:3},{value:"Matrix (chat)",id:"matrix-chat",level:3},{value:"Social Media",id:"social-media",level:3},{value:"Funding",id:"funding",level:2},{value:"Improving documentation",id:"improving-documentation",level:2},{value:"Packaging",id:"packaging",level:2},{value:"Report bugs",id:"report-bugs",level:2},{value:"Translations",id:"translations",level:2}];function c(e){let t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"getting-involved",children:"Getting Involved"})}),"\n",(0,s.jsx)(t.p,{children:"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out."}),"\n",(0,s.jsx)(t.h2,{id:"engaging-with-the-community",children:"Engaging with the community"}),"\n",(0,s.jsx)(t.h3,{id:"community-guidelines",children:"Community guidelines"}),"\n",(0,s.jsxs)(t.p,{children:["Solus enforces a set of community guidelines to maintain respect and professionalism, as well as a family-friendly environment. Please view our community guidelines ",(0,s.jsx)(t.a,{href:"/docs/user/contributing/community-guidelines",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"community-forums",children:"Community forums"}),"\n",(0,s.jsxs)(t.p,{children:["With so many new users joining, there are always more people needing help. A great way to help us out, would be to help out our users on the ",(0,s.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Solus Forums"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"matrix-chat",children:"Matrix (chat)"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https:/.wikipedia.org/wiki/Matrix_(protocol)",children:"Matrix"})," is a great way to discuss issues and development with the community, and project developers in real-time. It's also a great place for getting support, but remember due\nto timezone differences there might not always be people there to answer your question immediately. You can access Matrix using a client like ",(0,s.jsx)(t.a,{href:"https://app.element.io/",children:"Element Web"}),", or many ",(0,s.jsx)(t.a,{href:"https://matrix.org/ecosystem/clients/",children:"others"}),". You will need a Matrix account."]}),"\n",(0,s.jsxs)(t.p,{children:["You will find the following Solus rooms on the ",(0,s.jsx)(t.code,{children:"matrix.org"})," homeserver:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsxs)(t.a,{href:"https://matrix.to/#/#solus-support:matrix.org",children:["#solus-support",":matrix",".org"]})," Support room"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsxs)(t.a,{href:"https://matrix.to/#/#solus-off-topic:matrix.org",children:["#solus-off-topic",":matrix",".org"]})," Off-topic room"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsxs)(t.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:["#solus-packaging",":matrix",".org"]})," Packaging-related room"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsxs)(t.a,{href:"https://matrix.to/#/#solus-development:matrix.org",children:["#solus-development",":matrix",".org"]})," Development-related room"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsxs)(t.a,{href:"https://matrix.to/#/#solus-devlog:matrix.org",children:["#solus-devlog",":matrix",".org"]})," Commit and Pull Request notifications from the ",(0,s.jsx)(t.code,{children:"getsolus"})," GitHub organization (developer oriented, read-only)"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsxs)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:["#solus",":matrix",".org"]})," ",(0,s.jsx)(t.strong,{children:"Matrix Space containing all rooms"})]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"social-media",children:"Social Media"}),"\n",(0,s.jsx)(t.p,{children:"Alongside the forums, you can communicate with developers or others in the community by using one of the following websites:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.facebook.com/get.solus",children:"Facebook"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://fosstodon.org/@Solus",children:"Mastodon"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject/",children:"Reddit"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"funding",children:"Funding"}),"\n",(0,s.jsxs)(t.p,{children:["Solus is funded through our ",(0,s.jsx)(t.a,{href:"https://opencollective.com/getsolus",children:"Open Collective"}),", with our fiscal host being the non-profit 501(c)(3) organization ",(0,s.jsx)(t.a,{href:"https://oscollective.org/",children:"Open Source Collective"}),". To read more about what this funding enables us to do take a look at the ",(0,s.jsx)(t.a,{href:"https://opencollective.com/getsolus#category-ABOUT",children:'"About" section of our Open Collective page'}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"improving-documentation",children:"Improving documentation"}),"\n",(0,s.jsxs)(t.p,{children:["Our Help Center improves when the documentation improves. If there are docs that you think would be valuable to add, get involved by submitting pull requests to our ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/help-center-docs",children:"Help Center Docs"})," repository!"]}),"\n",(0,s.jsx)(t.h2,{id:"packaging",children:"Packaging"}),"\n",(0,s.jsxs)(t.p,{children:["There may be software you wish to have on your system that is currently not available in the repository. While you are more than welcome to submit a bug and wait for someone else to package the software you want, you can also improve\nand contribute to the community by packaging software. If you're interested in learning to package software, feel free to visit our documentation ",(0,s.jsx)(t.a,{href:"/docs/packaging/",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"report-bugs",children:"Report bugs"}),"\n",(0,s.jsx)(t.p,{children:"We're always looking to improve our systems, especially when they're not functioning as expected. By reporting bugs, you improve the system not only for you, but for all Solus users."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://issues.getsol.us",children:"Main Solus GitHub Issue Tracker"}),"\nMost bug reports about Solus itself, and its packages, should be filed here."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://github.com/getsolus",children:"Other Solus GitHub Repositories"}),"\nCertain parts of Solus, such as the Software Center, have repositories in the ",(0,s.jsx)(t.code,{children:"getsolus"})," organization on GitHub. Check here to see if the system in question is listed. If so, file the bug in the appropriate repository."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Budgie Desktop"}),"\nBudgie Desktop issues are filed in the ",(0,s.jsx)(t.code,{children:"BuddiesOfBudgie/budgie-desktop"})," repository on GitHub."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"translations",children:"Translations"}),"\n",(0,s.jsxs)(t.p,{children:["Assistance is always welcome in translating our projects ",(0,s.jsx)(t.a,{href:"/docs/packaging/translation-instructions",children:"to other languages"}),"!"]})]})}function h(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},50065:function(e,t,i){i.d(t,{Z:function(){return l},a:function(){return r}});var n=i(67294);let s={},o=n.createContext(s);function r(e){let t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7a24477a.fafb3313.js b/assets/js/7a24477a.fafb3313.js deleted file mode 100644 index 6d5ea651a..000000000 --- a/assets/js/7a24477a.fafb3313.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9135],{44308:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=i(85893),s=i(11151);const o={title:"Getting Involved",summary:"Getting involved with the Solus community"},r="Getting Involved",l={id:"user/contributing/getting-involved",title:"Getting Involved",description:"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out.",source:"@site/docs/user/contributing/getting-involved.md",sourceDirName:"user/contributing",slug:"/user/contributing/getting-involved",permalink:"/docs/user/contributing/getting-involved",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/getting-involved.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Getting Involved",summary:"Getting involved with the Solus community"},sidebar:"userSidebar",previous:{title:"Community Guidelines",permalink:"/docs/user/contributing/community-guidelines"},next:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"}},a={},u=[{value:"Engaging with the community",id:"engaging-with-the-community",level:2},{value:"Community guidelines",id:"community-guidelines",level:3},{value:"Community forums",id:"community-forums",level:3},{value:"Matrix (chat)",id:"matrix-chat",level:3},{value:"Social Media",id:"social-media",level:3},{value:"Funding",id:"funding",level:2},{value:"Improving documentation",id:"improving-documentation",level:2},{value:"Packaging",id:"packaging",level:2},{value:"Report bugs",id:"report-bugs",level:2},{value:"Translations",id:"translations",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"getting-involved",children:"Getting Involved"})}),"\n",(0,n.jsx)(t.p,{children:"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out."}),"\n",(0,n.jsx)(t.h2,{id:"engaging-with-the-community",children:"Engaging with the community"}),"\n",(0,n.jsx)(t.h3,{id:"community-guidelines",children:"Community guidelines"}),"\n",(0,n.jsxs)(t.p,{children:["Solus enforces a set of community guidelines to maintain respect and professionalism, as well as a family-friendly environment. Please view our community guidelines ",(0,n.jsx)(t.a,{href:"/docs/user/contributing/community-guidelines",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"community-forums",children:"Community forums"}),"\n",(0,n.jsxs)(t.p,{children:["With so many new users joining, there are always more people needing help. A great way to help us out, would be to help out our users on the ",(0,n.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Solus Forums"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"matrix-chat",children:"Matrix (chat)"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https:/.wikipedia.org/wiki/Matrix_(protocol)",children:"Matrix"})," is a great way to discuss issues and development with the community, and project developers in real-time. It's also a great place for getting support, but remember due\nto timezone differences there might not always be people there to answer your question immediately. You can access Matrix using a client like ",(0,n.jsx)(t.a,{href:"https://app.element.io/",children:"Element Web"}),", or many ",(0,n.jsx)(t.a,{href:"https://matrix.org/ecosystem/clients/",children:"others"}),". You will need a Matrix account."]}),"\n",(0,n.jsxs)(t.p,{children:["You will find the following Solus rooms on the ",(0,n.jsx)(t.code,{children:"matrix.org"})," homeserver:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-support:matrix.org",children:["#solus-support",":matrix",".org"]})," Support room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-off-topic:matrix.org",children:["#solus-off-topic",":matrix",".org"]})," Off-topic room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:["#solus-packaging",":matrix",".org"]})," Packaging-related room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-development:matrix.org",children:["#solus-development",":matrix",".org"]})," Development-related room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-devlog:matrix.org",children:["#solus-devlog",":matrix",".org"]})," Commit and Pull Request notifications from the ",(0,n.jsx)(t.code,{children:"getsolus"})," GitHub organization (developer oriented, read-only)"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:["#solus",":matrix",".org"]})," ",(0,n.jsx)(t.strong,{children:"Matrix Space containing all rooms"})]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"social-media",children:"Social Media"}),"\n",(0,n.jsx)(t.p,{children:"Alongside the forums, you can communicate with developers or others in the community by using one of the following websites:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.facebook.com/get.solus",children:"Facebook"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://fosstodon.org/@Solus",children:"Mastodon"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject/",children:"Reddit"})}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"funding",children:"Funding"}),"\n",(0,n.jsxs)(t.p,{children:["Solus is funded through our ",(0,n.jsx)(t.a,{href:"https://opencollective.com/getsolus",children:"Open Collective"}),", with our fiscal host being the non-profit 501(c)(3) organization ",(0,n.jsx)(t.a,{href:"https://oscollective.org/",children:"Open Source Collective"}),". To read more about what this funding enables us to do take a look at the ",(0,n.jsx)(t.a,{href:"https://opencollective.com/getsolus#category-ABOUT",children:'"About" section of our Open Collective page'}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"improving-documentation",children:"Improving documentation"}),"\n",(0,n.jsxs)(t.p,{children:["Our Help Center improves when the documentation improves. If there are docs that you think would be valuable to add, get involved by submitting pull requests to our ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/help-center-docs",children:"Help Center Docs"})," repository!"]}),"\n",(0,n.jsx)(t.h2,{id:"packaging",children:"Packaging"}),"\n",(0,n.jsxs)(t.p,{children:["There may be software you wish to have on your system that is currently not available in the repository. While you are more than welcome to submit a bug and wait for someone else to package the software you want, you can also improve\nand contribute to the community by packaging software. If you're interested in learning to package software, feel free to visit our documentation ",(0,n.jsx)(t.a,{href:"/docs/packaging/",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"report-bugs",children:"Report bugs"}),"\n",(0,n.jsx)(t.p,{children:"We're always looking to improve our systems, especially when they're not functioning as expected. By reporting bugs, you improve the system not only for you, but for all Solus users."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://issues.getsol.us",children:"Main Solus GitHub Issue Tracker"}),"\nMost bug reports about Solus itself, and its packages, should be filed here."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/getsolus",children:"Other Solus GitHub Repositories"}),"\nCertain parts of Solus, such as the Software Center, have repositories in the ",(0,n.jsx)(t.code,{children:"getsolus"})," organization on GitHub. Check here to see if the system in question is listed. If so, file the bug in the appropriate repository."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Budgie Desktop"}),"\nBudgie Desktop issues are filed in the ",(0,n.jsx)(t.code,{children:"BuddiesOfBudgie/budgie-desktop"})," repository on GitHub."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"translations",children:"Translations"}),"\n",(0,n.jsxs)(t.p,{children:["Assistance is always welcome in translating our projects ",(0,n.jsx)(t.a,{href:"/docs/packaging/translation-instructions",children:"to other languages"}),"!"]})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>l,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7b0bdf40.702b25a1.js b/assets/js/7b0bdf40.702b25a1.js deleted file mode 100644 index 218580534..000000000 --- a/assets/js/7b0bdf40.702b25a1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[29],{56548:e=>{e.exports=JSON.parse('{"tag":{"label":"eopkg","permalink":"/blog/tags/eopkg","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/eopkg","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/7b0bdf40.9366d3da.js b/assets/js/7b0bdf40.9366d3da.js new file mode 100644 index 000000000..c81bbc0b3 --- /dev/null +++ b/assets/js/7b0bdf40.9366d3da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8964"],{16165:function(e){e.exports=JSON.parse('{"tag":{"label":"eopkg","permalink":"/blog/tags/eopkg","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/eopkg","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/7c1fb106.a5495bc2.js b/assets/js/7c1fb106.a5495bc2.js new file mode 100644 index 000000000..1a8bc5cc2 --- /dev/null +++ b/assets/js/7c1fb106.a5495bc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9191"],{74244:function(e,t,a){a.r(t),a.d(t,{metadata:()=>i,contentTitle:()=>o,default:()=>l,assets:()=>p,toc:()=>c,frontMatter:()=>r});var i=JSON.parse('{"id":"packaging/appstream-metainfo","title":"Appstream Metainfo","description":"AppStream metainfo is required for all graphical application in Solus repository.","source":"@site/docs/packaging/appstream-metainfo.md","sourceDirName":"packaging","slug":"/packaging/appstream-metainfo","permalink":"/docs/packaging/appstream-metainfo","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/appstream-metainfo.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Appstream Metainfo","summary":"The purpose and format of Appstream Metainfo"},"sidebar":"packagingSidebar","previous":{"title":"Local Repository","permalink":"/docs/packaging/advanced-config/local-repository"},"next":{"title":"Git Basics","permalink":"/docs/packaging/git-basics"}}'),n=a("85893"),s=a("50065");let r={title:"Appstream Metainfo",summary:"The purpose and format of Appstream Metainfo"},o="AppStream Metainfo",p={},c=[{value:"Adding appstream metainfo to an existing package",id:"adding-appstream-metainfo-to-an-existing-package",level:2},{value:"Testing appstream metainfo",id:"testing-appstream-metainfo",level:2},{value:"Other Info",id:"other-info",level:2}];function d(e){let t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"appstream-metainfo",children:"AppStream Metainfo"})}),"\n",(0,n.jsx)(t.admonition,{type:"important",children:(0,n.jsx)(t.p,{children:"AppStream metainfo is required for all graphical application in Solus repository."})}),"\n",(0,n.jsx)(t.p,{children:"AppStream allows upstream projects to define metadata about the components they provide using small XML files, metainfo files, which get installed into locations on the client system and are used by distributors to enhance their metadata."}),"\n",(0,n.jsx)(t.p,{children:"AppStream metainfo become a requirement for all graphical application in Solus repository because software centers such as GNOME software and KDE Discover rely on it to display applications that are available in repository. AppStream metainfo should be shipped by the upstream project, bundled in with its source, but sometimes upstream projects don't do so. In which case, packagers are required to add AppStream metainfo themselves."}),"\n",(0,n.jsx)(t.h2,{id:"adding-appstream-metainfo-to-an-existing-package",children:"Adding appstream metainfo to an existing package"}),"\n",(0,n.jsx)(t.p,{children:"There are a few scenarios that Packagers might encounter:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"No"}),(0,n.jsx)(t.th,{children:"Scenario"}),(0,n.jsx)(t.th,{children:"Solution"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"1"}),(0,n.jsx)(t.td,{children:"An application already provides appstream metainfo"}),(0,n.jsx)(t.td,{children:"Nothing to do"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"2"}),(0,n.jsx)(t.td,{children:"An application contains appstream metainfo in the source package but we do not install it"}),(0,n.jsxs)(t.td,{children:["Install the appstream metainfo to ",(0,n.jsx)(t.code,{children:"/usr/share/metainfo"}),". ",(0,n.jsx)(t.em,{children:"Example"}),": ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/0a726a53454e7c8a6b0e66de69d59bcc66f0fc19",children:"here"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"3"}),(0,n.jsx)(t.td,{children:"An application doesn't contain appstream metainfo in the source package but it exists on Flathub"}),(0,n.jsxs)(t.td,{children:["Borrow and tweak the appstream metainfo from the Flathub repo. Encourage upstream project to add it to their source. ",(0,n.jsx)(t.em,{children:"Example"}),": ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/da2f65b93f412da43d1db9edbcb08bb90517a0eb",children:"here"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"4"}),(0,n.jsx)(t.td,{children:"An application doesn't provide appstream metainfo and it doesn't exist on flathub"}),(0,n.jsxs)(t.td,{children:["Write the appstream metadata, submit it to upstream project. ",(0,n.jsx)(t.em,{children:"Example"}),": ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/414219d8b2ceeabe85178d3a467f81b9131016f4",children:"here"})]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"5"}),(0,n.jsx)(t.td,{children:"Appstream metainfo is provided but generation of it is failing"}),(0,n.jsxs)(t.td,{children:["See ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/solus-appstream-data#debugging-failures",children:"here"}),". ",(0,n.jsx)(t.em,{children:"Example"}),": ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/583b7c742caf50e2f66a70e9b62e9b91566c03f5",children:"here"}),"."]})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["AppStream metainfo is to be installed in the ",(0,n.jsx)(t.code,{children:"/usr/share/metainfo/"})," directory. It must be placed in the package which should be installed in order to get the software described by the respective metadata. This means that you might need to move the _.metainfo.xml or _.appdata.xml to the right (sub)package."]}),"\n",(0,n.jsx)(t.p,{children:'In case your AppStream metainfo is describing a desktop-application (you can tell by the XML root-node having a type="desktop-application" or type="desktop" attribute), the .appdata.xml file must be placed in the same package as the .desktop file already is, which (as above) must be the package containing the application itself.'}),"\n",(0,n.jsx)(t.h2,{id:"testing-appstream-metainfo",children:"Testing appstream metainfo"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Clone the package repo"}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Build it or eopkg fetch pkgname"}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Run ",(0,n.jsx)(t.code,{children:"sudo eopkg it appstream-glib"}),", ",(0,n.jsx)(t.code,{children:"appstream-builder --packages-dir=. --include-failed -v"})]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Look in the ",(0,n.jsx)(t.code,{children:"example-failed.xml.gz"})," file to see if the appstream generation failed"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["Look in the ",(0,n.jsx)(t.code,{children:"example.xml.gz"})," file to see if the appstream generation succeeded."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"other-info",children:"Other Info"}),"\n",(0,n.jsx)(t.p,{children:"A package must provide one appstream metainfo file, an icon file and a .desktop file for AppStream generation to succeed. However, there are exceptions to this. If an application provides more than one AppStream metainfo file then the package must be subpackaged for generation of all the appstream metainfo files to succeed."})]})}function l(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},50065:function(e,t,a){a.d(t,{Z:function(){return o},a:function(){return r}});var i=a(67294);let n={},s=i.createContext(n);function r(e){let t=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c1fb106.e67f5672.js b/assets/js/7c1fb106.e67f5672.js deleted file mode 100644 index 1b4c65dd4..000000000 --- a/assets/js/7c1fb106.e67f5672.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4605],{66334:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=a(85893),n=a(11151);const s={title:"Appstream Metainfo",summary:"The purpose and format of Appstream Metainfo"},r="AppStream Metainfo",o={id:"packaging/appstream-metainfo",title:"Appstream Metainfo",description:"AppStream metainfo is required for all graphical application in Solus repository.",source:"@site/docs/packaging/appstream-metainfo.md",sourceDirName:"packaging",slug:"/packaging/appstream-metainfo",permalink:"/docs/packaging/appstream-metainfo",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/appstream-metainfo.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Appstream Metainfo",summary:"The purpose and format of Appstream Metainfo"},sidebar:"packagingSidebar",previous:{title:"Local Repository",permalink:"/docs/packaging/advanced-config/local-repository"},next:{title:"Git Basics",permalink:"/docs/packaging/git-basics"}},p={},c=[{value:"Adding appstream metainfo to an existing package",id:"adding-appstream-metainfo-to-an-existing-package",level:2},{value:"Testing appstream metainfo",id:"testing-appstream-metainfo",level:2},{value:"Other Info",id:"other-info",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"appstream-metainfo",children:"AppStream Metainfo"})}),"\n",(0,i.jsx)(t.admonition,{type:"important",children:(0,i.jsx)(t.p,{children:"AppStream metainfo is required for all graphical application in Solus repository."})}),"\n",(0,i.jsx)(t.p,{children:"AppStream allows upstream projects to define metadata about the components they provide using small XML files, metainfo files, which get installed into locations on the client system and are used by distributors to enhance their metadata."}),"\n",(0,i.jsx)(t.p,{children:"AppStream metainfo become a requirement for all graphical application in Solus repository because software centers such as GNOME software and KDE Discover rely on it to display applications that are available in repository. AppStream metainfo should be shipped by the upstream project, bundled in with its source, but sometimes upstream projects don't do so. In which case, packagers are required to add AppStream metainfo themselves."}),"\n",(0,i.jsx)(t.h2,{id:"adding-appstream-metainfo-to-an-existing-package",children:"Adding appstream metainfo to an existing package"}),"\n",(0,i.jsx)(t.p,{children:"There are a few scenarios that Packagers might encounter:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"No"}),(0,i.jsx)(t.th,{children:"Scenario"}),(0,i.jsx)(t.th,{children:"Solution"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"1"}),(0,i.jsx)(t.td,{children:"An application already provides appstream metainfo"}),(0,i.jsx)(t.td,{children:"Nothing to do"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"2"}),(0,i.jsx)(t.td,{children:"An application contains appstream metainfo in the source package but we do not install it"}),(0,i.jsxs)(t.td,{children:["Install the appstream metainfo to ",(0,i.jsx)(t.code,{children:"/usr/share/metainfo"}),". ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/0a726a53454e7c8a6b0e66de69d59bcc66f0fc19",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"3"}),(0,i.jsx)(t.td,{children:"An application doesn't contain appstream metainfo in the source package but it exists on Flathub"}),(0,i.jsxs)(t.td,{children:["Borrow and tweak the appstream metainfo from the Flathub repo. Encourage upstream project to add it to their source. ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/da2f65b93f412da43d1db9edbcb08bb90517a0eb",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"4"}),(0,i.jsx)(t.td,{children:"An application doesn't provide appstream metainfo and it doesn't exist on flathub"}),(0,i.jsxs)(t.td,{children:["Write the appstream metadata, submit it to upstream project. ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/414219d8b2ceeabe85178d3a467f81b9131016f4",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"5"}),(0,i.jsx)(t.td,{children:"Appstream metainfo is provided but generation of it is failing"}),(0,i.jsxs)(t.td,{children:["See ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/solus-appstream-data#debugging-failures",children:"here"}),". ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/583b7c742caf50e2f66a70e9b62e9b91566c03f5",children:"here"}),"."]})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["AppStream metainfo is to be installed in the ",(0,i.jsx)(t.code,{children:"/usr/share/metainfo/"})," directory. It must be placed in the package which should be installed in order to get the software described by the respective metadata. This means that you might need to move the _.metainfo.xml or _.appdata.xml to the right (sub)package."]}),"\n",(0,i.jsx)(t.p,{children:'In case your AppStream metainfo is describing a desktop-application (you can tell by the XML root-node having a type="desktop-application" or type="desktop" attribute), the .appdata.xml file must be placed in the same package as the .desktop file already is, which (as above) must be the package containing the application itself.'}),"\n",(0,i.jsx)(t.h2,{id:"testing-appstream-metainfo",children:"Testing appstream metainfo"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Clone the package repo"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Build it or eopkg fetch pkgname"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Run ",(0,i.jsx)(t.code,{children:"sudo eopkg it appstream-glib"}),", ",(0,i.jsx)(t.code,{children:"appstream-builder --packages-dir=. --include-failed -v"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Look in the ",(0,i.jsx)(t.code,{children:"example-failed.xml.gz"})," file to see if the appstream generation failed"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Look in the ",(0,i.jsx)(t.code,{children:"example.xml.gz"})," file to see if the appstream generation succeeded."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"other-info",children:"Other Info"}),"\n",(0,i.jsx)(t.p,{children:"A package must provide one appstream metainfo file, an icon file and a .desktop file for AppStream generation to succeed. However, there are exceptions to this. If an application provides more than one AppStream metainfo file then the package must be subpackaged for generation of all the appstream metainfo files to succeed."})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>o,a:()=>r});var i=a(67294);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c2abd66.1c99e3a1.js b/assets/js/7c2abd66.1c99e3a1.js deleted file mode 100644 index 1bb6fae08..000000000 --- a/assets/js/7c2abd66.1c99e3a1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[586],{19739:e=>{e.exports=JSON.parse('{"tag":{"label":"moss","permalink":"/blog/tags/moss","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/moss","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/7c2abd66.5be3e187.js b/assets/js/7c2abd66.5be3e187.js new file mode 100644 index 000000000..ff98f0e57 --- /dev/null +++ b/assets/js/7c2abd66.5be3e187.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3059"],{37831:function(e){e.exports=JSON.parse('{"tag":{"label":"moss","permalink":"/blog/tags/moss","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/moss","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/7e4100d6.ac132a79.js b/assets/js/7e4100d6.ac132a79.js deleted file mode 100644 index fed949937..000000000 --- a/assets/js/7e4100d6.ac132a79.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6990],{18193:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>i,toc:()=>h});var t=s(85893),a=s(11151);const n={title:"Wireshark",summary:"A quick start guide to Wireshark on Solus"},o="Wireshark",i={id:"user/software/networking/wireshark",title:"Wireshark",description:"Wireshark is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level.",source:"@site/docs/user/software/networking/wireshark.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/wireshark",permalink:"/docs/user/software/networking/wireshark",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/wireshark.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Wireshark",summary:"A quick start guide to Wireshark on Solus"},sidebar:"userSidebar",previous:{title:"TigerVNC",permalink:"/docs/user/software/networking/tigervnc"},next:{title:"XRDP",permalink:"/docs/user/software/networking/xrdp"}},c={},h=[{value:"Installation",id:"installation",level:2},{value:"Use wireshark as a non-root user",id:"use-wireshark-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"wireshark",children:"Wireshark"})}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.a,{href:"https://www.wireshark.org/",children:"Wireshark"})," is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level."]}),"\n",(0,t.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(r.p,{children:"Wireshark can be installed either from the Software Center or via terminal:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"sudo eopkg it wireshark\n"})}),"\n",(0,t.jsx)(r.h2,{id:"use-wireshark-as-a-non-root-user",children:"Use wireshark as a non-root user"}),"\n",(0,t.jsx)(r.p,{children:"For security reasons, it is strongly unadvised to run Wireshark as root. To capture packets as non-root user, execute these commands:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"sudo gpasswd -a $USER wireshark\nsudo setcap cap_dac_override,cap_net_admin,cap_net_raw+eip /usr/bin/dumpcap\n"})}),"\n",(0,t.jsx)(r.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsxs)(r.p,{children:["Wireshark ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org/docs/wsug_html_chunked/",children:"User\u2019s Guide"})," and ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org/docs/",children:"learning material"})," are available on ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org",children:"https://www.wireshark.org"}),"."]})]})}function d(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,r,s)=>{s.d(r,{Z:()=>i,a:()=>o});var t=s(67294);const a={},n=t.createContext(a);function o(e){const r=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7e4100d6.f9f19d50.js b/assets/js/7e4100d6.f9f19d50.js new file mode 100644 index 000000000..785104380 --- /dev/null +++ b/assets/js/7e4100d6.f9f19d50.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6520"],{58736:function(e,r,s){s.r(r),s.d(r,{metadata:()=>t,contentTitle:()=>o,default:()=>u,assets:()=>l,toc:()=>c,frontMatter:()=>i});var t=JSON.parse('{"id":"user/software/networking/wireshark","title":"Wireshark","description":"Wireshark is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level.","source":"@site/docs/user/software/networking/wireshark.md","sourceDirName":"user/software/networking","slug":"/user/software/networking/wireshark","permalink":"/docs/user/software/networking/wireshark","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/wireshark.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Wireshark","summary":"A quick start guide to Wireshark on Solus"},"sidebar":"userSidebar","previous":{"title":"TigerVNC","permalink":"/docs/user/software/networking/tigervnc"},"next":{"title":"XRDP","permalink":"/docs/user/software/networking/xrdp"}}'),a=s("85893"),n=s("50065");let i={title:"Wireshark",summary:"A quick start guide to Wireshark on Solus"},o="Wireshark",l={},c=[{value:"Installation",id:"installation",level:2},{value:"Use wireshark as a non-root user",id:"use-wireshark-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function h(e){let r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,n.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.header,{children:(0,a.jsx)(r.h1,{id:"wireshark",children:"Wireshark"})}),"\n",(0,a.jsxs)(r.p,{children:[(0,a.jsx)(r.a,{href:"https://www.wireshark.org/",children:"Wireshark"})," is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level."]}),"\n",(0,a.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsx)(r.p,{children:"Wireshark can be installed either from the Software Center or via terminal:"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-bash",children:"sudo eopkg it wireshark\n"})}),"\n",(0,a.jsx)(r.h2,{id:"use-wireshark-as-a-non-root-user",children:"Use wireshark as a non-root user"}),"\n",(0,a.jsx)(r.p,{children:"For security reasons, it is strongly unadvised to run Wireshark as root. To capture packets as non-root user, execute these commands:"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-bash",children:"sudo gpasswd -a $USER wireshark\nsudo setcap cap_dac_override,cap_net_admin,cap_net_raw+eip /usr/bin/dumpcap\n"})}),"\n",(0,a.jsx)(r.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsxs)(r.p,{children:["Wireshark ",(0,a.jsx)(r.a,{href:"https://www.wireshark.org/docs/wsug_html_chunked/",children:"User\u2019s Guide"})," and ",(0,a.jsx)(r.a,{href:"https://www.wireshark.org/docs/",children:"learning material"})," are available on ",(0,a.jsx)(r.a,{href:"https://www.wireshark.org",children:"https://www.wireshark.org"}),"."]})]})}function u(e={}){let{wrapper:r}={...(0,n.a)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},50065:function(e,r,s){s.d(r,{Z:function(){return o},a:function(){return i}});var t=s(67294);let a={},n=t.createContext(a);function i(e){let r=t.useContext(n);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/814f3328.6bedb449.js b/assets/js/814f3328.6bedb449.js deleted file mode 100644 index 58893d1bd..000000000 --- a/assets/js/814f3328.6bedb449.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2535],{45641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Clean, clean, clean!","permalink":"/blog/clean-clean-clean","unlisted":false,"date":"2024-11-21T00:00:00.000Z"},{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages","unlisted":false,"date":"2024-02-09T00:00:00.000Z"},{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal","unlisted":false,"date":"2024-01-29T00:00:00.000Z"},{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg","unlisted":false,"date":"2024-01-19T00:00:00.000Z"},{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1","unlisted":false,"date":"2024-01-13T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.7d9ca34f.js b/assets/js/814f3328.7d9ca34f.js new file mode 100644 index 000000000..6ed51eced --- /dev/null +++ b/assets/js/814f3328.7d9ca34f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["106"],{4200:function(e){e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Clean, clean, clean!","permalink":"/blog/clean-clean-clean","unlisted":false,"date":"2024-11-21T00:00:00.000Z"},{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages","unlisted":false,"date":"2024-02-09T00:00:00.000Z"},{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal","unlisted":false,"date":"2024-01-29T00:00:00.000Z"},{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg","unlisted":false,"date":"2024-01-19T00:00:00.000Z"},{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1","unlisted":false,"date":"2024-01-13T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8412.1f597009.js b/assets/js/8412.1f597009.js new file mode 100644 index 000000000..2dbd6ced8 --- /dev/null +++ b/assets/js/8412.1f597009.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8412"],{57216:function(e,t,n){n.d(t,{Z:()=>j});var a=n("85893");n("67294");var s=n("74904"),i=n("1822"),l=n("50490"),r=n("27544");let d="iconEdit_Z9Sw";function c(e){let{className:t,...n}=e;return(0,a.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.Z)(d,t),"aria-hidden":"true",...n,children:(0,a.jsx)("g",{children:(0,a.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function o(e){let{editUrl:t}=e;return(0,a.jsxs)(r.Z,{to:t,className:l.k.common.editThisPage,children:[(0,a.jsx)(c,{}),(0,a.jsx)(i.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n("28291");function h(e){let{lastUpdatedAt:t}=e,n=new Date(t),s=(0,u.P)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,a.jsx)(i.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,a.jsx)("b",{children:(0,a.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function m(e){let{lastUpdatedBy:t}=e;return(0,a.jsx)(i.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,a.jsx)("b",{children:t})},children:" by {user}"})}function p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,a.jsxs)("span",{className:l.k.common.lastUpdated,children:[(0,a.jsx)(i.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,a.jsx)(h,{lastUpdatedAt:t}):"",byUser:n?(0,a.jsx)(m,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}let x="lastUpdated_JAkA";function j(e){let{className:t,editUrl:n,lastUpdatedAt:i,lastUpdatedBy:l}=e;return(0,a.jsxs)("div",{className:(0,s.Z)("row",t),children:[(0,a.jsx)("div",{className:"col",children:n&&(0,a.jsx)(o,{editUrl:n})}),(0,a.jsx)("div",{className:(0,s.Z)("col",x),children:(i||l)&&(0,a.jsx)(p,{lastUpdatedAt:i,lastUpdatedBy:l})})]})}},27913:function(e,t,n){n.d(t,{Z:()=>U});var a=n("85893"),s=n("67294"),i=n("50065"),l=n("50777"),r=n("84404");function d(e){return(0,a.jsx)("code",{...e})}var c=n("27544"),o=n("74904"),u=n("88942"),h=n("12785"),m=n("13341"),p=n("6560");let x={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function j(e){return!!e&&("SUMMARY"===e.tagName||j(e.parentElement))}function f(e){let{summary:t,children:n,...i}=e;(0,h.Z)().collectAnchor(i.id);let l=(0,m.Z)(),r=(0,s.useRef)(null),{collapsed:d,setCollapsed:c}=(0,p.u)({initialState:!i.open}),[o,f]=(0,s.useState)(i.open),g=s.isValidElement(t)?t:(0,a.jsx)("summary",{children:t??"Details"});return(0,a.jsxs)("details",{...i,ref:r,open:o,"data-collapsed":d,className:(0,u.Z)(x.details,l&&x.isBrowser,i.className),onMouseDown:e=>{j(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();let t=e.target;if(!!(j(t)&&function e(t,n){return!!t&&(t===n||e(t.parentElement,n))}(t,r.current)))e.preventDefault(),d?(c(!1),f(!0)):c(!0)},children:[g,(0,a.jsx)(p.z,{lazy:!1,collapsed:d,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{c(e),f(!e)},children:(0,a.jsx)("div",{className:x.collapsibleContent,children:n})})]})}let g="details_b_Ee";function v(e){let{...t}=e;return(0,a.jsx)(f,{...t,className:(0,o.Z)("alert alert--info",g,t.className)})}function Z(e){let t=s.Children.toArray(e.children),n=t.find(e=>s.isValidElement(e)&&"summary"===e.type),i=(0,a.jsx)(a.Fragment,{children:t.filter(e=>e!==n)});return(0,a.jsx)(v,{...e,summary:n,children:i})}var b=n("52068");function _(e){return(0,a.jsx)(b.Z,{...e})}let y={containsTaskList:"containsTaskList_mC6p"},N="img_ev3q";var k=n("77793");let w={Head:l.Z,details:Z,Details:Z,code:function(e){var t;return void 0!==(t=e).children&&s.Children.toArray(t.children).every(e=>"string"==typeof e&&!e.includes("\n"))?(0,a.jsx)(d,{...e}):(0,a.jsx)(r.Z,{...e})},a:function(e){return(0,a.jsx)(c.Z,{...e})},pre:function(e){return(0,a.jsx)(a.Fragment,{children:e.children})},ul:function(e){return(0,a.jsx)("ul",{...e,className:function(e){if(void 0!==e)return(0,o.Z)(e,e?.includes("contains-task-list")&&y.containsTaskList)}(e.className)})},li:function(e){return(0,h.Z)().collectAnchor(e.id),(0,a.jsx)("li",{...e})},img:function(e){var t;return(0,a.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,o.Z)(t,N))})},h1:e=>(0,a.jsx)(_,{as:"h1",...e}),h2:e=>(0,a.jsx)(_,{as:"h2",...e}),h3:e=>(0,a.jsx)(_,{as:"h3",...e}),h4:e=>(0,a.jsx)(_,{as:"h4",...e}),h5:e=>(0,a.jsx)(_,{as:"h5",...e}),h6:e=>(0,a.jsx)(_,{as:"h6",...e}),admonition:k.Z,mermaid:()=>null};function U(e){let{children:t}=e;return(0,a.jsx)(i.Z,{components:w,children:t})}},15779:function(e,t,n){n.d(t,{Z:function(){return l}});var a=n(85893);n(67294);var s=n(74904),i=n(27544);function l(e){let{permalink:t,title:n,subLabel:l,isNext:r}=e;return(0,a.jsxs)(i.Z,{className:(0,s.Z)("pagination-nav__link",r?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,a.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,a.jsx)("div",{className:"pagination-nav__label",children:n})]})}},62837:function(e,t,n){n.d(t,{Z:()=>r});var a=n("85893");n("67294");var s=n("74904"),i=n("27544");let l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function r(e){let{permalink:t,label:n,count:r,description:d}=e;return(0,a.jsxs)(i.Z,{href:t,title:d,className:(0,s.Z)(l.tag,r?l.tagWithCount:l.tagRegular),children:[n,r&&(0,a.jsx)("span",{children:r})]})}},50905:function(e,t,n){n.d(t,{Z:()=>c});var a=n("85893");n("67294");var s=n("74904"),i=n("1822"),l=n("62837");let r="tags_jXut",d="tag_QGVx";function c(e){let{tags:t}=e;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("b",{children:(0,a.jsx)(i.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,a.jsx)("ul",{className:(0,s.Z)(r,"padding--none","margin-left--sm"),children:t.map(e=>(0,a.jsx)("li",{className:d,children:(0,a.jsx)(l.Z,{...e})},e.permalink))})]})}},28291:function(e,t,n){n.d(t,{P:function(){return s}});var a=n(93934);function s(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{i18n:{currentLocale:t}}=(0,a.Z)(),n=function(){let{i18n:{currentLocale:e,localeConfigs:t}}=(0,a.Z)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}}}]); \ No newline at end of file diff --git a/assets/js/8490a22d.4dda6488.js b/assets/js/8490a22d.4dda6488.js new file mode 100644 index 000000000..9f8ff83bd --- /dev/null +++ b/assets/js/8490a22d.4dda6488.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8219"],{12863:function(e,o,l){l.r(o),l.d(o,{metadata:()=>i,contentTitle:()=>a,default:()=>p,assets:()=>t,toc:()=>c,frontMatter:()=>r});var i=JSON.parse('{"id":"packaging/advanced-config/local-repository","title":"Local Repository","description":"This guide walks you through the steps necessary to tell solbuild how to use your locally built .eopkg files that are not yet in the Solus repository.","source":"@site/docs/packaging/advanced-config/local-repository.md","sourceDirName":"packaging/advanced-config","slug":"/packaging/advanced-config/local-repository","permalink":"/docs/packaging/advanced-config/local-repository","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/local-repository.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Local Repository","summary":"Packaging using a local repository"},"sidebar":"packagingSidebar","previous":{"title":"Eopkg Configuration","permalink":"/docs/packaging/advanced-config/eopkg-configuration"},"next":{"title":"Appstream Metainfo","permalink":"/docs/packaging/appstream-metainfo"}}'),s=l("85893"),n=l("50065");let r={title:"Local Repository",summary:"Packaging using a local repository"},a="Packaging using a local repository",t={},c=[{value:"Install the local profile",id:"install-the-local-profile",level:2},{value:"Using the local repository",id:"using-the-local-repository",level:2},{value:"Copying .eopkg
files to the local repository",id:"copying-eopkg-files-to-the-local-repository",level:3},{value:"Listing locally built eopkg files",id:"listing-locally-built-eopkg-files",level:3},{value:"Using the local repository to build a package",id:"using-the-local-repository-to-build-a-package",level:3},{value:"A streamlined local repository workflow for stack updates",id:"a-streamlined-local-repository-workflow-for-stack-updates",level:3},{value:"Best practices when working with a solbuild local repository",id:"best-practices-when-working-with-a-solbuild-local-repository",level:3},{value:"Installing packages from the local repository index",id:"installing-packages-from-the-local-repository-index",level:2},{value:"Creating or updating the local repository index",id:"creating-or-updating-the-local-repository-index",level:3},{value:"Package resolution priority in eopkg",id:"package-resolution-priority-in-eopkg",level:3},{value:"Adding the local repository index to the eopkg repository database",id:"adding-the-local-repository-index-to-the-eopkg-repository-database",level:3},{value:"Disabling the local solbuild repository in eopkg",id:"disabling-the-local-solbuild-repository-in-eopkg",level:4},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function d(e){let o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"packaging-using-a-local-repository",children:"Packaging using a local repository"})}),"\n",(0,s.jsxs)(o.p,{children:["This guide walks you through the steps necessary to tell ",(0,s.jsx)(o.code,{children:"solbuild"})," how to use your locally built ",(0,s.jsx)(o.code,{children:".eopkg"})," files that are not yet in the Solus repository."]}),"\n",(0,s.jsx)(o.admonition,{type:"note",children:(0,s.jsxs)(o.p,{children:["It is not necessary to use a local repository to test most package submissions. The easier and recommended way is to install the ",(0,s.jsx)(o.code,{children:".eopkg"})," files created when a package is built. This procedure is intended for use with stack upgrades, rebuilds, or new packages that need new dependencies that are not yet in the repository."]})}),"\n",(0,s.jsxs)(o.p,{children:["We assume you have worked through the ",(0,s.jsx)(o.a,{href:"/docs/packaging",children:"packaging"})," material for creating a package with ",(0,s.jsx)(o.code,{children:"solbuild"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"install-the-local-profile",children:"Install the local profile"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install solbuild-config-local-unstable\n"})}),"\n",(0,s.jsxs)(o.p,{children:["You will also need to ensure that your repository is fully up to date. See ",(0,s.jsx)(o.a,{href:"/docs/packaging/update-dev-environment",children:"Update Your Development Environment"})]}),"\n",(0,s.jsx)(o.h2,{id:"using-the-local-repository",children:"Using the local repository"}),"\n",(0,s.jsxs)(o.p,{children:["The local repository index and any local eopkg files are stored in ",(0,s.jsx)(o.code,{children:"/var/lib/solbuild/local/"})]}),"\n",(0,s.jsxs)(o.h3,{id:"copying-eopkg-files-to-the-local-repository",children:["Copying ",(0,s.jsx)(o.code,{children:".eopkg"})," files to the local repository"]}),"\n",(0,s.jsxs)(o.p,{children:["To use your locally built ",(0,s.jsx)(o.code,{children:".eopkg"})," package files as dependencies for another package, you must copy the regular package files, and any accompanying ",(0,s.jsx)(o.code,{children:"-devel"})," package files to the ",(0,s.jsx)(o.code,{children:"/var/lib/solbuild/local"})," local repository directory."]}),"\n",(0,s.jsxs)(o.p,{children:["For example, building the package ",(0,s.jsx)(o.code,{children:"libcmis"})," produces the packages ",(0,s.jsx)(o.code,{children:"libcmis"})," and ",(0,s.jsx)(o.code,{children:"libcmis-devel"}),". Both should be copied to the local repository to build other packages against ",(0,s.jsx)(o.code,{children:"libcmis"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["To copy all ",(0,s.jsx)(o.code,{children:".eopkg"})," files within a directory to the local repository, use the following command:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo cp -v *.eopkg /var/lib/solbuild/local\n"})}),"\n",(0,s.jsx)(o.h3,{id:"listing-locally-built-eopkg-files",children:"Listing locally built eopkg files"}),"\n",(0,s.jsx)(o.p,{children:"Use this to list all index and eopkg files in the local repository:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"go-task list-local\n"})}),"\n",(0,s.jsx)(o.h3,{id:"using-the-local-repository-to-build-a-package",children:"Using the local repository to build a package"}),"\n",(0,s.jsxs)(o.p,{children:["With the ",(0,s.jsx)(o.code,{children:".eopkg"})," files now present in the local repository, you can use them to build a package by running ",(0,s.jsx)(o.code,{children:"go-task build-local"}),", rather than just ",(0,s.jsx)(o.code,{children:"go-task"}),", and ",(0,s.jsx)(o.code,{children:"solbuild"})," will prefer your packages over packages found in the Solus repository."]}),"\n",(0,s.jsxs)(o.p,{children:["Every time you run ",(0,s.jsx)(o.code,{children:"go-task build-local"}),", all ",(0,s.jsx)(o.code,{children:".eopkg"})," files in the local repository will be re-indexed."]}),"\n",(0,s.jsx)(o.h3,{id:"a-streamlined-local-repository-workflow-for-stack-updates",children:"A streamlined local repository workflow for stack updates"}),"\n",(0,s.jsx)(o.p,{children:"If you know ahead of time that you are going to need to put the package files from the current build into the local repository as dependencies for subsequent builds, you can use:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"go-task build-localcp\n"})}),"\n",(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.code,{children:"build-localcp"})," task will:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Build the current package against any existing packages in your local repository."}),"\n",(0,s.jsx)(o.li,{children:"Copy the newly built package files to your local repository."}),"\n",(0,s.jsx)(o.li,{children:"Re-index your local repository."}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.code,{children:"build-localcp"})," workflow can be very convenient when you are doing stack updates."]}),"\n",(0,s.jsx)(o.h3,{id:"best-practices-when-working-with-a-solbuild-local-repository",children:"Best practices when working with a solbuild local repository"}),"\n",(0,s.jsx)(o.p,{children:"There are some important things to know when working with local repositories, as they may lead to issues later on."}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"solbuild"})," will use your version of a package from the local repository regardless of whether there's a higher release in the Solus repository. Therefore:","\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["Only use the ",(0,s.jsx)(o.code,{children:"build-local"})," or ",(0,s.jsx)(o.code,{children:"build-localcp"})," tasks when required."]}),"\n",(0,s.jsxs)(o.li,{children:["Old packages in the local repository can be removed with the ",(0,s.jsx)(o.code,{children:"clean-local"})," task:","\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"go-task clean-local\n"})}),"\n","Note that the ",(0,s.jsx)(o.code,{children:"clean-local"})," task will automatically re-index the (now empty) local repository."]}),"\n",(0,s.jsxs)(o.li,{children:["If a package is already installed in the ",(0,s.jsx)(o.code,{children:"solbuild"})," image, the release number of the updated version must be higher for it to be installed and used as a dependency at build time."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(o.h2,{id:"installing-packages-from-the-local-repository-index",children:"Installing packages from the local repository index"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg"})," supports resolving packages from more than one repository. This can be used to configure ",(0,s.jsx)(o.code,{children:"eopkg"})," to prefer installing local repository packages over packages from the Solus repository."]}),"\n",(0,s.jsxs)(o.p,{children:["This requires an existing local repository index. If you have used the command ",(0,s.jsx)(o.code,{children:"go-task build-local"}),", then an index was created automatically. Otherwise, you must create one."]}),"\n",(0,s.jsx)(o.h3,{id:"creating-or-updating-the-local-repository-index",children:"Creating or updating the local repository index"}),"\n",(0,s.jsxs)(o.p,{children:["To generate or refresh the ",(0,s.jsx)(o.code,{children:"eopkg"})," index in ",(0,s.jsx)(o.code,{children:"/var/lib/solbuild/local"}),", use the following command:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"go-task build-localindex\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Or, if you have our ",(0,s.jsx)(o.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," set up, you get the same result by running:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"localrepo_reindex\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Keep in mind that the index needs to be refreshed whenever you add or remove locally built packages to your local repository. Otherwise, ",(0,s.jsx)(o.code,{children:"eopkg"})," won't know that new packages are available or have been removed from the local repository."]}),"\n",(0,s.jsx)(o.h3,{id:"package-resolution-priority-in-eopkg",children:"Package resolution priority in eopkg"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg"})," will always prefer packages from the topmost repository listed with ",(0,s.jsx)(o.code,{children:"eopkg lr"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:["In other words, if a package exists both in the local repository and the Solus repository, ",(0,s.jsx)(o.code,{children:"eopkg"})," will only consider the package from the first repository listed with ",(0,s.jsx)(o.code,{children:"eopkg lr"})," ",(0,s.jsx)(o.em,{children:"regardless of its release number"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"adding-the-local-repository-index-to-the-eopkg-repository-database",children:"Adding the local repository index to the eopkg repository database"}),"\n",(0,s.jsxs)(o.p,{children:["The easiest way to add the local repository index to the list of repositories known to ",(0,s.jsx)(o.code,{children:"eopkg"}),", in the correct order, is to add the local repository and then ",(0,s.jsx)(o.em,{children:"re-add"})," the official Solus repository:"]}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["First, let's list the repositories currently known to ",(0,s.jsx)(o.code,{children:"eopkg"})," with ",(0,s.jsx)(o.code,{children:"eopkg lr"}),". This should produce output similar to:"]}),"\n"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"Solus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,s.jsxs)(o.ol,{start:"2",children:["\n",(0,s.jsx)(o.li,{children:"Now the repositories need to be added to account for the desired dependency resolution order:"}),"\n"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nsudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,s.jsx)(o.p,{children:"This should yield output similar to:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"$ sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nRepo Local added to system.\nUpdating repository: Local\nPackage database updated.\n$ sudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\nRepo already present with name Solus and same URL. Removing first.\nRepo Solus added to system.\nUpdating repository: Solus\neopkg-index.xml.xz.sha1sum (40.0 B)100% 765.61 KB/s [00:00:00] [complete]\neopkg-index.xml.xz (2.1 MB)100% 914.38 KB/s [00:00:01] [complete]\nPackage database updated.\n"})}),"\n",(0,s.jsxs)(o.ol,{start:"3",children:["\n",(0,s.jsxs)(o.li,{children:["Check that the dependency resolution order is correct so that packages from the local ",(0,s.jsx)(o.code,{children:"solbuild"})," repository are preferred over the upstream Solus repository."]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg lr"})," should yield output similar to:"]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"$ eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,s.jsx)(o.h4,{id:"disabling-the-local-solbuild-repository-in-eopkg",children:"Disabling the local solbuild repository in eopkg"}),"\n",(0,s.jsxs)(o.p,{children:['To reset the system to use only packages from the official Solus repository, disable the "Local" ',(0,s.jsx)(o.code,{children:"eopkg"})," repository using the command ",(0,s.jsx)(o.code,{children:"sudo eopkg disable-repo Local"}),"."]}),"\n",(0,s.jsx)(o.p,{children:"The output should look similar to:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"$ sudo eopkg disable-repo Local\n$ sudo eopkg lr\nLocal [inactive]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,s.jsxs)(o.p,{children:['The "Local" ',(0,s.jsx)(o.code,{children:"eopkg"})," repository can be re-enabled with ",(0,s.jsx)(o.code,{children:"sudo eopkg enable-repo Local"}),"."]}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{children:"$ sudo eopkg enable-repo Local\n$ sudo eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,s.jsx)(o.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,s.jsx)(o.p,{children:"Congratulations on making it this far! Your system should now be ready for convenient deployment and testing of locally built packages."})]})}function p(e={}){let{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},50065:function(e,o,l){l.d(o,{Z:function(){return a},a:function(){return r}});var i=l(67294);let s={},n=i.createContext(s);function r(e){let o=i.useContext(n);return i.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8490a22d.bf17f908.js b/assets/js/8490a22d.bf17f908.js deleted file mode 100644 index 6d1d766a4..000000000 --- a/assets/js/8490a22d.bf17f908.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8575],{5734:(e,o,l)=>{l.r(o),l.d(o,{assets:()=>t,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=l(85893),s=l(11151);const n={title:"Local Repository",summary:"Packaging using a local repository"},r="Packaging using a local repository",a={id:"packaging/advanced-config/local-repository",title:"Local Repository",description:"This guide walks you through the steps necessary to tell solbuild how to use your locally built .eopkg files that are not yet in the Solus repository.",source:"@site/docs/packaging/advanced-config/local-repository.md",sourceDirName:"packaging/advanced-config",slug:"/packaging/advanced-config/local-repository",permalink:"/docs/packaging/advanced-config/local-repository",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/local-repository.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Local Repository",summary:"Packaging using a local repository"},sidebar:"packagingSidebar",previous:{title:"Eopkg Configuration",permalink:"/docs/packaging/advanced-config/eopkg-configuration"},next:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"}},t={},c=[{value:"Install the local profile",id:"install-the-local-profile",level:2},{value:"Using the local repository",id:"using-the-local-repository",level:2},{value:"Copying.eopkg
files to the local repository",id:"copying-eopkg-files-to-the-local-repository",level:3},{value:"Listing locally built eopkg files",id:"listing-locally-built-eopkg-files",level:3},{value:"Using the local repository to build a package",id:"using-the-local-repository-to-build-a-package",level:3},{value:"A streamlined local repository workflow for stack updates",id:"a-streamlined-local-repository-workflow-for-stack-updates",level:3},{value:"Best practices when working with a solbuild local repository",id:"best-practices-when-working-with-a-solbuild-local-repository",level:3},{value:"Installing packages from the local repository index",id:"installing-packages-from-the-local-repository-index",level:2},{value:"Creating or updating the local repository index",id:"creating-or-updating-the-local-repository-index",level:3},{value:"Package resolution priority in eopkg",id:"package-resolution-priority-in-eopkg",level:3},{value:"Adding the local repository index to the eopkg repository database",id:"adding-the-local-repository-index-to-the-eopkg-repository-database",level:3},{value:"Disabling the local solbuild repository in eopkg",id:"disabling-the-local-solbuild-repository-in-eopkg",level:4},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function d(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"packaging-using-a-local-repository",children:"Packaging using a local repository"})}),"\n",(0,i.jsxs)(o.p,{children:["This guide walks you through the steps necessary to tell ",(0,i.jsx)(o.code,{children:"solbuild"})," how to use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," files that are not yet in the Solus repository."]}),"\n",(0,i.jsx)(o.admonition,{type:"note",children:(0,i.jsxs)(o.p,{children:["It is not necessary to use a local repository to test most package submissions. The easier and recommended way is to install the ",(0,i.jsx)(o.code,{children:".eopkg"})," files created when a package is built. This procedure is intended for use with stack upgrades, rebuilds, or new packages that need new dependencies that are not yet in the repository."]})}),"\n",(0,i.jsxs)(o.p,{children:["We assume you have worked through the ",(0,i.jsx)(o.a,{href:"/docs/packaging",children:"packaging"})," material for creating a package with ",(0,i.jsx)(o.code,{children:"solbuild"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"install-the-local-profile",children:"Install the local profile"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install solbuild-config-local-unstable\n"})}),"\n",(0,i.jsxs)(o.p,{children:["You will also need to ensure that your repository is fully up to date. See ",(0,i.jsx)(o.a,{href:"/docs/packaging/update-dev-environment",children:"Update Your Development Environment"})]}),"\n",(0,i.jsx)(o.h2,{id:"using-the-local-repository",children:"Using the local repository"}),"\n",(0,i.jsxs)(o.p,{children:["The local repository index and any local eopkg files are stored in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local/"})]}),"\n",(0,i.jsxs)(o.h3,{id:"copying-eopkg-files-to-the-local-repository",children:["Copying ",(0,i.jsx)(o.code,{children:".eopkg"})," files to the local repository"]}),"\n",(0,i.jsxs)(o.p,{children:["To use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," package files as dependencies for another package, you must copy the regular package files, and any accompanying ",(0,i.jsx)(o.code,{children:"-devel"})," package files to the ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"})," local repository directory."]}),"\n",(0,i.jsxs)(o.p,{children:["For example, building the package ",(0,i.jsx)(o.code,{children:"libcmis"})," produces the packages ",(0,i.jsx)(o.code,{children:"libcmis"})," and ",(0,i.jsx)(o.code,{children:"libcmis-devel"}),". Both should be copied to the local repository to build other packages against ",(0,i.jsx)(o.code,{children:"libcmis"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["To copy all ",(0,i.jsx)(o.code,{children:".eopkg"})," files within a directory to the local repository, use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo cp -v *.eopkg /var/lib/solbuild/local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"listing-locally-built-eopkg-files",children:"Listing locally built eopkg files"}),"\n",(0,i.jsx)(o.p,{children:"Use this to list all index and eopkg files in the local repository:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task list-local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"using-the-local-repository-to-build-a-package",children:"Using the local repository to build a package"}),"\n",(0,i.jsxs)(o.p,{children:["With the ",(0,i.jsx)(o.code,{children:".eopkg"})," files now present in the local repository, you can use them to build a package by running ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", rather than just ",(0,i.jsx)(o.code,{children:"go-task"}),", and ",(0,i.jsx)(o.code,{children:"solbuild"})," will prefer your packages over packages found in the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["Every time you run ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", all ",(0,i.jsx)(o.code,{children:".eopkg"})," files in the local repository will be re-indexed."]}),"\n",(0,i.jsx)(o.h3,{id:"a-streamlined-local-repository-workflow-for-stack-updates",children:"A streamlined local repository workflow for stack updates"}),"\n",(0,i.jsx)(o.p,{children:"If you know ahead of time that you are going to need to put the package files from the current build into the local repository as dependencies for subsequent builds, you can use:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localcp\n"})}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," task will:"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Build the current package against any existing packages in your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Copy the newly built package files to your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Re-index your local repository."}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," workflow can be very convenient when you are doing stack updates."]}),"\n",(0,i.jsx)(o.h3,{id:"best-practices-when-working-with-a-solbuild-local-repository",children:"Best practices when working with a solbuild local repository"}),"\n",(0,i.jsx)(o.p,{children:"There are some important things to know when working with local repositories, as they may lead to issues later on."}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"solbuild"})," will use your version of a package from the local repository regardless of whether there's a higher release in the Solus repository. Therefore:","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Only use the ",(0,i.jsx)(o.code,{children:"build-local"})," or ",(0,i.jsx)(o.code,{children:"build-localcp"})," tasks when required."]}),"\n",(0,i.jsxs)(o.li,{children:["Old packages in the local repository can be removed with the ",(0,i.jsx)(o.code,{children:"clean-local"})," task:","\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task clean-local\n"})}),"\n","Note that the ",(0,i.jsx)(o.code,{children:"clean-local"})," task will automatically re-index the (now empty) local repository."]}),"\n",(0,i.jsxs)(o.li,{children:["If a package is already installed in the ",(0,i.jsx)(o.code,{children:"solbuild"})," image, the release number of the updated version must be higher for it to be installed and used as a dependency at build time."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"installing-packages-from-the-local-repository-index",children:"Installing packages from the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," supports resolving packages from more than one repository. This can be used to configure ",(0,i.jsx)(o.code,{children:"eopkg"})," to prefer installing local repository packages over packages from the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["This requires an existing local repository index. If you have used the command ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", then an index was created automatically. Otherwise, you must create one."]}),"\n",(0,i.jsx)(o.h3,{id:"creating-or-updating-the-local-repository-index",children:"Creating or updating the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:["To generate or refresh the ",(0,i.jsx)(o.code,{children:"eopkg"})," index in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"}),", use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Or, if you have our ",(0,i.jsx)(o.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," set up, you get the same result by running:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"localrepo_reindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Keep in mind that the index needs to be refreshed whenever you add or remove locally built packages to your local repository. Otherwise, ",(0,i.jsx)(o.code,{children:"eopkg"})," won't know that new packages are available or have been removed from the local repository."]}),"\n",(0,i.jsx)(o.h3,{id:"package-resolution-priority-in-eopkg",children:"Package resolution priority in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," will always prefer packages from the topmost repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["In other words, if a package exists both in the local repository and the Solus repository, ",(0,i.jsx)(o.code,{children:"eopkg"})," will only consider the package from the first repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"})," ",(0,i.jsx)(o.em,{children:"regardless of its release number"}),"."]}),"\n",(0,i.jsx)(o.h3,{id:"adding-the-local-repository-index-to-the-eopkg-repository-database",children:"Adding the local repository index to the eopkg repository database"}),"\n",(0,i.jsxs)(o.p,{children:["The easiest way to add the local repository index to the list of repositories known to ",(0,i.jsx)(o.code,{children:"eopkg"}),", in the correct order, is to add the local repository and then ",(0,i.jsx)(o.em,{children:"re-add"})," the official Solus repository:"]}),"\n",(0,i.jsxs)(o.ol,{children:["\n",(0,i.jsxs)(o.li,{children:["First, let's list the repositories currently known to ",(0,i.jsx)(o.code,{children:"eopkg"})," with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),". This should produce output similar to:"]}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"Solus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"2",children:["\n",(0,i.jsx)(o.li,{children:"Now the repositories need to be added to account for the desired dependency resolution order:"}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nsudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.p,{children:"This should yield output similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nRepo Local added to system.\nUpdating repository: Local\nPackage database updated.\n$ sudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\nRepo already present with name Solus and same URL. Removing first.\nRepo Solus added to system.\nUpdating repository: Solus\neopkg-index.xml.xz.sha1sum (40.0 B)100% 765.61 KB/s [00:00:00] [complete]\neopkg-index.xml.xz (2.1 MB)100% 914.38 KB/s [00:00:01] [complete]\nPackage database updated.\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"3",children:["\n",(0,i.jsxs)(o.li,{children:["Check that the dependency resolution order is correct so that packages from the local ",(0,i.jsx)(o.code,{children:"solbuild"})," repository are preferred over the upstream Solus repository."]}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg lr"})," should yield output similar to:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h4,{id:"disabling-the-local-solbuild-repository-in-eopkg",children:"Disabling the local solbuild repository in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:['To reset the system to use only packages from the official Solus repository, disable the "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository using the command ",(0,i.jsx)(o.code,{children:"sudo eopkg disable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"The output should look similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg disable-repo Local\n$ sudo eopkg lr\nLocal [inactive]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.p,{children:['The "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository can be re-enabled with ",(0,i.jsx)(o.code,{children:"sudo eopkg enable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg enable-repo Local\n$ sudo eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,i.jsx)(o.p,{children:"Congratulations on making it this far! Your system should now be ready for convenient deployment and testing of locally built packages."})]})}function p(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,l)=>{l.d(o,{Z:()=>a,a:()=>r});var i=l(67294);const s={},n=i.createContext(s);function r(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/88a83a8c.9ab002a9.js b/assets/js/88a83a8c.9ab002a9.js deleted file mode 100644 index ecbb42c99..000000000 --- a/assets/js/88a83a8c.9ab002a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1242],{65574:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>r,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(85893),a=t(11151);const o={title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},i="KDE Wallet and SSH keys",l={id:"user/software/utilities/kwallet",title:"KDE Wallet",description:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them.",source:"@site/docs/user/software/utilities/kwallet.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/kwallet",permalink:"/docs/user/software/utilities/kwallet",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/kwallet.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},sidebar:"userSidebar",previous:{title:"KSysGuard",permalink:"/docs/user/software/utilities/ksysguard"},next:{title:"Virtualization",permalink:"/docs/category/virtualization"}},r={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"TheSSH_ASKPASS
environment variable",id:"the-ssh_askpass-environment-variable",level:2},{value:"Create~/.config/autostart/ssh-add.desktop
",id:"create-configautostartssh-adddesktop",level:2},{value:"Example",id:"example",level:3},{value:"Set correct permissions",id:"set-correct-permissions",level:3},{value:"Re-log to test your changes",id:"re-log-to-test-your-changes",level:2},{value:"Unlock SSH key passphrases automatically on login",id:"unlock-ssh-key-passphrases-automatically-on-login",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"kde-wallet-and-ssh-keys",children:"KDE Wallet and SSH keys"})}),"\n",(0,n.jsx)(s.p,{children:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them."}),"\n",(0,n.jsx)(s.p,{children:"Out of the box, the Solus KDE Plasma Desktop is already configured to use the KDE Wallet PAM module, which unlocks the KDE Wallet on session login."}),"\n",(0,n.jsx)(s.p,{children:"However, additional configuration is needed to make the KDE Wallet manage SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(s.p,{children:"This document assumes that you are familiar with utilising SSH key passphrases."}),"\n",(0,n.jsxs)(s.p,{children:["For more information, see ",(0,n.jsx)(s.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases",children:"working with SSH key passphrases"})]}),"\n",(0,n.jsxs)(s.h2,{id:"the-ssh_askpass-environment-variable",children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable"]}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable tells the SSH subsystem which application to use when prompting the user for SSH key passphrases."]}),"\n",(0,n.jsxs)(s.p,{children:["On the Solus KDE Plasma Desktop spin, ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," is installed out of the box and ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," is set to ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," in the file ",(0,n.jsx)(s.code,{children:"/usr/share/xdg/plasma-workspace/env/50-solus-defaults.sh"})," by default."]}),"\n",(0,n.jsxs)(s.h2,{id:"create-configautostartssh-adddesktop",children:["Create ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})]}),"\n",(0,n.jsxs)(s.p,{children:["The contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})," should reflect the SSH keys you want to manage using the KDE Wallet."]}),"\n",(0,n.jsx)(s.h3,{id:"example",children:"Example"}),"\n",(0,n.jsxs)(s.p,{children:["Below is an example of the contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"}),":"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Tip: The above ssh-add.desktop file will only add the default key ",(0,n.jsx)(s.code,{children:"~/.ssh/id_rsa"}),". Assuming you have different keys named key1, key2 etc you need to change the above desktop file to"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q ~/.ssh/key1 ~/.ssh/key2 ~/.ssh/key3\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsx)(s.h3,{id:"set-correct-permissions",children:"Set correct permissions"}),"\n",(0,n.jsx)(s.p,{children:"After you created your file inside the autostart folder you have to give it the correct permissions"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"chmod 700 ~/.config/autostart/ssh-add.desktop\n"})}),"\n",(0,n.jsx)(s.p,{children:"with this the file should appear inside the autostart settings"}),"\n",(0,n.jsx)(s.h2,{id:"re-log-to-test-your-changes",children:"Re-log to test your changes"}),"\n",(0,n.jsx)(s.p,{children:"After logging out and back in, you should now be prompted by the KDE Wallet to input your SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"unlock-ssh-key-passphrases-automatically-on-login",children:"Unlock SSH key passphrases automatically on login"}),"\n",(0,n.jsx)(s.p,{children:"KDE Wallet supports automatically unlocking your SSH key passphrases on login."}),"\n",(0,n.jsx)(s.p,{children:"For this to work, your KDE Wallet password needs to be identical to your login password."}),"\n",(0,n.jsx)(s.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(s.p,{children:"ssh key doesn't get triggered, you can force this manually by running this command."}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"SSH_ASKPASS=/usr/bin/ksshaskpass ssh-add < /dev/null\n"})})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>i});var n=t(67294);const a={},o=n.createContext(a);function i(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/88a83a8c.c8c11340.js b/assets/js/88a83a8c.c8c11340.js new file mode 100644 index 000000000..c8f8bdd4f --- /dev/null +++ b/assets/js/88a83a8c.c8c11340.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3187"],{23371:function(e,s,t){t.r(s),t.d(s,{metadata:()=>n,contentTitle:()=>l,default:()=>c,assets:()=>r,toc:()=>d,frontMatter:()=>o});var n=JSON.parse('{"id":"user/software/utilities/kwallet","title":"KDE Wallet","description":"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them.","source":"@site/docs/user/software/utilities/kwallet.md","sourceDirName":"user/software/utilities","slug":"/user/software/utilities/kwallet","permalink":"/docs/user/software/utilities/kwallet","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/kwallet.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"KDE Wallet","summary":"A quick introduction to using KWallet on Solus"},"sidebar":"userSidebar","previous":{"title":"KSysGuard","permalink":"/docs/user/software/utilities/ksysguard"},"next":{"title":"Virtualization","permalink":"/docs/category/virtualization"}}'),a=t("85893"),i=t("50065");let o={title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},l="KDE Wallet and SSH keys",r={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"TheSSH_ASKPASS
environment variable",id:"the-ssh_askpass-environment-variable",level:2},{value:"Create~/.config/autostart/ssh-add.desktop
",id:"create-configautostartssh-adddesktop",level:2},{value:"Example",id:"example",level:3},{value:"Set correct permissions",id:"set-correct-permissions",level:3},{value:"Re-log to test your changes",id:"re-log-to-test-your-changes",level:2},{value:"Unlock SSH key passphrases automatically on login",id:"unlock-ssh-key-passphrases-automatically-on-login",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){let s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"kde-wallet-and-ssh-keys",children:"KDE Wallet and SSH keys"})}),"\n",(0,a.jsx)(s.p,{children:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them."}),"\n",(0,a.jsx)(s.p,{children:"Out of the box, the Solus KDE Plasma Desktop is already configured to use the KDE Wallet PAM module, which unlocks the KDE Wallet on session login."}),"\n",(0,a.jsx)(s.p,{children:"However, additional configuration is needed to make the KDE Wallet manage SSH key passphrases."}),"\n",(0,a.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsx)(s.p,{children:"This document assumes that you are familiar with utilising SSH key passphrases."}),"\n",(0,a.jsxs)(s.p,{children:["For more information, see ",(0,a.jsx)(s.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases",children:"working with SSH key passphrases"})]}),"\n",(0,a.jsxs)(s.h2,{id:"the-ssh_askpass-environment-variable",children:["The ",(0,a.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable"]}),"\n",(0,a.jsxs)(s.p,{children:["The ",(0,a.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable tells the SSH subsystem which application to use when prompting the user for SSH key passphrases."]}),"\n",(0,a.jsxs)(s.p,{children:["On the Solus KDE Plasma Desktop spin, ",(0,a.jsx)(s.code,{children:"ksshaskpass"})," is installed out of the box and ",(0,a.jsx)(s.code,{children:"SSH_ASKPASS"})," is set to ",(0,a.jsx)(s.code,{children:"ksshaskpass"})," in the file ",(0,a.jsx)(s.code,{children:"/usr/share/xdg/plasma-workspace/env/50-solus-defaults.sh"})," by default."]}),"\n",(0,a.jsxs)(s.h2,{id:"create-configautostartssh-adddesktop",children:["Create ",(0,a.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})]}),"\n",(0,a.jsxs)(s.p,{children:["The contents of ",(0,a.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})," should reflect the SSH keys you want to manage using the KDE Wallet."]}),"\n",(0,a.jsx)(s.h3,{id:"example",children:"Example"}),"\n",(0,a.jsxs)(s.p,{children:["Below is an example of the contents of ",(0,a.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"}),":"]}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q\nName=ssh-add\nType=Application\n"})}),"\n",(0,a.jsxs)(s.p,{children:["Tip: The above ssh-add.desktop file will only add the default key ",(0,a.jsx)(s.code,{children:"~/.ssh/id_rsa"}),". Assuming you have different keys named key1, key2 etc you need to change the above desktop file to"]}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q ~/.ssh/key1 ~/.ssh/key2 ~/.ssh/key3\nName=ssh-add\nType=Application\n"})}),"\n",(0,a.jsx)(s.h3,{id:"set-correct-permissions",children:"Set correct permissions"}),"\n",(0,a.jsx)(s.p,{children:"After you created your file inside the autostart folder you have to give it the correct permissions"}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"chmod 700 ~/.config/autostart/ssh-add.desktop\n"})}),"\n",(0,a.jsx)(s.p,{children:"with this the file should appear inside the autostart settings"}),"\n",(0,a.jsx)(s.h2,{id:"re-log-to-test-your-changes",children:"Re-log to test your changes"}),"\n",(0,a.jsx)(s.p,{children:"After logging out and back in, you should now be prompted by the KDE Wallet to input your SSH key passphrases."}),"\n",(0,a.jsx)(s.h2,{id:"unlock-ssh-key-passphrases-automatically-on-login",children:"Unlock SSH key passphrases automatically on login"}),"\n",(0,a.jsx)(s.p,{children:"KDE Wallet supports automatically unlocking your SSH key passphrases on login."}),"\n",(0,a.jsx)(s.p,{children:"For this to work, your KDE Wallet password needs to be identical to your login password."}),"\n",(0,a.jsx)(s.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,a.jsx)(s.p,{children:"ssh key doesn't get triggered, you can force this manually by running this command."}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"SSH_ASKPASS=/usr/bin/ksshaskpass ssh-add < /dev/null\n"})})]})}function c(e={}){let{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},50065:function(e,s,t){t.d(s,{Z:function(){return l},a:function(){return o}});var n=t(67294);let a={},i=n.createContext(a);function o(e){let s=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8917.d2a12266.js b/assets/js/8917.d2a12266.js deleted file mode 100644 index ee2a22b1f..000000000 --- a/assets/js/8917.d2a12266.js +++ /dev/null @@ -1,75 +0,0 @@ -/*! For license information please see 8917.d2a12266.js.LICENSE.txt */ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8917],{63186:(e,t,n)=>{n.d(t,{Z:()=>l});n(67294);var o=n(57164),r=n(55361),i=n(85893);function a(e,t){switch(e){case"noicon":case"loaded":return null;case"loading":return(0,r.I)({id:"theme.IdealImageMessage.loading",message:"Loading...",description:"When the full-scale image is loading"});case"load":{const{pickedSrc:e}=t,{size:n}=e,o=n?` (${function(e){const t=["B","KB","MB","GB","TB"];if(0===e)return"n/a";const n=Math.floor(Math.log(e)/Math.log(1024));return 0===n?`${e} ${t[n]}`:`${(e/1024**n).toFixed(1)} ${t[n]}`}(n)})`:"";return(0,r.I)({id:"theme.IdealImageMessage.load",message:"Click to load{sizeMessage}",description:"To prompt users to load the full image. sizeMessage is a parenthesized size figure."},{sizeMessage:o})}case"offline":return(0,r.I)({id:"theme.IdealImageMessage.offline",message:"Your browser is offline. Image not loaded",description:"When the user is viewing an offline document"});case"error":{const{loadInfo:e}=t;return 404===e?(0,r.I)({id:"theme.IdealImageMessage.404error",message:"404. Image not found",description:"When the image is not found"}):(0,r.I)({id:"theme.IdealImageMessage.error",message:"Error. Click to reload",description:"When the image fails to load for unknown error"})}default:throw new Error(`Wrong icon: ${e}`)}}function l(e){const{img:t,...n}=e;return"string"==typeof t||"default"in t?(0,i.jsx)("img",{src:"string"==typeof t?t:t.default,...n}):(0,i.jsx)(o.Z,{...n,height:t.src.height??100,width:t.src.width??100,placeholder:{lqip:t.preSrc},src:t.src.src,srcSet:t.src.images.map((e=>({...e,src:e.path}))),getMessage:a})}},94229:(e,t,n)=>{var o=n(66344);t.Z=void 0;var r=o(n(64938)),i=n(85893),a=(0,r.default)((0,i.jsx)("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"}),"Settings");t.Z=a},39217:(e,t,n)=>{var o=n(66344);t.Z=void 0;var r=o(n(64938)),i=n(85893),a=(0,r.default)((0,i.jsx)("path",{d:"M7 20h4c0 1.1-.9 2-2 2s-2-.9-2-2zm-2-1h8v-2H5v2zm11.5-9.5c0 3.82-2.66 5.86-3.77 6.5H5.27c-1.11-.64-3.77-2.68-3.77-6.5C1.5 5.36 4.86 2 9 2s7.5 3.36 7.5 7.5zm4.87-2.13L20 8l1.37.63L22 10l.63-1.37L24 8l-1.37-.63L22 6l-.63 1.37zM19 6l.94-2.06L22 3l-2.06-.94L19 0l-.94 2.06L16 3l2.06.94L19 6z"}),"TipsAndUpdates");t.Z=a},78146:(e,t,n)=>{n.d(t,{Z:()=>oe});var o=n(80102),r=n(83117),i=n(67294),a=n(86010),l=n(47925),s=n(94780),c=n(41796),u=n(90948),d=n(71657),p=n(11467),f=n(798),h=n(18791);var v=n(90144);const m=i.createContext(null);function g(e,t){var n=Object.create(null);return e&&i.Children.map(e,(function(e){return e})).forEach((function(e){n[e.key]=function(e){return t&&(0,i.isValidElement)(e)?t(e):e}(e)})),n}function b(e,t,n){return null!=n[t]?n[t]:e.props[t]}function y(e,t,n){var o=g(e.children),r=function(e,t){function n(n){return n in t?t[n]:e[n]}e=e||{},t=t||{};var o,r=Object.create(null),i=[];for(var a in e)a in t?i.length&&(r[a]=i,i=[]):i.push(a);var l={};for(var s in t){if(r[s])for(o=0;o{if(!c&&null!=u){const e=setTimeout(u,d);return()=>{clearTimeout(e)}}}),[u,c,d]),(0,R.jsx)("span",{className:h,style:v,children:(0,R.jsx)("span",{className:m})})};var C=n(1588);const P=(0,C.Z)("MuiTouchRipple",["root","ripple","rippleVisible","ripplePulsate","child","childLeaving","childPulsate"]),z=["center","classes","className"];let T,j,k,_,L=e=>e;const $=M(T||(T=L` - 0% { - transform: scale(0); - opacity: 0.1; - } - - 100% { - transform: scale(1); - opacity: 0.3; - } -`)),B=M(j||(j=L` - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - } -`)),I=M(k||(k=L` - 0% { - transform: scale(1); - } - - 50% { - transform: scale(0.92); - } - - 100% { - transform: scale(1); - } -`)),N=(0,u.ZP)("span",{name:"MuiTouchRipple",slot:"Root"})({overflow:"hidden",pointerEvents:"none",position:"absolute",zIndex:0,top:0,right:0,bottom:0,left:0,borderRadius:"inherit"}),W=(0,u.ZP)(Z,{name:"MuiTouchRipple",slot:"Ripple"})(_||(_=L` - opacity: 0; - position: absolute; - - &.${0} { - opacity: 0.3; - transform: scale(1); - animation-name: ${0}; - animation-duration: ${0}ms; - animation-timing-function: ${0}; - } - - &.${0} { - animation-duration: ${0}ms; - } - - & .${0} { - opacity: 1; - display: block; - width: 100%; - height: 100%; - border-radius: 50%; - background-color: currentColor; - } - - & .${0} { - opacity: 0; - animation-name: ${0}; - animation-duration: ${0}ms; - animation-timing-function: ${0}; - } - - & .${0} { - position: absolute; - /* @noflip */ - left: 0px; - top: 0; - animation-name: ${0}; - animation-duration: 2500ms; - animation-timing-function: ${0}; - animation-iteration-count: infinite; - animation-delay: 200ms; - } -`),P.rippleVisible,$,550,(({theme:e})=>e.transitions.easing.easeInOut),P.ripplePulsate,(({theme:e})=>e.transitions.duration.shorter),P.child,P.childLeaving,B,550,(({theme:e})=>e.transitions.easing.easeInOut),P.childPulsate,I,(({theme:e})=>e.transitions.easing.easeInOut)),V=i.forwardRef((function(e,t){const n=(0,d.Z)({props:e,name:"MuiTouchRipple"}),{center:l=!1,classes:s={},className:c}=n,u=(0,o.Z)(n,z),[p,f]=i.useState([]),h=i.useRef(0),v=i.useRef(null);i.useEffect((()=>{v.current&&(v.current(),v.current=null)}),[p]);const m=i.useRef(!1),g=i.useRef(0),b=i.useRef(null),y=i.useRef(null);i.useEffect((()=>()=>{g.current&&clearTimeout(g.current)}),[]);const w=i.useCallback((e=>{const{pulsate:t,rippleX:n,rippleY:o,rippleSize:r,cb:i}=e;f((e=>[...e,(0,R.jsx)(W,{classes:{ripple:(0,a.Z)(s.ripple,P.ripple),rippleVisible:(0,a.Z)(s.rippleVisible,P.rippleVisible),ripplePulsate:(0,a.Z)(s.ripplePulsate,P.ripplePulsate),child:(0,a.Z)(s.child,P.child),childLeaving:(0,a.Z)(s.childLeaving,P.childLeaving),childPulsate:(0,a.Z)(s.childPulsate,P.childPulsate)},timeout:550,pulsate:t,rippleX:n,rippleY:o,rippleSize:r},h.current)])),h.current+=1,v.current=i}),[s]),S=i.useCallback(((e={},t={},n=(()=>{}))=>{const{pulsate:o=!1,center:r=l||t.pulsate,fakeElement:i=!1}=t;if("mousedown"===(null==e?void 0:e.type)&&m.current)return void(m.current=!1);"touchstart"===(null==e?void 0:e.type)&&(m.current=!0);const a=i?null:y.current,s=a?a.getBoundingClientRect():{width:0,height:0,left:0,top:0};let c,u,d;if(r||void 0===e||0===e.clientX&&0===e.clientY||!e.clientX&&!e.touches)c=Math.round(s.width/2),u=Math.round(s.height/2);else{const{clientX:t,clientY:n}=e.touches&&e.touches.length>0?e.touches[0]:e;c=Math.round(t-s.left),u=Math.round(n-s.top)}if(r)d=Math.sqrt((2*s.width**2+s.height**2)/3),d%2==0&&(d+=1);else{const e=2*Math.max(Math.abs((a?a.clientWidth:0)-c),c)+2,t=2*Math.max(Math.abs((a?a.clientHeight:0)-u),u)+2;d=Math.sqrt(e**2+t**2)}null!=e&&e.touches?null===b.current&&(b.current=()=>{w({pulsate:o,rippleX:c,rippleY:u,rippleSize:d,cb:n})},g.current=setTimeout((()=>{b.current&&(b.current(),b.current=null)}),80)):w({pulsate:o,rippleX:c,rippleY:u,rippleSize:d,cb:n})}),[l,w]),E=i.useCallback((()=>{S({},{pulsate:!0})}),[S]),O=i.useCallback(((e,t)=>{if(clearTimeout(g.current),"touchend"===(null==e?void 0:e.type)&&b.current)return b.current(),b.current=null,void(g.current=setTimeout((()=>{O(e,t)})));b.current=null,f((e=>e.length>0?e.slice(1):e)),v.current=t}),[]);return i.useImperativeHandle(t,(()=>({pulsate:E,start:S,stop:O})),[E,S,O]),(0,R.jsx)(N,(0,r.Z)({className:(0,a.Z)(P.root,s.root,c),ref:y},u,{children:(0,R.jsx)(x,{component:null,exit:!0,children:p})}))}));var D=n(34867);function H(e){return(0,D.Z)("MuiButtonBase",e)}const F=(0,C.Z)("MuiButtonBase",["root","disabled","focusVisible"]),A=["action","centerRipple","children","className","component","disabled","disableRipple","disableTouchRipple","focusRipple","focusVisibleClassName","LinkComponent","onBlur","onClick","onContextMenu","onDragLeave","onFocus","onFocusVisible","onKeyDown","onKeyUp","onMouseDown","onMouseLeave","onMouseUp","onTouchEnd","onTouchMove","onTouchStart","tabIndex","TouchRippleProps","touchRippleRef","type"],q=(0,u.ZP)("button",{name:"MuiButtonBase",slot:"Root",overridesResolver:(e,t)=>t.root})({display:"inline-flex",alignItems:"center",justifyContent:"center",position:"relative",boxSizing:"border-box",WebkitTapHighlightColor:"transparent",backgroundColor:"transparent",outline:0,border:0,margin:0,borderRadius:0,padding:0,cursor:"pointer",userSelect:"none",verticalAlign:"middle",MozAppearance:"none",WebkitAppearance:"none",textDecoration:"none",color:"inherit","&::-moz-focus-inner":{borderStyle:"none"},[`&.${F.disabled}`]:{pointerEvents:"none",cursor:"default"},"@media print":{colorAdjust:"exact"}}),U=i.forwardRef((function(e,t){const n=(0,d.Z)({props:e,name:"MuiButtonBase"}),{action:l,centerRipple:c=!1,children:u,className:v,component:m="button",disabled:g=!1,disableRipple:b=!1,disableTouchRipple:y=!1,focusRipple:w=!1,LinkComponent:S="a",onBlur:x,onClick:E,onContextMenu:O,onDragLeave:M,onFocus:Z,onFocusVisible:C,onKeyDown:P,onKeyUp:z,onMouseDown:T,onMouseLeave:j,onMouseUp:k,onTouchEnd:_,onTouchMove:L,onTouchStart:$,tabIndex:B=0,TouchRippleProps:I,touchRippleRef:N,type:W}=n,D=(0,o.Z)(n,A),F=i.useRef(null),U=i.useRef(null),K=(0,p.Z)(U,N),{isFocusVisibleRef:X,onFocus:Y,onBlur:G,ref:J}=(0,h.Z)(),[Q,ee]=i.useState(!1);g&&Q&&ee(!1),i.useImperativeHandle(l,(()=>({focusVisible:()=>{ee(!0),F.current.focus()}})),[]);const[te,ne]=i.useState(!1);i.useEffect((()=>{ne(!0)}),[]);const oe=te&&!b&&!g;function re(e,t,n=y){return(0,f.Z)((o=>{t&&t(o);return!n&&U.current&&U.current[e](o),!0}))}i.useEffect((()=>{Q&&w&&!b&&te&&U.current.pulsate()}),[b,w,Q,te]);const ie=re("start",T),ae=re("stop",O),le=re("stop",M),se=re("stop",k),ce=re("stop",(e=>{Q&&e.preventDefault(),j&&j(e)})),ue=re("start",$),de=re("stop",_),pe=re("stop",L),fe=re("stop",(e=>{G(e),!1===X.current&&ee(!1),x&&x(e)}),!1),he=(0,f.Z)((e=>{F.current||(F.current=e.currentTarget),Y(e),!0===X.current&&(ee(!0),C&&C(e)),Z&&Z(e)})),ve=()=>{const e=F.current;return m&&"button"!==m&&!("A"===e.tagName&&e.href)},me=i.useRef(!1),ge=(0,f.Z)((e=>{w&&!me.current&&Q&&U.current&&" "===e.key&&(me.current=!0,U.current.stop(e,(()=>{U.current.start(e)}))),e.target===e.currentTarget&&ve()&&" "===e.key&&e.preventDefault(),P&&P(e),e.target===e.currentTarget&&ve()&&"Enter"===e.key&&!g&&(e.preventDefault(),E&&E(e))})),be=(0,f.Z)((e=>{w&&" "===e.key&&U.current&&Q&&!e.defaultPrevented&&(me.current=!1,U.current.stop(e,(()=>{U.current.pulsate(e)}))),z&&z(e),E&&e.target===e.currentTarget&&ve()&&" "===e.key&&!e.defaultPrevented&&E(e)}));let ye=m;"button"===ye&&(D.href||D.to)&&(ye=S);const we={};"button"===ye?(we.type=void 0===W?"button":W,we.disabled=g):(D.href||D.to||(we.role="button"),g&&(we["aria-disabled"]=g));const Se=(0,p.Z)(t,J,F);const xe=(0,r.Z)({},n,{centerRipple:c,component:m,disabled:g,disableRipple:b,disableTouchRipple:y,focusRipple:w,tabIndex:B,focusVisible:Q}),Ee=(e=>{const{disabled:t,focusVisible:n,focusVisibleClassName:o,classes:r}=e,i={root:["root",t&&"disabled",n&&"focusVisible"]},a=(0,s.Z)(i,H,r);return n&&o&&(a.root+=` ${o}`),a})(xe);return(0,R.jsxs)(q,(0,r.Z)({as:ye,className:(0,a.Z)(Ee.root,v),ownerState:xe,onBlur:fe,onClick:E,onContextMenu:ae,onFocus:he,onKeyDown:ge,onKeyUp:be,onMouseDown:ie,onMouseLeave:ce,onMouseUp:se,onDragLeave:le,onTouchEnd:de,onTouchMove:pe,onTouchStart:ue,ref:Se,tabIndex:g?-1:B,type:W},we,D,{children:[u,oe?(0,R.jsx)(V,(0,r.Z)({ref:K,center:c},I)):null]}))}));var K=n(98216);function X(e){return(0,D.Z)("MuiButton",e)}const Y=(0,C.Z)("MuiButton",["root","text","textInherit","textPrimary","textSecondary","textSuccess","textError","textInfo","textWarning","outlined","outlinedInherit","outlinedPrimary","outlinedSecondary","outlinedSuccess","outlinedError","outlinedInfo","outlinedWarning","contained","containedInherit","containedPrimary","containedSecondary","containedSuccess","containedError","containedInfo","containedWarning","disableElevation","focusVisible","disabled","colorInherit","textSizeSmall","textSizeMedium","textSizeLarge","outlinedSizeSmall","outlinedSizeMedium","outlinedSizeLarge","containedSizeSmall","containedSizeMedium","containedSizeLarge","sizeMedium","sizeSmall","sizeLarge","fullWidth","startIcon","endIcon","iconSizeSmall","iconSizeMedium","iconSizeLarge"]);var G=n(98363);const J=["children","color","component","className","disabled","disableElevation","disableFocusRipple","endIcon","focusVisibleClassName","fullWidth","size","startIcon","type","variant"],Q=e=>(0,r.Z)({},"small"===e.size&&{"& > *:nth-of-type(1)":{fontSize:18}},"medium"===e.size&&{"& > *:nth-of-type(1)":{fontSize:20}},"large"===e.size&&{"& > *:nth-of-type(1)":{fontSize:22}}),ee=(0,u.ZP)(U,{shouldForwardProp:e=>(0,u.FO)(e)||"classes"===e,name:"MuiButton",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,t[n.variant],t[`${n.variant}${(0,K.Z)(n.color)}`],t[`size${(0,K.Z)(n.size)}`],t[`${n.variant}Size${(0,K.Z)(n.size)}`],"inherit"===n.color&&t.colorInherit,n.disableElevation&&t.disableElevation,n.fullWidth&&t.fullWidth]}})((({theme:e,ownerState:t})=>{var n,o;const i="light"===e.palette.mode?e.palette.grey[300]:e.palette.grey[800],a="light"===e.palette.mode?e.palette.grey.A100:e.palette.grey[700];return(0,r.Z)({},e.typography.button,{minWidth:64,padding:"6px 16px",borderRadius:(e.vars||e).shape.borderRadius,transition:e.transitions.create(["background-color","box-shadow","border-color","color"],{duration:e.transitions.duration.short}),"&:hover":(0,r.Z)({textDecoration:"none",backgroundColor:e.vars?`rgba(${e.vars.palette.text.primaryChannel} / ${e.vars.palette.action.hoverOpacity})`:(0,c.Fq)(e.palette.text.primary,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},"text"===t.variant&&"inherit"!==t.color&&{backgroundColor:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / ${e.vars.palette.action.hoverOpacity})`:(0,c.Fq)(e.palette[t.color].main,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},"outlined"===t.variant&&"inherit"!==t.color&&{border:`1px solid ${(e.vars||e).palette[t.color].main}`,backgroundColor:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / ${e.vars.palette.action.hoverOpacity})`:(0,c.Fq)(e.palette[t.color].main,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},"contained"===t.variant&&{backgroundColor:e.vars?e.vars.palette.Button.inheritContainedHoverBg:a,boxShadow:(e.vars||e).shadows[4],"@media (hover: none)":{boxShadow:(e.vars||e).shadows[2],backgroundColor:(e.vars||e).palette.grey[300]}},"contained"===t.variant&&"inherit"!==t.color&&{backgroundColor:(e.vars||e).palette[t.color].dark,"@media (hover: none)":{backgroundColor:(e.vars||e).palette[t.color].main}}),"&:active":(0,r.Z)({},"contained"===t.variant&&{boxShadow:(e.vars||e).shadows[8]}),[`&.${Y.focusVisible}`]:(0,r.Z)({},"contained"===t.variant&&{boxShadow:(e.vars||e).shadows[6]}),[`&.${Y.disabled}`]:(0,r.Z)({color:(e.vars||e).palette.action.disabled},"outlined"===t.variant&&{border:`1px solid ${(e.vars||e).palette.action.disabledBackground}`},"contained"===t.variant&&{color:(e.vars||e).palette.action.disabled,boxShadow:(e.vars||e).shadows[0],backgroundColor:(e.vars||e).palette.action.disabledBackground})},"text"===t.variant&&{padding:"6px 8px"},"text"===t.variant&&"inherit"!==t.color&&{color:(e.vars||e).palette[t.color].main},"outlined"===t.variant&&{padding:"5px 15px",border:"1px solid currentColor"},"outlined"===t.variant&&"inherit"!==t.color&&{color:(e.vars||e).palette[t.color].main,border:e.vars?`1px solid rgba(${e.vars.palette[t.color].mainChannel} / 0.5)`:`1px solid ${(0,c.Fq)(e.palette[t.color].main,.5)}`},"contained"===t.variant&&{color:e.vars?e.vars.palette.text.primary:null==(n=(o=e.palette).getContrastText)?void 0:n.call(o,e.palette.grey[300]),backgroundColor:e.vars?e.vars.palette.Button.inheritContainedBg:i,boxShadow:(e.vars||e).shadows[2]},"contained"===t.variant&&"inherit"!==t.color&&{color:(e.vars||e).palette[t.color].contrastText,backgroundColor:(e.vars||e).palette[t.color].main},"inherit"===t.color&&{color:"inherit",borderColor:"currentColor"},"small"===t.size&&"text"===t.variant&&{padding:"4px 5px",fontSize:e.typography.pxToRem(13)},"large"===t.size&&"text"===t.variant&&{padding:"8px 11px",fontSize:e.typography.pxToRem(15)},"small"===t.size&&"outlined"===t.variant&&{padding:"3px 9px",fontSize:e.typography.pxToRem(13)},"large"===t.size&&"outlined"===t.variant&&{padding:"7px 21px",fontSize:e.typography.pxToRem(15)},"small"===t.size&&"contained"===t.variant&&{padding:"4px 10px",fontSize:e.typography.pxToRem(13)},"large"===t.size&&"contained"===t.variant&&{padding:"8px 22px",fontSize:e.typography.pxToRem(15)},t.fullWidth&&{width:"100%"})}),(({ownerState:e})=>e.disableElevation&&{boxShadow:"none","&:hover":{boxShadow:"none"},[`&.${Y.focusVisible}`]:{boxShadow:"none"},"&:active":{boxShadow:"none"},[`&.${Y.disabled}`]:{boxShadow:"none"}})),te=(0,u.ZP)("span",{name:"MuiButton",slot:"StartIcon",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.startIcon,t[`iconSize${(0,K.Z)(n.size)}`]]}})((({ownerState:e})=>(0,r.Z)({display:"inherit",marginRight:8,marginLeft:-4},"small"===e.size&&{marginLeft:-2},Q(e)))),ne=(0,u.ZP)("span",{name:"MuiButton",slot:"EndIcon",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.endIcon,t[`iconSize${(0,K.Z)(n.size)}`]]}})((({ownerState:e})=>(0,r.Z)({display:"inherit",marginRight:-4,marginLeft:8},"small"===e.size&&{marginRight:-2},Q(e)))),oe=i.forwardRef((function(e,t){const n=i.useContext(G.Z),c=(0,l.Z)(n,e),u=(0,d.Z)({props:c,name:"MuiButton"}),{children:p,color:f="primary",component:h="button",className:v,disabled:m=!1,disableElevation:g=!1,disableFocusRipple:b=!1,endIcon:y,focusVisibleClassName:w,fullWidth:S=!1,size:x="medium",startIcon:E,type:O,variant:M="text"}=u,Z=(0,o.Z)(u,J),C=(0,r.Z)({},u,{color:f,component:h,disabled:m,disableElevation:g,disableFocusRipple:b,fullWidth:S,size:x,type:O,variant:M}),P=(e=>{const{color:t,disableElevation:n,fullWidth:o,size:i,variant:a,classes:l}=e,c={root:["root",a,`${a}${(0,K.Z)(t)}`,`size${(0,K.Z)(i)}`,`${a}Size${(0,K.Z)(i)}`,"inherit"===t&&"colorInherit",n&&"disableElevation",o&&"fullWidth"],label:["label"],startIcon:["startIcon",`iconSize${(0,K.Z)(i)}`],endIcon:["endIcon",`iconSize${(0,K.Z)(i)}`]},u=(0,s.Z)(c,X,l);return(0,r.Z)({},l,u)})(C),z=E&&(0,R.jsx)(te,{className:P.startIcon,ownerState:C,children:E}),T=y&&(0,R.jsx)(ne,{className:P.endIcon,ownerState:C,children:y});return(0,R.jsxs)(ee,(0,r.Z)({ownerState:C,className:(0,a.Z)(n.className,P.root,v),component:h,disabled:m,focusRipple:!b,focusVisibleClassName:(0,a.Z)(P.focusVisible,w),ref:t,type:O},Z,{classes:P,children:[z,p,T]}))}))},56863:(e,t,n)=>{n.d(t,{Z:()=>w});var o=n(80102),r=n(83117),i=n(67294),a=n(86010),l=n(94780),s=n(41796),c=n(98216),u=n(90948),d=n(71657),p=n(1588),f=n(34867);function h(e){return(0,f.Z)("MuiButtonGroup",e)}const v=(0,p.Z)("MuiButtonGroup",["root","contained","outlined","text","disableElevation","disabled","fullWidth","vertical","grouped","groupedHorizontal","groupedVertical","groupedText","groupedTextHorizontal","groupedTextVertical","groupedTextPrimary","groupedTextSecondary","groupedOutlined","groupedOutlinedHorizontal","groupedOutlinedVertical","groupedOutlinedPrimary","groupedOutlinedSecondary","groupedContained","groupedContainedHorizontal","groupedContainedVertical","groupedContainedPrimary","groupedContainedSecondary"]);var m=n(98363),g=n(85893);const b=["children","className","color","component","disabled","disableElevation","disableFocusRipple","disableRipple","fullWidth","orientation","size","variant"],y=(0,u.ZP)("div",{name:"MuiButtonGroup",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[{[`& .${v.grouped}`]:t.grouped},{[`& .${v.grouped}`]:t[`grouped${(0,c.Z)(n.orientation)}`]},{[`& .${v.grouped}`]:t[`grouped${(0,c.Z)(n.variant)}`]},{[`& .${v.grouped}`]:t[`grouped${(0,c.Z)(n.variant)}${(0,c.Z)(n.orientation)}`]},{[`& .${v.grouped}`]:t[`grouped${(0,c.Z)(n.variant)}${(0,c.Z)(n.color)}`]},t.root,t[n.variant],!0===n.disableElevation&&t.disableElevation,n.fullWidth&&t.fullWidth,"vertical"===n.orientation&&t.vertical]}})((({theme:e,ownerState:t})=>(0,r.Z)({display:"inline-flex",borderRadius:(e.vars||e).shape.borderRadius},"contained"===t.variant&&{boxShadow:(e.vars||e).shadows[2]},t.disableElevation&&{boxShadow:"none"},t.fullWidth&&{width:"100%"},"vertical"===t.orientation&&{flexDirection:"column"},{[`& .${v.grouped}`]:(0,r.Z)({minWidth:40,"&:not(:first-of-type)":(0,r.Z)({},"horizontal"===t.orientation&&{borderTopLeftRadius:0,borderBottomLeftRadius:0},"vertical"===t.orientation&&{borderTopRightRadius:0,borderTopLeftRadius:0},"outlined"===t.variant&&"horizontal"===t.orientation&&{marginLeft:-1},"outlined"===t.variant&&"vertical"===t.orientation&&{marginTop:-1}),"&:not(:last-of-type)":(0,r.Z)({},"horizontal"===t.orientation&&{borderTopRightRadius:0,borderBottomRightRadius:0},"vertical"===t.orientation&&{borderBottomRightRadius:0,borderBottomLeftRadius:0},"text"===t.variant&&"horizontal"===t.orientation&&{borderRight:e.vars?`1px solid rgba(${e.vars.palette.common.onBackgroundChannel} / 0.23)`:"1px solid "+("light"===e.palette.mode?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)"),[`&.${v.disabled}`]:{borderRight:`1px solid ${(e.vars||e).palette.action.disabled}`}},"text"===t.variant&&"vertical"===t.orientation&&{borderBottom:e.vars?`1px solid rgba(${e.vars.palette.common.onBackgroundChannel} / 0.23)`:"1px solid "+("light"===e.palette.mode?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)"),[`&.${v.disabled}`]:{borderBottom:`1px solid ${(e.vars||e).palette.action.disabled}`}},"text"===t.variant&&"inherit"!==t.color&&{borderColor:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / 0.5)`:(0,s.Fq)(e.palette[t.color].main,.5)},"outlined"===t.variant&&"horizontal"===t.orientation&&{borderRightColor:"transparent"},"outlined"===t.variant&&"vertical"===t.orientation&&{borderBottomColor:"transparent"},"contained"===t.variant&&"horizontal"===t.orientation&&{borderRight:`1px solid ${(e.vars||e).palette.grey[400]}`,[`&.${v.disabled}`]:{borderRight:`1px solid ${(e.vars||e).palette.action.disabled}`}},"contained"===t.variant&&"vertical"===t.orientation&&{borderBottom:`1px solid ${(e.vars||e).palette.grey[400]}`,[`&.${v.disabled}`]:{borderBottom:`1px solid ${(e.vars||e).palette.action.disabled}`}},"contained"===t.variant&&"inherit"!==t.color&&{borderColor:(e.vars||e).palette[t.color].dark},{"&:hover":(0,r.Z)({},"outlined"===t.variant&&"horizontal"===t.orientation&&{borderRightColor:"currentColor"},"outlined"===t.variant&&"vertical"===t.orientation&&{borderBottomColor:"currentColor"})}),"&:hover":(0,r.Z)({},"contained"===t.variant&&{boxShadow:"none"})},"contained"===t.variant&&{boxShadow:"none"})}))),w=i.forwardRef((function(e,t){const n=(0,d.Z)({props:e,name:"MuiButtonGroup"}),{children:s,className:u,color:p="primary",component:f="div",disabled:v=!1,disableElevation:w=!1,disableFocusRipple:S=!1,disableRipple:x=!1,fullWidth:E=!1,orientation:O="horizontal",size:M="medium",variant:R="outlined"}=n,Z=(0,o.Z)(n,b),C=(0,r.Z)({},n,{color:p,component:f,disabled:v,disableElevation:w,disableFocusRipple:S,disableRipple:x,fullWidth:E,orientation:O,size:M,variant:R}),P=(e=>{const{classes:t,color:n,disabled:o,disableElevation:r,fullWidth:i,orientation:a,variant:s}=e,u={root:["root",s,"vertical"===a&&"vertical",i&&"fullWidth",r&&"disableElevation"],grouped:["grouped",`grouped${(0,c.Z)(a)}`,`grouped${(0,c.Z)(s)}`,`grouped${(0,c.Z)(s)}${(0,c.Z)(a)}`,`grouped${(0,c.Z)(s)}${(0,c.Z)(n)}`,o&&"disabled"]};return(0,l.Z)(u,h,t)})(C),z=i.useMemo((()=>({className:P.grouped,color:p,disabled:v,disableElevation:w,disableFocusRipple:S,disableRipple:x,fullWidth:E,size:M,variant:R})),[p,v,w,S,x,E,M,R,P.grouped]);return(0,g.jsx)(y,(0,r.Z)({as:f,role:"group",className:(0,a.Z)(P.root,u),ref:t,ownerState:C},Z,{children:(0,g.jsx)(m.Z.Provider,{value:z,children:s})}))}))},98363:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n(67294).createContext({})},96189:(e,t,n)=>{n.d(t,{Z:()=>o});const o={50:"#eceff1",100:"#cfd8dc",200:"#b0bec5",300:"#90a4ae",400:"#78909c",500:"#607d8b",600:"#546e7a",700:"#455a64",800:"#37474f",900:"#263238",A100:"#cfd8dc",A200:"#b0bec5",A400:"#78909c",A700:"#455a64"}},22430:(e,t,n)=>{n.d(t,{Z:()=>b});var o=n(83117),r=n(80102),i=n(67294);const a=i.createContext(null);function l(){return i.useContext(a)}const s="function"==typeof Symbol&&Symbol.for?Symbol.for("mui.nested"):"__THEME_NESTED__";var c=n(85893);const u=function(e){const{children:t,theme:n}=e,r=l(),u=i.useMemo((()=>{const e=null===r?n:function(e,t){if("function"==typeof t)return t(e);return(0,o.Z)({},e,t)}(r,n);return null!=e&&(e[s]=null!==r),e}),[n,r]);return(0,c.jsx)(a.Provider,{value:u,children:t})};var d=n(75260),p=n(34168);const f={};function h(e,t,n,r=!1){return i.useMemo((()=>{const i=e&&t[e]||t;if("function"==typeof n){const a=n(i),l=e?(0,o.Z)({},t,{[e]:a}):a;return r?()=>l:l}return e?(0,o.Z)({},t,{[e]:n}):(0,o.Z)({},t,n)}),[e,t,n,r])}const v=function(e){const{children:t,theme:n,themeId:o}=e,r=(0,p.Z)(f),i=l()||f,a=h(o,r,n),s=h(o,i,n,!0);return(0,c.jsx)(u,{theme:s,children:(0,c.jsx)(d.T.Provider,{value:a,children:t})})};var m=n(10606);const g=["theme"];function b(e){let{theme:t}=e,n=(0,r.Z)(e,g);const i=t[m.Z];return(0,c.jsx)(v,(0,o.Z)({},n,{themeId:i?m.Z:void 0,theme:i||t}))}},98391:(e,t,n)=>{n.d(t,{Z:()=>c});var o=n(83117),r=n(71387);function i(e){return String(parseFloat(e)).length===String(e).length}function a(e){return parseFloat(e)}function l(e){return(t,n)=>{const o=String(t).match(/[\d.\-+]*\s*(.*)/)[1]||"";if(o===n)return t;let r=a(t);"px"!==o&&("em"===o||"rem"===o)&&(r=a(t)*a(e));let i=r;if("px"!==n)if("em"===n)i=r/a(e);else{if("rem"!==n)return t;i=r/a(e)}return parseFloat(i.toFixed(5))+n}}function s({lineHeight:e,pixels:t,htmlFontSize:n}){return t/(e*n)}function c(e,t={}){const{breakpoints:n=["sm","md","lg"],disableAlign:a=!1,factor:c=2,variants:u=["h1","h2","h3","h4","h5","h6","subtitle1","subtitle2","body1","body2","caption","button","overline"]}=t,d=(0,o.Z)({},e);d.typography=(0,o.Z)({},d.typography);const p=d.typography,f=l(p.htmlFontSize),h=n.map((e=>d.breakpoints.values[e]));return u.forEach((e=>{const t=p[e],n=parseFloat(f(t.fontSize,"rem"));if(n<=1)return;const l=n,u=1+(l-1)/c;let{lineHeight:d}=t;if(!i(d)&&!a)throw new Error((0,r.Z)(6));i(d)||(d=parseFloat(f(d,"rem"))/parseFloat(n));let v=null;a||(v=e=>function({size:e,grid:t}){const n=e-e%t,o=n+t;return e-n {let r=t+l*n;null!==i&&(r=i(r)),a[`@media (min-width:${n}px)`]={[e]:`${Math.round(1e4*r)/1e4}${o}`}})),a}({cssProperty:"fontSize",min:u,max:l,unit:"rem",breakpoints:h,transform:v}))})),d}},2734:(e,t,n)=>{n.d(t,{Z:()=>a});n(67294);var o=n(96682),r=n(90247),i=n(10606);function a(){const e=(0,o.Z)(r.Z);return e[i.Z]||e}},98396:(e,t,n)=>{var o;n.d(t,{Z:()=>d});var r=n(67294),i=n(34168),a=n(20539),l=n(58974);function s(e,t,n,o,i){const[a,s]=r.useState((()=>i&&n?n(e).matches:o?o(e).matches:t));return(0,l.Z)((()=>{let t=!0;if(!n)return;const o=n(e),r=()=>{t&&s(o.matches)};return r(),o.addListener(r),()=>{t=!1,o.removeListener(r)}}),[e,n]),a}const c=(o||(o=n.t(r,2))).useSyncExternalStore;function u(e,t,n,o,i){const a=r.useCallback((()=>t),[t]),l=r.useMemo((()=>{if(i&&n)return()=>n(e).matches;if(null!==o){const{matches:t}=o(e);return()=>t}return a}),[a,e,o,i,n]),[s,u]=r.useMemo((()=>{if(null===n)return[a,()=>()=>{}];const t=n(e);return[()=>t.matches,e=>(t.addListener(e),()=>{t.removeListener(e)})]}),[a,n,e]);return c(u,s,l)}function d(e,t={}){const n=(0,i.Z)(),o="undefined"!=typeof window&&void 0!==window.matchMedia,{defaultMatches:r=!1,matchMedia:l=(o?window.matchMedia:null),ssrMatchMedia:d=null,noSsr:p=!1}=(0,a.Z)({name:"MuiUseMediaQuery",props:t,theme:n});let f="function"==typeof e?e(n):e;f=f.replace(/^@media( ?)/m,"");return(void 0!==c?u:s)(f,r,l,d,p)}},58221:(e,t,n)=>{t.__esModule=!0,t.default=void 0;var o=i(n(67294)),r=i(n(66174));function i(e){return e&&e.__esModule?e:{default:e}}function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t {t.__esModule=!0,t.default=void 0;var o=i(n(67294)),r=i(n(66174));function i(e){return e&&e.__esModule?e:{default:e}}function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t {t.__esModule=!0,t.default=void 0;var o=i(n(67294)),r=i(n(66174));function i(e){return e&&e.__esModule?e:{default:e}}function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t {t.__esModule=!0,t.default=void 0;var o=i(n(67294)),r=i(n(66174));function i(e){return e&&e.__esModule?e:{default:e}}function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t {t.__esModule=!0,t.default=void 0;var o=i(n(67294)),r=i(n(45697));function i(e){return e&&e.__esModule?e:{default:e}}var a=function(e){var t=e.size,n=void 0===t?24:t,r=e.fill,i=void 0===r?"#000":r,a=e.className,l=e.path;return o.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:n,height:n,viewBox:"0 0 24 24",className:a},o.default.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),o.default.createElement("path",{fill:i,d:l}))};a.propTypes={size:r.default.number,fill:r.default.string,className:r.default.string,path:r.default.string.isRequired};var l=a;t.default=l},51688:(e,t,n)=>{t.__esModule=!0,t.default=void 0;var o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=d(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var a=r?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(o,i,a):o[i]=e[i]}o.default=e,n&&n.set(e,o);return o}(n(67294)),r=u(n(45697)),i=n(83824),a=u(n(58374)),l=n(42863),s=n(85082),c=n(26889);function u(e){return e&&e.__esModule?e:{default:e}}function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(d=function(e){return e?n:t})(e)}function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;t 1?(0,c.guessMaxImageWidth)(n.state.dimensions):0,supportsWebp:c.supportsWebp}),t=n.props.getUrl,o=t?t(e):e.src,r=n.props.shouldAutoDownload(h(h({},n.state),{},{size:e.size}));n.setState({pickedSrc:e,shouldAutoDownload:r,url:o},(function(){r&&n.load(!1)}))}})),g(v(n),"onLeave",(function(){n.state.loadState!==y||n.state.userTriggered||(n.setState({inViewport:!1}),n.cancel(!1))})),n.state={loadState:b,connection:c.nativeConnection?{downlink:navigator.connection.downlink,rtt:navigator.connection.rtt,effectiveType:navigator.connection.effectiveType}:null,onLine:!0,overThreshold:!1,inViewport:!1,userTriggered:!1,possiblySlowNetwork:!1},n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,m(t,n);var l=r.prototype;return l.componentDidMount=function(){var e=this;c.nativeConnection?(this.updateConnection=function(){navigator.onLine&&e.state.loadState===b&&e.setState({connection:{effectiveType:navigator.connection.effectiveType,downlink:navigator.connection.downlink,rtt:navigator.connection.rtt}})},navigator.connection.addEventListener("onchange",this.updateConnection)):this.props.threshold&&(this.possiblySlowNetworkListener=function(t){if(e.state.loadState===b){var n=t.detail.possiblySlowNetwork;!e.state.possiblySlowNetwork&&n&&e.setState({possiblySlowNetwork:n})}},window.document.addEventListener("possiblySlowNetwork",this.possiblySlowNetworkListener)),this.updateOnlineStatus=function(){return e.setState({onLine:navigator.onLine})},this.updateOnlineStatus(),window.addEventListener("online",this.updateOnlineStatus),window.addEventListener("offline",this.updateOnlineStatus)},l.componentWillUnmount=function(){this.clear(),c.nativeConnection?navigator.connection.removeEventListener("onchange",this.updateConnection):this.props.threshold&&window.document.removeEventListener("possiblySlowNetwork",this.possiblySlowNetworkListener),window.removeEventListener("online",this.updateOnlineStatus),window.removeEventListener("offline",this.updateOnlineStatus)},l.clear=function(){this.loader&&(this.loader.cancel(),this.loader=void 0)},l.cancel=function(e){y===this.state.loadState&&(this.clear(),this.loadStateChange(b,e))},l.loadStateChange=function(e,t,n){void 0===n&&(n=null),this.setState({loadState:e,overThreshold:!1,userTriggered:!!t,loadInfo:n})},l.render=function(){var e=this,t=this.props.getIcon(this.state),n=this.props.getMessage(t,this.state);return o.default.createElement(i.Waypoint,{onEnter:this.onEnter,onLeave:this.onLeave},o.default.createElement(a.default,p({},this.props,(0,c.fallbackParams)(this.props),{onClick:this.onClick,icon:t,src:this.state.url||"",onDimensions:function(t){return e.setState({dimensions:t})},message:n})))},r}(o.Component);t.default=x,g(x,"propTypes",{threshold:r.default.number,getUrl:r.default.func,srcSet:r.default.arrayOf(r.default.shape({width:r.default.number.isRequired,src:r.default.string,size:r.default.number,format:r.default.oneOf(["jpeg","jpg","webp","png","gif"])})).isRequired,shouldAutoDownload:r.default.func,getMessage:r.default.func,getIcon:r.default.func,loader:r.default.oneOf(["image","xhr"]),width:r.default.number.isRequired,height:r.default.number.isRequired,placeholder:r.default.oneOfType([r.default.shape({color:r.default.string.isRequired}),r.default.shape({lqip:r.default.string.isRequired})]).isRequired,icons:r.default.object.isRequired,theme:r.default.object.isRequired}),g(x,"defaultProps",{shouldAutoDownload:function(e){var t=e.connection,n=e.size,o=e.threshold;if(e.possiblySlowNetwork)return!1;if(!t)return!0;var r=t.downlink,i=t.rtt;switch(t.effectiveType){case"slow-2g":case"2g":return!1;case"3g":return!!(r&&n&&o)&&8*n/(1e3*r)+i {t.__esModule=!0,t.default=void 0;var o=l(n(67294)),r=l(n(51688)),i=l(n(4891)),a=l(n(74125));function l(e){return e&&e.__esModule?e:{default:e}}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t {t.__esModule=!0,t.default=void 0;var o=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=s(t);if(n&&n.has(e))return n.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var a=r?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(o,i,a):o[i]=e[i]}o.default=e,n&&n.set(e,o);return o}(n(67294)),r=l(n(45697)),i=l(n(12185)),a=n(42863);function l(e){return e&&e.__esModule?e:{default:e}}function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(s=function(e){return e?n:t})(e)}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t {t.__esModule=!0,t.default=void 0;t.default=function(){for(var e,t=[],n=arguments.length,o=new Array(n),r=0;r 1?t.join(" "):t[0],style:e}}},42863:(e,t)=>{t.__esModule=!0,t.loadStates=t.icons=void 0;var n="loading",o="loaded",r="error",i={load:"load",loading:n,loaded:o,error:r,noicon:"noicon",offline:"offline"};t.icons=i;var a={initial:"initial",loading:n,loaded:o,error:r};t.loadStates=a},26889:(e,t)=>{t.__esModule=!0,t.supportsWebp=t.ssr=t.selectSrc=t.nativeConnection=t.guessMaxImageWidth=t.fallbackParams=t.bytesToSize=void 0;var n="undefined"==typeof window||"ReactSnap"===window.navigator.userAgent;t.ssr=n;var o=!n&&!!window.navigator.connection;t.nativeConnection=o;t.guessMaxImageWidth=function(e,t){if(n)return 0;t||(t=window);var o,r=e.width,i=t.screen,a=i.width,l=i.height,s=document.documentElement,c=t.innerWidth||s.clientWidth,u=t.innerHeight||s.clientHeight,d=t.devicePixelRatio||1;if(a>c){var p=document.getElementsByTagName("body")[0],f=c-r;o=(p.clientHeight>u||p.clientHeight>l)&&f<=15?a-f:r/c*a}else o=r;return o*d};t.bytesToSize=function(e){var t=["Bytes","KB","MB","GB","TB"];if(0===e)return"n/a";var n=parseInt(Math.floor(Math.log(e)/Math.log(1024)),10);return 0===n?e+" "+t[n]:(e/Math.pow(1024,n)).toFixed(1)+" "+t[n]};var r=function(){if(n)return!1;var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))&&0===e.toDataURL("image/webp").indexOf("data:image/webp")}();t.supportsWebp=r;var i=function(e){return"webp"===e.format||e.src&&e.src.match(/\.webp($|\?.*)/i)};t.selectSrc=function(e){var t,n,o=e.srcSet,r=e.maxImageWidth,a=e.supportsWebp;if(0===o.length)throw new Error("Need at least one item in srcSet");if(a)0===(t=o.filter(i)).length&&(t=o);else if(0===(t=o.filter((function(e){return!i(e)}))).length)throw new Error("Need at least one supported format item in srcSet");var l=t.filter((function(e){return e.width>=r}));return 0===l.length?(l=t,n=Math.max.apply(null,l.map((function(e){return e.width})))):n=Math.min.apply(null,l.map((function(e){return e.width}))),t.filter((function(e){return e.width===n}))[0]};t.fallbackParams=function(e){var t=e.srcSet,o=e.getUrl;if(!n)return{};var r=t.filter((function(e){return!i(e)})),a=r[0];return{nsSrcSet:r.map((function(e){return(o?o(e):e.src)+" "+e.width+"w"})).join(","),nsSrc:o?o(a):a.src,ssr:n}}},4891:(e,t,n)=>{t.__esModule=!0,t.default=void 0;var o,r=c(n(58221)),i=c(n(18524)),a=c(n(48551)),l=c(n(15802)),s=n(42863);function c(e){return e&&e.__esModule?e:{default:e}}var u=s.icons.load,d=s.icons.loading,p=s.icons.loaded,f=s.icons.error,h=s.icons.noicon,v=s.icons.offline,m=((o={})[u]=r.default,o[d]=l.default,o[p]=null,o[f]=a.default,o[h]=null,o[v]=i.default,o);t.default=m},85082:(e,t,n)=>{t.__esModule=!0,t.xhrLoader=t.timeout=t.imageLoader=t.combineCancel=void 0;var o=n(71499);function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t {t.__esModule=!0,t.default=void 0;t.default={placeholder:{backgroundSize:"cover",backgroundRepeat:"no-repeat",position:"relative"},img:{width:"100%",height:"auto",maxWidth:"100%",marginBottom:"-4px"},icon:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center"},noscript:{position:"absolute",top:0,left:0}}},71499:(e,t)=>{t.__esModule=!0,t.unfetch=t.UnfetchAbortController=void 0;t.UnfetchAbortController=function(){var e=this;this.signal={onabort:function(){}},this.abort=function(){return e.signal.onabort()}};t.unfetch=function(e,t){return t=t||{},new Promise((function(n,o){var r=new XMLHttpRequest;for(var i in r.open(t.method||"get",e,!0),t.headers)r.setRequestHeader(i,t.headers[i]);function a(){var e,t=[],n=[],o={};return r.getAllResponseHeaders().replace(/^(.*?):\s*?([\s\S]*?)$/gm,(function(r,i,a){t.push(i=i.toLowerCase()),n.push([i,a]),e=o[i],o[i]=e?e+","+a:a})),{ok:2==(r.status/100|0),status:r.status,statusText:r.statusText,url:r.responseURL,clone:a,text:function(){return Promise.resolve(r.responseText)},json:function(){return Promise.resolve(r.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([r.response]))},headers:{keys:function(){return t},entries:function(){return n},get:function(e){return o[e.toLowerCase()]},has:function(e){return e.toLowerCase()in o}}}}r.withCredentials="include"===t.credentials,r.onload=function(){n(a())},r.onerror=o,t.signal&&(t.signal.onabort=function(){r.onerror=r.onload=void 0,r.abort()}),r.send(t.body)}))}},57164:(e,t,n)=>{var o;t.Z=void 0;var r=((o=n(22830))&&o.__esModule?o:{default:o}).default;t.Z=r},69921:(e,t)=>{var n,o=Symbol.for("react.element"),r=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),f=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),m=Symbol.for("react.offscreen");function g(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case o:switch(e=e.type){case i:case l:case a:case p:case f:return e;default:switch(e=e&&e.$$typeof){case u:case c:case d:case v:case h:case s:return e;default:return t}}case r:return t}}}n=Symbol.for("react.module.reference"),t.isForwardRef=function(e){return g(e)===d}},59864:(e,t,n)=>{e.exports=n(69921)},83824:(e,t,n)=>{n.r(t),n.d(t,{Waypoint:()=>O});var o=n(90144),r=!("undefined"==typeof window||!window.document||!window.document.createElement);var i=void 0;function a(){return void 0===i&&(i=function(){if(!r)return!1;if(!window.addEventListener||!window.removeEventListener||!Object.defineProperty)return!1;var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}}),n=function(){};window.addEventListener("testPassiveEventSupport",n,t),window.removeEventListener("testPassiveEventSupport",n,t)}catch(o){}return e}()),i}function l(e){e.handlers===e.nextHandlers&&(e.nextHandlers=e.handlers.slice())}function s(e){this.target=e,this.events={}}s.prototype.getEventHandlers=function(e,t){var n,o=String(e)+" "+String((n=t)?!0===n?100:(n.capture<<0)+(n.passive<<1)+(n.once<<2):0);return this.events[o]||(this.events[o]={handlers:[],handleEvent:void 0},this.events[o].nextHandlers=this.events[o].handlers),this.events[o]},s.prototype.handleEvent=function(e,t,n){var o=this.getEventHandlers(e,t);o.handlers=o.nextHandlers,o.handlers.forEach((function(e){e&&e(n)}))},s.prototype.add=function(e,t,n){var o=this,r=this.getEventHandlers(e,n);l(r),0===r.nextHandlers.length&&(r.handleEvent=this.handleEvent.bind(this,e,n),this.target.addEventListener(e,r.handleEvent,n)),r.nextHandlers.push(t);var i=!0;return function(){if(i){i=!1,l(r);var a=r.nextHandlers.indexOf(t);r.nextHandlers.splice(a,1),0===r.nextHandlers.length&&(o.target&&o.target.removeEventListener(e,r.handleEvent,n),r.handleEvent=void 0)}}};var c="__consolidated_events_handlers__";function u(e,t,n,o){e[c]||(e[c]=new s(e));var r=function(e){if(e)return a()?e:!!e.capture}(o);return e[c].add(t,n,r)}var d=n(67294),p=n(59864);function f(e,t){var n,o=(n=e,!isNaN(parseFloat(n))&&isFinite(n)?parseFloat(n):"px"===n.slice(-2)?parseFloat(n.slice(0,-2)):void 0);if("number"==typeof o)return o;var r=function(e){if("%"===e.slice(-1))return parseFloat(e.slice(0,-1))/100}(e);return"number"==typeof r?r*t:void 0}var h="above",v="inside",m="below",g="invisible";function b(e){return"string"==typeof e.type}var y;var w=[];function S(e){w.push(e),y||(y=setTimeout((function(){var e;for(y=null;e=w.shift();)e()}),0));var t=!0;return function(){if(t){t=!1;var n=w.indexOf(e);-1!==n&&(w.splice(n,1),!w.length&&y&&(clearTimeout(y),y=null))}}}var x="undefined"!=typeof window,E={debug:!1,scrollableAncestor:void 0,children:void 0,topOffset:"0px",bottomOffset:"0px",horizontal:!1,onEnter:function(){},onLeave:function(){},onPositionChange:function(){},fireOnRapidScroll:!0},O=function(e){function t(t){var n;return(n=e.call(this,t)||this).refElement=function(e){n._ref=e},n}(0,o.Z)(t,e);var r=t.prototype;return r.componentDidMount=function(){var e=this;x&&(this.cancelOnNextTick=S((function(){e.cancelOnNextTick=null;var t=e.props,n=t.children;t.debug;!function(e,t){if(e&&!b(e)&&!t)throw new Error(" needs a DOM element to compute boundaries. The child you passed is neither a DOM element (e.g. ) nor does it use the innerRef prop.\n\nSee https://goo.gl/LrBNgw for more info.")}(n,e._ref),e._handleScroll=e._handleScroll.bind(e),e.scrollableAncestor=e._findScrollableAncestor(),e.scrollEventListenerUnsubscribe=u(e.scrollableAncestor,"scroll",e._handleScroll,{passive:!0}),e.resizeEventListenerUnsubscribe=u(window,"resize",e._handleScroll,{passive:!0}),e._handleScroll(null)})))},r.componentDidUpdate=function(){var e=this;x&&this.scrollableAncestor&&(this.cancelOnNextTick||(this.cancelOnNextTick=S((function(){e.cancelOnNextTick=null,e._handleScroll(null)}))))},r.componentWillUnmount=function(){x&&(this.scrollEventListenerUnsubscribe&&this.scrollEventListenerUnsubscribe(),this.resizeEventListenerUnsubscribe&&this.resizeEventListenerUnsubscribe(),this.cancelOnNextTick&&this.cancelOnNextTick())},r._findScrollableAncestor=function(){var e=this.props,t=e.horizontal,o=e.scrollableAncestor;if(o)return function(e){return"window"===e?n.g.window:e}(o);for(var r=this._ref;r.parentNode;){if((r=r.parentNode)===document.body)return window;var i=window.getComputedStyle(r),a=(t?i.getPropertyValue("overflow-x"):i.getPropertyValue("overflow-y"))||i.getPropertyValue("overflow");if("auto"===a||"scroll"===a||"overlay"===a)return r}return window},r._handleScroll=function(e){if(this._ref){var t=this._getBounds(),n=function(e){return e.viewportBottom-e.viewportTop==0?g:e.viewportTop<=e.waypointTop&&e.waypointTop<=e.viewportBottom||e.viewportTop<=e.waypointBottom&&e.waypointBottom<=e.viewportBottom||e.waypointTop<=e.viewportTop&&e.viewportBottom<=e.waypointBottom?v:e.viewportBottom{n.d(t,{Z:()=>l,a:()=>a});var o=n(67294);const r={},i=o.createContext(r);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8917.d2a12266.js.LICENSE.txt b/assets/js/8917.d2a12266.js.LICENSE.txt deleted file mode 100644 index 53dcf70ce..000000000 --- a/assets/js/8917.d2a12266.js.LICENSE.txt +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @license React - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ diff --git a/assets/js/8d193990.8949a660.js b/assets/js/8d193990.8949a660.js new file mode 100644 index 000000000..b2671aa12 --- /dev/null +++ b/assets/js/8d193990.8949a660.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3129"],{31612:function(e,t,n){n.r(t),n.d(t,{assets:function(){return r},contentTitle:function(){return a},default:function(){return d},frontMatter:function(){return l},metadata:function(){return o},toc:function(){return c}});var o=n(39756),s=n(85893),i=n(50065);let l={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},a=void 0,r={authorsImageUrls:[void 0]},c=[];function h(e){let t={a:"a",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Close watchers of our ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It's a long story."}),"\n",(0,s.jsxs)(t.p,{children:["Our package manager ",(0,s.jsx)(t.code,{children:"eopkg"})," is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Do we really want to just port ",(0,s.jsx)(t.code,{children:"eopkg"})," to python3? Surely we could build something newer and shinier."]}),"\n",(0,s.jsxs)(t.li,{children:["How exactly do we want to port ",(0,s.jsx)(t.code,{children:"eopkg"})," to Python3? (We'll call this ported version ",(0,s.jsx)(t.code,{children:"eopkg3"})," for short)"]}),"\n",(0,s.jsxs)(t.li,{children:["How do we make sure ",(0,s.jsx)(t.code,{children:"eopkg3"})," works even if something goes wrong with the Python3 libraries on someone's machine?"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Here's the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager ",(0,s.jsx)(t.a,{href:"https://github.com/serpent-os/moss",children:(0,s.jsx)(t.em,{children:"moss"})})," that we are excited about. And they're building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we're taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things."]}),"\n",(0,s.jsxs)(t.p,{children:["Sheepman, Livingsilver, and others completed a ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/eopkg/commits/python3",children:"direct Python3 port"}),", which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a ",(0,s.jsx)(t.em,{children:"binary"})," using ",(0,s.jsx)(t.a,{href:"https://nuitka.net/doc/download.html",children:"nuitka"}),". We're calling this compiled ",(0,s.jsx)(t.code,{children:"eopkg3"})," binary ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," for now. Critically, this binary will have ",(0,s.jsx)(t.em,{children:"no dependencies"})," other than ",(0,s.jsx)(t.code,{children:"libc"}),". If we can successfully swap ",(0,s.jsx)(t.code,{children:"eopkg"})," with ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," on user's machines, then we've solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?"]}),"\n",(0,s.jsxs)(t.p,{children:["But what about Python2? Well, now that Evan and Joey have seen off a ",(0,s.jsx)(t.a,{href:"https://getsol.us/2024/01/08/solus-4-5-released/",children:"successful ISO release"})," with a ",(0,s.jsx)(t.code,{children:"calamares"})," based installer, we can cross ",(0,s.jsx)(t.code,{children:"os-installer"})," ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"off the list"}),". And ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," will let us cross off a whole bunch more. The rest of that list is a story for another day."]})]})}function d(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return a},a:function(){return l}});var o=n(67294);let s={},i=o.createContext(s);function l(e){let t=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),o.createElement(i.Provider,{value:t},e.children)}},39756:function(e){e.exports=JSON.parse('{"permalink":"/blog/eopkg-is-dead-long-live-eopkg","source":"@site/devlog/2024-01-19-eopkg-is-dead.md","title":"eopkg is dead, long live eopkg","description":"Close watchers of our packages repository may have noticed some strange looking items:","date":"2024-01-19T00:00:00.000Z","tags":[{"inline":true,"label":"eopkg","permalink":"/blog/tags/eopkg"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"moss","permalink":"/blog/tags/moss"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":1.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"eopkg is dead, long live eopkg","slug":"eopkg-is-dead-long-live-eopkg","authors":"david","tags":["eopkg","devlog","moss","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"},"nextItem":{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1"}}')}}]); \ No newline at end of file diff --git a/assets/js/8d193990.e1e40f22.js b/assets/js/8d193990.e1e40f22.js deleted file mode 100644 index 5b91b8c8e..000000000 --- a/assets/js/8d193990.e1e40f22.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1539],{5436:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=o(85893),n=o(11151);const i={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},l=void 0,a={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},c=[];function h(e){const t={a:"a",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Close watchers of our ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It's a long story."}),"\n",(0,s.jsxs)(t.p,{children:["Our package manager ",(0,s.jsx)(t.code,{children:"eopkg"})," is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Do we really want to just port ",(0,s.jsx)(t.code,{children:"eopkg"})," to python3? Surely we could build something newer and shinier."]}),"\n",(0,s.jsxs)(t.li,{children:["How exactly do we want to port ",(0,s.jsx)(t.code,{children:"eopkg"})," to Python3? (We'll call this ported version ",(0,s.jsx)(t.code,{children:"eopkg3"})," for short)"]}),"\n",(0,s.jsxs)(t.li,{children:["How do we make sure ",(0,s.jsx)(t.code,{children:"eopkg3"})," works even if something goes wrong with the Python3 libraries on someone's machine?"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Here's the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager ",(0,s.jsx)(t.a,{href:"https://github.com/serpent-os/moss",children:(0,s.jsx)(t.em,{children:"moss"})})," that we are excited about. And they're building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we're taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things."]}),"\n",(0,s.jsxs)(t.p,{children:["Sheepman, Livingsilver, and others completed a ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/eopkg/commits/python3",children:"direct Python3 port"}),", which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a ",(0,s.jsx)(t.em,{children:"binary"})," using ",(0,s.jsx)(t.a,{href:"https://nuitka.net/doc/download.html",children:"nuitka"}),". We're calling this compiled ",(0,s.jsx)(t.code,{children:"eopkg3"})," binary ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," for now. Critically, this binary will have ",(0,s.jsx)(t.em,{children:"no dependencies"})," other than ",(0,s.jsx)(t.code,{children:"libc"}),". If we can successfully swap ",(0,s.jsx)(t.code,{children:"eopkg"})," with ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," on user's machines, then we've solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?"]}),"\n",(0,s.jsxs)(t.p,{children:["But what about Python2? Well, now that Evan and Joey have seen off a ",(0,s.jsx)(t.a,{href:"https://getsol.us/2024/01/08/solus-4-5-released/",children:"successful ISO release"})," with a ",(0,s.jsx)(t.code,{children:"calamares"})," based installer, we can cross ",(0,s.jsx)(t.code,{children:"os-installer"})," ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"off the list"}),". And ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," will let us cross off a whole bunch more. The rest of that list is a story for another day."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e3d5b32.7f0788ff.js b/assets/js/8e3d5b32.7f0788ff.js new file mode 100644 index 000000000..272e3717d --- /dev/null +++ b/assets/js/8e3d5b32.7f0788ff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2288"],{99641:function(e,n,t){t.r(n),t.d(n,{metadata:()=>i,contentTitle:()=>o,default:()=>u,assets:()=>l,toc:()=>d,frontMatter:()=>r});var i=JSON.parse('{"id":"user/software/localization/ibus","title":"IBus","description":"Configuration","source":"@site/docs/user/software/localization/ibus.md","sourceDirName":"user/software/localization","slug":"/user/software/localization/ibus","permalink":"/docs/user/software/localization/ibus","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/localization/ibus.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"IBus","summary":"Configuration of additional languages via IBUS"},"sidebar":"userSidebar","previous":{"title":"Localization","permalink":"/docs/category/localization"},"next":{"title":"Networking","permalink":"/docs/category/networking"}}'),s=t("85893"),a=t("50065");let r={title:"IBus",summary:"Configuration of additional languages via IBUS"},o="IBus",l={},d=[{value:"Configuration",id:"configuration",level:2},{value:"IBus IME package list",id:"ibus-ime-package-list",level:2}];function c(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"ibus",children:"IBus"})}),"\n",(0,s.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["Find the IME (Input Method Editor) you require from the ",(0,s.jsx)(n.a,{href:"#ibus-ime-package-list",children:"IBus IME package list"}),' and then search for it in the Software Center. Click "Install" to add the IME.']}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"IBus IME Install",src:t(10913).Z+"",width:"812",height:"315"})}),"\n",(0,s.jsx)(n.p,{children:"You may have to agree to install some additional dependencies and will need to type in your user password as authentication is required."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"IBus IME Dependencies",src:t(48184).Z+"",width:"446",height:"445"})}),"\n",(0,s.jsxs)(n.p,{children:["Once it has finished installing, logout of your computer and then login again. Now you'll be able to select the newly installed IME by following the same steps as detailed above for changing keyboard layouts in Budgie. For instance, in this example we have installed the ",(0,s.jsx)(n.code,{children:"ibus-hangul"})," package for the Korean language. By following the steps above and then searching for Korean keyboard layouts, we are now able to select Korean (Hangul) as an input source."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"IBus Region and Language",src:t(669).Z+"",width:"742",height:"394"})}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, once you have added the IME and have it selected in the Region & Languages window, you can click on the cog icon under the input sources to load the settings window for your specific IME. The ",(0,s.jsx)(n.code,{children:"ibus-hangul"})," settings window is shown below but this will vary between the different IME's."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"IBus IME Settings Example: Hangul",src:t(20260).Z+"",width:"347",height:"405"})}),"\n",(0,s.jsx)(n.h2,{id:"ibus-ime-package-list",children:"IBus IME package list"}),"\n",(0,s.jsx)(n.p,{children:"A list of IBus IME packages available in the Solus software repository."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Package"}),(0,s.jsx)(n.th,{children:"Input Method"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-anthy"}),(0,s.jsx)(n.td,{children:"Japanese"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-chewing"}),(0,s.jsx)(n.td,{children:"Phonetic Chinese input method for Zhuyin (Bopomofo)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-hangul"}),(0,s.jsx)(n.td,{children:"Korean"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-m17n"}),(0,s.jsx)(n.td,{children:"Multiple Languages"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-unikey"}),(0,s.jsx)(n.td,{children:"Vietnamese"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-libpinyin"}),(0,s.jsx)(n.td,{children:"Chinese Pinyin and Bopomofo"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-libzhuyin"}),(0,s.jsx)(n.td,{children:"Chinese Zhuyin"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ibus-cangjie"}),(0,s.jsx)(n.td,{children:"Simplified Cangjie"})]})]})]})]})}function u(e={}){let{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},48184:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/ibus-ime-dependencies-0dc4668d437230c7528de2f86647531b.jpg"},10913:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/ibus-ime-install-68ba41c372dec67147393ad161a0f6f9.jpg"},20260:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/ibus-ime-settings-hangul-27a3a73e189a7c7e02287539008b825c.jpg"},669:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/ibus-region-and-languages-beb500ff774fb2dc414857fe1d196515.jpg"},50065:function(e,n,t){t.d(n,{Z:function(){return o},a:function(){return r}});var i=t(67294);let s={},a=i.createContext(s);function r(e){let n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e3d5b32.fae5b38f.js b/assets/js/8e3d5b32.fae5b38f.js deleted file mode 100644 index aa44052a0..000000000 --- a/assets/js/8e3d5b32.fae5b38f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8499],{15838:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var t=n(85893),s=n(11151);const a={title:"IBus",summary:"Configuration of additional languages via IBUS"},o="IBus",r={id:"user/software/localization/ibus",title:"IBus",description:"Configuration",source:"@site/docs/user/software/localization/ibus.md",sourceDirName:"user/software/localization",slug:"/user/software/localization/ibus",permalink:"/docs/user/software/localization/ibus",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/localization/ibus.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"IBus",summary:"Configuration of additional languages via IBUS"},sidebar:"userSidebar",previous:{title:"Localization",permalink:"/docs/category/localization"},next:{title:"Networking",permalink:"/docs/category/networking"}},l={},d=[{value:"Configuration",id:"configuration",level:2},{value:"IBus IME package list",id:"ibus-ime-package-list",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ibus",children:"IBus"})}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(i.p,{children:["Find the IME (Input Method Editor) you require from the ",(0,t.jsx)(i.a,{href:"#ibus-ime-package-list",children:"IBus IME package list"}),' and then search for it in the Software Center. Click "Install" to add the IME.']}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Install",src:n(38161).Z+"",width:"812",height:"315"})}),"\n",(0,t.jsx)(i.p,{children:"You may have to agree to install some additional dependencies and will need to type in your user password as authentication is required."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Dependencies",src:n(11533).Z+"",width:"446",height:"445"})}),"\n",(0,t.jsxs)(i.p,{children:["Once it has finished installing, logout of your computer and then login again. Now you'll be able to select the newly installed IME by following the same steps as detailed above for changing keyboard layouts in Budgie. For instance, in this example we have installed the ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," package for the Korean language. By following the steps above and then searching for Korean keyboard layouts, we are now able to select Korean (Hangul) as an input source."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus Region and Language",src:n(99809).Z+"",width:"742",height:"394"})}),"\n",(0,t.jsxs)(i.p,{children:["Additionally, once you have added the IME and have it selected in the Region & Languages window, you can click on the cog icon under the input sources to load the settings window for your specific IME. The ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," settings window is shown below but this will vary between the different IME's."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Settings Example: Hangul",src:n(40584).Z+"",width:"347",height:"405"})}),"\n",(0,t.jsx)(i.h2,{id:"ibus-ime-package-list",children:"IBus IME package list"}),"\n",(0,t.jsx)(i.p,{children:"A list of IBus IME packages available in the Solus software repository."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Package"}),(0,t.jsx)(i.th,{children:"Input Method"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-anthy"}),(0,t.jsx)(i.td,{children:"Japanese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-chewing"}),(0,t.jsx)(i.td,{children:"Phonetic Chinese input method for Zhuyin (Bopomofo)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-hangul"}),(0,t.jsx)(i.td,{children:"Korean"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-m17n"}),(0,t.jsx)(i.td,{children:"Multiple Languages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-unikey"}),(0,t.jsx)(i.td,{children:"Vietnamese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libpinyin"}),(0,t.jsx)(i.td,{children:"Chinese Pinyin and Bopomofo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libzhuyin"}),(0,t.jsx)(i.td,{children:"Chinese Zhuyin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-cangjie"}),(0,t.jsx)(i.td,{children:"Simplified Cangjie"})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},11533:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-dependencies-0dc4668d437230c7528de2f86647531b.jpg"},38161:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-install-68ba41c372dec67147393ad161a0f6f9.jpg"},40584:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-settings-hangul-27a3a73e189a7c7e02287539008b825c.jpg"},99809:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-region-and-languages-beb500ff774fb2dc414857fe1d196515.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>o});var t=n(67294);const s={},a=t.createContext(s);function o(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e861970.23584379.js b/assets/js/8e861970.23584379.js deleted file mode 100644 index b93a8dd37..000000000 --- a/assets/js/8e861970.23584379.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8026],{95751:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var t=a(85893),n=a(11151);const r={title:"Requesting a Package",summary:"Requesting a new package"},i="Requesting A Package",o={id:"packaging/procedures/request-a-package",title:"Requesting a Package",description:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker.",source:"@site/docs/packaging/procedures/request-a-package.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package",permalink:"/docs/packaging/procedures/request-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Requesting a Package",summary:"Requesting a new package"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"},next:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"}},c={},u=[{value:"Steps to request a new package",id:"steps-to-request-a-new-package",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"requesting-a-package",children:"Requesting A Package"})}),"\n",(0,t.jsx)(s.p,{children:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker."}),"\n",(0,t.jsx)(s.h2,{id:"steps-to-request-a-new-package",children:"Steps to request a new package"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Addition+Request%22",children:"Look to see if an issue has already been filed"})," for the package you want. If there is already request for your package, please do not open another issue. Instead, add your comments to the existing issue."]}),"\n",(0,t.jsxs)(s.li,{children:["Skim our ",(0,t.jsx)(s.a,{href:"/docs/packaging/procedures/package-inclusion",children:"Package inclusion policy"})," to make sure your request won't be rejected."]}),"\n",(0,t.jsxs)(s.li,{children:["Open a new ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Addition+Request%2CPriority%3A+Wishlist&projects=&template=request-new-package.yml&title=What%27s+the+package+name%3F",children:"issue"})," for your package using the ",(0,t.jsx)(s.em,{children:"Request a new package"})," template. The template will ask you for the following information. Please complete as much as you can.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Name"}),"\n",(0,t.jsx)(s.li,{children:"Homepage"}),"\n",(0,t.jsxs)(s.li,{children:["Why should this be included in the repository? If we already offer similar packages in our repository ",(0,t.jsx)(s.strong,{children:"or third party repository"}),", please tell us what your new package does that our existing packages do not (",(0,t.jsx)(s.em,{children:"How is it different or better"}),")."]}),"\n",(0,t.jsxs)(s.li,{children:["Are we allowed to distribute it?","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["For Solus to distribute the package it must use a license found on the ",(0,t.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),", or Solus must be given permission to redistribute it by the owner."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"What kind of user will use this package, and how many users do you think will use this package?"}),"\n",(0,t.jsxs)(s.li,{children:["Link to source tarball/zip file. This must point to a stable, versioned source, for example: ",(0,t.jsx)(s.code,{children:"1.2.3.tar.gz"})," or ",(0,t.jsx)(s.code,{children:"packagename-1.2.3"}),". Nightlies, snapshots and pre-releases are not allowed."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Wait for Solus Staff to approve or reject your request."}),"\n"]})]})}function d(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>o,a:()=>i});var t=a(67294);const n={},r=t.createContext(n);function i(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e861970.9590ad1b.js b/assets/js/8e861970.9590ad1b.js new file mode 100644 index 000000000..9969216ee --- /dev/null +++ b/assets/js/8e861970.9590ad1b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7667"],{6852:function(e,s,t){t.r(s),t.d(s,{metadata:()=>a,contentTitle:()=>o,default:()=>d,assets:()=>c,toc:()=>u,frontMatter:()=>i});var a=JSON.parse('{"id":"packaging/procedures/request-a-package","title":"Requesting a Package","description":"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker.","source":"@site/docs/packaging/procedures/request-a-package.md","sourceDirName":"packaging/procedures","slug":"/packaging/procedures/request-a-package","permalink":"/docs/packaging/procedures/request-a-package","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Requesting a Package","summary":"Requesting a new package"},"sidebar":"packagingSidebar","previous":{"title":"Requesting a Package Update","permalink":"/docs/packaging/procedures/request-a-package-update"},"next":{"title":"Rebuilding a stack","permalink":"/docs/packaging/stack-rebuilds"}}'),n=t("85893"),r=t("50065");let i={title:"Requesting a Package",summary:"Requesting a new package"},o="Requesting A Package",c={},u=[{value:"Steps to request a new package",id:"steps-to-request-a-new-package",level:2}];function l(e){let s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"requesting-a-package",children:"Requesting A Package"})}),"\n",(0,n.jsx)(s.p,{children:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker."}),"\n",(0,n.jsx)(s.h2,{id:"steps-to-request-a-new-package",children:"Steps to request a new package"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Addition+Request%22",children:"Look to see if an issue has already been filed"})," for the package you want. If there is already request for your package, please do not open another issue. Instead, add your comments to the existing issue."]}),"\n",(0,n.jsxs)(s.li,{children:["Skim our ",(0,n.jsx)(s.a,{href:"/docs/packaging/procedures/package-inclusion",children:"Package inclusion policy"})," to make sure your request won't be rejected."]}),"\n",(0,n.jsxs)(s.li,{children:["Open a new ",(0,n.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Addition+Request%2CPriority%3A+Wishlist&projects=&template=request-new-package.yml&title=What%27s+the+package+name%3F",children:"issue"})," for your package using the ",(0,n.jsx)(s.em,{children:"Request a new package"})," template. The template will ask you for the following information. Please complete as much as you can.","\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Name"}),"\n",(0,n.jsx)(s.li,{children:"Homepage"}),"\n",(0,n.jsxs)(s.li,{children:["Why should this be included in the repository? If we already offer similar packages in our repository ",(0,n.jsx)(s.strong,{children:"or third party repository"}),", please tell us what your new package does that our existing packages do not (",(0,n.jsx)(s.em,{children:"How is it different or better"}),")."]}),"\n",(0,n.jsxs)(s.li,{children:["Are we allowed to distribute it?","\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["For Solus to distribute the package it must use a license found on the ",(0,n.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),", or Solus must be given permission to redistribute it by the owner."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.li,{children:"What kind of user will use this package, and how many users do you think will use this package?"}),"\n",(0,n.jsxs)(s.li,{children:["Link to source tarball/zip file. This must point to a stable, versioned source, for example: ",(0,n.jsx)(s.code,{children:"1.2.3.tar.gz"})," or ",(0,n.jsx)(s.code,{children:"packagename-1.2.3"}),". Nightlies, snapshots and pre-releases are not allowed."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.li,{children:"Wait for Solus Staff to approve or reject your request."}),"\n"]})]})}function d(e={}){let{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},50065:function(e,s,t){t.d(s,{Z:function(){return o},a:function(){return i}});var a=t(67294);let n={},r=a.createContext(n);function i(e){let s=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),a.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e886580.32f66441.js b/assets/js/8e886580.32f66441.js deleted file mode 100644 index 8ae905f5f..000000000 --- a/assets/js/8e886580.32f66441.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4978],{71137:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=s(85893),o=s(11151);const r={title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},i="Rust",l={id:"user/software/development/rust",title:"Rust",description:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs.",source:"@site/docs/user/software/development/rust.md",sourceDirName:"user/software/development",slug:"/user/software/development/rust",permalink:"/docs/user/software/development/rust",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/rust.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},sidebar:"userSidebar",previous:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"},next:{title:"Web Development",permalink:"/docs/user/software/development/web"}},a={},d=[];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rust",children:"Rust"})}),"\n",(0,n.jsx)(t.p,{children:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs."}),"\n",(0,n.jsx)(t.p,{children:"Rust can be obtained by:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rustup"})," package, then installing any Rust target and/or tool using ",(0,n.jsx)(t.code,{children:"rustup"})," itself"]}),"\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rust"})," package"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Users should prefer the ",(0,n.jsx)(t.code,{children:"rustup"})," way, since it gives the freedom to install any tools and targets, including nightly versions and debugging utilities, although it may require editing the ",(0,n.jsx)(t.code,{children:"PATH"})," variable depending on your shell setup. According to the official Rust ",(0,n.jsx)(t.a,{href:"https://www.rust-lang.org/tools/install",children:"installation guide"}),":"]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["It is customary for Rust developers to include ",(0,n.jsx)(t.code,{children:"~/.cargo/bin"})," in their ",(0,n.jsx)(t.code,{children:"PATH "}),"environment variable. During installation rustup will attempt to configure the ",(0,n.jsx)(t.code,{children:"PATH"}),". Because of differences between platforms, command shells, and bugs in rustup, the modifications to ",(0,n.jsx)(t.code,{children:"PATH"})," may not take effect until the console is restarted, or the user is logged out, or it may not succeed at all."]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"rust"})," package, in fact, is present in the Solus repository for building packages that depend on it and it is not intended to be used by the final user, although it is possible and supported. Users that want to use the ",(0,n.jsx)(t.code,{children:"rust"})," package for their projects will be limited to the targets and tools that Solus needs to support, namely x86_64 and i686 Linux targets and ",(0,n.jsx)(t.code,{children:"cargo"}),". On the other hand, the ",(0,n.jsx)(t.code,{children:"rust"})," package is ready to use after its installation with no extra configurations."]}),"\n",(0,n.jsxs)(t.p,{children:["Either way, it is also recommended to install our ",(0,n.jsx)(t.code,{children:"system.devel"})," component, which is typically required for compiling. See our documentation for it ",(0,n.jsx)(t.a,{href:"/docs/user/software/development",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["As a final note, it is possible to ",(0,n.jsx)(t.a,{href:"https://rust-lang.github.io/rustup/installation/already-installed-rust.html",children:"configure"})," ",(0,n.jsx)(t.code,{children:"rustup"})," to use the system toolchain. This setup is ",(0,n.jsx)(t.strong,{children:"discouraged"})," unless aimed at developing applications targeting Solus itself."]})]})}function c(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>i});var n=s(67294);const o={},r=n.createContext(o);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e886580.4d5d1ca9.js b/assets/js/8e886580.4d5d1ca9.js new file mode 100644 index 000000000..d234bff11 --- /dev/null +++ b/assets/js/8e886580.4d5d1ca9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1992"],{24459:function(e,t,s){s.r(t),s.d(t,{metadata:()=>n,contentTitle:()=>l,default:()=>c,assets:()=>a,toc:()=>d,frontMatter:()=>i});var n=JSON.parse('{"id":"user/software/development/rust","title":"Rust","description":"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users\' needs.","source":"@site/docs/user/software/development/rust.md","sourceDirName":"user/software/development","slug":"/user/software/development/rust","permalink":"/docs/user/software/development/rust","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/rust.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Rust","summary":"A quick guide to getting set up for Rust development on Solus"},"sidebar":"userSidebar","previous":{"title":"R and RStudio","permalink":"/docs/user/software/development/r-and-rstudio"},"next":{"title":"Web Development","permalink":"/docs/user/software/development/web"}}'),o=s("85893"),r=s("50065");let i={title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},l="Rust",a={},d=[];function u(e){let t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"rust",children:"Rust"})}),"\n",(0,o.jsx)(t.p,{children:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs."}),"\n",(0,o.jsx)(t.p,{children:"Rust can be obtained by:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Installing the ",(0,o.jsx)(t.code,{children:"rustup"})," package, then installing any Rust target and/or tool using ",(0,o.jsx)(t.code,{children:"rustup"})," itself"]}),"\n",(0,o.jsxs)(t.li,{children:["Installing the ",(0,o.jsx)(t.code,{children:"rust"})," package"]}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["Users should prefer the ",(0,o.jsx)(t.code,{children:"rustup"})," way, since it gives the freedom to install any tools and targets, including nightly versions and debugging utilities, although it may require editing the ",(0,o.jsx)(t.code,{children:"PATH"})," variable depending on your shell setup. According to the official Rust ",(0,o.jsx)(t.a,{href:"https://www.rust-lang.org/tools/install",children:"installation guide"}),":"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["It is customary for Rust developers to include ",(0,o.jsx)(t.code,{children:"~/.cargo/bin"})," in their ",(0,o.jsx)(t.code,{children:"PATH "}),"environment variable. During installation rustup will attempt to configure the ",(0,o.jsx)(t.code,{children:"PATH"}),". Because of differences between platforms, command shells, and bugs in rustup, the modifications to ",(0,o.jsx)(t.code,{children:"PATH"})," may not take effect until the console is restarted, or the user is logged out, or it may not succeed at all."]}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"rust"})," package, in fact, is present in the Solus repository for building packages that depend on it and it is not intended to be used by the final user, although it is possible and supported. Users that want to use the ",(0,o.jsx)(t.code,{children:"rust"})," package for their projects will be limited to the targets and tools that Solus needs to support, namely x86_64 and i686 Linux targets and ",(0,o.jsx)(t.code,{children:"cargo"}),". On the other hand, the ",(0,o.jsx)(t.code,{children:"rust"})," package is ready to use after its installation with no extra configurations."]}),"\n",(0,o.jsxs)(t.p,{children:["Either way, it is also recommended to install our ",(0,o.jsx)(t.code,{children:"system.devel"})," component, which is typically required for compiling. See our documentation for it ",(0,o.jsx)(t.a,{href:"/docs/user/software/development",children:"here"}),"."]}),"\n",(0,o.jsxs)(t.p,{children:["As a final note, it is possible to ",(0,o.jsx)(t.a,{href:"https://rust-lang.github.io/rustup/installation/already-installed-rust.html",children:"configure"})," ",(0,o.jsx)(t.code,{children:"rustup"})," to use the system toolchain. This setup is ",(0,o.jsx)(t.strong,{children:"discouraged"})," unless aimed at developing applications targeting Solus itself."]})]})}function c(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},50065:function(e,t,s){s.d(t,{Z:function(){return l},a:function(){return i}});var n=s(67294);let o={},r=n.createContext(o);function i(e){let t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/920ec10a.28cf9cf6.js b/assets/js/920ec10a.28cf9cf6.js new file mode 100644 index 000000000..5176d1b71 --- /dev/null +++ b/assets/js/920ec10a.28cf9cf6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8261"],{35010:function(e){e.exports=JSON.parse('{"tag":{"label":"glibc","permalink":"/blog/tags/glibc","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/glibc","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/920ec10a.ba0a929e.js b/assets/js/920ec10a.ba0a929e.js deleted file mode 100644 index 04498e122..000000000 --- a/assets/js/920ec10a.ba0a929e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4725],{63438:e=>{e.exports=JSON.parse('{"tag":{"label":"glibc","permalink":"/blog/tags/glibc","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/glibc","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/9284d474.2f7ad000.js b/assets/js/9284d474.2f7ad000.js new file mode 100644 index 000000000..8d6c54f39 --- /dev/null +++ b/assets/js/9284d474.2f7ad000.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5528"],{85529:function(e,n,i){i.r(n),i.d(n,{metadata:()=>s,contentTitle:()=>l,default:()=>h,assets:()=>o,toc:()=>d,frontMatter:()=>a});var s=JSON.parse('{"id":"user/software/gaming/index","title":"Gaming","description":"Heroes of Newerth","source":"@site/docs/user/software/gaming/index.md","sourceDirName":"user/software/gaming","slug":"/user/software/gaming/","permalink":"/docs/user/software/gaming/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/gaming/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Gaming","summary":"Instructions for installing various gaming software on Solus"},"sidebar":"userSidebar","previous":{"title":"Web Development","permalink":"/docs/user/software/development/web"},"next":{"title":"Localization","permalink":"/docs/category/localization"}}'),r=i("85893"),t=i("50065");let a={title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},l="Gaming",o={},d=[{value:"Heroes of Newerth",id:"heroes-of-newerth",level:2},{value:"Lutris",id:"lutris",level:2},{value:"About",id:"about",level:3},{value:"Minecraft",id:"minecraft",level:2},{value:"Installation",id:"installation",level:3},{value:"Prism Launcher",id:"prism-launcher",level:3},{value:"RetroArch",id:"retroarch",level:2},{value:"Installing the assets",id:"installing-the-assets",level:3},{value:"Steam",id:"steam",level:2},{value:"NVIDIA",id:"nvidia",level:3}];function c(e){let n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"gaming",children:"Gaming"})}),"\n",(0,r.jsx)(n.h2,{id:"heroes-of-newerth",children:"Heroes of Newerth"}),"\n",(0,r.jsx)(n.p,{children:'First, install the latest version of HoN by downloading it and running "HoNClient.sh".'}),"\n",(0,r.jsx)(n.p,{children:"Assuming that you install to ~/HoN (default), you only need to run two commands:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf libgcrypt11 libglu\n"})}),"\n",(0,r.jsx)(n.p,{children:"That installs all of the dependencies that HoN needs."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"rm ~/HoN/libs-x86_64/{libcurl.so.4,libfreetype.so.6,libgcc_s.so.1,libgcrypt.so.11,libspeexdsp.so.1,libspeex.so.1,libstdc++.so.6,libudev.so.0}\n"})}),"\n",(0,r.jsx)(n.p,{children:"This removes all the libraries that conflict with the ones in Solus."}),"\n",(0,r.jsx)(n.h2,{id:"lutris",children:"Lutris"}),"\n",(0,r.jsxs)(n.p,{children:["Lutris is currently available via the Solus repository, as the ",(0,r.jsx)(n.code,{children:"lutris"})," package."]}),"\n",(0,r.jsx)(n.h3,{id:"about",children:"About"}),"\n",(0,r.jsx)(n.p,{children:"Lutris is an open gaming platform for Linux. It helps you install and manage your games in a unified interface. Their goal is to support every game which runs on Linux, from native to Windows games (via Wine) to emulators and browser games. The desktop application and the website are libre software, contributions are welcome!"}),"\n",(0,r.jsxs)(n.p,{children:["For more information you can visit their website at ",(0,r.jsx)(n.a,{href:"https://lutris.net",children:"lutris.net"}),". You can also see their list of games ",(0,r.jsx)(n.a,{href:"https://lutris.net/games/",children:"here"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"minecraft",children:"Minecraft"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://www.minecraft.net",children:"Minecraft"}),' is a sandbox independent video game originally created by Swedish programmer Markus "Notch" Persson and later developed and published by the Swedish company Mojang.']}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Minecraft Screenshot",src:i(41786).Z+"",width:"1920",height:"1080"})}),"\n",(0,r.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.p,{children:"Install dependencies and download Minecraft:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf binutils\nwget https://launcher.mojang.com/download/Minecraft.deb\n"})}),"\n",(0,r.jsx)(n.p,{children:"Extract files and remove old archive:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo ar xf Minecraft.deb\nsudo tar xf data.tar.xz -C /\nsudo rm control.tar.xz data.tar.xz debian-binary Minecraft.deb\n"})}),"\n",(0,r.jsx)(n.p,{children:"Integrate the installed files into your system:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,r.jsx)(n.h3,{id:"prism-launcher",children:"Prism Launcher"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://prismlauncher.org/",children:"Prism Launcher"})," is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods. Focused on user freedom and free redistributability."]}),"\n",(0,r.jsxs)(n.p,{children:["Prism Launcher is currently available via the Solus repository, as the ",(0,r.jsx)(n.code,{children:"prism-launcher"})," package."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"The official Minecraft launcher is not required to use Prism Launcher"})}),"\n",(0,r.jsx)(n.h2,{id:"retroarch",children:"RetroArch"}),"\n",(0,r.jsx)(n.p,{children:"RetroArch is a frontend for emulators, game engines and media players. It has all you need to run classic games through its polished graphical interface."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"RetroArch Screenshot",src:i(10311).Z+"",width:"960",height:"746"})}),"\n",(0,r.jsx)(n.h3,{id:"installing-the-assets",children:"Installing the assets"}),"\n",(0,r.jsx)(n.p,{children:'The assets are not packaged with RetroArch itself and have to be downloaded from inside the program. This can easily be done by going into the Online Updater from the Main Menu and selecting "Update Assets".'}),"\n",(0,r.jsx)(n.h2,{id:"steam",children:"Steam"}),"\n",(0,r.jsxs)(n.p,{children:["Steam is currently available via the Solus repository, as the ",(0,r.jsx)(n.code,{children:"steam"})," package."]}),"\n",(0,r.jsx)(n.h3,{id:"nvidia",children:"NVIDIA"}),"\n",(0,r.jsx)(n.p,{children:"For systems running NVIDIA graphics hardware, you will need to install the corresponding 32bit video driver for your card, listed below:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Current Gen: ",(0,r.jsx)(n.code,{children:"nvidia-glx-driver-32bit"})]}),"\n",(0,r.jsxs)(n.li,{children:["470 series: ",(0,r.jsx)(n.code,{children:"nvidia-470-glx-driver-32bit"})]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:'You can use our "Hardware Drivers" utility to find the right driver for your system.'})})]})}function h(e={}){let{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},41786:function(e,n,i){i.d(n,{Z:function(){return s}});let s=i.p+"assets/images/minecraft-7079f00591b397a6d96d8b3603f5d05f.jpg"},10311:function(e,n,i){i.d(n,{Z:function(){return s}});let s=i.p+"assets/images/retroarch-9d687fb4c01f4d4f393f10b277b10e9c.jpg"},50065:function(e,n,i){i.d(n,{Z:function(){return l},a:function(){return a}});var s=i(67294);let r={},t=s.createContext(r);function a(e){let n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9284d474.2fb1c458.js b/assets/js/9284d474.2fb1c458.js deleted file mode 100644 index ff76cdbfe..000000000 --- a/assets/js/9284d474.2fb1c458.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7626],{8110:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var i=s(85893),r=s(11151);const t={title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},a="Gaming",l={id:"user/software/gaming/index",title:"Gaming",description:"Heroes of Newerth",source:"@site/docs/user/software/gaming/index.md",sourceDirName:"user/software/gaming",slug:"/user/software/gaming/",permalink:"/docs/user/software/gaming/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/gaming/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},sidebar:"userSidebar",previous:{title:"Web Development",permalink:"/docs/user/software/development/web"},next:{title:"Localization",permalink:"/docs/category/localization"}},o={},d=[{value:"Heroes of Newerth",id:"heroes-of-newerth",level:2},{value:"Lutris",id:"lutris",level:2},{value:"About",id:"about",level:3},{value:"Minecraft",id:"minecraft",level:2},{value:"Installation",id:"installation",level:3},{value:"Prism Launcher",id:"prism-launcher",level:3},{value:"RetroArch",id:"retroarch",level:2},{value:"Installing the assets",id:"installing-the-assets",level:3},{value:"Steam",id:"steam",level:2},{value:"NVIDIA",id:"nvidia",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gaming",children:"Gaming"})}),"\n",(0,i.jsx)(n.h2,{id:"heroes-of-newerth",children:"Heroes of Newerth"}),"\n",(0,i.jsx)(n.p,{children:'First, install the latest version of HoN by downloading it and running "HoNClient.sh".'}),"\n",(0,i.jsx)(n.p,{children:"Assuming that you install to ~/HoN (default), you only need to run two commands:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf libgcrypt11 libglu\n"})}),"\n",(0,i.jsx)(n.p,{children:"That installs all of the dependencies that HoN needs."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"rm ~/HoN/libs-x86_64/{libcurl.so.4,libfreetype.so.6,libgcc_s.so.1,libgcrypt.so.11,libspeexdsp.so.1,libspeex.so.1,libstdc++.so.6,libudev.so.0}\n"})}),"\n",(0,i.jsx)(n.p,{children:"This removes all the libraries that conflict with the ones in Solus."}),"\n",(0,i.jsx)(n.h2,{id:"lutris",children:"Lutris"}),"\n",(0,i.jsxs)(n.p,{children:["Lutris is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"lutris"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"about",children:"About"}),"\n",(0,i.jsx)(n.p,{children:"Lutris is an open gaming platform for Linux. It helps you install and manage your games in a unified interface. Their goal is to support every game which runs on Linux, from native to Windows games (via Wine) to emulators and browser games. The desktop application and the website are libre software, contributions are welcome!"}),"\n",(0,i.jsxs)(n.p,{children:["For more information you can visit their website at ",(0,i.jsx)(n.a,{href:"https://lutris.net",children:"lutris.net"}),". You can also see their list of games ",(0,i.jsx)(n.a,{href:"https://lutris.net/games/",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"minecraft",children:"Minecraft"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://www.minecraft.net",children:"Minecraft"}),' is a sandbox independent video game originally created by Swedish programmer Markus "Notch" Persson and later developed and published by the Swedish company Mojang.']}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Minecraft Screenshot",src:s(15528).Z+"",width:"1920",height:"1080"})}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"Install dependencies and download Minecraft:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf binutils\nwget https://launcher.mojang.com/download/Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract files and remove old archive:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo ar xf Minecraft.deb\nsudo tar xf data.tar.xz -C /\nsudo rm control.tar.xz data.tar.xz debian-binary Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Integrate the installed files into your system:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,i.jsx)(n.h3,{id:"prism-launcher",children:"Prism Launcher"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://prismlauncher.org/",children:"Prism Launcher"})," is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods. Focused on user freedom and free redistributability."]}),"\n",(0,i.jsxs)(n.p,{children:["Prism Launcher is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"prism-launcher"})," package."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The official Minecraft launcher is not required to use Prism Launcher"})}),"\n",(0,i.jsx)(n.h2,{id:"retroarch",children:"RetroArch"}),"\n",(0,i.jsx)(n.p,{children:"RetroArch is a frontend for emulators, game engines and media players. It has all you need to run classic games through its polished graphical interface."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"RetroArch Screenshot",src:s(30963).Z+"",width:"960",height:"746"})}),"\n",(0,i.jsx)(n.h3,{id:"installing-the-assets",children:"Installing the assets"}),"\n",(0,i.jsx)(n.p,{children:'The assets are not packaged with RetroArch itself and have to be downloaded from inside the program. This can easily be done by going into the Online Updater from the Main Menu and selecting "Update Assets".'}),"\n",(0,i.jsx)(n.h2,{id:"steam",children:"Steam"}),"\n",(0,i.jsxs)(n.p,{children:["Steam is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"steam"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"nvidia",children:"NVIDIA"}),"\n",(0,i.jsx)(n.p,{children:"For systems running NVIDIA graphics hardware, you will need to install the corresponding 32bit video driver for your card, listed below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Current Gen: ",(0,i.jsx)(n.code,{children:"nvidia-glx-driver-32bit"})]}),"\n",(0,i.jsxs)(n.li,{children:["470 series: ",(0,i.jsx)(n.code,{children:"nvidia-470-glx-driver-32bit"})]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:'You can use our "Hardware Drivers" utility to find the right driver for your system.'})})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},15528:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/minecraft-7079f00591b397a6d96d8b3603f5d05f.jpg"},30963:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/retroarch-9d687fb4c01f4d4f393f10b277b10e9c.jpg"},11151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>a});var i=s(67294);const r={},t=i.createContext(r);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9310.a97e1cbd.js b/assets/js/9310.a97e1cbd.js new file mode 100644 index 000000000..b02680f67 --- /dev/null +++ b/assets/js/9310.a97e1cbd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9310"],{92487:function(e,t,n){n.d(t,{Z:function(){return l}});var i=n(85893);n(67294);var o=n(74904),r=n(1822),s=n(52068);function l(e){let{className:t}=e;return(0,i.jsx)("main",{className:(0,o.Z)("container margin-vert--xl",t),children:(0,i.jsx)("div",{className:"row",children:(0,i.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,i.jsx)(s.Z,{as:"h1",className:"hero__title",children:(0,i.jsx)(r.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,i.jsx)("p",{children:(0,i.jsx)(r.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,i.jsx)("p",{children:(0,i.jsx)(r.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},11320:function(e,t,n){n.r(t),n.d(t,{default:function(){return a}});var i=n(85893);n(67294);var o=n(1822),r=n(81921),s=n(99757),l=n(92487);function a(){let e=(0,o.I)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.d,{title:e}),(0,i.jsx)(s.Z,{children:(0,i.jsx)(l.Z,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/947d9ca4.21091671.js b/assets/js/947d9ca4.21091671.js new file mode 100644 index 000000000..04b6d0254 --- /dev/null +++ b/assets/js/947d9ca4.21091671.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7131"],{26916:function(e,n,t){t.r(n),t.d(n,{metadata:()=>i,contentTitle:()=>d,default:()=>h,assets:()=>a,toc:()=>r,frontMatter:()=>s});var i=JSON.parse('{"id":"user/software/development/web","title":"Web Development","description":"Solus provides multiple web servers for local testing of web applications.","source":"@site/docs/user/software/development/web.md","sourceDirName":"user/software/development","slug":"/user/software/development/web","permalink":"/docs/user/software/development/web","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/web.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Web Development","summary":"Install and configure different web development tools on Solus."},"sidebar":"userSidebar","previous":{"title":"Rust","permalink":"/docs/user/software/development/rust"},"next":{"title":"Gaming","permalink":"/docs/user/software/gaming/"}}'),o=t("85893"),l=t("50065");let s={title:"Web Development",summary:"Install and configure different web development tools on Solus."},d="Web Development",a={},r=[{value:"Caddy",id:"caddy",level:2},{value:"Installation",id:"installation",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Management",id:"management",level:4},{value:"httpd (Apache)",id:"httpd-apache",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Usage",id:"usage",level:3},{value:"Configuration and DocumentRoot",id:"configuration-and-documentroot",level:4},{value:"Enabling PHP support",id:"enabling-php-support",level:4},{value:"Management",id:"management-1",level:4},{value:"nginx",id:"nginx",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Usage",id:"usage-1",level:3},{value:"Configuration",id:"configuration-1",level:4},{value:"Management",id:"management-2",level:4}];function c(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"web-development",children:"Web Development"})}),"\n",(0,o.jsx)(n.h1,{id:"servers",children:"Servers"}),"\n",(0,o.jsx)(n.p,{children:"Solus provides multiple web servers for local testing of web applications."}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Solus is not a server operating system"}),". Usage of server packages outside local testing is not recommended."]})}),"\n",(0,o.jsx)(n.h2,{id:"caddy",children:"Caddy"}),"\n",(0,o.jsx)(n.p,{children:"Caddy is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"caddy"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install caddy\n"})}),"\n",(0,o.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["You can configure Caddy using a ",(0,o.jsx)(n.em,{children:"Caddyfile"}),", a text file that contains configuration directives. The default Caddyfile is located at ",(0,o.jsx)(n.code,{children:"/usr/share/caddy/Caddyfile"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"To reload Caddy with a new configuration file, use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"caddy reload --config /path/to/new/caddyfile\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For more information, see the Caddy documentation at ",(0,o.jsx)(n.a,{href:"https://caddyserver.com/docs/",children:"https://caddyserver.com/docs/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"management",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage Caddy:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable Caddy on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now caddy"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop Caddy: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop caddy"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"httpd-apache",children:"httpd (Apache)"}),"\n",(0,o.jsx)(n.p,{children:"httpd (Apache) is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"httpd"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install httpd\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-and-documentroot",children:"Configuration and DocumentRoot"}),"\n",(0,o.jsxs)(n.p,{children:["The default configuration files for Apache are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," directory. To override the default configuration, create a new file with the ",(0,o.jsx)(n.code,{children:".conf"})," extension in the ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d"})," directory."]}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:["If you modify the configuration files located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," folder, your changes might be overwritten during a system update."]})}),"\n",(0,o.jsxs)(n.p,{children:["The document root is the directory where Apache serves files from. By default, the document root is ",(0,o.jsx)(n.code,{children:"/var/www/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"enabling-php-support",children:"Enabling PHP support"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.code,{children:"php"})," from the Software Center or execute the following command: ",(0,o.jsx)(n.code,{children:"sudo eopkg install php"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Create a new ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d/php.conf"})," file with the following contents:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'LoadModule proxy_module lib64/httpd/mod_proxy.so\nLoadModule proxy_fcgi_module lib64/httpd/mod_proxy_fcgi.so\n \nSetHandler "proxy:fcgi://127.0.0.1:9000"\n \n\nDirectoryIndex index.php index.html\n \n'})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["Execute the following command: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart httpd && sudo systemctl restart php-fpm"})]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"management-1",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage httpd:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable httpd on startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable httpd"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Start the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl start httpd"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop httpd"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"nginx",children:"nginx"}),"\n",(0,o.jsx)(n.p,{children:"nginx is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"nginx"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install nginx\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-1",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["Nginx's configuration files are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/nginx/"})," directory. To override the default configuration, you can create configuration files in the ",(0,o.jsx)(n.code,{children:"/etc/nginx/conf.d/"})," or the ",(0,o.jsx)(n.code,{children:"/etc/nginx/sites-enabled"})," folders."]}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To revert back to the original settings, delete the ",(0,o.jsx)(n.code,{children:"/etc/nginx/"})," folder."]})}),"\n",(0,o.jsx)(n.h4,{id:"management-2",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage nginx:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable nginx on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now nginx"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop nginx: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop nginx"})]}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return d},a:function(){return s}});var i=t(67294);let o={},l=i.createContext(o);function s(e){let n=i.useContext(l);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/947d9ca4.734cbf9e.js b/assets/js/947d9ca4.734cbf9e.js deleted file mode 100644 index ef7aa1706..000000000 --- a/assets/js/947d9ca4.734cbf9e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1944],{10025:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>r});var o=t(85893),i=t(11151);const s={title:"Web Development",summary:"Install and configure different web development tools on Solus."},l="Web Development",d={id:"user/software/development/web",title:"Web Development",description:"Solus provides multiple web servers for local testing of web applications.",source:"@site/docs/user/software/development/web.md",sourceDirName:"user/software/development",slug:"/user/software/development/web",permalink:"/docs/user/software/development/web",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/web.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Web Development",summary:"Install and configure different web development tools on Solus."},sidebar:"userSidebar",previous:{title:"Rust",permalink:"/docs/user/software/development/rust"},next:{title:"Gaming",permalink:"/docs/user/software/gaming/"}},a={},r=[{value:"Caddy",id:"caddy",level:2},{value:"Installation",id:"installation",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Management",id:"management",level:4},{value:"httpd (Apache)",id:"httpd-apache",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Usage",id:"usage",level:3},{value:"Configuration and DocumentRoot",id:"configuration-and-documentroot",level:4},{value:"Enabling PHP support",id:"enabling-php-support",level:4},{value:"Management",id:"management-1",level:4},{value:"nginx",id:"nginx",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Usage",id:"usage-1",level:3},{value:"Configuration",id:"configuration-1",level:4},{value:"Management",id:"management-2",level:4}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"web-development",children:"Web Development"})}),"\n",(0,o.jsx)(n.h1,{id:"servers",children:"Servers"}),"\n",(0,o.jsx)(n.p,{children:"Solus provides multiple web servers for local testing of web applications."}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Solus is not a server operating system"}),". Usage of server packages outside local testing is not recommended."]})}),"\n",(0,o.jsx)(n.h2,{id:"caddy",children:"Caddy"}),"\n",(0,o.jsx)(n.p,{children:"Caddy is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"caddy"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install caddy\n"})}),"\n",(0,o.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["You can configure Caddy using a ",(0,o.jsx)(n.em,{children:"Caddyfile"}),", a text file that contains configuration directives. The default Caddyfile is located at ",(0,o.jsx)(n.code,{children:"/usr/share/caddy/Caddyfile"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"To reload Caddy with a new configuration file, use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"caddy reload --config /path/to/new/caddyfile\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For more information, see the Caddy documentation at ",(0,o.jsx)(n.a,{href:"https://caddyserver.com/docs/",children:"https://caddyserver.com/docs/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"management",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage Caddy:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable Caddy on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now caddy"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop Caddy: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop caddy"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"httpd-apache",children:"httpd (Apache)"}),"\n",(0,o.jsx)(n.p,{children:"httpd (Apache) is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"httpd"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install httpd\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-and-documentroot",children:"Configuration and DocumentRoot"}),"\n",(0,o.jsxs)(n.p,{children:["The default configuration files for Apache are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," directory. To override the default configuration, create a new file with the ",(0,o.jsx)(n.code,{children:".conf"})," extension in the ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d"})," directory."]}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:["If you modify the configuration files located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," folder, your changes might be overwritten during a system update."]})}),"\n",(0,o.jsxs)(n.p,{children:["The document root is the directory where Apache serves files from. By default, the document root is ",(0,o.jsx)(n.code,{children:"/var/www/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"enabling-php-support",children:"Enabling PHP support"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.code,{children:"php"})," from the Software Center or execute the following command: ",(0,o.jsx)(n.code,{children:"sudo eopkg install php"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Create a new ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d/php.conf"})," file with the following contents:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'LoadModule proxy_module lib64/httpd/mod_proxy.so\nLoadModule proxy_fcgi_module lib64/httpd/mod_proxy_fcgi.so\n\nSetHandler "proxy:fcgi://127.0.0.1:9000"\n \n\nDirectoryIndex index.php index.html\n \n'})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["Execute the following command: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart httpd && sudo systemctl restart php-fpm"})]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"management-1",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage httpd:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable httpd on startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable httpd"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Start the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl start httpd"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop httpd"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"nginx",children:"nginx"}),"\n",(0,o.jsx)(n.p,{children:"nginx is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"nginx"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install nginx\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-1",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["Nginx's configuration files are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/nginx/"})," directory. To override the default configuration, you can create configuration files in the ",(0,o.jsx)(n.code,{children:"/etc/nginx/conf.d/"})," or the ",(0,o.jsx)(n.code,{children:"/etc/nginx/sites-enabled"})," folders."]}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To revert back to the original settings, delete the ",(0,o.jsx)(n.code,{children:"/etc/nginx/"})," folder."]})}),"\n",(0,o.jsx)(n.h4,{id:"management-2",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage nginx:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable nginx on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now nginx"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop nginx: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop nginx"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>l});var o=t(67294);const i={},s=o.createContext(i);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9485dea6.14b20627.js b/assets/js/9485dea6.14b20627.js deleted file mode 100644 index 15aadc07f..000000000 --- a/assets/js/9485dea6.14b20627.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2358],{29421:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var l=n(85893),r=n(11151);const t={title:"WiFi",summary:null},s="WiFi",c={id:"user/hardware/compatibility/wifi",title:"WiFi",description:"The following wireless chipsets have been tested and/or suggested to function correctly by our users.",source:"@site/docs/user/hardware/compatibility/wifi.md",sourceDirName:"user/hardware/compatibility",slug:"/user/hardware/compatibility/wifi",permalink:"/docs/user/hardware/compatibility/wifi",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/wifi.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"WiFi",summary:null},sidebar:"userSidebar",previous:{title:"Laptops",permalink:"/docs/user/hardware/compatibility/laptops"},next:{title:"Mobile",permalink:"/docs/category/mobile"}},d={},o=[{value:"Atheros",id:"atheros",level:2},{value:"Broadcom",id:"broadcom",level:2},{value:"Netgear",id:"netgear",level:2},{value:"Intel",id:"intel",level:2},{value:"Ralink",id:"ralink",level:2},{value:"Realtek",id:"realtek",level:2}];function a(e){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.header,{children:(0,l.jsx)(i.h1,{id:"wifi",children:"WiFi"})}),"\n",(0,l.jsx)(i.p,{children:"The following wireless chipsets have been tested and/or suggested to function correctly by our users."}),"\n",(0,l.jsxs)(i.p,{children:["This list should not suggest that ",(0,l.jsx)(i.em,{children:"only"}),"- such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,l.jsx)(i.h2,{id:"atheros",children:"Atheros"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Atheros AR5B97"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR242x"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR542x"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR928X"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR8161"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9285"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9287"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9462"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9485"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9485WB-EG"}),"\n",(0,l.jsx)(i.li,{children:"Atheros QCA9565 / AR9565"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"broadcom",children:"Broadcom"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4312"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4313"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4322"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4324"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4331"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4365"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM57785"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"netgear",children:"Netgear"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Netgear WPN111"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"intel",children:"Intel"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Intel AC3160"}),"\n",(0,l.jsx)(i.li,{children:"Intel AC7265"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6200"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6205"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6235"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Ultimate-N 6300"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Wireless-N 2230"}),"\n",(0,l.jsx)(i.li,{children:"Intel PRO/Wireless 3945ABG"}),"\n",(0,l.jsx)(i.li,{children:"Intel PRO/Wireless 4965 AG or AGN"}),"\n",(0,l.jsx)(i.li,{children:"Intel Ultimate N WiFi Link 5300"}),"\n",(0,l.jsx)(i.li,{children:"Intel WiFi Link 5100"}),"\n",(0,l.jsx)(i.li,{children:"Intel Wireless 8265 / 8275"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"ralink",children:"Ralink"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Ralink RT5390"}),"\n",(0,l.jsx)(i.li,{children:"Ralink RT3070"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"realtek",children:"Realtek"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Realtek RTL8101E/RTL8102E"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8111/8168B"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8169"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8179"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8187SE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8188CE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8188CUS"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8191SEvB"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8192ce"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8723BE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8723DE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8821CD"}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(a,{...e})}):a(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>s});var l=n(67294);const r={},t=l.createContext(r);function s(e){const i=l.useContext(t);return l.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9485dea6.9c558050.js b/assets/js/9485dea6.9c558050.js new file mode 100644 index 000000000..bc045f24b --- /dev/null +++ b/assets/js/9485dea6.9c558050.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["628"],{22633:function(e,n,i){i.r(n),i.d(n,{metadata:()=>l,contentTitle:()=>c,default:()=>h,assets:()=>d,toc:()=>a,frontMatter:()=>s});var l=JSON.parse('{"id":"user/hardware/compatibility/wifi","title":"WiFi","description":"The following wireless chipsets have been tested and/or suggested to function correctly by our users.","source":"@site/docs/user/hardware/compatibility/wifi.md","sourceDirName":"user/hardware/compatibility","slug":"/user/hardware/compatibility/wifi","permalink":"/docs/user/hardware/compatibility/wifi","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/wifi.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"WiFi","summary":null},"sidebar":"userSidebar","previous":{"title":"Laptops","permalink":"/docs/user/hardware/compatibility/laptops"},"next":{"title":"Mobile","permalink":"/docs/category/mobile"}}'),r=i("85893"),t=i("50065");let s={title:"WiFi",summary:null},c="WiFi",d={},a=[{value:"Atheros",id:"atheros",level:2},{value:"Broadcom",id:"broadcom",level:2},{value:"Netgear",id:"netgear",level:2},{value:"Intel",id:"intel",level:2},{value:"Ralink",id:"ralink",level:2},{value:"Realtek",id:"realtek",level:2}];function o(e){let n={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"wifi",children:"WiFi"})}),"\n",(0,r.jsx)(n.p,{children:"The following wireless chipsets have been tested and/or suggested to function correctly by our users."}),"\n",(0,r.jsxs)(n.p,{children:["This list should not suggest that ",(0,r.jsx)(n.em,{children:"only"}),"- such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,r.jsx)(n.h2,{id:"atheros",children:"Atheros"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Atheros AR5B97"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR242x"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR542x"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR928X"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR8161"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR9285"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR9287"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR9462"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR9485"}),"\n",(0,r.jsx)(n.li,{children:"Atheros AR9485WB-EG"}),"\n",(0,r.jsx)(n.li,{children:"Atheros QCA9565 / AR9565"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"broadcom",children:"Broadcom"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Broadcom BCM4312"}),"\n",(0,r.jsx)(n.li,{children:"Broadcom BCM4313"}),"\n",(0,r.jsx)(n.li,{children:"Broadcom BCM4322"}),"\n",(0,r.jsx)(n.li,{children:"Broadcom BCM4324"}),"\n",(0,r.jsx)(n.li,{children:"Broadcom BCM4331"}),"\n",(0,r.jsx)(n.li,{children:"Broadcom BCM4365"}),"\n",(0,r.jsx)(n.li,{children:"Broadcom BCM57785"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"netgear",children:"Netgear"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Netgear WPN111"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"intel",children:"Intel"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Intel AC3160"}),"\n",(0,r.jsx)(n.li,{children:"Intel AC7265"}),"\n",(0,r.jsx)(n.li,{children:"Intel Centrino Advanced-N 6200"}),"\n",(0,r.jsx)(n.li,{children:"Intel Centrino Advanced-N 6205"}),"\n",(0,r.jsx)(n.li,{children:"Intel Centrino Advanced-N 6235"}),"\n",(0,r.jsx)(n.li,{children:"Intel Centrino Ultimate-N 6300"}),"\n",(0,r.jsx)(n.li,{children:"Intel Centrino Wireless-N 2230"}),"\n",(0,r.jsx)(n.li,{children:"Intel PRO/Wireless 3945ABG"}),"\n",(0,r.jsx)(n.li,{children:"Intel PRO/Wireless 4965 AG or AGN"}),"\n",(0,r.jsx)(n.li,{children:"Intel Ultimate N WiFi Link 5300"}),"\n",(0,r.jsx)(n.li,{children:"Intel WiFi Link 5100"}),"\n",(0,r.jsx)(n.li,{children:"Intel Wireless 8265 / 8275"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"ralink",children:"Ralink"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Ralink RT5390"}),"\n",(0,r.jsx)(n.li,{children:"Ralink RT3070"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"realtek",children:"Realtek"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Realtek RTL8101E/RTL8102E"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8111/8168B"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8169"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8179"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8187SE"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8188CE"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8188CUS"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8191SEvB"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8192ce"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8723BE"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8723DE"}),"\n",(0,r.jsx)(n.li,{children:"Realtek RTL8821CD"}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},50065:function(e,n,i){i.d(n,{Z:function(){return c},a:function(){return s}});var l=i(67294);let r={},t=l.createContext(r);function s(e){let n=l.useContext(t);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/96af6484.878ddd89.js b/assets/js/96af6484.878ddd89.js deleted file mode 100644 index 094af4fce..000000000 --- a/assets/js/96af6484.878ddd89.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6225],{53058:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var t=n(85893),s=n(11151);const r={title:"Mice and Touchpads",summary:"Guide to using and configuring input devices on Solus"},a="Mice and Touchpads",c={id:"user/hardware/peripherals/mice-and-touchpads",title:"Mice and Touchpads",description:"ASUS, Logitech, Roccat, SteelSeries",source:"@site/docs/user/hardware/peripherals/mice-and-touchpads.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/mice-and-touchpads",permalink:"/docs/user/hardware/peripherals/mice-and-touchpads",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/mice-and-touchpads.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Mice and Touchpads",summary:"Guide to using and configuring input devices on Solus"},sidebar:"userSidebar",previous:{title:"Peripherals",permalink:"/docs/category/peripherals"},next:{title:"MIDI Keyboards",permalink:"/docs/user/hardware/peripherals/midi-keyboard"}},o={},d=[{value:"ASUS, Logitech, Roccat, SteelSeries",id:"asus-logitech-roccat-steelseries",level:2},{value:"Razer",id:"razer",level:2},{value:"Synaptics",id:"synaptics",level:2},{value:"Setup",id:"setup",level:3},{value:"Revert configuration",id:"revert-configuration",level:3}];function l(e){const i={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"mice-and-touchpads",children:"Mice and Touchpads"})}),"\n",(0,t.jsx)(i.h2,{id:"asus-logitech-roccat-steelseries",children:"ASUS, Logitech, Roccat, SteelSeries"}),"\n",(0,t.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,t.jsx)(i.code,{children:"piper"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,t.jsx)(i.h2,{id:"razer",children:"Razer"}),"\n",(0,t.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,t.jsx)(i.code,{children:"polychromatic"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,t.jsx)(i.h2,{id:"synaptics",children:"Synaptics"}),"\n",(0,t.jsx)(i.p,{children:"These instructions describe how to use the the synaptics driver instead of the default libinput driver to manage your touchpad. You might try this if:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"libinput doesn't allow for two-finger scrolling"}),"\n",(0,t.jsx)(i.li,{children:"libinput doesn't supports edge scrolling or vice versa"}),"\n",(0,t.jsx)(i.li,{children:"You want to take advantage of the extended configurability of the synaptics driver"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," The synaptics driver will only be used for your touchpad and libinput will be used for all other input devices."]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," That the synaptics driver is in maintenance mode and libinput is the preferred driver and also sees active development."]}),"\n",(0,t.jsx)(i.h3,{id:"setup",children:"Setup"}),"\n",(0,t.jsx)(i.p,{children:"To get started open up a terminal and install the synaptics driver."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it xorg-driver-input-synaptics\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Then, copy the default synaptics config file to the ",(0,t.jsx)(i.code,{children:"/etc/"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/90-synaptics.conf\n"})}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," The /etc/ directory has a higher priority over the default config location and will ensure the synaptics driver gets loaded first, additionally by copying to /etc/ first it will avoid a three-way merge issue if you wish the edit the config file directly."]}),"\n",(0,t.jsx)(i.p,{children:"Reboot your machine then verify the synaptics driver is in use:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cat /var/log/Xorg.0.log | grep \"Using input driver 'synaptics' for\"\n"})}),"\n",(0,t.jsx)(i.p,{children:"If it returns a result, then success! The synaptics driver is in use instead of libinput for your Touchpad."}),"\n",(0,t.jsx)(i.h3,{id:"revert-configuration",children:"Revert configuration"}),"\n",(0,t.jsx)(i.p,{children:"If you wish to switch back to using libinput:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo rm /etc/X11/xorg.conf.d/90-synaptics.conf\nsudo eopkg rm xorg-driver-input-synaptics\n"})})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>a});var t=n(67294);const s={},r=t.createContext(s);function a(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/96af6484.b9da4550.js b/assets/js/96af6484.b9da4550.js new file mode 100644 index 000000000..680ba29cc --- /dev/null +++ b/assets/js/96af6484.b9da4550.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8736"],{31763:function(e,i,n){n.r(i),n.d(i,{metadata:()=>t,contentTitle:()=>c,default:()=>h,assets:()=>o,toc:()=>d,frontMatter:()=>a});var t=JSON.parse('{"id":"user/hardware/peripherals/mice-and-touchpads","title":"Mice and Touchpads","description":"ASUS, Logitech, Roccat, SteelSeries","source":"@site/docs/user/hardware/peripherals/mice-and-touchpads.md","sourceDirName":"user/hardware/peripherals","slug":"/user/hardware/peripherals/mice-and-touchpads","permalink":"/docs/user/hardware/peripherals/mice-and-touchpads","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/mice-and-touchpads.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Mice and Touchpads","summary":"Guide to using and configuring input devices on Solus"},"sidebar":"userSidebar","previous":{"title":"Peripherals","permalink":"/docs/category/peripherals"},"next":{"title":"MIDI Keyboards","permalink":"/docs/user/hardware/peripherals/midi-keyboard"}}'),r=n("85893"),s=n("50065");let a={title:"Mice and Touchpads",summary:"Guide to using and configuring input devices on Solus"},c="Mice and Touchpads",o={},d=[{value:"ASUS, Logitech, Roccat, SteelSeries",id:"asus-logitech-roccat-steelseries",level:2},{value:"Razer",id:"razer",level:2},{value:"Synaptics",id:"synaptics",level:2},{value:"Setup",id:"setup",level:3},{value:"Revert configuration",id:"revert-configuration",level:3}];function l(e){let i={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"mice-and-touchpads",children:"Mice and Touchpads"})}),"\n",(0,r.jsx)(i.h2,{id:"asus-logitech-roccat-steelseries",children:"ASUS, Logitech, Roccat, SteelSeries"}),"\n",(0,r.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,r.jsx)(i.code,{children:"piper"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,r.jsx)(i.h2,{id:"razer",children:"Razer"}),"\n",(0,r.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,r.jsx)(i.code,{children:"polychromatic"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,r.jsx)(i.h2,{id:"synaptics",children:"Synaptics"}),"\n",(0,r.jsx)(i.p,{children:"These instructions describe how to use the the synaptics driver instead of the default libinput driver to manage your touchpad. You might try this if:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"libinput doesn't allow for two-finger scrolling"}),"\n",(0,r.jsx)(i.li,{children:"libinput doesn't supports edge scrolling or vice versa"}),"\n",(0,r.jsx)(i.li,{children:"You want to take advantage of the extended configurability of the synaptics driver"}),"\n"]}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"NOTE:"})," The synaptics driver will only be used for your touchpad and libinput will be used for all other input devices."]}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"NOTE:"})," That the synaptics driver is in maintenance mode and libinput is the preferred driver and also sees active development."]}),"\n",(0,r.jsx)(i.h3,{id:"setup",children:"Setup"}),"\n",(0,r.jsx)(i.p,{children:"To get started open up a terminal and install the synaptics driver."}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it xorg-driver-input-synaptics\n"})}),"\n",(0,r.jsxs)(i.p,{children:["Then, copy the default synaptics config file to the ",(0,r.jsx)(i.code,{children:"/etc/"})," directory."]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:"sudo cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/90-synaptics.conf\n"})}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"NOTE:"})," The /etc/ directory has a higher priority over the default config location and will ensure the synaptics driver gets loaded first, additionally by copying to /etc/ first it will avoid a three-way merge issue if you wish the edit the config file directly."]}),"\n",(0,r.jsx)(i.p,{children:"Reboot your machine then verify the synaptics driver is in use:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:"cat /var/log/Xorg.0.log | grep \"Using input driver 'synaptics' for\"\n"})}),"\n",(0,r.jsx)(i.p,{children:"If it returns a result, then success! The synaptics driver is in use instead of libinput for your Touchpad."}),"\n",(0,r.jsx)(i.h3,{id:"revert-configuration",children:"Revert configuration"}),"\n",(0,r.jsx)(i.p,{children:"If you wish to switch back to using libinput:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:"sudo rm /etc/X11/xorg.conf.d/90-synaptics.conf\nsudo eopkg rm xorg-driver-input-synaptics\n"})})]})}function h(e={}){let{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},50065:function(e,i,n){n.d(i,{Z:function(){return c},a:function(){return a}});var t=n(67294);let r={},s=t.createContext(r);function a(e){let i=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/97c623e4.9f56cce7.js b/assets/js/97c623e4.9f56cce7.js deleted file mode 100644 index 9a3661fa0..000000000 --- a/assets/js/97c623e4.9f56cce7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6427],{42268:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var s=t(85893),r=t(11151);const n={title:"Requesting a Package Update",summary:"Boohoo, your favorite package is outdated!"},o="Requesting A Package Update",i={id:"packaging/procedures/request-a-package-update",title:"Requesting a Package Update",description:"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know.",source:"@site/docs/packaging/procedures/request-a-package-update.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package-update",permalink:"/docs/packaging/procedures/request-a-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package-update.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Requesting a Package Update",summary:"Boohoo, your favorite package is outdated!"},sidebar:"packagingSidebar",previous:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"},next:{title:"Requesting a Package",permalink:"/docs/packaging/procedures/request-a-package"}},c={},p=[];function d(e){const a={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"requesting-a-package-update",children:"Requesting A Package Update"})}),"\n",(0,s.jsx)(a.p,{children:"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know."}),"\n",(0,s.jsxs)(a.p,{children:[(0,s.jsxs)(a.strong,{children:["First, please ",(0,s.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Update+Request%22",children:"look to see if an update request has already been filed"})," for the software or library you require"]}),"."]}),"\n",(0,s.jsx)(a.p,{children:"If there isn't an existing request, you can use the link below to request a package update. Note that updates solely for a new version number, platform-specific updates (such as to macOS or Windows) which aren't relevant, or solely translation updates, are generally not accepted or not prioritized."}),"\n",(0,s.jsx)(a.p,{children:"You will be asked in the form to provide the following information:"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsxs)(a.li,{children:["Title: ",(0,s.jsx)(a.code,{children:"Update $packagename to $version"})," (Example: ",(0,s.jsx)(a.code,{children:"Update nano to 2.9.7"}),")"]}),"\n",(0,s.jsx)(a.li,{children:"Description: Explanation as to the value-add of updating this package."}),"\n",(0,s.jsxs)(a.li,{children:["Link to source tarball/zip file. Note: ",(0,s.jsx)(a.code,{children:"master.zip"})," files ",(0,s.jsx)(a.strong,{children:"are not permitted"}),'. We require versioned tarballs, for example: "1.2.3.tar.gz".']}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["Please put this into a new ",(0,s.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Update+Request&projects=&template=request-package-update.yml",children:"issue"}),"."]})]})}function l(e={}){const{wrapper:a}={...(0,r.a)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,a,t)=>{t.d(a,{Z:()=>i,a:()=>o});var s=t(67294);const r={},n=s.createContext(r);function o(e){const a=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/97c623e4.fe9ce8f4.js b/assets/js/97c623e4.fe9ce8f4.js new file mode 100644 index 000000000..32bbc10aa --- /dev/null +++ b/assets/js/97c623e4.fe9ce8f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4661"],{39487:function(e,a,t){t.r(a),t.d(a,{metadata:()=>s,contentTitle:()=>i,default:()=>d,assets:()=>c,toc:()=>p,frontMatter:()=>o});var s=JSON.parse('{"id":"packaging/procedures/request-a-package-update","title":"Requesting a Package Update","description":"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know.","source":"@site/docs/packaging/procedures/request-a-package-update.md","sourceDirName":"packaging/procedures","slug":"/packaging/procedures/request-a-package-update","permalink":"/docs/packaging/procedures/request-a-package-update","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package-update.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Requesting a Package Update","summary":"Boohoo, your favorite package is outdated!"},"sidebar":"packagingSidebar","previous":{"title":"Release Processes","permalink":"/docs/packaging/procedures/release-processes"},"next":{"title":"Requesting a Package","permalink":"/docs/packaging/procedures/request-a-package"}}'),r=t("85893"),n=t("50065");let o={title:"Requesting a Package Update",summary:"Boohoo, your favorite package is outdated!"},i="Requesting A Package Update",c={},p=[];function l(e){let a={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"requesting-a-package-update",children:"Requesting A Package Update"})}),"\n",(0,r.jsx)(a.p,{children:"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know."}),"\n",(0,r.jsxs)(a.p,{children:[(0,r.jsxs)(a.strong,{children:["First, please ",(0,r.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Update+Request%22",children:"look to see if an update request has already been filed"})," for the software or library you require"]}),"."]}),"\n",(0,r.jsx)(a.p,{children:"If there isn't an existing request, you can use the link below to request a package update. Note that updates solely for a new version number, platform-specific updates (such as to macOS or Windows) which aren't relevant, or solely translation updates, are generally not accepted or not prioritized."}),"\n",(0,r.jsx)(a.p,{children:"You will be asked in the form to provide the following information:"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsxs)(a.li,{children:["Title: ",(0,r.jsx)(a.code,{children:"Update $packagename to $version"})," (Example: ",(0,r.jsx)(a.code,{children:"Update nano to 2.9.7"}),")"]}),"\n",(0,r.jsx)(a.li,{children:"Description: Explanation as to the value-add of updating this package."}),"\n",(0,r.jsxs)(a.li,{children:["Link to source tarball/zip file. Note: ",(0,r.jsx)(a.code,{children:"master.zip"})," files ",(0,r.jsx)(a.strong,{children:"are not permitted"}),'. We require versioned tarballs, for example: "1.2.3.tar.gz".']}),"\n"]}),"\n",(0,r.jsxs)(a.p,{children:["Please put this into a new ",(0,r.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Update+Request&projects=&template=request-package-update.yml",children:"issue"}),"."]})]})}function d(e={}){let{wrapper:a}={...(0,n.a)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},50065:function(e,a,t){t.d(a,{Z:function(){return i},a:function(){return o}});var s=t(67294);let r={},n=s.createContext(r);function o(e){let a=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99bedda9.5bdd5b90.js b/assets/js/99bedda9.5bdd5b90.js new file mode 100644 index 000000000..092327c49 --- /dev/null +++ b/assets/js/99bedda9.5bdd5b90.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7240"],{9982:function(e,r,i){i.r(r),i.d(r,{metadata:()=>n,contentTitle:()=>l,default:()=>c,assets:()=>o,toc:()=>a,frontMatter:()=>d});var n=JSON.parse('{"id":"user/hardware/index","title":"Hardware","description":"Preinstalled drivers","source":"@site/docs/user/hardware/index.md","sourceDirName":"user/hardware","slug":"/user/hardware/","permalink":"/docs/user/hardware/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Hardware","summary":"Guide to using additional hardware on Solus"},"sidebar":"userSidebar","previous":{"title":"Tips and Tricks","permalink":"/docs/user/editions/xfce/tips-and-tricks"},"next":{"title":"Compatibility","permalink":"/docs/category/compatibility"}}'),t=i("85893"),s=i("50065");let d={title:"Hardware",summary:"Guide to using additional hardware on Solus"},l="Hardware",o={},a=[{value:"Preinstalled drivers",id:"preinstalled-drivers",level:2},{value:"GPUs",id:"gpus",level:3},{value:"Proprietary drivers",id:"proprietary-drivers",level:2},{value:"Supported drivers",id:"supported-drivers",level:3}];function h(e){let r={h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"hardware",children:"Hardware"})}),"\n",(0,t.jsx)(r.h2,{id:"preinstalled-drivers",children:"Preinstalled drivers"}),"\n",(0,t.jsx)(r.p,{children:"The vast majority of hardware on Linux is supported by driver modules included with the Linux Kernel. This includes things like:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"CPUs (AMD, Intel)"}),"\n",(0,t.jsx)(r.li,{children:"Networking"}),"\n",(0,t.jsx)(r.li,{children:"PCI and PCI Express"}),"\n",(0,t.jsx)(r.li,{children:"Storage"}),"\n",(0,t.jsx)(r.li,{children:"USB"}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"The purpose of this documentation is to help you find drivers for hardware that is not directly supported or requires additional configuration to be used on Solus."}),"\n",(0,t.jsx)(r.h3,{id:"gpus",children:"GPUs"}),"\n",(0,t.jsx)(r.p,{children:"The situations with GPU drivers on Linux is a little complicated. Each driver is actually broken up into multiple pieces:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Direct Rendering Manager (DRM)"}),"\nThis is the part of the driver provided by the Linux kernel and provides just enough functionality to allow other drivers to access the hardware and render to a connected display.\nLinux provides support for AMD, Intel, and NVIDIA GPUs in this basic capacity."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"OpenGL driver"}),"\nThis part of the driver is needed for OpenGL applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Vulkan driver"}),"\nThis part of the driver is needed for Vulkan applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Xorg driver"}),"\nIn order to expose certain features to the Xorg Server, AMD and Intel have additional drivers which may be needed for things like variable refresh rate or multiple display support."]}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"Unfortunately for NVIDIA users, the situation gets a little complicated. Linux has two sets of drivers for NVIDIA GPUs:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Nouveau"}),"\nThis is the open-source driver for NVIDIA GPUs. It consists of a DRM driver provided by the Linux kernel, OpenGL drivers (nvc0, nv50) from Mesa, and an Xorg driver (xorg-driver-video-nouveau).\nDevice support for these drivers has historically lagged behind the NVIDIA proprietary drivers and likely will not support newer hardware and does not include Vulkan support.\nPerformance of this driver also typically lags behind the proprietary drivers."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"NVIDIA proprietary drivers"}),"\nThis is the closed-source driver provided directly by NVIDIA. It consists of a DRM driver module for the kernel, OpenGL and Vulkan drivers for rendering, and additional drivers for extended features of the hardware.\nDevice support for these drivers is very good for newer hardware, but older devices will eventually become unsupported and require the Nouveau drivers instead.\nPerformance of this driver is typically the best available and is therefore highly desirable to gamers and content creators."]}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"proprietary-drivers",children:"Proprietary drivers"}),"\n",(0,t.jsx)(r.p,{children:"Installing proprietary drivers may improve performance or certain features, however they are usually not necessary for normal daily usage. Solus provides a utility for installing drivers for detected hardware."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsx)(r.img,{alt:"DoFlicky Screenshot",src:i(50996).Z+"",width:"497",height:"321"})}),"\n",(0,t.jsx)(r.p,{children:"If there are proprietary drivers that can be installed, they will show up in the box below the description. You can click the item you wish to install and click Install. If you are installing NVIDIA drivers, you may find it to be desirable to install the 32-bit driver as well, in the event you wish to use Steam or Wine."}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Note:"})," A reboot will be required to use the newly installed driver."]}),"\n",(0,t.jsx)(r.h3,{id:"supported-drivers",children:"Supported drivers"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Vendor"}),(0,t.jsx)(r.th,{children:"Drivers"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"ASUS"}),(0,t.jsx)(r.td,{children:"piper"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Broadcom"}),(0,t.jsx)(r.td,{children:"broadcom-sta"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Logitech"}),(0,t.jsx)(r.td,{children:"piper"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"NVIDIA"}),(0,t.jsx)(r.td,{children:"470, main series"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Razer"}),(0,t.jsx)(r.td,{children:"openrazer"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Roccat"}),(0,t.jsx)(r.td,{children:"piper"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"SteelSeries"}),(0,t.jsx)(r.td,{children:"piper"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"VMware"}),(0,t.jsx)(r.td,{children:"open-vm-tools"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Xbox"}),(0,t.jsx)(r.td,{children:"xone"})]})]})]})]})}function c(e={}){let{wrapper:r}={...(0,s.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},50996:function(e,r,i){i.d(r,{Z:function(){return n}});let n=i.p+"assets/images/doflicky-574dff562b460c3839fb6d47c7fa2d25.jpg"},50065:function(e,r,i){i.d(r,{Z:function(){return l},a:function(){return d}});var n=i(67294);let t={},s=n.createContext(t);function d(e){let r=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),n.createElement(s.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99bedda9.7d99703c.js b/assets/js/99bedda9.7d99703c.js deleted file mode 100644 index 6b8fd0f30..000000000 --- a/assets/js/99bedda9.7d99703c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8639],{48345:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>o,contentTitle:()=>d,default:()=>c,frontMatter:()=>t,metadata:()=>l,toc:()=>a});var s=i(85893),n=i(11151);const t={title:"Hardware",summary:"Guide to using additional hardware on Solus"},d="Hardware",l={id:"user/hardware/index",title:"Hardware",description:"Preinstalled drivers",source:"@site/docs/user/hardware/index.md",sourceDirName:"user/hardware",slug:"/user/hardware/",permalink:"/docs/user/hardware/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Hardware",summary:"Guide to using additional hardware on Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"},next:{title:"Compatibility",permalink:"/docs/category/compatibility"}},o={},a=[{value:"Preinstalled drivers",id:"preinstalled-drivers",level:2},{value:"GPUs",id:"gpus",level:3},{value:"Proprietary drivers",id:"proprietary-drivers",level:2},{value:"Supported drivers",id:"supported-drivers",level:3}];function h(e){const r={h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"hardware",children:"Hardware"})}),"\n",(0,s.jsx)(r.h2,{id:"preinstalled-drivers",children:"Preinstalled drivers"}),"\n",(0,s.jsx)(r.p,{children:"The vast majority of hardware on Linux is supported by driver modules included with the Linux Kernel. This includes things like:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"CPUs (AMD, Intel)"}),"\n",(0,s.jsx)(r.li,{children:"Networking"}),"\n",(0,s.jsx)(r.li,{children:"PCI and PCI Express"}),"\n",(0,s.jsx)(r.li,{children:"Storage"}),"\n",(0,s.jsx)(r.li,{children:"USB"}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"The purpose of this documentation is to help you find drivers for hardware that is not directly supported or requires additional configuration to be used on Solus."}),"\n",(0,s.jsx)(r.h3,{id:"gpus",children:"GPUs"}),"\n",(0,s.jsx)(r.p,{children:"The situations with GPU drivers on Linux is a little complicated. Each driver is actually broken up into multiple pieces:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Direct Rendering Manager (DRM)"}),"\nThis is the part of the driver provided by the Linux kernel and provides just enough functionality to allow other drivers to access the hardware and render to a connected display.\nLinux provides support for AMD, Intel, and NVIDIA GPUs in this basic capacity."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"OpenGL driver"}),"\nThis part of the driver is needed for OpenGL applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Vulkan driver"}),"\nThis part of the driver is needed for Vulkan applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Xorg driver"}),"\nIn order to expose certain features to the Xorg Server, AMD and Intel have additional drivers which may be needed for things like variable refresh rate or multiple display support."]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"Unfortunately for NVIDIA users, the situation gets a little complicated. Linux has two sets of drivers for NVIDIA GPUs:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Nouveau"}),"\nThis is the open-source driver for NVIDIA GPUs. It consists of a DRM driver provided by the Linux kernel, OpenGL drivers (nvc0, nv50) from Mesa, and an Xorg driver (xorg-driver-video-nouveau).\nDevice support for these drivers has historically lagged behind the NVIDIA proprietary drivers and likely will not support newer hardware and does not include Vulkan support.\nPerformance of this driver also typically lags behind the proprietary drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"NVIDIA proprietary drivers"}),"\nThis is the closed-source driver provided directly by NVIDIA. It consists of a DRM driver module for the kernel, OpenGL and Vulkan drivers for rendering, and additional drivers for extended features of the hardware.\nDevice support for these drivers is very good for newer hardware, but older devices will eventually become unsupported and require the Nouveau drivers instead.\nPerformance of this driver is typically the best available and is therefore highly desirable to gamers and content creators."]}),"\n"]}),"\n",(0,s.jsx)(r.h2,{id:"proprietary-drivers",children:"Proprietary drivers"}),"\n",(0,s.jsx)(r.p,{children:"Installing proprietary drivers may improve performance or certain features, however they are usually not necessary for normal daily usage. Solus provides a utility for installing drivers for detected hardware."}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"DoFlicky Screenshot",src:i(42202).Z+"",width:"497",height:"321"})}),"\n",(0,s.jsx)(r.p,{children:"If there are proprietary drivers that can be installed, they will show up in the box below the description. You can click the item you wish to install and click Install. If you are installing NVIDIA drivers, you may find it to be desirable to install the 32-bit driver as well, in the event you wish to use Steam or Wine."}),"\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Note:"})," A reboot will be required to use the newly installed driver."]}),"\n",(0,s.jsx)(r.h3,{id:"supported-drivers",children:"Supported drivers"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Vendor"}),(0,s.jsx)(r.th,{children:"Drivers"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ASUS"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Broadcom"}),(0,s.jsx)(r.td,{children:"broadcom-sta"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Logitech"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"NVIDIA"}),(0,s.jsx)(r.td,{children:"470, main series"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Razer"}),(0,s.jsx)(r.td,{children:"openrazer"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Roccat"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"SteelSeries"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"VMware"}),(0,s.jsx)(r.td,{children:"open-vm-tools"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Xbox"}),(0,s.jsx)(r.td,{children:"xone"})]})]})]})]})}function c(e={}){const{wrapper:r}={...(0,n.a)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},42202:(e,r,i)=>{i.d(r,{Z:()=>s});const s=i.p+"assets/images/doflicky-574dff562b460c3839fb6d47c7fa2d25.jpg"},11151:(e,r,i)=>{i.d(r,{Z:()=>l,a:()=>d});var s=i(67294);const n={},t=s.createContext(n);function d(e){const r=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9b400668.5f9fa4fa.js b/assets/js/9b400668.5f9fa4fa.js new file mode 100644 index 000000000..c21990bdb --- /dev/null +++ b/assets/js/9b400668.5f9fa4fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["900"],{42667:function(e){e.exports=JSON.parse('{"tag":{"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/x-86-64-v-3","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/9b400668.6f6321d9.js b/assets/js/9b400668.6f6321d9.js deleted file mode 100644 index 069b326fd..000000000 --- a/assets/js/9b400668.6f6321d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7670],{20767:e=>{e.exports=JSON.parse('{"tag":{"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/x-86-64-v-3","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.2ef313bc.js b/assets/js/9e4087bc.2ef313bc.js new file mode 100644 index 000000000..a26c72b75 --- /dev/null +++ b/assets/js/9e4087bc.2ef313bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7293"],{23699:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(85893);r(67294);var a=r(27544),i=r(1822),s=r(81921),l=r(28291),c=r(99757),d=r(52068);function h(e){let{year:t,posts:r}=e,i=(0,l.P)({day:"numeric",month:"long",timeZone:"UTC"}),s=e=>i.format(new Date(e));return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.Z,{as:"h3",id:t,children:t}),(0,n.jsx)("ul",{children:r.map(e=>(0,n.jsx)("li",{children:(0,n.jsxs)(a.Z,{to:e.metadata.permalink,children:[s(e.metadata.date)," - ",e.metadata.title]})},e.metadata.date))})]})}function o(e){let{years:t}=e;return(0,n.jsx)("section",{className:"margin-vert--lg",children:(0,n.jsx)("div",{className:"container",children:(0,n.jsx)("div",{className:"row",children:t.map((e,t)=>(0,n.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,n.jsx)(h,{...e})},t))})})})}function m(e){let{archive:t}=e,r=(0,i.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,i.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),l=Array.from(t.blogPosts.reduce((e,t)=>{let r=t.metadata.date.split("-")[0],n=e.get(r)??[];return e.set(r,[t,...n])},new Map),e=>{let[t,r]=e;return{year:t,posts:r}});return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.d,{title:r,description:a}),(0,n.jsxs)(c.Z,{children:[(0,n.jsx)("header",{className:"hero hero--primary",children:(0,n.jsxs)("div",{className:"container",children:[(0,n.jsx)(d.Z,{as:"h1",className:"hero__title",children:r}),(0,n.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,n.jsx)("main",{children:l.length>0&&(0,n.jsx)(o,{years:l})})]})]})}},28291:function(e,t,r){r.d(t,{P:function(){return a}});var n=r(93934);function a(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{i18n:{currentLocale:t}}=(0,n.Z)(),r=function(){let{i18n:{currentLocale:e,localeConfigs:t}}=(0,n.Z)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:r,...e})}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.ae5a1aa1.js b/assets/js/9e4087bc.ae5a1aa1.js deleted file mode 100644 index c135fcdf5..000000000 --- a/assets/js/9e4087bc.ae5a1aa1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3608],{8635:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(67294);var a=t(38208),n=t(55361),s=t(96984),i=t(14852),c=t(48714),l=t(42704),o=t(85893);function d(e){let{year:r,posts:t}=e;const n=(0,i.P)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.Z,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.Z,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.d,{title:t,description:a}),(0,o.jsxs)(c.Z,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.Z,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:i.length>0&&(0,o.jsx)(h,{years:i})})]})]})}},14852:(e,r,t)=>{t.d(r,{P:()=>n});var a=t(75276);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.Z)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.Z)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/assets/js/a05bfad9.3a4b6377.js b/assets/js/a05bfad9.3a4b6377.js new file mode 100644 index 000000000..ec28e483d --- /dev/null +++ b/assets/js/a05bfad9.3a4b6377.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1584"],{82131:function(e,t,s){s.r(t),s.d(t,{metadata:()=>i,contentTitle:()=>c,default:()=>u,assets:()=>l,toc:()=>o,frontMatter:()=>d});var i=JSON.parse('{"id":"user/editions/budgie/tips-and-tricks","title":"Tips and Tricks","description":"Budgie Shortcuts","source":"@site/docs/user/editions/budgie/tips-and-tricks.md","sourceDirName":"user/editions/budgie","slug":"/user/editions/budgie/tips-and-tricks","permalink":"/docs/user/editions/budgie/tips-and-tricks","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/tips-and-tricks.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Tips and Tricks","summary":"Tips and Tricks for Budgie users"},"sidebar":"userSidebar","previous":{"title":"Configuration","permalink":"/docs/user/editions/budgie/configuration"},"next":{"title":"GNOME","permalink":"/docs/user/editions/gnome/"}}'),n=s("85893"),r=s("50065");let d={title:"Tips and Tricks",summary:"Tips and Tricks for Budgie users"},c="Tips and Tricks",l={},o=[{value:"Budgie Shortcuts",id:"budgie-shortcuts",level:2},{value:"Restoring Panel Defaults",id:"restoring-panel-defaults",level:2}];function a(e){let t={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(t.h2,{id:"budgie-shortcuts",children:"Budgie Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"Budgie provides multiple shortcuts to make navigating around Budgie faster and easier."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Keyboard Shortcut"}),(0,n.jsx)(t.th,{children:"Action"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Alt + F2"}),(0,n.jsx)(t.td,{children:"Open Budgie Run dialog"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Alt + F4"}),(0,n.jsx)(t.td,{children:"Kill the active window on the desktop"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Alt + Tab"}),(0,n.jsx)(t.td,{children:"Open application switcher overlay"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Shift + Alt + Tab"}),(0,n.jsx)(t.td,{children:"Open application switcher, switch to previous applications"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["Super (",(0,n.jsx)(t.em,{children:"also Super + S"}),")"]}),(0,n.jsx)(t.td,{children:"Open Budgie Menu"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Super + A"}),(0,n.jsx)(t.td,{children:"Open Applets section of Raven"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Super + L"}),(0,n.jsx)(t.td,{children:"Lock the screen"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Super + N"}),(0,n.jsx)(t.td,{children:"Open Notifications section of Raven"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["Super + Space (",(0,n.jsx)(t.em,{children:"also Alt + Shift"}),")"]}),(0,n.jsx)(t.td,{children:"Switch keyboard layouts"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"restoring-panel-defaults",children:"Restoring Panel Defaults"}),"\n",(0,n.jsx)(t.p,{children:"To restore Budgie's default panel settings, run the command below"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"budgie-panel --reset --replace &\n"})}),"\n",(0,n.jsx)(t.p,{children:"After this you can press CTRL + D to close the terminal without closing the Budgie Panel process."}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"TODO: There's got to be more that we can add here"}),"\n"]})]})}function u(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},50065:function(e,t,s){s.d(t,{Z:function(){return c},a:function(){return d}});var i=s(67294);let n={},r=i.createContext(n);function d(e){let t=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a05bfad9.c2946a01.js b/assets/js/a05bfad9.c2946a01.js deleted file mode 100644 index 2e8d4df1c..000000000 --- a/assets/js/a05bfad9.c2946a01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[885],{12620:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const r={title:"Tips and Tricks",summary:"Tips and Tricks for Budgie users"},d="Tips and Tricks",c={id:"user/editions/budgie/tips-and-tricks",title:"Tips and Tricks",description:"Budgie Shortcuts",source:"@site/docs/user/editions/budgie/tips-and-tricks.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/tips-and-tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Tips and Tricks",summary:"Tips and Tricks for Budgie users"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/budgie/configuration"},next:{title:"GNOME",permalink:"/docs/user/editions/gnome/"}},o={},l=[{value:"Budgie Shortcuts",id:"budgie-shortcuts",level:2},{value:"Restoring Panel Defaults",id:"restoring-panel-defaults",level:2}];function a(e){const t={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,i.jsx)(t.h2,{id:"budgie-shortcuts",children:"Budgie Shortcuts"}),"\n",(0,i.jsx)(t.p,{children:"Budgie provides multiple shortcuts to make navigating around Budgie faster and easier."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Keyboard Shortcut"}),(0,i.jsx)(t.th,{children:"Action"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + F2"}),(0,i.jsx)(t.td,{children:"Open Budgie Run dialog"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + F4"}),(0,i.jsx)(t.td,{children:"Kill the active window on the desktop"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + Tab"}),(0,i.jsx)(t.td,{children:"Open application switcher overlay"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Shift + Alt + Tab"}),(0,i.jsx)(t.td,{children:"Open application switcher, switch to previous applications"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsxs)(t.td,{children:["Super (",(0,i.jsx)(t.em,{children:"also Super + S"}),")"]}),(0,i.jsx)(t.td,{children:"Open Budgie Menu"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + A"}),(0,i.jsx)(t.td,{children:"Open Applets section of Raven"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + L"}),(0,i.jsx)(t.td,{children:"Lock the screen"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + N"}),(0,i.jsx)(t.td,{children:"Open Notifications section of Raven"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsxs)(t.td,{children:["Super + Space (",(0,i.jsx)(t.em,{children:"also Alt + Shift"}),")"]}),(0,i.jsx)(t.td,{children:"Switch keyboard layouts"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"restoring-panel-defaults",children:"Restoring Panel Defaults"}),"\n",(0,i.jsx)(t.p,{children:"To restore Budgie's default panel settings, run the command below"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"budgie-panel --reset --replace &\n"})}),"\n",(0,i.jsx)(t.p,{children:"After this you can press CTRL + D to close the terminal without closing the Budgie Panel process."}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"TODO: There's got to be more that we can add here"}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>d});var i=s(67294);const n={},r=i.createContext(n);function d(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a398ef57.1f7e170d.js b/assets/js/a398ef57.1f7e170d.js deleted file mode 100644 index e25fc9e60..000000000 --- a/assets/js/a398ef57.1f7e170d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2586],{45523:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=t(85893),r=t(11151);const s={title:"Apple",summary:"Quick guide to working with Apple devices on Solus"},o="Apple",a={id:"user/hardware/mobile/apple",title:"Apple",description:"Solus provides iOS support via libimobiledevice and libgpod.",source:"@site/docs/user/hardware/mobile/apple.md",sourceDirName:"user/hardware/mobile",slug:"/user/hardware/mobile/apple",permalink:"/docs/user/hardware/mobile/apple",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/apple.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Apple",summary:"Quick guide to working with Apple devices on Solus"},sidebar:"userSidebar",previous:{title:"Android",permalink:"/docs/user/hardware/mobile/android"},next:{title:"Peripherals",permalink:"/docs/category/peripherals"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"File management",id:"file-management",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"apple",children:"Apple"})}),"\n",(0,i.jsxs)(n.p,{children:["Solus provides iOS support via ",(0,i.jsx)(n.a,{href:"https://libimobiledevice.org/",children:"libimobiledevice"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/fadingred/libgpod/",children:"libgpod"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Please note that the below mentioned installation instructions do not guarantee functional iOS features such as content synchronization (music) or file copying."}),"\n",(0,i.jsx)(n.p,{children:"This support can be exposed via your file manager (such as Nautilus) upon connecting your iOS device or music players such as Rhythmbox."}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["To ensure you have the required software for iOS support, install ",(0,i.jsx)(n.code,{children:"libideviceactivation"})," via the Software Center or terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libideviceactivation\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"NOTE:"})," It is recommended that you reboot your system after this installation."]}),"\n",(0,i.jsx)(n.h2,{id:"file-management",children:"File management"}),"\n",(0,i.jsx)(n.p,{children:"TODO: Tutorial on file access and syncing"})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(67294);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a398ef57.d7b3741a.js b/assets/js/a398ef57.d7b3741a.js new file mode 100644 index 000000000..89f5a106c --- /dev/null +++ b/assets/js/a398ef57.d7b3741a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1418"],{78086:function(e,n,t){t.r(n),t.d(n,{metadata:()=>i,contentTitle:()=>o,default:()=>p,assets:()=>l,toc:()=>c,frontMatter:()=>a});var i=JSON.parse('{"id":"user/hardware/mobile/apple","title":"Apple","description":"Solus provides iOS support via libimobiledevice and libgpod.","source":"@site/docs/user/hardware/mobile/apple.md","sourceDirName":"user/hardware/mobile","slug":"/user/hardware/mobile/apple","permalink":"/docs/user/hardware/mobile/apple","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/apple.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Apple","summary":"Quick guide to working with Apple devices on Solus"},"sidebar":"userSidebar","previous":{"title":"Android","permalink":"/docs/user/hardware/mobile/android"},"next":{"title":"Peripherals","permalink":"/docs/category/peripherals"}}'),r=t("85893"),s=t("50065");let a={title:"Apple",summary:"Quick guide to working with Apple devices on Solus"},o="Apple",l={},c=[{value:"Installation",id:"installation",level:2},{value:"File management",id:"file-management",level:2}];function d(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"apple",children:"Apple"})}),"\n",(0,r.jsxs)(n.p,{children:["Solus provides iOS support via ",(0,r.jsx)(n.a,{href:"https://libimobiledevice.org/",children:"libimobiledevice"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/fadingred/libgpod/",children:"libgpod"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Please note that the below mentioned installation instructions do not guarantee functional iOS features such as content synchronization (music) or file copying."}),"\n",(0,r.jsx)(n.p,{children:"This support can be exposed via your file manager (such as Nautilus) upon connecting your iOS device or music players such as Rhythmbox."}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(n.p,{children:["To ensure you have the required software for iOS support, install ",(0,r.jsx)(n.code,{children:"libideviceactivation"})," via the Software Center or terminal:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libideviceactivation\n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"NOTE:"})," It is recommended that you reboot your system after this installation."]}),"\n",(0,r.jsx)(n.h2,{id:"file-management",children:"File management"}),"\n",(0,r.jsx)(n.p,{children:"TODO: Tutorial on file access and syncing"})]})}function p(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return o},a:function(){return a}});var i=t(67294);let r={},s=i.createContext(r);function a(e){let n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a52026b8.062c3310.js b/assets/js/a52026b8.062c3310.js new file mode 100644 index 000000000..37c6e6883 --- /dev/null +++ b/assets/js/a52026b8.062c3310.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["185"],{87912:function(e,t,o){o.r(t),o.d(t,{assets:function(){return u},contentTitle:function(){return i},default:function(){return g},frontMatter:function(){return r},metadata:function(){return n},toc:function(){return a}});var n=o(42650),l=o(85893),s=o(50065);let r={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},i=void 0,u={authorsImageUrls:[void 0]},a=[];function c(e){let t={p:"p",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,l.jsx)(t.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."})]})}function g(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},50065:function(e,t,o){o.d(t,{Z:function(){return i},a:function(){return r}});var n=o(67294);let l={},s=n.createContext(l);function r(e){let t=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),n.createElement(s.Provider,{value:t},e.children)}},42650:function(e){e.exports=JSON.parse('{"permalink":"/blog/welcome-solus-devlog-v1","source":"@site/devlog/2024-01-13-welcome-devlog.md","title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","date":"2024-01-13T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"firstpost","permalink":"/blog/tags/firstpost"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":0.9,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","slug":"welcome-solus-devlog-v1","authors":"joey","tags":["hello","devlog","firstpost","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}}')}}]); \ No newline at end of file diff --git a/assets/js/a52026b8.d25a67cc.js b/assets/js/a52026b8.d25a67cc.js deleted file mode 100644 index 2211612bd..000000000 --- a/assets/js/a52026b8.d25a67cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7862],{19253:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>i,default:()=>g,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var l=t(85893),s=t(11151);const n={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/welcome-solus-devlog-v1",source:"@site/devlog/2024-01-13-welcome-devlog.md",title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",date:"2024-01-13T00:00:00.000Z",tags:[{inline:!0,label:"hello",permalink:"/blog/tags/hello"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"firstpost",permalink:"/blog/tags/firstpost"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:.9,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},c=[];function u(e){const o={p:"p",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,l.jsx)(o.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."})]})}function g(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,l.jsx)(o,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>i});var l=t(67294);const s={},n=l.createContext(s);function i(e){const o=l.useContext(n);return l.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),l.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.4c879bac.js b/assets/js/a6aa9e1f.4c879bac.js deleted file mode 100644 index 13ee3db73..000000000 --- a/assets/js/a6aa9e1f.4c879bac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3089],{33587:(e,t,n)=>{n.r(t),n.d(t,{default:()=>m});n(67294);var s=n(36905),a=n(75276),i=n(96984),r=n(50563),l=n(50429),o=n(17091),c=n(62362),p=n(82957),d=n(79722),g=n(58112),h=n(85893);function u(e){const t=(0,g.CS)(e);return(0,h.jsx)(d.Z,{children:(0,h.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function x(e){const{metadata:t}=e,{siteConfig:{title:n}}=(0,a.Z)(),{blogDescription:s,blogTitle:r,permalink:l}=t,o="/"===l?n:r;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(i.d,{title:o,description:s}),(0,h.jsx)(c.Z,{tag:"blog_posts_list"})]})}function j(e){const{metadata:t,items:n,sidebar:s}=e;return(0,h.jsxs)(l.Z,{sidebar:s,children:[(0,h.jsx)(p.Z,{items:n}),(0,h.jsx)(o.Z,{metadata:t})]})}function m(e){return(0,h.jsxs)(i.FG,{className:(0,s.Z)(r.k.wrapper.blogPages,r.k.page.blogListPage),children:[(0,h.jsx)(x,{...e}),(0,h.jsx)(u,{...e}),(0,h.jsx)(j,{...e})]})}},17091:(e,t,n)=>{n.d(t,{Z:()=>r});n(67294);var s=n(55361),a=n(60968),i=n(85893);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.Z,{permalink:n,title:(0,i.jsx)(s.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),r&&(0,i.jsx)(a.Z,{permalink:r,title:(0,i.jsx)(s.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},82957:(e,t,n)=>{n.d(t,{Z:()=>r});n(67294);var s=n(58112),a=n(81782),i=n(85893);function r(e){let{items:t,component:n=a.Z}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.n4,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.5913345c.js b/assets/js/a6aa9e1f.5913345c.js new file mode 100644 index 000000000..0fd87c13a --- /dev/null +++ b/assets/js/a6aa9e1f.5913345c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8514"],{34760:function(e,t,r){r.r(t),r.d(t,{default:()=>j});var n=r("85893");r("67294");var l=r("74904"),a=r("93934"),i=r("81921"),s=r("50490"),o=r("30928"),c=r("40043"),d=r("49868"),u=r("30955"),m=r("50777"),g=r("75700");function h(e){let t=(0,g.CS)(e);return(0,n.jsx)(m.Z,{children:(0,n.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function x(e){let{metadata:t}=e,{siteConfig:{title:r}}=(0,a.Z)(),{blogDescription:l,blogTitle:s,permalink:o}=t;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.d,{title:"/"===o?r:s,description:l}),(0,n.jsx)(d.Z,{tag:"blog_posts_list"})]})}function p(e){let{metadata:t,items:r,sidebar:l}=e;return(0,n.jsxs)(o.Z,{sidebar:l,children:[(0,n.jsx)(u.Z,{items:r}),(0,n.jsx)(c.Z,{metadata:t})]})}function j(e){return(0,n.jsxs)(i.FG,{className:(0,l.Z)(s.k.wrapper.blogPages,s.k.page.blogListPage),children:[(0,n.jsx)(x,{...e}),(0,n.jsx)(h,{...e}),(0,n.jsx)(p,{...e})]})}},40043:function(e,t,r){r.d(t,{Z:function(){return i}});var n=r(85893);r(67294);var l=r(1822),a=r(15779);function i(e){let{metadata:t}=e,{previousPage:r,nextPage:i}=t;return(0,n.jsxs)("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[r&&(0,n.jsx)(a.Z,{permalink:r,title:(0,n.jsx)(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),i&&(0,n.jsx)(a.Z,{permalink:i,title:(0,n.jsx)(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},35825:function(e,t,r){r.d(t,{Z:()=>R});var n=r("85893");r("67294");var l=r("74904"),a=r("75700");function i(e){let{children:t,className:r}=e;return(0,n.jsx)("article",{className:r,children:t})}var s=r("27544");let o="title_f1Hy";function c(e){let{className:t}=e,{metadata:r,isBlogPostPage:i}=(0,a.nO)(),{permalink:c,title:d}=r;return(0,n.jsx)(i?"h1":"h2",{className:(0,l.Z)(o,t),children:i?d:(0,n.jsx)(s.Z,{to:c,children:d})})}var d=r("1822"),u=r("67984"),m=r("28291");let g="container_mt6G";function h(e){let{readingTime:t}=e,r=function(){let{selectMessage:e}=(0,u.c)();return t=>{let r=Math.ceil(t);return e(r,(0,d.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:r}))}}();return(0,n.jsx)(n.Fragment,{children:r(t)})}function x(e){let{date:t,formattedDate:r}=e;return(0,n.jsx)("time",{dateTime:t,children:r})}function p(){return(0,n.jsx)(n.Fragment,{children:" \xb7 "})}function j(e){let t,{className:r}=e,{metadata:i}=(0,a.nO)(),{date:s,readingTime:o}=i,c=(0,m.P)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,n.jsxs)("div",{className:(0,l.Z)(g,"margin-vert--md",r),children:[(0,n.jsx)(x,{date:s,formattedDate:(t=s,c.format(new Date(t)))}),void 0!==o&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(p,{}),(0,n.jsx)(h,{readingTime:o})]})]})}var f=r("91941");let b={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function Z(e){let{className:t}=e,{metadata:{authors:r},assets:i}=(0,a.nO)();if(0===r.length)return null;let s=r.every(e=>{let{name:t}=e;return!t}),o=1===r.length;return(0,n.jsx)("div",{className:(0,l.Z)("margin-top--md margin-bottom--sm",s?b.imageOnlyAuthorRow:"row",t),children:r.map((e,t)=>(0,n.jsx)("div",{className:(0,l.Z)(!s&&(o?"col col--12":"col col--6"),s?b.imageOnlyAuthorCol:b.authorCol),children:(0,n.jsx)(f.Z,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})},t))})}function v(){return(0,n.jsxs)("header",{children:[(0,n.jsx)(c,{}),(0,n.jsx)(j,{}),(0,n.jsx)(Z,{})]})}var w=r("3062"),N=r("27913");function O(e){let{children:t,className:r}=e,{isBlogPostPage:i}=(0,a.nO)();return(0,n.jsx)("div",{id:i?w.blogPostContainerID:void 0,className:(0,l.Z)("markdown",r),children:(0,n.jsx)(N.Z,{children:t})})}var k=r("50490"),y=r("57216"),_=r("50905");function A(){return(0,n.jsx)("b",{children:(0,n.jsx)(d.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function C(e){let{blogPostTitle:t,...r}=e;return(0,n.jsx)(s.Z,{"aria-label":(0,d.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...r,children:(0,n.jsx)(A,{})})}function T(){let{metadata:e,isBlogPostPage:t}=(0,a.nO)(),{tags:r,title:i,editUrl:s,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,u=!t&&o,m=r.length>0;if(!(m||u||s))return null;if(!t)return(0,n.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[m&&(0,n.jsx)("div",{className:(0,l.Z)("col",{"col--9":u}),children:(0,n.jsx)(_.Z,{tags:r})}),u&&(0,n.jsx)("div",{className:(0,l.Z)("col text--right",{"col--3":m}),children:(0,n.jsx)(C,{blogPostTitle:i,to:e.permalink})})]});{let e=!!(s||d||c);return(0,n.jsxs)("footer",{className:"docusaurus-mt-lg",children:[m&&(0,n.jsx)("div",{className:(0,l.Z)("row","margin-top--sm",k.k.blog.blogFooterEditMetaRow),children:(0,n.jsx)("div",{className:"col",children:(0,n.jsx)(_.Z,{tags:r})})}),e&&(0,n.jsx)(y.Z,{className:(0,l.Z)("margin-top--sm",k.k.blog.blogFooterEditMetaRow),editUrl:s,lastUpdatedAt:d,lastUpdatedBy:c})]})}}function R(e){let{children:t,className:r}=e,s=function(){let{isBlogPostPage:e}=(0,a.nO)();return e?void 0:"margin-bottom--xl"}();return(0,n.jsxs)(i,{className:(0,l.Z)(s,r),children:[(0,n.jsx)(v,{}),(0,n.jsx)(O,{children:t}),(0,n.jsx)(T,{})]})}},30955:function(e,t,r){r.d(t,{Z:function(){return i}});var n=r(85893);r(67294);var l=r(75700),a=r(35825);function i(e){let{items:t,component:r=a.Z}=e;return(0,n.jsx)(n.Fragment,{children:t.map(e=>{let{content:t}=e;return(0,n.jsx)(l.n4,{content:t,children:(0,n.jsx)(r,{children:(0,n.jsx)(t,{})})},t.metadata.permalink)})})}}}]); \ No newline at end of file diff --git a/assets/js/a6c0fb2f.5a3c7a0e.js b/assets/js/a6c0fb2f.5a3c7a0e.js new file mode 100644 index 000000000..7ba64caee --- /dev/null +++ b/assets/js/a6c0fb2f.5a3c7a0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6973"],{51346:function(e,t,n){n.r(t),n.d(t,{assets:function(){return r},contentTitle:function(){return l},default:function(){return d},frontMatter:function(){return i},metadata:function(){return a},toc:function(){return h}});var a=n(71752),o=n(85893),s=n(50065);let i={title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},l=void 0,r={authorsImageUrls:[void 0]},h=[{value:"A bit of background",id:"a-bit-of-background",level:2},{value:"What is it?",id:"what-is-it",level:2},{value:"Why bother?",id:"why-bother",level:2},{value:"What we accomplished",id:"what-we-accomplished",level:2},{value:"What next?",id:"what-next",level:2},{value:"Want to help?",id:"want-to-help",level:2},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function c(e){let t={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next."}),"\n",(0,o.jsx)(t.h2,{id:"a-bit-of-background",children:"A bit of background"}),"\n",(0,o.jsxs)(t.p,{children:["I started contributing in October 2023, when Solus participated in ",(0,o.jsx)(t.a,{href:"https://getsol.us/2023/10/01/solus-and-hacktoberfest-2023/",children:"Hacktoberfest"}),". Hacktoberfest is a month-long event that encourage people to contribute to open source project in exchange for some digital merchandise. Finally, an excuse to contribute to something I use every day. Although, as an accountant, all of this is new experience to me. It was confusing at first, but I persisted. Finally, I got the hang of it and I managed to submit around 100 pull request during the month of the event. I was very excited and motivated. During the month, a few people joined the event and contributed to Solus, but then November came and most of the contribution slowed down. I was the only one left that continued doing the beginner tasks, mostly adding homepage to packages."]}),"\n",(0,o.jsxs)(t.p,{children:["At the start of January 2024, Jakob Gezelius (",(0,o.jsx)(t.a,{href:"https://github.com/androidnisse",children:"androidnisse"}),') comes in and starts contributing to homepage task too. Worried that we would stepped on each other\'s feet, we started a private chat to organize the tasks between ourselves. Until May, the two of us had been chipping away at the homepage task which at this point left 650 packages without a homepage. Then we had more contributors joining. I decided to make a group chat to accommodate all the people joining. It was called "Solus Homepage Team" at the time. More contributors and staff members joined the room, then it was renamed as "Solus Cleanup Crew" and moved under the official Solus matrix space.']}),"\n",(0,o.jsx)(t.h2,{id:"what-is-it",children:"What is it?"}),"\n",(0,o.jsx)(t.p,{children:"Solus cleanup crew is a group of community contributors as as well staff members with the goal of bringing the Solus package repository up to current standard. It is a subset of the packaging room on our matrix channel. We organize the work on all the cleanup related tasks."}),"\n",(0,o.jsx)(t.h2,{id:"why-bother",children:"Why bother?"}),"\n",(0,o.jsx)(t.p,{children:"Solus has been updating their tooling and infrastructure since its resurrection. While most of the tooling changes can be accomplished by staff members alone, there are things that they cannot do. While many consider Solus repository as small, it still contains more than 6000 packages. Some packages have never even gotten an update since Solus was first created! We want to get rid of all its cruft before we can migrate to a better tooling. That's where the community contributor can come in and help."}),"\n",(0,o.jsx)(t.p,{children:"For me personally, it is a chance to learn something new and fill my time with more purpose. Sometimes, I feel like a slob scrolling through things, opening the same three apps over and over or sleeping midday. Technically speaking, doing packaging is still scrolling through things, still opening the same three apps over and over, and I still get my midday nap, but now it is with purpose. I love that what I do can be enjoyed by other people. It is mostly invisible and not even noticed by people, but the chance of it helping people gives me so much joy. Why bother? Because I love it."}),"\n",(0,o.jsx)(t.h2,{id:"what-we-accomplished",children:"What we accomplished"}),"\n",(0,o.jsx)(t.p,{children:"We create a few repository wide task that can done with little reading of our packaging guide. The keen-eyed of you may have already seen these tasks. It is always attached at the end of every Sync Updates since July. These are the tasks we did:"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"No."}),(0,o.jsx)(t.th,{children:"Task"}),(0,o.jsx)(t.th,{children:"Date Started"}),(0,o.jsx)(t.th,{children:"Start count"}),(0,o.jsx)(t.th,{children:"Current count"})]})}),(0,o.jsxs)(t.tbody,{children:[(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"1."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/411",children:"Adding homepage key to package.yml"})}),(0,o.jsx)(t.td,{children:"30-09-2023"}),(0,o.jsx)(t.td,{children:"2300"}),(0,o.jsx)(t.td,{children:"8"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"2."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/449",children:"Adding AppStream metainfo to all font packages"})}),(0,o.jsx)(t.td,{children:"06-10-2023"}),(0,o.jsx)(t.td,{children:"38"}),(0,o.jsx)(t.td,{children:"Done \uD83C\uDF89"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"3."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1389",children:"Adding AppStream metainfo to all graphical applications"})}),(0,o.jsx)(t.td,{children:"22-01-2024"}),(0,o.jsx)(t.td,{children:"316"}),(0,o.jsx)(t.td,{children:"198"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"4."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/3111",children:"Applying new cargo macros"})}),(0,o.jsx)(t.td,{children:"27-06-2024"}),(0,o.jsx)(t.td,{children:"37"}),(0,o.jsx)(t.td,{children:"Done \uD83C\uDF89"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"5."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/4116",children:"Changing all packages with homepages pointing to wiki.gnome.org"})}),(0,o.jsx)(t.td,{children:"20-10-2024"}),(0,o.jsx)(t.td,{children:"87"}),(0,o.jsx)(t.td,{children:"62"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"6."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/4121",children:"Adding monitoring.yml"})}),(0,o.jsx)(t.td,{children:"21-10-2024"}),(0,o.jsx)(t.td,{children:"3070"}),(0,o.jsx)(t.td,{children:"2937"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"7."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Packaging+Problem%22",children:"Tagging packages that do not build"})}),(0,o.jsx)(t.td,{children:"Ongoing"}),(0,o.jsx)(t.td,{children:"N/A"}),(0,o.jsx)(t.td,{children:"13"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"8."}),(0,o.jsx)(t.td,{children:(0,o.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Package%3A+Removal+Request%22",children:"Tagging packages that should be deprecated"})}),(0,o.jsx)(t.td,{children:"Ongoing"}),(0,o.jsx)(t.td,{children:"N/A"}),(0,o.jsx)(t.td,{children:"25"})]})]})]}),"\n",(0,o.jsx)(t.p,{children:"As you can see from the table above, we just completed two tasks and we are close to completing homepage task. Packages that do not build also are also getting solved one by one. Right now, there are 12 people in Solus Cleanup Crew Matrix room, 6 of them are new contributors. We also create a new AppStream metainfo documentation, clean up our issue templates, implement a better tagging system for organizing issues and much more. Solus Cleanup Crew is also becoming a place where we can onboard new contributors and recruit new staff. I thought we accomplished a lot and I am happy with it."}),"\n",(0,o.jsx)(t.h2,{id:"what-next",children:"What next?"}),"\n",(0,o.jsxs)(t.p,{children:["We want to focus on adding appstream metainfo for remaining 200 packages, in line with the goal of 4.7 ISO. It will not be easy nor quick, but we will try our best. We want Solus users to have the best experience possible when we finally say goodbye to ",(0,o.jsx)(t.code,{children:"solus-sc"})," and switch to modern software center (Gnome Software and KDE Discover). We want you to be able to install all graphical application from software center and have all the relevant information (Legible screenshot, Hi-Res Icon, good description, etc)."]}),"\n",(0,o.jsxs)(t.p,{children:["We also want to add more ",(0,o.jsx)(t.a,{href:"https://help.getsol.us/docs/packaging/monitoring.yml",children:"monitoring.yml"})," files to packages, so we can utilize our proof-of-concept ",(0,o.jsx)(t.a,{href:"https://shared.getsol.us/justin/updates/",children:'"Package Update Monitor"'})," created by ",(0,o.jsx)(t.a,{href:"https://github.com/Justinzobel",children:"Justin Zobel"}),". I, myself and ",(0,o.jsx)(t.a,{href:"https://github.com/joebonrichie",children:"Joey Riches"}),' will explore the possibility of curating our own "Editor\'s Choice" and "Featured Apps" in Gnome Software, made possible by ',(0,o.jsx)(t.a,{href:"https://gitlab.gnome.org/GNOME/gnome-app-list",children:(0,o.jsx)(t.code,{children:"gnome-app-list"})}),". I think the road ahead is very exciting for us and hopefully for you too!"]}),"\n",(0,o.jsx)(t.h2,{id:"want-to-help",children:"Want to help?"}),"\n",(0,o.jsxs)(t.p,{children:["We are always eager for people to join and spend their time contributing to Solus. There are many ways you can ",(0,o.jsx)(t.a,{href:"https://help.getsol.us/docs/user/contributing/getting-involved",children:"contribute"}),", but for me it is packaging. For me, packaging can be relaxing, sometimes frustrating, but always gives me joy at the end. If you are interested to dip your toe on packaging and want to help us, here are the simple steps:"]}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsx)(t.li,{children:"Join the Solus Packaging Room on Matrix"}),"\n",(0,o.jsxs)(t.li,{children:["Read and practice our ",(0,o.jsx)(t.a,{href:"https://help.getsol.us/docs/packaging/",children:"packaging documentation"})]}),"\n",(0,o.jsx)(t.li,{children:"Submit your first Pull Request. We recommend doing the wiki gnome task or monitoring task"}),"\n",(0,o.jsx)(t.li,{children:"Follow along the review process until your PR gets merged"}),"\n",(0,o.jsx)(t.li,{children:"Continue on contributing and you might get invited to Solus Cleanup Crew"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,o.jsxs)(t.p,{children:["I want to thank all the contributors that made all of this possible. It was such a wonderful effort from everyone and we will strive to keep that up. Let me know if you are interested in a follow-up blog about the detail of doing packaging for Solus. ",(0,o.jsx)(t.em,{children:"Terima kasih dan sampai jumpa"}),"!"]})]})}function d(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return l},a:function(){return i}});var a=n(67294);let o={},s=a.createContext(o);function i(e){let t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),a.createElement(s.Provider,{value:t},e.children)}},71752:function(e){e.exports=JSON.parse('{"permalink":"/blog/clean-clean-clean","source":"@site/devlog/2024-11-21-clean-cleanl-clean.md","title":"Clean, clean, clean!","description":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.","date":"2024-11-21T00:00:00.000Z","tags":[{"inline":true,"label":"housekeeping","permalink":"/blog/tags/housekeeping"},{"inline":true,"label":"cleanup","permalink":"/blog/tags/cleanup"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":5.585,"hasTruncateMarker":true,"authors":[{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi"}],"frontMatter":{"title":"Clean, clean, clean!","slug":"clean-clean-clean","authors":"alfi","tags":["housekeeping","cleanup","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"}}')}}]); \ No newline at end of file diff --git a/assets/js/a6c0fb2f.5ab50382.js b/assets/js/a6c0fb2f.5ab50382.js deleted file mode 100644 index 2042c3e85..000000000 --- a/assets/js/a6c0fb2f.5ab50382.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6335],{54501:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>h});var a=n(85893),o=n(11151);const s={title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},i=void 0,l={permalink:"/blog/clean-clean-clean",source:"@site/devlog/2024-11-21-clean-cleanl-clean.md",title:"Clean, clean, clean!",description:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.",date:"2024-11-21T00:00:00.000Z",tags:[{inline:!0,label:"housekeeping",permalink:"/blog/tags/housekeeping"},{inline:!0,label:"cleanup",permalink:"/blog/tags/cleanup"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:5.585,hasTruncateMarker:!0,authors:[{name:"Muhammad Alfi Syahrin",title:"Solus Staff",page:{permalink:"/blog/authors/alfi"},socials:{github:"https://github.com/malfisya"},imageURL:"https://avatars.githubusercontent.com/u/101771435",key:"alfi"}],frontMatter:{title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"}},r={authorsImageUrls:[void 0]},h=[{value:"A bit of background",id:"a-bit-of-background",level:2},{value:"What is it?",id:"what-is-it",level:2},{value:"Why bother?",id:"why-bother",level:2},{value:"What we accomplished",id:"what-we-accomplished",level:2},{value:"What next?",id:"what-next",level:2},{value:"Want to help?",id:"want-to-help",level:2},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function c(e){const t={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next."}),"\n",(0,a.jsx)(t.h2,{id:"a-bit-of-background",children:"A bit of background"}),"\n",(0,a.jsxs)(t.p,{children:["I started contributing in October 2023, when Solus participated in ",(0,a.jsx)(t.a,{href:"https://getsol.us/2023/10/01/solus-and-hacktoberfest-2023/",children:"Hacktoberfest"}),". Hacktoberfest is a month-long event that encourage people to contribute to open source project in exchange for some digital merchandise. Finally, an excuse to contribute to something I use every day. Although, as an accountant, all of this is new experience to me. It was confusing at first, but I persisted. Finally, I got the hang of it and I managed to submit around 100 pull request during the month of the event. I was very excited and motivated. During the month, a few people joined the event and contributed to Solus, but then November came and most of the contribution slowed down. I was the only one left that continued doing the beginner tasks, mostly adding homepage to packages."]}),"\n",(0,a.jsxs)(t.p,{children:["At the start of January 2024, Jakob Gezelius (",(0,a.jsx)(t.a,{href:"https://github.com/androidnisse",children:"androidnisse"}),') comes in and starts contributing to homepage task too. Worried that we would stepped on each other\'s feet, we started a private chat to organize the tasks between ourselves. Until May, the two of us had been chipping away at the homepage task which at this point left 650 packages without a homepage. Then we had more contributors joining. I decided to make a group chat to accommodate all the people joining. It was called "Solus Homepage Team" at the time. More contributors and staff members joined the room, then it was renamed as "Solus Cleanup Crew" and moved under the official Solus matrix space.']}),"\n",(0,a.jsx)(t.h2,{id:"what-is-it",children:"What is it?"}),"\n",(0,a.jsx)(t.p,{children:"Solus cleanup crew is a group of community contributors as as well staff members with the goal of bringing the Solus package repository up to current standard. It is a subset of the packaging room on our matrix channel. We organize the work on all the cleanup related tasks."}),"\n",(0,a.jsx)(t.h2,{id:"why-bother",children:"Why bother?"}),"\n",(0,a.jsx)(t.p,{children:"Solus has been updating their tooling and infrastructure since its resurrection. While most of the tooling changes can be accomplished by staff members alone, there are things that they cannot do. While many consider Solus repository as small, it still contains more than 6000 packages. Some packages have never even gotten an update since Solus was first created! We want to get rid of all its cruft before we can migrate to a better tooling. That's where the community contributor can come in and help."}),"\n",(0,a.jsx)(t.p,{children:"For me personally, it is a chance to learn something new and fill my time with more purpose. Sometimes, I feel like a slob scrolling through things, opening the same three apps over and over or sleeping midday. Technically speaking, doing packaging is still scrolling through things, still opening the same three apps over and over, and I still get my midday nap, but now it is with purpose. I love that what I do can be enjoyed by other people. It is mostly invisible and not even noticed by people, but the chance of it helping people gives me so much joy. Why bother? Because I love it."}),"\n",(0,a.jsx)(t.h2,{id:"what-we-accomplished",children:"What we accomplished"}),"\n",(0,a.jsx)(t.p,{children:"We create a few repository wide task that can done with little reading of our packaging guide. The keen-eyed of you may have already seen these tasks. It is always attached at the end of every Sync Updates since July. These are the tasks we did:"}),"\n",(0,a.jsxs)(t.table,{children:[(0,a.jsx)(t.thead,{children:(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.th,{children:"No."}),(0,a.jsx)(t.th,{children:"Task"}),(0,a.jsx)(t.th,{children:"Date Started"}),(0,a.jsx)(t.th,{children:"Start count"}),(0,a.jsx)(t.th,{children:"Current count"})]})}),(0,a.jsxs)(t.tbody,{children:[(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"1."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/411",children:"Adding homepage key to package.yml"})}),(0,a.jsx)(t.td,{children:"30-09-2023"}),(0,a.jsx)(t.td,{children:"2300"}),(0,a.jsx)(t.td,{children:"8"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"2."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/449",children:"Adding AppStream metainfo to all font packages"})}),(0,a.jsx)(t.td,{children:"06-10-2023"}),(0,a.jsx)(t.td,{children:"38"}),(0,a.jsx)(t.td,{children:"Done \ud83c\udf89"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"3."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1389",children:"Adding AppStream metainfo to all graphical applications"})}),(0,a.jsx)(t.td,{children:"22-01-2024"}),(0,a.jsx)(t.td,{children:"316"}),(0,a.jsx)(t.td,{children:"198"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"4."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/3111",children:"Applying new cargo macros"})}),(0,a.jsx)(t.td,{children:"27-06-2024"}),(0,a.jsx)(t.td,{children:"37"}),(0,a.jsx)(t.td,{children:"Done \ud83c\udf89"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"5."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/4116",children:"Changing all packages with homepages pointing to wiki.gnome.org"})}),(0,a.jsx)(t.td,{children:"20-10-2024"}),(0,a.jsx)(t.td,{children:"87"}),(0,a.jsx)(t.td,{children:"62"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"6."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/4121",children:"Adding monitoring.yml"})}),(0,a.jsx)(t.td,{children:"21-10-2024"}),(0,a.jsx)(t.td,{children:"3070"}),(0,a.jsx)(t.td,{children:"2937"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"7."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Packaging+Problem%22",children:"Tagging packages that do not build"})}),(0,a.jsx)(t.td,{children:"Ongoing"}),(0,a.jsx)(t.td,{children:"N/A"}),(0,a.jsx)(t.td,{children:"13"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"8."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Package%3A+Removal+Request%22",children:"Tagging packages that should be deprecated"})}),(0,a.jsx)(t.td,{children:"Ongoing"}),(0,a.jsx)(t.td,{children:"N/A"}),(0,a.jsx)(t.td,{children:"25"})]})]})]}),"\n",(0,a.jsx)(t.p,{children:"As you can see from the table above, we just completed two tasks and we are close to completing homepage task. Packages that do not build also are also getting solved one by one. Right now, there are 12 people in Solus Cleanup Crew Matrix room, 6 of them are new contributors. We also create a new AppStream metainfo documentation, clean up our issue templates, implement a better tagging system for organizing issues and much more. Solus Cleanup Crew is also becoming a place where we can onboard new contributors and recruit new staff. I thought we accomplished a lot and I am happy with it."}),"\n",(0,a.jsx)(t.h2,{id:"what-next",children:"What next?"}),"\n",(0,a.jsxs)(t.p,{children:["We want to focus on adding appstream metainfo for remaining 200 packages, in line with the goal of 4.7 ISO. It will not be easy nor quick, but we will try our best. We want Solus users to have the best experience possible when we finally say goodbye to ",(0,a.jsx)(t.code,{children:"solus-sc"})," and switch to modern software center (Gnome Software and KDE Discover). We want you to be able to install all graphical application from software center and have all the relevant information (Legible screenshot, Hi-Res Icon, good description, etc)."]}),"\n",(0,a.jsxs)(t.p,{children:["We also want to add more ",(0,a.jsx)(t.a,{href:"https://help.getsol.us/docs/packaging/monitoring.yml",children:"monitoring.yml"})," files to packages, so we can utilize our proof-of-concept ",(0,a.jsx)(t.a,{href:"https://shared.getsol.us/justin/updates/",children:'"Package Update Monitor"'})," created by ",(0,a.jsx)(t.a,{href:"https://github.com/Justinzobel",children:"Justin Zobel"}),". I, myself and ",(0,a.jsx)(t.a,{href:"https://github.com/joebonrichie",children:"Joey Riches"}),' will explore the possibility of curating our own "Editor\'s Choice" and "Featured Apps" in Gnome Software, made possible by ',(0,a.jsx)(t.a,{href:"https://gitlab.gnome.org/GNOME/gnome-app-list",children:(0,a.jsx)(t.code,{children:"gnome-app-list"})}),". I think the road ahead is very exciting for us and hopefully for you too!"]}),"\n",(0,a.jsx)(t.h2,{id:"want-to-help",children:"Want to help?"}),"\n",(0,a.jsxs)(t.p,{children:["We are always eager for people to join and spend their time contributing to Solus. There are many ways you can ",(0,a.jsx)(t.a,{href:"https://help.getsol.us/docs/user/contributing/getting-involved",children:"contribute"}),", but for me it is packaging. For me, packaging can be relaxing, sometimes frustrating, but always gives me joy at the end. If you are interested to dip your toe on packaging and want to help us, here are the simple steps:"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Join the Solus Packaging Room on Matrix"}),"\n",(0,a.jsxs)(t.li,{children:["Read and practice our ",(0,a.jsx)(t.a,{href:"https://help.getsol.us/docs/packaging/",children:"packaging documentation"})]}),"\n",(0,a.jsx)(t.li,{children:"Submit your first Pull Request. We recommend doing the wiki gnome task or monitoring task"}),"\n",(0,a.jsx)(t.li,{children:"Follow along the review process until your PR gets merged"}),"\n",(0,a.jsx)(t.li,{children:"Continue on contributing and you might get invited to Solus Cleanup Crew"}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,a.jsxs)(t.p,{children:["I want to thank all the contributors that made all of this possible. It was such a wonderful effort from everyone and we will strive to keep that up. Let me know if you are interested in a follow-up blog about the detail of doing packaging for Solus. ",(0,a.jsx)(t.em,{children:"Terima kasih dan sampai jumpa"}),"!"]})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var a=n(67294);const o={},s=a.createContext(o);function i(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a7456010.3f4d399e.js b/assets/js/a7456010.3f4d399e.js deleted file mode 100644 index 2bc904e68..000000000 --- a/assets/js/a7456010.3f4d399e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5980],{79365:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7456010.503de679.js b/assets/js/a7456010.503de679.js new file mode 100644 index 000000000..fb9fc3154 --- /dev/null +++ b/assets/js/a7456010.503de679.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7365"],{62050:function(e){e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.28cde8bd.js b/assets/js/a7bd4aaa.28cde8bd.js new file mode 100644 index 000000000..fb81cbc1a --- /dev/null +++ b/assets/js/a7bd4aaa.28cde8bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5211"],{35327:function(n,e,s){s.r(e),s.d(e,{default:function(){return d}});var r=s(85893);s(67294);var t=s(81921),o=s(73838),l=s(85302),c=s(18790),u=s(49868);function i(n){let{version:e}=n;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(u.Z,{version:e.version,tag:(0,o.J)(e.pluginId,e.version)}),(0,r.jsx)(t.d,{children:e.noIndex&&(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function a(n){let{version:e,route:s}=n;return(0,r.jsx)(t.FG,{className:e.className,children:(0,r.jsx)(l.q,{version:e,children:(0,c.H)(s.routes)})})}function d(n){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i,{...n}),(0,r.jsx)(a,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.cf59d69a.js b/assets/js/a7bd4aaa.cf59d69a.js deleted file mode 100644 index 6e78b8512..000000000 --- a/assets/js/a7bd4aaa.cf59d69a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8518],{89615:(e,n,s)=>{s.r(n),s.d(n,{default:()=>d});s(67294);var r=s(96984),o=s(90447),t=s(72950),c=s(18790),i=s(62362),l=s(85893);function u(e){const{version:n}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.Z,{version:n.version,tag:(0,o.J)(n.pluginId,n.version)}),(0,l.jsx)(r.d,{children:n.noIndex&&(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function a(e){const{version:n,route:s}=e;return(0,l.jsx)(r.FG,{className:n.className,children:(0,l.jsx)(t.q,{version:n,children:(0,c.H)(s.routes)})})}function d(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(u,{...e}),(0,l.jsx)(a,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.092bd870.js b/assets/js/a94703ab.092bd870.js deleted file mode 100644 index 0f74f661d..000000000 --- a/assets/js/a94703ab.092bd870.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4368],{59779:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(67294),o=n(36905),i=n(96984),s=n(50563),l=n(68879),r=n(40217),c=n(55361),d=n(18119),u=n(89062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(85893);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.Ct)();return(0,d.RF)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.Z)("clean-btn",s.k.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(68048),x=n(16550),f=n(62550),j=n(39581),k=n(82546);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const v={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.Z)("button button--secondary button--outline",v.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:v.collapseSidebarButtonIcon})})}var C=n(25461),S=n(20585);const I=Symbol("EmptyContext"),N=a.createContext(I);function T(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var B=n(93841),Z=n(51997),A=n(38208),L=n(45025);function y(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.I)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.I)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function w(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.L)(),k=function(e){const t=(0,L.Z)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.LM)(e):void 0),[e,t])}(t),_=(0,l._F)(t,i),v=(0,Z.Mg)(x,i),{collapsed:g,setCollapsed:C}=(0,B.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:T,setExpandedItem:w}=function(){const e=(0,a.useContext)(N);if(e===I)throw new S.i6("DocSidebarItemsExpandedStateProvider");return e}(),E=function(e){void 0===e&&(e=!g),w(e?null:c),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.D9)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:E}),(0,a.useEffect)((()=>{h&&null!=T&&T!==c&&f&&C(!0)}),[h,T,c,C,f]),(0,b.jsxs)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemCategory,s.k.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v}),children:[(0,b.jsx)(A.Z,{className:(0,o.Z)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?E(!1):(e.preventDefault(),E())}:()=>{n?.(t)},"aria-current":v?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?k??"#":k,...d,children:m}),x&&h&&(0,b.jsx)(y,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),E()}})]}),(0,b.jsx)(B.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(V,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var E=n(41117),H=n(99391);const M={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l._F)(t,a),x=(0,E.Z)(d);return(0,b.jsx)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemLink,s.k.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(A.Z,{className:(0,o.Z)("menu__link",!x&&M.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.Z,{})]})},u)}const W={menuHtmlItem:"menuHtmlItem_M9Kj"};function F(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemLink,s.k.docs.docSidebarItemLinkLevel(n),l&&[W.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function P(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(w,{item:t,...n});case"html":return(0,b.jsx)(F,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function D(e){let{items:t,...n}=e;const a=(0,l.f)(t,n.activePath);return(0,b.jsx)(T,{children:a.map(((e,t)=>(0,b.jsx)(P,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(D),U={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function K(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,C.n)(),[t,n]=(0,a.useState)(e);return(0,d.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.Z)("menu thin-scrollbar",U.menu,l&&U.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.Z)(s.k.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const Y="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",G="sidebarHidden_VK0M",O="sidebarLogo_isFc";function q(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.L)();return(0,b.jsxs)("div",{className:(0,o.Z)(Y,s&&z,i&&G),children:[s&&(0,b.jsx)(k.Z,{tabIndex:-1,className:O}),(0,b.jsx)(K,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const J=a.memo(q);var Q=n(5689),X=n(44160);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,X.e)();return(0,b.jsx)("ul",{className:(0,o.Z)(s.k.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(Q.Zo,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.i)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(J,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.V)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.TH)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.n)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.Z)(s.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.Z)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.V)();return(0,b.jsx)("main",{className:(0,o.Z)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.Z)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.V)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(96325);function be(e){const t=(0,l.SN)(e);if(!t)return(0,b.jsx)(me.Z,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.FG,{className:(0,o.Z)(s.k.page.docsDocPage),children:(0,b.jsx)(r.b,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},96325:(e,t,n)=>{n.d(t,{Z:()=>l});n(67294);var a=n(36905),o=n(55361),i=n(42704),s=n(85893);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.Z)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.Z,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.f3353760.js b/assets/js/a94703ab.f3353760.js new file mode 100644 index 000000000..3426f56d0 --- /dev/null +++ b/assets/js/a94703ab.f3353760.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9914"],{49341:function(e,t,n){n.r(t),n.d(t,{default:()=>ec});var a=n("85893"),i=n("67294"),r=n("74904"),o=n("81921"),l=n("50490"),s=n("71364"),d=n("26844"),c=n("1822"),u=n("27570"),m=n("11257");let b={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function h(){let{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e,[n,a]=(0,i.useState)(!1),r=(0,i.useRef)(!1),{startScroll:o,cancelScroll:l}=(0,u.Ct)();return(0,u.RF)((e,n)=>{let{scrollY:i}=e,o=n?.scrollY;if(!!o)r.current?r.current=!1:i>=o?(l(),a(!1)):i {e.location.hash&&(r.current=!0,a(!1))}),{shown:n,scrollToTop:()=>o(0)}}({threshold:300});return(0,a.jsx)("button",{"aria-label":(0,c.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,r.Z)("clean-btn",l.k.common.backToTopButton,b.backToTopButton,e&&b.backToTopButtonShow),type:"button",onClick:t})}var p=n("11027"),x=n("16550"),f=n("72649"),j=n("45237"),_=n("40858");function k(e){return(0,a.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,a.jsxs)("g",{fill:"#7a7a7a",children:[(0,a.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,a.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}let g="collapseSidebarButton_PEFL",v="collapseSidebarButtonIcon_kv0_";function S(e){let{onClick:t}=e;return(0,a.jsx)("button",{type:"button",title:(0,c.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,r.Z)("button button--secondary button--outline",g),onClick:t,children:(0,a.jsx)(k,{className:v})})}var C=n("73183"),I=n("57100");let N=Symbol("EmptyContext"),T=i.createContext(N);function Z(e){let{children:t}=e,[n,r]=(0,i.useState)(null),o=(0,i.useMemo)(()=>({expandedItem:n,setExpandedItem:r}),[n]);return(0,a.jsx)(T.Provider,{value:o,children:t})}var L=n("6560"),y=n("16896"),B=n("27544"),A=n("13341");function w(e){let{collapsed:t,categoryLabel:n,onClick:i}=e;return(0,a.jsx)("button",{"aria-label":t?(0,c.I)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.I)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:i})}function H(e){let{item:t,onItemClick:n,activePath:o,level:d,index:c,...u}=e,{items:m,label:b,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.L)(),_=function(e){let t=(0,A.Z)();return(0,i.useMemo)(()=>{if(e.href&&!e.linkUnlisted)return e.href;if(!t&&!!e.collapsible)return(0,s.LM)(e)},[e,t])}(t),k=(0,s._F)(t,o),g=(0,y.Mg)(x,o),{collapsed:v,setCollapsed:S}=(0,L.u)({initialState:()=>!!h&&!k&&t.collapsed}),{expandedItem:C,setExpandedItem:Z}=function(){let e=(0,i.useContext)(T);if(e===N)throw new I.i6("DocSidebarItemsExpandedStateProvider");return e}(),H=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:!v;Z(e?null:c),S(e)};return!function(e){let{isActive:t,collapsed:n,updateCollapsed:a}=e,r=(0,I.D9)(t);(0,i.useEffect)(()=>{t&&!r&&n&&a(!1)},[t,r,n,a])}({isActive:k,collapsed:v,updateCollapsed:H}),(0,i.useEffect)(()=>{h&&null!=C&&C!==c&&f&&S(!0)},[h,C,c,S,f]),(0,a.jsxs)("li",{className:(0,r.Z)(l.k.docs.docSidebarItemCategory,l.k.docs.docSidebarItemCategoryLevel(d),"menu__list-item",{"menu__list-item--collapsed":v},p),children:[(0,a.jsxs)("div",{className:(0,r.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g}),children:[(0,a.jsx)(B.Z,{className:(0,r.Z)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":k}),onClick:h?e=>{n?.(t),x?H(!1):(e.preventDefault(),H())}:()=>{n?.(t)},"aria-current":g?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!v:void 0,href:h?_??"#":_,...u,children:b}),x&&h&&(0,a.jsx)(w,{collapsed:v,categoryLabel:b,onClick:e=>{e.preventDefault(),H()}})]}),(0,a.jsx)(L.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:v,children:(0,a.jsx)(V,{items:m,tabIndex:v?-1:0,onItemClick:n,activePath:o,level:d+1})})]})}var E=n("76520"),M=n("54072");let W={menuExternalLink:"menuExternalLink_NmtK"};function F(e){let{item:t,onItemClick:n,activePath:i,level:o,index:d,...c}=e,{href:u,label:m,className:b,autoAddBaseUrl:h}=t,p=(0,s._F)(t,i),x=(0,E.Z)(u);return(0,a.jsx)("li",{className:(0,r.Z)(l.k.docs.docSidebarItemLink,l.k.docs.docSidebarItemLinkLevel(o),"menu__list-item",b),children:(0,a.jsxs)(B.Z,{className:(0,r.Z)("menu__link",!x&&W.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:u,...x&&{onClick:n?()=>n(t):void 0},...c,children:[m,!x&&(0,a.jsx)(M.Z,{})]})},m)}let R={menuHtmlItem:"menuHtmlItem_M9Kj"};function D(e){let{item:t,level:n,index:i}=e,{value:o,defaultStyle:s,className:d}=t;return(0,a.jsx)("li",{className:(0,r.Z)(l.k.docs.docSidebarItemLink,l.k.docs.docSidebarItemLinkLevel(n),s&&[R.menuHtmlItem,"menu__list-item"],d),dangerouslySetInnerHTML:{__html:o}},i)}function P(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,a.jsx)(H,{item:t,...n});case"html":return(0,a.jsx)(D,{item:t,...n});default:return(0,a.jsx)(F,{item:t,...n})}}let V=(0,i.memo)(function(e){let{items:t,...n}=e,i=(0,s.f)(t,n.activePath);return(0,a.jsx)(Z,{children:i.map((e,t)=>(0,a.jsx)(P,{item:e,index:t,...n},t))})}),U={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function K(e){let{path:t,sidebar:n,className:o}=e,s=function(){let{isActive:e}=(0,C.n)(),[t,n]=(0,i.useState)(e);return(0,u.RF)(t=>{let{scrollY:a}=t;e&&n(0===a)},[e]),e&&t}();return(0,a.jsx)("nav",{"aria-label":(0,c.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,r.Z)("menu thin-scrollbar",U.menu,s&&U.menuWithAnnouncementBar,o),children:(0,a.jsx)("ul",{className:(0,r.Z)(l.k.docs.docSidebarMenu,"menu__list"),children:(0,a.jsx)(V,{items:n,activePath:t,level:1})})})}let z={sidebar:"sidebar_njMd",sidebarWithHideableNavbar:"sidebarWithHideableNavbar_wUlq",sidebarHidden:"sidebarHidden_VK0M",sidebarLogo:"sidebarLogo_isFc"},G=i.memo(function(e){let{path:t,sidebar:n,onCollapse:i,isHidden:o}=e,{navbar:{hideOnScroll:l},docs:{sidebar:{hideable:s}}}=(0,j.L)();return(0,a.jsxs)("div",{className:(0,r.Z)(z.sidebar,l&&z.sidebarWithHideableNavbar,o&&z.sidebarHidden),children:[l&&(0,a.jsx)(_.Z,{tabIndex:-1,className:z.sidebarLogo}),(0,a.jsx)(K,{path:t,sidebar:n}),s&&(0,a.jsx)(S,{onClick:i})]})});var Y=n("5942"),q=n("25658");let J=e=>{let{sidebar:t,path:n}=e,i=(0,q.e)();return(0,a.jsx)("ul",{className:(0,r.Z)(l.k.docs.docSidebarMenu,"menu__list"),children:(0,a.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&i.toggle(),"link"===e.type&&i.toggle()},level:1})})},O=i.memo(function(e){return(0,a.jsx)(Y.Zo,{component:J,props:e})});function Q(e){let t=(0,f.i)();return(0,a.jsxs)(a.Fragment,{children:[("desktop"===t||"ssr"===t)&&(0,a.jsx)(G,{...e}),"mobile"===t&&(0,a.jsx)(O,{...e})]})}let X="expandButton_TmdG",$="expandButtonIcon_i1dp";function ee(e){let{toggleSidebar:t}=e;return(0,a.jsx)("div",{className:X,title:(0,c.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,a.jsx)(k,{className:$})})}let et={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function en(e){let{children:t}=e,n=(0,d.V)();return(0,a.jsx)(i.Fragment,{children:t},n?.name??"noSidebar")}function ea(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e,{pathname:s}=(0,x.TH)(),[d,c]=(0,i.useState)(!1),u=(0,i.useCallback)(()=>{d&&c(!1),!d&&(0,p.n)()&&c(!0),o(e=>!e)},[o,d]);return(0,a.jsx)("aside",{className:(0,r.Z)(l.k.docs.docSidebarContainer,et.docSidebarContainer,n&&et.docSidebarContainerHidden),onTransitionEnd:e=>{if(!!e.currentTarget.classList.contains(et.docSidebarContainer))n&&c(!0)},children:(0,a.jsx)(en,{children:(0,a.jsxs)("div",{className:(0,r.Z)(et.sidebarViewport,d&&et.sidebarViewportHidden),children:[(0,a.jsx)(Q,{sidebar:t,path:s,onCollapse:u,isHidden:d}),d&&(0,a.jsx)(ee,{toggleSidebar:u})]})})})}let ei={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function er(e){let{hiddenSidebarContainer:t,children:n}=e,i=(0,d.V)();return(0,a.jsx)("main",{className:(0,r.Z)(ei.docMainContainer,(t||!i)&&ei.docMainContainerEnhanced),children:(0,a.jsx)("div",{className:(0,r.Z)("container padding-top--md padding-bottom--lg",ei.docItemWrapper,t&&ei.docItemWrapperEnhanced),children:n})})}let eo="docRoot_UBD9",el="docsWrapper_hBAB";function es(e){let{children:t}=e,n=(0,d.V)(),[r,o]=(0,i.useState)(!1);return(0,a.jsxs)("div",{className:el,children:[(0,a.jsx)(h,{}),(0,a.jsxs)("div",{className:eo,children:[n&&(0,a.jsx)(ea,{sidebar:n.items,hiddenSidebarContainer:r,setHiddenSidebarContainer:o}),(0,a.jsx)(er,{hiddenSidebarContainer:r,children:t})]})]})}var ed=n("92487");function ec(e){let t=(0,s.SN)(e);if(!t)return(0,a.jsx)(ed.Z,{});let{docElement:n,sidebarName:i,sidebarItems:c}=t;return(0,a.jsx)(o.FG,{className:(0,r.Z)(l.k.page.docsDocPage),children:(0,a.jsx)(d.b,{name:i,items:c,children:(0,a.jsx)(es,{children:n})})})}},92487:function(e,t,n){n.d(t,{Z:function(){return l}});var a=n(85893);n(67294);var i=n(74904),r=n(1822),o=n(52068);function l(e){let{className:t}=e;return(0,a.jsx)("main",{className:(0,i.Z)("container margin-vert--xl",t),children:(0,a.jsx)("div",{className:"row",children:(0,a.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,a.jsx)(o.Z,{as:"h1",className:"hero__title",children:(0,a.jsx)(r.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,a.jsx)("p",{children:(0,a.jsx)(r.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,a.jsx)("p",{children:(0,a.jsx)(r.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/a9e19215.1e237522.js b/assets/js/a9e19215.1e237522.js new file mode 100644 index 000000000..176c0f52c --- /dev/null +++ b/assets/js/a9e19215.1e237522.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5147"],{72459:function(e,t,n){n.r(t),n.d(t,{metadata:()=>r,contentTitle:()=>a,default:()=>p,assets:()=>l,toc:()=>d,frontMatter:()=>i});var r=JSON.parse('{"id":"user/software/networking/xrdp","title":"XRDP","description":"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android).","source":"@site/docs/user/software/networking/xrdp.md","sourceDirName":"user/software/networking","slug":"/user/software/networking/xrdp","permalink":"/docs/user/software/networking/xrdp","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/xrdp.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"XRDP","summary":"User guide for XRDP on Solus"},"sidebar":"userSidebar","previous":{"title":"Wireshark","permalink":"/docs/user/software/networking/wireshark"},"next":{"title":"Sound","permalink":"/docs/user/software/sound/"}}'),o=n("85893"),s=n("50065");let i={title:"XRDP",summary:"User guide for XRDP on Solus"},a="XRDP",l={},d=[{value:"Installation",id:"installation",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Start / Stop xrdp",id:"start--stop-xrdp",level:2}];function c(e){let t={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"xrdp",children:"XRDP"})}),"\n",(0,o.jsx)(t.p,{children:"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android)."}),"\n",(0,o.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(t.p,{children:"Solus has an xrdp integration package for each Desktop Environment that will install the correct configuration for that DE. Install the respective package for your DE."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.code,{children:"xrdp-budgie-integration"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.code,{children:"xrdp-gnome-integration"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.code,{children:"xrdp-mate-integration"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.code,{children:"xrdp-plasma-integration"})}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["This package will also install the ",(0,o.jsx)(t.code,{children:"xrdp"})," and ",(0,o.jsx)(t.code,{children:"xorgxrdp"})," packages."]}),"\n",(0,o.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsx)(t.p,{children:"The following file needs to be created, if it doesn't already exist, with the following contents."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"cat /etc/X11/Xwrapper.config\n\nallowed_users=anybody\n"})}),"\n",(0,o.jsx)(t.h2,{id:"start--stop-xrdp",children:"Start / Stop xrdp"}),"\n",(0,o.jsx)(t.p,{children:"Please note that xrdp does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"# Start xrdp manually\nsudo systemctl start xrdp\n\n# Configure xrdp to start automatically on each boot and immediately start the service\nsudo systemctl enable --now xrdp\n\n# Check whether xrdp is running\nsudo systemctl status xrdp\n\n# Restart xrdp manually\nsudo systemctl restart xrdp\n\n# Stop xrdp manually\nsudo systemctl stop xrdp\n\n# Configure xrdp to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now xrdp\n"})})]})}function p(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return a},a:function(){return i}});var r=n(67294);let o={},s=r.createContext(o);function i(e){let t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a9e19215.59ba6bf2.js b/assets/js/a9e19215.59ba6bf2.js deleted file mode 100644 index e7fbae87c..000000000 --- a/assets/js/a9e19215.59ba6bf2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[333],{71371:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=n(85893),o=n(11151);const s={title:"XRDP",summary:"User guide for XRDP on Solus"},i="XRDP",a={id:"user/software/networking/xrdp",title:"XRDP",description:"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android).",source:"@site/docs/user/software/networking/xrdp.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/xrdp",permalink:"/docs/user/software/networking/xrdp",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/xrdp.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"XRDP",summary:"User guide for XRDP on Solus"},sidebar:"userSidebar",previous:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"},next:{title:"Sound",permalink:"/docs/user/software/sound/"}},d={},l=[{value:"Installation",id:"installation",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Start / Stop xrdp",id:"start--stop-xrdp",level:2}];function c(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"xrdp",children:"XRDP"})}),"\n",(0,r.jsx)(t.p,{children:"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android)."}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(t.p,{children:"Solus has an xrdp integration package for each Desktop Environment that will install the correct configuration for that DE. Install the respective package for your DE."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-budgie-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-gnome-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-mate-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-plasma-integration"})}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["This package will also install the ",(0,r.jsx)(t.code,{children:"xrdp"})," and ",(0,r.jsx)(t.code,{children:"xorgxrdp"})," packages."]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t.p,{children:"The following file needs to be created, if it doesn't already exist, with the following contents."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cat /etc/X11/Xwrapper.config\n\nallowed_users=anybody\n"})}),"\n",(0,r.jsx)(t.h2,{id:"start--stop-xrdp",children:"Start / Stop xrdp"}),"\n",(0,r.jsx)(t.p,{children:"Please note that xrdp does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"# Start xrdp manually\nsudo systemctl start xrdp\n\n# Configure xrdp to start automatically on each boot and immediately start the service\nsudo systemctl enable --now xrdp\n\n# Check whether xrdp is running\nsudo systemctl status xrdp\n\n# Restart xrdp manually\nsudo systemctl restart xrdp\n\n# Stop xrdp manually\nsudo systemctl stop xrdp\n\n# Configure xrdp to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now xrdp\n"})})]})}function p(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var r=n(67294);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ab89b7a6.23b91f29.js b/assets/js/ab89b7a6.23b91f29.js new file mode 100644 index 000000000..cdb62c3a9 --- /dev/null +++ b/assets/js/ab89b7a6.23b91f29.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3960"],{13414:function(e,t,n){n.r(t),n.d(t,{metadata:()=>i,contentTitle:()=>c,default:()=>u,assets:()=>l,toc:()=>d,frontMatter:()=>o});var i=JSON.parse('{"id":"user/editions/xfce/index","title":"XFCE","description":"XFCE is provided by the XFCE Edition of Solus. It is described as:","source":"@site/docs/user/editions/xfce/index.md","sourceDirName":"user/editions/xfce","slug":"/user/editions/xfce/","permalink":"/docs/user/editions/xfce/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"XFCE","summary":"A quick introduction to the XFCE Edition of Solus"},"sidebar":"userSidebar","previous":{"title":"Tips and Tricks","permalink":"/docs/user/editions/plasma/tips-and-tricks"},"next":{"title":"Configuration","permalink":"/docs/user/editions/xfce/configuration"}}'),s=n("85893"),r=n("50065");let o={title:"XFCE",summary:"A quick introduction to the XFCE Edition of Solus"},c="XFCE Desktop",l={},d=[];function a(e){let t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"xfce-desktop",children:"XFCE Desktop"})}),"\n",(0,s.jsx)(t.p,{children:"XFCE is provided by the XFCE Edition of Solus. It is described as:"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Xfce is a lightweight desktop environment for UNIX-like operating systems. It aims to be fast and low on system resources, while still being visually appealing and user friendly."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://xfce.org",children:"Homepage"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://blog.xfce.org",children:"Blog"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://gitlab.xfce.org",children:"Support"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"configuration",children:"Go to XFCE Configuration"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"tips-and-tricks",children:"Go to XFCE Tips and Tricks"})})]})}function u(e={}){let{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return c},a:function(){return o}});var i=n(67294);let s={},r=i.createContext(s);function o(e){let t=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ab89b7a6.db136f45.js b/assets/js/ab89b7a6.db136f45.js deleted file mode 100644 index e2e6a86bc..000000000 --- a/assets/js/ab89b7a6.db136f45.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5575],{83016:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=n(85893),i=n(11151);const o={title:"XFCE",summary:"A quick introduction to the XFCE Edition of Solus"},r="XFCE Desktop",c={id:"user/editions/xfce/index",title:"XFCE",description:"XFCE is provided by the XFCE Edition of Solus. It is described as:",source:"@site/docs/user/editions/xfce/index.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/",permalink:"/docs/user/editions/xfce/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"XFCE",summary:"A quick introduction to the XFCE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/xfce/configuration"}},d={},l=[];function a(e){const t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"xfce-desktop",children:"XFCE Desktop"})}),"\n",(0,s.jsx)(t.p,{children:"XFCE is provided by the XFCE Edition of Solus. It is described as:"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Xfce is a lightweight desktop environment for UNIX-like operating systems. It aims to be fast and low on system resources, while still being visually appealing and user friendly."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://xfce.org",children:"Homepage"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://blog.xfce.org",children:"Blog"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://gitlab.xfce.org",children:"Support"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"configuration",children:"Go to XFCE Configuration"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"tips-and-tricks",children:"Go to XFCE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var s=n(67294);const i={},o=s.createContext(i);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aba21aa0.0e4979fa.js b/assets/js/aba21aa0.0e4979fa.js deleted file mode 100644 index e617822a3..000000000 --- a/assets/js/aba21aa0.0e4979fa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3629],{41765:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/aba21aa0.6e47277b.js b/assets/js/aba21aa0.6e47277b.js new file mode 100644 index 000000000..2cf1cd473 --- /dev/null +++ b/assets/js/aba21aa0.6e47277b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5112"],{42418:function(e){e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/acecf23e.6898e8f6.js b/assets/js/acecf23e.6898e8f6.js new file mode 100644 index 000000000..759e14c09 --- /dev/null +++ b/assets/js/acecf23e.6898e8f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7627"],{47548:function(e){e.exports=JSON.parse('{"blogBasePath":"/blog","blogTitle":"Solus DevLog","authorsListPath":"/blog/authors"}')}}]); \ No newline at end of file diff --git a/assets/js/acecf23e.c3c14ed7.js b/assets/js/acecf23e.c3c14ed7.js deleted file mode 100644 index 43dd47b60..000000000 --- a/assets/js/acecf23e.c3c14ed7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7393],{81838:e=>{e.exports=JSON.parse('{"blogBasePath":"/blog","blogTitle":"Solus DevLog","authorsListPath":"/blog/authors"}')}}]); \ No newline at end of file diff --git a/assets/js/ad205e99.4667a45a.js b/assets/js/ad205e99.4667a45a.js deleted file mode 100644 index d55cf3587..000000000 --- a/assets/js/ad205e99.4667a45a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1617],{38491:(e,a,s)=>{s.r(a),s.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>d});var n=s(85893),i=s(11151);const t={title:"Rebuilding a stack",summary:"Rebuilding a stack of package dependencies"},r="Rebuilding a stack",c={id:"packaging/stack-rebuilds",title:"Rebuilding a stack",description:"In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package's reverse dependencies. When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library.",source:"@site/docs/packaging/stack-rebuilds.md",sourceDirName:"packaging",slug:"/packaging/stack-rebuilds",permalink:"/docs/packaging/stack-rebuilds",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/stack-rebuilds.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Rebuilding a stack",summary:"Rebuilding a stack of package dependencies"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package",permalink:"/docs/packaging/procedures/request-a-package"},next:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"}},l={},d=[{value:"Updating the library",id:"updating-the-library",level:2},{value:"What are symbols?",id:"what-are-symbols",level:2},{value:"Checking if rebuilds are necessary",id:"checking-if-rebuilds-are-necessary",level:2},{value:"Finding reverse dependencies",id:"finding-reverse-dependencies",level:2},{value:"Rebuild the stack",id:"rebuild-the-stack",level:2}];function o(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"rebuilding-a-stack",children:"Rebuilding a stack"})}),"\n",(0,n.jsxs)(a.p,{children:["In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package's ",(0,n.jsx)(a.em,{children:"reverse dependencies"}),". When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library."]}),"\n",(0,n.jsx)(a.admonition,{type:"note",children:(0,n.jsxs)(a.p,{children:["If you haven't already, you will need to ",(0,n.jsx)(a.a,{href:"/docs/packaging/advanced-config/local-repository",children:"set up a local repository"})," to do stack rebuilds."]})}),"\n",(0,n.jsx)(a.h2,{id:"updating-the-library",children:"Updating the library"}),"\n",(0,n.jsxs)(a.p,{children:["Go through the steps in ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"Updating an Existing Package"})," as normal, but instead of running ",(0,n.jsx)(a.code,{children:"go-task build"}),", run ",(0,n.jsx)(a.code,{children:"go-task build-localcp"}),". This will automatically copy the produced package files to your local repository for use in future builds."]}),"\n",(0,n.jsx)(a.h2,{id:"what-are-symbols",children:"What are symbols?"}),"\n",(0,n.jsxs)(a.p,{children:["Updating a library often means also building its reverse dependencies against the new version due to dynamic linking. Libraries are distributed as shared object, or ",(0,n.jsx)(a.code,{children:".so"}),", files, which contain the code symbols that other software can use. These files are usually versioned, such as ",(0,n.jsx)(a.code,{children:"libpoppler.so.140"}),'. This version is called the "so version". When a piece of software is built, it is ',(0,n.jsx)(a.em,{children:"linked"})," to the versioned libraries and code symbols that it uses."]}),"\n",(0,n.jsxs)(a.p,{children:["When the developers of a library release a new update, they may decide to bump the ",(0,n.jsx)(a.code,{children:".so"})," version, and code symbols are added and/or removed from the library. If this happens, but its reverse dependencies are not rebuilt after updating, they will try to use the old shared object file and symbols. Because they no longer exist, however, the program will crash when it tries to open them. Rebuilding the stack ensures that every piece of software is pointing to the correct version of its dependencies."]}),"\n",(0,n.jsx)(a.h2,{id:"checking-if-rebuilds-are-necessary",children:"Checking if rebuilds are necessary"}),"\n",(0,n.jsxs)(a.p,{children:["That's where the ",(0,n.jsx)(a.code,{children:"abi_*"})," files in the package repository come in. ",(0,n.jsx)(a.code,{children:"abi_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_symbols"})," list the libraries and code symbols provided by a package, while ",(0,n.jsx)(a.code,{children:"abi_used_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_used_symbols"})," list what libraries and symbols the package links to. After updating a package that has ",(0,n.jsx)(a.code,{children:"abi_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_symbols"})," files, run ",(0,n.jsx)(a.code,{children:"git diff"})," on them and check for two things:"]}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["Changes in the ",(0,n.jsx)(a.code,{children:".so"})," version"]}),"\n",(0,n.jsxs)(a.li,{children:["Removed lines in ",(0,n.jsx)(a.code,{children:"abi_symbols"})]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"If either of these conditions are true, then all reverse dependencies of that package need to be rebuilt."}),"\n",(0,n.jsx)(a.admonition,{type:"note",children:(0,n.jsx)(a.p,{children:"Sometimes, packages in a stack are rebuilt even though the above conditions are not met. These are called Safety Rebuilds."})}),"\n",(0,n.jsx)(a.h2,{id:"finding-reverse-dependencies",children:"Finding reverse dependencies"}),"\n",(0,n.jsxs)(a.p,{children:["In most cases, all of the required rebuilds can be found by running ",(0,n.jsx)(a.code,{children:"eopkg info "})," and looking at the Reverse Dependencies line, thanks to our tooling's automatic dependency detection. This doesn't always work, though, such as with ",(0,n.jsx)(a.code,{children:"abseil-cpp"}),". In that case, you can use a tool like RipGrep to find all of the packages that link against the library you're updating, for example:"]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:'# Run in the root of the Solus package repository on your system\nrg "absl" packages/*/*/abi_used_libs\n'})}),"\n",(0,n.jsx)(a.h2,{id:"rebuild-the-stack",children:"Rebuild the stack"}),"\n",(0,n.jsx)(a.p,{children:"For each package in the stack, follow this procedure:"}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Bump the package"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"go-task bump\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Make sure there are no unwanted changes"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"git diff .\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Build the package using packages in your local repository"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"go-task build-local\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package#commit-your-changes",children:"Commit your changes"}),". Use this format for your commit message:"]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-git",children:"package: Rebuild for other-package\n"})}),"\n",(0,n.jsx)(a.p,{children:"Do this in the same git branch as the library update."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["Once all packages in the stack have been rebuilt, ",(0,n.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),". If changes are requested, see ",(0,n.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request#amending-a-pull-request-with-multiple-commits",children:"this section"})," about amending a pull request with multiple commits."]})]})}function h(e={}){const{wrapper:a}={...(0,i.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},11151:(e,a,s)=>{s.d(a,{Z:()=>c,a:()=>r});var n=s(67294);const i={},t=n.createContext(i);function r(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ad205e99.b5bdb675.js b/assets/js/ad205e99.b5bdb675.js new file mode 100644 index 000000000..d022fb182 --- /dev/null +++ b/assets/js/ad205e99.b5bdb675.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6995"],{53379:function(e,a,n){n.r(a),n.d(a,{metadata:()=>s,contentTitle:()=>l,default:()=>h,assets:()=>c,toc:()=>d,frontMatter:()=>r});var s=JSON.parse('{"id":"packaging/stack-rebuilds","title":"Rebuilding a stack","description":"In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package\'s reverse dependencies. When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library.","source":"@site/docs/packaging/stack-rebuilds.md","sourceDirName":"packaging","slug":"/packaging/stack-rebuilds","permalink":"/docs/packaging/stack-rebuilds","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/stack-rebuilds.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Rebuilding a stack","summary":"Rebuilding a stack of package dependencies"},"sidebar":"packagingSidebar","previous":{"title":"Requesting a Package","permalink":"/docs/packaging/procedures/request-a-package"},"next":{"title":"Translation instructions","permalink":"/docs/packaging/translation-instructions"}}'),i=n("85893"),t=n("50065");let r={title:"Rebuilding a stack",summary:"Rebuilding a stack of package dependencies"},l="Rebuilding a stack",c={},d=[{value:"Updating the library",id:"updating-the-library",level:2},{value:"What are symbols?",id:"what-are-symbols",level:2},{value:"Checking if rebuilds are necessary",id:"checking-if-rebuilds-are-necessary",level:2},{value:"Finding reverse dependencies",id:"finding-reverse-dependencies",level:2},{value:"Rebuild the stack",id:"rebuild-the-stack",level:2}];function o(e){let a={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.header,{children:(0,i.jsx)(a.h1,{id:"rebuilding-a-stack",children:"Rebuilding a stack"})}),"\n",(0,i.jsxs)(a.p,{children:["In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package's ",(0,i.jsx)(a.em,{children:"reverse dependencies"}),". When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library."]}),"\n",(0,i.jsx)(a.admonition,{type:"note",children:(0,i.jsxs)(a.p,{children:["If you haven't already, you will need to ",(0,i.jsx)(a.a,{href:"/docs/packaging/advanced-config/local-repository",children:"set up a local repository"})," to do stack rebuilds."]})}),"\n",(0,i.jsx)(a.h2,{id:"updating-the-library",children:"Updating the library"}),"\n",(0,i.jsxs)(a.p,{children:["Go through the steps in ",(0,i.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"Updating an Existing Package"})," as normal, but instead of running ",(0,i.jsx)(a.code,{children:"go-task build"}),", run ",(0,i.jsx)(a.code,{children:"go-task build-localcp"}),". This will automatically copy the produced package files to your local repository for use in future builds."]}),"\n",(0,i.jsx)(a.h2,{id:"what-are-symbols",children:"What are symbols?"}),"\n",(0,i.jsxs)(a.p,{children:["Updating a library often means also building its reverse dependencies against the new version due to dynamic linking. Libraries are distributed as shared object, or ",(0,i.jsx)(a.code,{children:".so"}),", files, which contain the code symbols that other software can use. These files are usually versioned, such as ",(0,i.jsx)(a.code,{children:"libpoppler.so.140"}),'. This version is called the "so version". When a piece of software is built, it is ',(0,i.jsx)(a.em,{children:"linked"})," to the versioned libraries and code symbols that it uses."]}),"\n",(0,i.jsxs)(a.p,{children:["When the developers of a library release a new update, they may decide to bump the ",(0,i.jsx)(a.code,{children:".so"})," version, and code symbols are added and/or removed from the library. If this happens, but its reverse dependencies are not rebuilt after updating, they will try to use the old shared object file and symbols. Because they no longer exist, however, the program will crash when it tries to open them. Rebuilding the stack ensures that every piece of software is pointing to the correct version of its dependencies."]}),"\n",(0,i.jsx)(a.h2,{id:"checking-if-rebuilds-are-necessary",children:"Checking if rebuilds are necessary"}),"\n",(0,i.jsxs)(a.p,{children:["That's where the ",(0,i.jsx)(a.code,{children:"abi_*"})," files in the package repository come in. ",(0,i.jsx)(a.code,{children:"abi_libs"})," and ",(0,i.jsx)(a.code,{children:"abi_symbols"})," list the libraries and code symbols provided by a package, while ",(0,i.jsx)(a.code,{children:"abi_used_libs"})," and ",(0,i.jsx)(a.code,{children:"abi_used_symbols"})," list what libraries and symbols the package links to. After updating a package that has ",(0,i.jsx)(a.code,{children:"abi_libs"})," and ",(0,i.jsx)(a.code,{children:"abi_symbols"})," files, run ",(0,i.jsx)(a.code,{children:"git diff"})," on them and check for two things:"]}),"\n",(0,i.jsxs)(a.ol,{children:["\n",(0,i.jsxs)(a.li,{children:["Changes in the ",(0,i.jsx)(a.code,{children:".so"})," version"]}),"\n",(0,i.jsxs)(a.li,{children:["Removed lines in ",(0,i.jsx)(a.code,{children:"abi_symbols"})]}),"\n"]}),"\n",(0,i.jsx)(a.p,{children:"If either of these conditions are true, then all reverse dependencies of that package need to be rebuilt."}),"\n",(0,i.jsx)(a.admonition,{type:"note",children:(0,i.jsx)(a.p,{children:"Sometimes, packages in a stack are rebuilt even though the above conditions are not met. These are called Safety Rebuilds."})}),"\n",(0,i.jsx)(a.h2,{id:"finding-reverse-dependencies",children:"Finding reverse dependencies"}),"\n",(0,i.jsxs)(a.p,{children:["In most cases, all of the required rebuilds can be found by running ",(0,i.jsx)(a.code,{children:"eopkg info "})," and looking at the Reverse Dependencies line, thanks to our tooling's automatic dependency detection. This doesn't always work, though, such as with ",(0,i.jsx)(a.code,{children:"abseil-cpp"}),". In that case, you can use a tool like RipGrep to find all of the packages that link against the library you're updating, for example:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:'# Run in the root of the Solus package repository on your system\nrg "absl" packages/*/*/abi_used_libs\n'})}),"\n",(0,i.jsx)(a.h2,{id:"rebuild-the-stack",children:"Rebuild the stack"}),"\n",(0,i.jsx)(a.p,{children:"For each package in the stack, follow this procedure:"}),"\n",(0,i.jsxs)(a.ol,{children:["\n",(0,i.jsxs)(a.li,{children:["\n",(0,i.jsx)(a.p,{children:"Bump the package"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"go-task bump\n"})}),"\n"]}),"\n",(0,i.jsxs)(a.li,{children:["\n",(0,i.jsx)(a.p,{children:"Make sure there are no unwanted changes"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"git diff .\n"})}),"\n"]}),"\n",(0,i.jsxs)(a.li,{children:["\n",(0,i.jsx)(a.p,{children:"Build the package using packages in your local repository"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"go-task build-local\n"})}),"\n"]}),"\n",(0,i.jsxs)(a.li,{children:["\n",(0,i.jsxs)(a.p,{children:[(0,i.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package#commit-your-changes",children:"Commit your changes"}),". Use this format for your commit message:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-git",children:"package: Rebuild for other-package\n"})}),"\n",(0,i.jsx)(a.p,{children:"Do this in the same git branch as the library update."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(a.p,{children:["Once all packages in the stack have been rebuilt, ",(0,i.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),". If changes are requested, see ",(0,i.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request#amending-a-pull-request-with-multiple-commits",children:"this section"})," about amending a pull request with multiple commits."]})]})}function h(e={}){let{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},50065:function(e,a,n){n.d(a,{Z:function(){return l},a:function(){return r}});var s=n(67294);let i={},t=s.createContext(i);function r(e){let a=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4302412.365f4a53.js b/assets/js/b4302412.365f4a53.js deleted file mode 100644 index 207cb5431..000000000 --- a/assets/js/b4302412.365f4a53.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2081],{55892:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var n=s(85893),r=s(11151);const i={title:"Tips and Tricks",summary:"Useful tips and tricks for GNOME users"},o="Tips and Tricks",c={id:"user/editions/gnome/tips-and-tricks",title:"Tips and Tricks",description:"GNOME Keyboard Shortcuts",source:"@site/docs/user/editions/gnome/tips-and-tricks.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/tips-and-tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Tips and Tricks",summary:"Useful tips and tricks for GNOME users"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/gnome/configuration"},next:{title:"MATE",permalink:"/docs/user/editions/mate/"}},d={},a=[{value:"GNOME Keyboard Shortcuts",id:"gnome-keyboard-shortcuts",level:2},{value:"GNOME Hot Corners",id:"gnome-hot-corners",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(t.h2,{id:"gnome-keyboard-shortcuts",children:"GNOME Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Provide a quick guide to these shortcuts like we did for Budgie"}),"\n",(0,n.jsx)(t.h2,{id:"gnome-hot-corners",children:"GNOME Hot Corners"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Since Hot Corners aren't easily discoverable, maybe a quick intro to using them"}),"\n",(0,n.jsx)(t.p,{children:"TODO: I'm sure there are other things that GNOME users can point out"})]})}function l(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>o});var n=s(67294);const r={},i=n.createContext(r);function o(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4302412.700e839d.js b/assets/js/b4302412.700e839d.js new file mode 100644 index 000000000..6047f4abf --- /dev/null +++ b/assets/js/b4302412.700e839d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3388"],{37967:function(e,t,s){s.r(t),s.d(t,{metadata:()=>n,contentTitle:()=>c,default:()=>l,assets:()=>d,toc:()=>a,frontMatter:()=>o});var n=JSON.parse('{"id":"user/editions/gnome/tips-and-tricks","title":"Tips and Tricks","description":"GNOME Keyboard Shortcuts","source":"@site/docs/user/editions/gnome/tips-and-tricks.md","sourceDirName":"user/editions/gnome","slug":"/user/editions/gnome/tips-and-tricks","permalink":"/docs/user/editions/gnome/tips-and-tricks","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/tips-and-tricks.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Tips and Tricks","summary":"Useful tips and tricks for GNOME users"},"sidebar":"userSidebar","previous":{"title":"Configuration","permalink":"/docs/user/editions/gnome/configuration"},"next":{"title":"MATE","permalink":"/docs/user/editions/mate/"}}'),r=s("85893"),i=s("50065");let o={title:"Tips and Tricks",summary:"Useful tips and tricks for GNOME users"},c="Tips and Tricks",d={},a=[{value:"GNOME Keyboard Shortcuts",id:"gnome-keyboard-shortcuts",level:2},{value:"GNOME Hot Corners",id:"gnome-hot-corners",level:2}];function u(e){let t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,r.jsx)(t.h2,{id:"gnome-keyboard-shortcuts",children:"GNOME Keyboard Shortcuts"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Provide a quick guide to these shortcuts like we did for Budgie"}),"\n",(0,r.jsx)(t.h2,{id:"gnome-hot-corners",children:"GNOME Hot Corners"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Since Hot Corners aren't easily discoverable, maybe a quick intro to using them"}),"\n",(0,r.jsx)(t.p,{children:"TODO: I'm sure there are other things that GNOME users can point out"})]})}function l(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},50065:function(e,t,s){s.d(t,{Z:function(){return c},a:function(){return o}});var n=s(67294);let r={},i=n.createContext(r);function o(e){let t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b6ca4f35.2eb370e8.js b/assets/js/b6ca4f35.2eb370e8.js deleted file mode 100644 index 549f142cd..000000000 --- a/assets/js/b6ca4f35.2eb370e8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9214],{27983:e=>{e.exports=JSON.parse('{"tag":{"label":"packaging","permalink":"/blog/tags/packaging","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/packaging","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/b6ca4f35.a395af94.js b/assets/js/b6ca4f35.a395af94.js new file mode 100644 index 000000000..4ec12d576 --- /dev/null +++ b/assets/js/b6ca4f35.a395af94.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["188"],{7:function(e){e.exports=JSON.parse('{"tag":{"label":"packaging","permalink":"/blog/tags/packaging","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/packaging","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/baa66232.58180d72.js b/assets/js/baa66232.58180d72.js new file mode 100644 index 000000000..e448e3cff --- /dev/null +++ b/assets/js/baa66232.58180d72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2549"],{59710:function(e,n,r){r.r(n),r.d(n,{metadata:()=>o,contentTitle:()=>i,default:()=>u,assets:()=>l,toc:()=>c,frontMatter:()=>s});var o=JSON.parse('{"id":"user/software/camera/droidcam","title":"DroidCam","description":"DroidCam turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype.","source":"@site/docs/user/software/camera/droidcam.md","sourceDirName":"user/software/camera","slug":"/user/software/camera/droidcam","permalink":"/docs/user/software/camera/droidcam","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/camera/droidcam.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"DroidCam","summary":"Quick Start guide to DroidCam on Solus"},"sidebar":"userSidebar","previous":{"title":"Camera","permalink":"/docs/category/camera"},"next":{"title":"Command Line","permalink":"/docs/user/software/command-line/"}}'),a=r("85893"),t=r("50065");let s={title:"DroidCam",summary:"Quick Start guide to DroidCam on Solus"},i="DroidCam",l={},c=[{value:"Before installation",id:"before-installation",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function d(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"droidcam",children:"DroidCam"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.a,{href:"https://www.dev47apps.com/",children:"DroidCam"})," turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype."]}),"\n",(0,a.jsx)(n.h2,{id:"before-installation",children:"Before installation"}),"\n",(0,a.jsxs)(n.p,{children:["DroidCam relies on the v4l2loopback kernel module. So you need to install ",(0,a.jsx)(n.code,{children:"v4l2loopback"})," or ",(0,a.jsx)(n.code,{children:"v4l2loopback-current"})," depending of which kernel is installed on your computer. To find out which kernel is installed, run:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This should return a version which ends in ",(0,a.jsx)(n.code,{children:".current"})," or ",(0,a.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,a.jsx)(n.code,{children:"v4l2loopback-current"}),":"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback-current\n"})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,a.jsx)(n.code,{children:"v4l2loopback"}),":"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback\n"})}),"\n",(0,a.jsx)(n.p,{children:"After the kernel module is installed, continue to installation steps."}),"\n",(0,a.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsx)(n.p,{children:"DroidCam can be installed from Software Center or via terminal :"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it droidcam\n"})}),"\n",(0,a.jsx)(n.p,{children:"Once DroidCam is installed, reboot your system. Now DroidCam is ready to use."}),"\n",(0,a.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsxs)(n.p,{children:["To start pairing your phone or tablet with your computer, you can follow steps provided by this ",(0,a.jsx)(n.a,{href:"https://www.dev47apps.com/droidcam/connect/",children:"guide"})," from the DroidCam developer."]})]})}function u(e={}){let{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},50065:function(e,n,r){r.d(n,{Z:function(){return i},a:function(){return s}});var o=r(67294);let a={},t=o.createContext(a);function s(e){let n=o.useContext(t);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/baa66232.bf45c7ea.js b/assets/js/baa66232.bf45c7ea.js deleted file mode 100644 index a53ae8e5d..000000000 --- a/assets/js/baa66232.bf45c7ea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[984],{17789:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var o=r(85893),a=r(11151);const s={title:"DroidCam",summary:"Quick Start guide to DroidCam on Solus"},t="DroidCam",i={id:"user/software/camera/droidcam",title:"DroidCam",description:"DroidCam turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype.",source:"@site/docs/user/software/camera/droidcam.md",sourceDirName:"user/software/camera",slug:"/user/software/camera/droidcam",permalink:"/docs/user/software/camera/droidcam",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/camera/droidcam.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"DroidCam",summary:"Quick Start guide to DroidCam on Solus"},sidebar:"userSidebar",previous:{title:"Camera",permalink:"/docs/category/camera"},next:{title:"Command Line",permalink:"/docs/user/software/command-line/"}},l={},c=[{value:"Before installation",id:"before-installation",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"droidcam",children:"DroidCam"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://www.dev47apps.com/",children:"DroidCam"})," turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype."]}),"\n",(0,o.jsx)(n.h2,{id:"before-installation",children:"Before installation"}),"\n",(0,o.jsxs)(n.p,{children:["DroidCam relies on the v4l2loopback kernel module. So you need to install ",(0,o.jsx)(n.code,{children:"v4l2loopback"})," or ",(0,o.jsx)(n.code,{children:"v4l2loopback-current"})," depending of which kernel is installed on your computer. To find out which kernel is installed, run:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This should return a version which ends in ",(0,o.jsx)(n.code,{children:".current"})," or ",(0,o.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,o.jsx)(n.code,{children:"v4l2loopback-current"}),":"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback-current\n"})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,o.jsx)(n.code,{children:"v4l2loopback"}),":"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback\n"})}),"\n",(0,o.jsx)(n.p,{children:"After the kernel module is installed, continue to installation steps."}),"\n",(0,o.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(n.p,{children:"DroidCam can be installed from Software Center or via terminal :"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it droidcam\n"})}),"\n",(0,o.jsx)(n.p,{children:"Once DroidCam is installed, reboot your system. Now DroidCam is ready to use."}),"\n",(0,o.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsxs)(n.p,{children:["To start pairing your phone or tablet with your computer, you can follow steps provided by this ",(0,o.jsx)(n.a,{href:"https://www.dev47apps.com/droidcam/connect/",children:"guide"})," from the DroidCam developer."]})]})}function u(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>i,a:()=>t});var o=r(67294);const a={},s=o.createContext(a);function t(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/baf1b6e8.62f87ab0.js b/assets/js/baf1b6e8.62f87ab0.js deleted file mode 100644 index 063a5609a..000000000 --- a/assets/js/baf1b6e8.62f87ab0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9677],{14864:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=t(85893),a=t(11151);const i={title:"Java",summary:"Learn how to install, run, and manage Java on Solus."},r="Java",o={id:"user/software/development/java",title:"Java",description:"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once.",source:"@site/docs/user/software/development/java.md",sourceDirName:"user/software/development",slug:"/user/software/development/java",permalink:"/docs/user/software/development/java",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/java.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Java",summary:"Learn how to install, run, and manage Java on Solus."},sidebar:"userSidebar",previous:{title:"Containers",permalink:"/docs/user/software/development/containers"},next:{title:"PostgreSQL",permalink:"/docs/user/software/development/postgresql"}},d={},l=[{value:"Running Java applications",id:"running-java-applications",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"java",children:"Java"})}),"\n",(0,s.jsx)(n.p,{children:"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["If you need to install different versions of Java, use alternative installation methods such as ",(0,s.jsx)(n.a,{href:"https://sdkman.io/",children:(0,s.jsx)(n.em,{children:"SDKMAN!"})}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["All Java packages in the Solus repositories include the ",(0,s.jsx)(n.em,{children:"Java Runtime Environment"})," (JRE) and the ",(0,s.jsx)(n.em,{children:"Java Development Kit"})," (JDK)."]}),"\n",(0,s.jsx)(n.p,{children:"The following table lists the versions of Java available in the Solus repositories."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Version"}),(0,s.jsx)(n.th,{children:"Package name"}),(0,s.jsx)(n.th,{children:"Installation directory"}),(0,s.jsx)(n.th,{children:"Included components"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 11"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-11"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-11"})}),(0,s.jsx)(n.td,{children:"JRE, JDK, OpenJFX"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 17"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-17"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-17"})}),(0,s.jsx)(n.td,{children:"JRE, JDK"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 21"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-21"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-21"})}),(0,s.jsx)(n.td,{children:"JRE, JDK"}),(0,s.jsx)(n.td,{})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"running-java-applications",children:"Running Java applications"}),"\n",(0,s.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,s.jsxs)(n.p,{children:["Solus does not add Java to the ",(0,s.jsx)(n.code,{children:"PATH"})," environment variable by default."]})}),"\n",(0,s.jsx)(n.p,{children:"There are multiple ways to execute Java applications in Solus:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Create a .desktop file, then add ",(0,s.jsx)(n.code,{children:"env JAVA_HOME=/path/to/jdk/bin"})," to Exec."]}),"\n",(0,s.jsxs)(n.li,{children:["Create a script that sets ",(0,s.jsx)(n.code,{children:"JAVA_HOME"})," before running the application."]}),"\n",(0,s.jsxs)(n.li,{children:["Symlink the ",(0,s.jsx)(n.code,{children:"java"})," executable from ",(0,s.jsx)(n.code,{children:"/path/to/jdk/bin"})," to ",(0,s.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Add ",(0,s.jsx)(n.code,{children:"/path/to/jdk/bin"})," to your PATH environment variable."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var s=t(67294);const a={},i=s.createContext(a);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/baf1b6e8.ade100ee.js b/assets/js/baf1b6e8.ade100ee.js new file mode 100644 index 000000000..3e298fedb --- /dev/null +++ b/assets/js/baf1b6e8.ade100ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6762"],{25709:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,contentTitle:()=>o,default:()=>h,assets:()=>l,toc:()=>d,frontMatter:()=>r});var s=JSON.parse('{"id":"user/software/development/java","title":"Java","description":"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once.","source":"@site/docs/user/software/development/java.md","sourceDirName":"user/software/development","slug":"/user/software/development/java","permalink":"/docs/user/software/development/java","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/java.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Java","summary":"Learn how to install, run, and manage Java on Solus."},"sidebar":"userSidebar","previous":{"title":"Containers","permalink":"/docs/user/software/development/containers"},"next":{"title":"PostgreSQL","permalink":"/docs/user/software/development/postgresql"}}'),i=t("85893"),a=t("50065");let r={title:"Java",summary:"Learn how to install, run, and manage Java on Solus."},o="Java",l={},d=[{value:"Running Java applications",id:"running-java-applications",level:2}];function c(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"java",children:"Java"})}),"\n",(0,i.jsx)(n.p,{children:"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once."}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["If you need to install different versions of Java, use alternative installation methods such as ",(0,i.jsx)(n.a,{href:"https://sdkman.io/",children:(0,i.jsx)(n.em,{children:"SDKMAN!"})}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["All Java packages in the Solus repositories include the ",(0,i.jsx)(n.em,{children:"Java Runtime Environment"})," (JRE) and the ",(0,i.jsx)(n.em,{children:"Java Development Kit"})," (JDK)."]}),"\n",(0,i.jsx)(n.p,{children:"The following table lists the versions of Java available in the Solus repositories."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Version"}),(0,i.jsx)(n.th,{children:"Package name"}),(0,i.jsx)(n.th,{children:"Installation directory"}),(0,i.jsx)(n.th,{children:"Included components"}),(0,i.jsx)(n.th,{children:"Notes"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Java 11"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"openjdk-11"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"/usr/lib64/openjdk-11"})}),(0,i.jsx)(n.td,{children:"JRE, JDK, OpenJFX"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Java 17"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"openjdk-17"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"/usr/lib64/openjdk-17"})}),(0,i.jsx)(n.td,{children:"JRE, JDK"}),(0,i.jsx)(n.td,{})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Java 21"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"openjdk-21"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"/usr/lib64/openjdk-21"})}),(0,i.jsx)(n.td,{children:"JRE, JDK"}),(0,i.jsx)(n.td,{})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"running-java-applications",children:"Running Java applications"}),"\n",(0,i.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,i.jsxs)(n.p,{children:["Solus does not add Java to the ",(0,i.jsx)(n.code,{children:"PATH"})," environment variable by default."]})}),"\n",(0,i.jsx)(n.p,{children:"There are multiple ways to execute Java applications in Solus:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Create a .desktop file, then add ",(0,i.jsx)(n.code,{children:"env JAVA_HOME=/path/to/jdk/bin"})," to Exec."]}),"\n",(0,i.jsxs)(n.li,{children:["Create a script that sets ",(0,i.jsx)(n.code,{children:"JAVA_HOME"})," before running the application."]}),"\n",(0,i.jsxs)(n.li,{children:["Symlink the ",(0,i.jsx)(n.code,{children:"java"})," executable from ",(0,i.jsx)(n.code,{children:"/path/to/jdk/bin"})," to ",(0,i.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Add ",(0,i.jsx)(n.code,{children:"/path/to/jdk/bin"})," to your PATH environment variable."]}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return o},a:function(){return r}});var s=t(67294);let i={},a=s.createContext(i);function r(e){let n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/be4ac66b.a5924dbe.js b/assets/js/be4ac66b.a5924dbe.js deleted file mode 100644 index 8f87b6daa..000000000 --- a/assets/js/be4ac66b.a5924dbe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4869],{87190:(n,i,e)=>{e.r(i),e.d(i,{assets:()=>h,contentTitle:()=>d,default:()=>t,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var l=e(85893),s=e(11151);const r={title:"Laptops",summary:"List of known-working laptop hardware from various vendors"},d="Laptops",o={id:"user/hardware/compatibility/laptops",title:"Laptops",description:"The following laptops have been tested and/or suggested to function correctly by our users.",source:"@site/docs/user/hardware/compatibility/laptops.md",sourceDirName:"user/hardware/compatibility",slug:"/user/hardware/compatibility/laptops",permalink:"/docs/user/hardware/compatibility/laptops",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/laptops.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Laptops",summary:"List of known-working laptop hardware from various vendors"},sidebar:"userSidebar",previous:{title:"Compatibility",permalink:"/docs/category/compatibility"},next:{title:"WiFi",permalink:"/docs/user/hardware/compatibility/wifi"}},h={},c=[{value:"Acer",id:"acer",level:2},{value:"Alienware",id:"alienware",level:2},{value:"Apple",id:"apple",level:2},{value:"ASUS",id:"asus",level:2},{value:"Dell",id:"dell",level:2},{value:"eMachines",id:"emachines",level:2},{value:"Fujitsu",id:"fujitsu",level:2},{value:"GIGABYTE",id:"gigabyte",level:2},{value:"Google",id:"google",level:2},{value:"HP",id:"hp",level:2},{value:"Lenovo",id:"lenovo",level:2},{value:"MSI",id:"msi",level:2},{value:"Samsung",id:"samsung",level:2},{value:"Schenker",id:"schenker",level:2},{value:"Sony",id:"sony",level:2},{value:"System76",id:"system76",level:2},{value:"Toshiba",id:"toshiba",level:2}];function a(n){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...n.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.header,{children:(0,l.jsx)(i.h1,{id:"laptops",children:"Laptops"})}),"\n",(0,l.jsx)(i.p,{children:"The following laptops have been tested and/or suggested to function correctly by our users."}),"\n",(0,l.jsxs)(i.p,{children:["This list should not suggest that ",(0,l.jsx)(i.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,l.jsx)(i.h2,{id:"acer",children:"Acer"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Acer Aspire 1825PTZ"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 4830T"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 5750G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 7551"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-473-370Z"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-573G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-575G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire ES 15 (ES1-572-5025)"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire ES 17 (ES1-731G-P1MC)"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V3-112P"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V3-571G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V5-121"}),"\n",(0,l.jsx)(i.li,{children:"Acer C710 Chromebook"}),"\n",(0,l.jsx)(i.li,{children:"Acer C720-2848 Chromebook"}),"\n",(0,l.jsx)(i.li,{children:"Acer TravelMate X349-G2-M"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"alienware",children:"Alienware"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Alienware 14"}),"\n",(0,l.jsx)(i.li,{children:"Alienware 17 R3"}),"\n",(0,l.jsx)(i.li,{children:"Alienware 17 R4"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"apple",children:"Apple"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Apple Macbook (late 2008)"}),"\n",(0,l.jsx)(i.li,{children:"Apple MacBookPro8,3"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"asus",children:"ASUS"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Asus EEE-PC 1001PX"}),"\n",(0,l.jsx)(i.li,{children:"Asus EEE-PC 1011PX"}),"\n",(0,l.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,l.jsx)(i.li,{children:"Asus K53U"}),"\n",(0,l.jsx)(i.li,{children:"Asus K55VM"}),"\n",(0,l.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,l.jsx)(i.li,{children:"Asus M50VM"}),"\n",(0,l.jsx)(i.li,{children:"Asus N501JW"}),"\n",(0,l.jsx)(i.li,{children:"Asus Pro50SR"}),"\n",(0,l.jsx)(i.li,{children:"Asus ROG G750JZA"}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 K505ZA","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA-BQ171T","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(i.li,{children:"Asus VivoBook Pro N61JA"}),"\n",(0,l.jsx)(i.li,{children:"Asus VivoBook Pro N61Jv"}),"\n",(0,l.jsx)(i.li,{children:"Asus X200MA"}),"\n",(0,l.jsx)(i.li,{children:"Asus X201EV"}),"\n",(0,l.jsx)(i.li,{children:"Asus X540L"}),"\n",(0,l.jsx)(i.li,{children:"Asus X55"}),"\n",(0,l.jsx)(i.li,{children:"Asus X550LD"}),"\n",(0,l.jsx)(i.li,{children:"Asus X551CAP"}),"\n",(0,l.jsx)(i.li,{children:"Asus ZenBook UX31A"}),"\n",(0,l.jsx)(i.li,{children:"Asus ZenBook UX305FA"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"dell",children:"Dell"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 14 3442"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 14 3452"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15 7579"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15R N5010"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15R N5110"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 1110"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 5050"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 7548"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude D830"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E4310"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E5440"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E5510"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6230"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6320"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6410"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6420"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6430"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6530"}),"\n",(0,l.jsx)(i.li,{children:"Dell Precision 7520"}),"\n",(0,l.jsx)(i.li,{children:"Dell Precision M6500"}),"\n",(0,l.jsx)(i.li,{children:"Dell Vostro 1700"}),"\n",(0,l.jsx)(i.li,{children:"Dell XPS 15 9560"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"emachines",children:"eMachines"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"eMachines E728"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"fujitsu",children:"Fujitsu"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Fujitsu Lifebook A531"}),"\n",(0,l.jsx)(i.li,{children:"Fujitsu Lifebook T900"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"gigabyte",children:"GIGABYTE"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"GIGABYTE Aero 14K"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"google",children:"Google"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Google Chromebook CR48"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"hp",children:"HP"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"HP 240 G3"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq 6730B"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq NC6400"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq Presario CQ61"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8440P"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8460p"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8740w"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8760w"}),"\n",(0,l.jsx)(i.li,{children:"HP Envy TS M6"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion 15-E042SO"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6Z-6c00"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6Z-6100"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV7"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV2700"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion x360 Convertible"}),"\n",(0,l.jsx)(i.li,{children:"HP Presario V6000"}),"\n",(0,l.jsx)(i.li,{children:"HP Probook 6360b"}),"\n",(0,l.jsx)(i.li,{children:"HP ProBook 6450b"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"lenovo",children:"Lenovo"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Lenovo 3000 V200"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo B41-80"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo B50-50"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo G50-80"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo G510"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad S145-15API"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad S400U"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad U310 Touch"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad Z370"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad Z585"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad 13"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad A485 (with latest BIOS update)"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad E450"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad E550"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad Edge E545"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Thinkpad L412"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad L440"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad L512"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad R60e"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad S5-S540"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad SL510"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Thinkpad T400 (2767V2W)"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T410i"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T420"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T430"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T440"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T440s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T470"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T470s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T490s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T560"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T570"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad W520 4270CTO"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 3rd Edition"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 4th Edition"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X61"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X200T"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X201"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X220"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X230"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X280"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Yoga 2 11"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Z50-70"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"msi",children:"MSI"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"MSI GE70"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"samsung",children:"Samsung"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Samsung NP270E5E-X02PL"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP300E4C-AD5BR"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP355E5C"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP365E5C-S04US"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP900X3G"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP900X4C-AU05"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"schenker",children:"Schenker"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Schenker XMG A506-VE"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"sony",children:"Sony"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Sony VAIO Pro 13"}),"\n",(0,l.jsx)(i.li,{children:"Sony VAIO S Series 13"}),"\n",(0,l.jsx)(i.li,{children:"Sony VAIO VPCEC3M1E"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"system76",children:"System76"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"System76 Gazelle Professional"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"toshiba",children:"Toshiba"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Toshiba Portege R930"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Qosmio X305"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Qosmio X875"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite A660"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C50D-A-125"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C55D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C640"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C665D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L300D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L455D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L850-B218"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L855D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Tecra A11"}),"\n"]})]})}function t(n={}){const{wrapper:i}={...(0,s.a)(),...n.components};return i?(0,l.jsx)(i,{...n,children:(0,l.jsx)(a,{...n})}):a(n)}},11151:(n,i,e)=>{e.d(i,{Z:()=>o,a:()=>d});var l=e(67294);const s={},r=l.createContext(s);function d(n){const i=l.useContext(r);return l.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function o(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:d(n.components),l.createElement(r.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/be4ac66b.f0a25510.js b/assets/js/be4ac66b.f0a25510.js new file mode 100644 index 000000000..f3fcd7e67 --- /dev/null +++ b/assets/js/be4ac66b.f0a25510.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6857"],{81522:function(n,i,e){e.r(i),e.d(i,{metadata:()=>l,contentTitle:()=>o,default:()=>t,assets:()=>h,toc:()=>c,frontMatter:()=>d});var l=JSON.parse('{"id":"user/hardware/compatibility/laptops","title":"Laptops","description":"The following laptops have been tested and/or suggested to function correctly by our users.","source":"@site/docs/user/hardware/compatibility/laptops.md","sourceDirName":"user/hardware/compatibility","slug":"/user/hardware/compatibility/laptops","permalink":"/docs/user/hardware/compatibility/laptops","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/laptops.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Laptops","summary":"List of known-working laptop hardware from various vendors"},"sidebar":"userSidebar","previous":{"title":"Compatibility","permalink":"/docs/category/compatibility"},"next":{"title":"WiFi","permalink":"/docs/user/hardware/compatibility/wifi"}}'),s=e("85893"),r=e("50065");let d={title:"Laptops",summary:"List of known-working laptop hardware from various vendors"},o="Laptops",h={},c=[{value:"Acer",id:"acer",level:2},{value:"Alienware",id:"alienware",level:2},{value:"Apple",id:"apple",level:2},{value:"ASUS",id:"asus",level:2},{value:"Dell",id:"dell",level:2},{value:"eMachines",id:"emachines",level:2},{value:"Fujitsu",id:"fujitsu",level:2},{value:"GIGABYTE",id:"gigabyte",level:2},{value:"Google",id:"google",level:2},{value:"HP",id:"hp",level:2},{value:"Lenovo",id:"lenovo",level:2},{value:"MSI",id:"msi",level:2},{value:"Samsung",id:"samsung",level:2},{value:"Schenker",id:"schenker",level:2},{value:"Sony",id:"sony",level:2},{value:"System76",id:"system76",level:2},{value:"Toshiba",id:"toshiba",level:2}];function a(n){let i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"laptops",children:"Laptops"})}),"\n",(0,s.jsx)(i.p,{children:"The following laptops have been tested and/or suggested to function correctly by our users."}),"\n",(0,s.jsxs)(i.p,{children:["This list should not suggest that ",(0,s.jsx)(i.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,s.jsx)(i.h2,{id:"acer",children:"Acer"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Acer Aspire 1825PTZ"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire 4830T"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire 5750G"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire 7551"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire E5-473-370Z"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire E5-573G"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire E5-575G"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire ES 15 (ES1-572-5025)"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire ES 17 (ES1-731G-P1MC)"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire V3-112P"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire V3-571G"}),"\n",(0,s.jsx)(i.li,{children:"Acer Aspire V5-121"}),"\n",(0,s.jsx)(i.li,{children:"Acer C710 Chromebook"}),"\n",(0,s.jsx)(i.li,{children:"Acer C720-2848 Chromebook"}),"\n",(0,s.jsx)(i.li,{children:"Acer TravelMate X349-G2-M"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"alienware",children:"Alienware"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Alienware 14"}),"\n",(0,s.jsx)(i.li,{children:"Alienware 17 R3"}),"\n",(0,s.jsx)(i.li,{children:"Alienware 17 R4"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"apple",children:"Apple"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Apple Macbook (late 2008)"}),"\n",(0,s.jsx)(i.li,{children:"Apple MacBookPro8,3"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"asus",children:"ASUS"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Asus EEE-PC 1001PX"}),"\n",(0,s.jsx)(i.li,{children:"Asus EEE-PC 1011PX"}),"\n",(0,s.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,s.jsx)(i.li,{children:"Asus K53U"}),"\n",(0,s.jsx)(i.li,{children:"Asus K55VM"}),"\n",(0,s.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,s.jsx)(i.li,{children:"Asus M50VM"}),"\n",(0,s.jsx)(i.li,{children:"Asus N501JW"}),"\n",(0,s.jsx)(i.li,{children:"Asus Pro50SR"}),"\n",(0,s.jsx)(i.li,{children:"Asus ROG G750JZA"}),"\n",(0,s.jsxs)(i.li,{children:["Asus VivoBook 15 K505ZA","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA-BQ171T","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.li,{children:"Asus VivoBook Pro N61JA"}),"\n",(0,s.jsx)(i.li,{children:"Asus VivoBook Pro N61Jv"}),"\n",(0,s.jsx)(i.li,{children:"Asus X200MA"}),"\n",(0,s.jsx)(i.li,{children:"Asus X201EV"}),"\n",(0,s.jsx)(i.li,{children:"Asus X540L"}),"\n",(0,s.jsx)(i.li,{children:"Asus X55"}),"\n",(0,s.jsx)(i.li,{children:"Asus X550LD"}),"\n",(0,s.jsx)(i.li,{children:"Asus X551CAP"}),"\n",(0,s.jsx)(i.li,{children:"Asus ZenBook UX31A"}),"\n",(0,s.jsx)(i.li,{children:"Asus ZenBook UX305FA"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"dell",children:"Dell"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 14 3442"}),"\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 14 3452"}),"\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 15 7579"}),"\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 15R N5010"}),"\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 15R N5110"}),"\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 1110"}),"\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 5050"}),"\n",(0,s.jsx)(i.li,{children:"Dell Inspiron 7548"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude D830"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E4310"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E5440"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E5510"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E6230"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E6320"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E6410"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E6420"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E6430"}),"\n",(0,s.jsx)(i.li,{children:"Dell Latitude E6530"}),"\n",(0,s.jsx)(i.li,{children:"Dell Precision 7520"}),"\n",(0,s.jsx)(i.li,{children:"Dell Precision M6500"}),"\n",(0,s.jsx)(i.li,{children:"Dell Vostro 1700"}),"\n",(0,s.jsx)(i.li,{children:"Dell XPS 15 9560"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"emachines",children:"eMachines"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"eMachines E728"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"fujitsu",children:"Fujitsu"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Fujitsu Lifebook A531"}),"\n",(0,s.jsx)(i.li,{children:"Fujitsu Lifebook T900"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"gigabyte",children:"GIGABYTE"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"GIGABYTE Aero 14K"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"google",children:"Google"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Google Chromebook CR48"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"hp",children:"HP"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"HP 240 G3"}),"\n",(0,s.jsx)(i.li,{children:"HP Compaq 6730B"}),"\n",(0,s.jsx)(i.li,{children:"HP Compaq NC6400"}),"\n",(0,s.jsx)(i.li,{children:"HP Compaq Presario CQ61"}),"\n",(0,s.jsx)(i.li,{children:"HP EliteBook 8440P"}),"\n",(0,s.jsx)(i.li,{children:"HP EliteBook 8460p"}),"\n",(0,s.jsx)(i.li,{children:"HP EliteBook 8740w"}),"\n",(0,s.jsx)(i.li,{children:"HP EliteBook 8760w"}),"\n",(0,s.jsx)(i.li,{children:"HP Envy TS M6"}),"\n",(0,s.jsx)(i.li,{children:"HP Pavilion 15-E042SO"}),"\n",(0,s.jsx)(i.li,{children:"HP Pavilion DV6"}),"\n",(0,s.jsx)(i.li,{children:"HP Pavilion DV6Z-6c00"}),"\n",(0,s.jsx)(i.li,{children:"HP Pavilion DV6Z-6100"}),"\n",(0,s.jsx)(i.li,{children:"HP Pavilion DV7"}),"\n",(0,s.jsx)(i.li,{children:"HP Pavilion DV2700"}),"\n",(0,s.jsx)(i.li,{children:"HP Pavilion x360 Convertible"}),"\n",(0,s.jsx)(i.li,{children:"HP Presario V6000"}),"\n",(0,s.jsx)(i.li,{children:"HP Probook 6360b"}),"\n",(0,s.jsx)(i.li,{children:"HP ProBook 6450b"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"lenovo",children:"Lenovo"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Lenovo 3000 V200"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo B41-80"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo B50-50"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo G50-80"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo G510"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo IdeaPad S145-15API"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo IdeaPad S400U"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo IdeaPad U310 Touch"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo IdeaPad Z370"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo IdeaPad Z585"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad 13"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad A485 (with latest BIOS update)"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad E450"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad E550"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad Edge E545"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo Thinkpad L412"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad L440"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad L512"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad R60e"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad S5-S540"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad SL510"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo Thinkpad T400 (2767V2W)"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T410i"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T420"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T430"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T440"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T440s"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T470"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T470s"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T490s"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T560"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad T570"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad W520 4270CTO"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 3rd Edition"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 4th Edition"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X61"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X200T"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X201"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X220"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X230"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo ThinkPad X280"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo Yoga 2 11"}),"\n",(0,s.jsx)(i.li,{children:"Lenovo Z50-70"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"msi",children:"MSI"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"MSI GE70"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"samsung",children:"Samsung"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Samsung NP270E5E-X02PL"}),"\n",(0,s.jsx)(i.li,{children:"Samsung NP300E4C-AD5BR"}),"\n",(0,s.jsx)(i.li,{children:"Samsung NP355E5C"}),"\n",(0,s.jsx)(i.li,{children:"Samsung NP365E5C-S04US"}),"\n",(0,s.jsx)(i.li,{children:"Samsung NP900X3G"}),"\n",(0,s.jsx)(i.li,{children:"Samsung NP900X4C-AU05"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"schenker",children:"Schenker"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Schenker XMG A506-VE"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"sony",children:"Sony"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Sony VAIO Pro 13"}),"\n",(0,s.jsx)(i.li,{children:"Sony VAIO S Series 13"}),"\n",(0,s.jsx)(i.li,{children:"Sony VAIO VPCEC3M1E"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"system76",children:"System76"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"System76 Gazelle Professional"}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"toshiba",children:"Toshiba"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Toshiba Portege R930"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Qosmio X305"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Qosmio X875"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite A660"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite C50D-A-125"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite C55D"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite C640"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite C665D"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite L300D"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite L455D"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite L850-B218"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Satellite L855D"}),"\n",(0,s.jsx)(i.li,{children:"Toshiba Tecra A11"}),"\n"]})]})}function t(n={}){let{wrapper:i}={...(0,r.a)(),...n.components};return i?(0,s.jsx)(i,{...n,children:(0,s.jsx)(a,{...n})}):a(n)}},50065:function(n,i,e){e.d(i,{Z:function(){return o},a:function(){return d}});var l=e(67294);let s={},r=l.createContext(s);function d(n){let i=l.useContext(r);return l.useMemo(function(){return"function"==typeof n?n(i):{...i,...n}},[i,n])}function o(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:d(n.components),l.createElement(r.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/be79d003.aac528f5.js b/assets/js/be79d003.aac528f5.js new file mode 100644 index 000000000..27cb8b866 --- /dev/null +++ b/assets/js/be79d003.aac528f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9507"],{36604:function(e,n,o){o.r(n),o.d(n,{metadata:()=>t,contentTitle:()=>i,default:()=>u,assets:()=>d,toc:()=>l,frontMatter:()=>s});var t=JSON.parse('{"id":"packaging/update-dev-environment","title":"Update Your Development Environment","description":"Always make sure your development environment and system are up to date before beginning work on a package","source":"@site/docs/packaging/update-dev-environment.md","sourceDirName":"packaging","slug":"/packaging/update-dev-environment","permalink":"/docs/packaging/update-dev-environment","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/update-dev-environment.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"sidebarPosition":2,"frontMatter":{"title":"Update Your Development Environment","summary":"Update your development environment before working on a package","sidebar_position":2},"sidebar":"packagingSidebar","previous":{"title":"Prepare for Packaging","permalink":"/docs/packaging/prepare-for-packaging"},"next":{"title":"Creating a New Package","permalink":"/docs/packaging/creating-a-new-package"}}'),a=o("85893"),r=o("50065");let s={title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},i="Update Your Development Environment",d={},l=[{value:"Update your fork of the getsolus/packages repository",id:"update-your-fork-of-the-getsoluspackages-repository",level:2},{value:"Update your local clone of your fork",id:"update-your-local-clone-of-your-fork",level:2},{value:"Update solbuild
and the system",id:"update-solbuild-and-the-system",level:2}];function c(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"update-your-development-environment",children:"Update Your Development Environment"})}),"\n",(0,a.jsx)(n.p,{children:"Always make sure your development environment and system are up to date before beginning work on a package"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Update your fork of the ",(0,a.jsx)(n.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," repository."]}),"\n",(0,a.jsx)(n.li,{children:"Update your local clone of your fork."}),"\n",(0,a.jsxs)(n.li,{children:["Update the solbuild base image ",(0,a.jsx)(n.code,{children:"sudo solbuild update"})]}),"\n",(0,a.jsx)(n.li,{children:"Update the system."}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"update-your-fork-of-the-getsoluspackages-repository",children:"Update your fork of the getsolus/packages repository"}),"\n",(0,a.jsxs)(n.p,{children:["If you already have a fork of ",(0,a.jsx)(n.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," in GitHub, log into GitHub. Make sure you're looking at the ",(0,a.jsx)(n.code,{children:"main"}),' branch. Check to see that your fork is up to date with the main repository it was forked from. If your fork indicates it is behind, use the "Sync fork" button to bring it up to date.']}),"\n",(0,a.jsx)(n.h2,{id:"update-your-local-clone-of-your-fork",children:"Update your local clone of your fork"}),"\n",(0,a.jsx)(n.p,{children:"If you already have a local clone, you need to bring it up to date. To do so run:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,a.jsxs)(n.h2,{id:"update-solbuild-and-the-system",children:["Update ",(0,a.jsx)(n.code,{children:"solbuild"})," and the system"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"sudo solbuild update\nsudo eopkg up\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, you can either ",(0,a.jsx)(n.a,{href:"/docs/packaging/creating-a-new-package",children:"Submit a New Package"})," or ",(0,a.jsx)(n.a,{href:"/docs/packaging/updating-an-existing-package",children:"Update an Existing Package"})]})]})}function u(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},50065:function(e,n,o){o.d(n,{Z:function(){return i},a:function(){return s}});var t=o(67294);let a={},r=t.createContext(a);function s(e){let n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/be79d003.f1a4d102.js b/assets/js/be79d003.f1a4d102.js deleted file mode 100644 index bd1680c91..000000000 --- a/assets/js/be79d003.f1a4d102.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6012],{62262:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var t=n(85893),a=n(11151);const r={title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},s="Update Your Development Environment",i={id:"packaging/update-dev-environment",title:"Update Your Development Environment",description:"Always make sure your development environment and system are up to date before beginning work on a package",source:"@site/docs/packaging/update-dev-environment.md",sourceDirName:"packaging",slug:"/packaging/update-dev-environment",permalink:"/docs/packaging/update-dev-environment",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/update-dev-environment.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,sidebarPosition:2,frontMatter:{title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},sidebar:"packagingSidebar",previous:{title:"Prepare for Packaging",permalink:"/docs/packaging/prepare-for-packaging"},next:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"}},d={},c=[{value:"Update your fork of the getsolus/packages repository",id:"update-your-fork-of-the-getsoluspackages-repository",level:2},{value:"Update your local clone of your fork",id:"update-your-local-clone-of-your-fork",level:2},{value:"Updatesolbuild
and the system",id:"update-solbuild-and-the-system",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"update-your-development-environment",children:"Update Your Development Environment"})}),"\n",(0,t.jsx)(o.p,{children:"Always make sure your development environment and system are up to date before beginning work on a package"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["Update your fork of the ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," repository."]}),"\n",(0,t.jsx)(o.li,{children:"Update your local clone of your fork."}),"\n",(0,t.jsxs)(o.li,{children:["Update the solbuild base image ",(0,t.jsx)(o.code,{children:"sudo solbuild update"})]}),"\n",(0,t.jsx)(o.li,{children:"Update the system."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"update-your-fork-of-the-getsoluspackages-repository",children:"Update your fork of the getsolus/packages repository"}),"\n",(0,t.jsxs)(o.p,{children:["If you already have a fork of ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," in GitHub, log into GitHub. Make sure you're looking at the ",(0,t.jsx)(o.code,{children:"main"}),' branch. Check to see that your fork is up to date with the main repository it was forked from. If your fork indicates it is behind, use the "Sync fork" button to bring it up to date.']}),"\n",(0,t.jsx)(o.h2,{id:"update-your-local-clone-of-your-fork",children:"Update your local clone of your fork"}),"\n",(0,t.jsx)(o.p,{children:"If you already have a local clone, you need to bring it up to date. To do so run:"}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,t.jsxs)(o.h2,{id:"update-solbuild-and-the-system",children:["Update ",(0,t.jsx)(o.code,{children:"solbuild"})," and the system"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"sudo solbuild update\nsudo eopkg up\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Next, you can either ",(0,t.jsx)(o.a,{href:"/docs/packaging/creating-a-new-package",children:"Submit a New Package"})," or ",(0,t.jsx)(o.a,{href:"/docs/packaging/updating-an-existing-package",children:"Update an Existing Package"})]})]})}function p(e={}){const{wrapper:o}={...(0,a.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,o,n)=>{n.d(o,{Z:()=>i,a:()=>s});var t=n(67294);const a={},r=t.createContext(a);function s(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c15d9823.bd5c9de5.js b/assets/js/c15d9823.bd5c9de5.js deleted file mode 100644 index f42a170d9..000000000 --- a/assets/js/c15d9823.bd5c9de5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6642],{92506:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":5,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/c15d9823.c5249e7e.js b/assets/js/c15d9823.c5249e7e.js new file mode 100644 index 000000000..3d69181b6 --- /dev/null +++ b/assets/js/c15d9823.c5249e7e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9359"],{39546:function(e){e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":5,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/c55c138b.d270ff03.js b/assets/js/c55c138b.d270ff03.js deleted file mode 100644 index 6180a29b4..000000000 --- a/assets/js/c55c138b.d270ff03.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7465],{76323:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>t});var s=n(85893),a=n(11151);const o={title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},c="Packaging Changes",l={id:"packaging/packaging-changes",title:"Packaging Changes",description:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details.",source:"@site/docs/packaging/packaging-changes.md",sourceDirName:"packaging",slug:"/packaging/packaging-changes",permalink:"/docs/packaging/packaging-changes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-changes.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,sidebarPosition:7,frontMatter:{title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},sidebar:"packagingSidebar",previous:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"},next:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"}},r={},t=[{value:"2024",id:"2024",level:2},{value:"May",id:"may",level:3},{value:"Remove 'Test Plan' and 'Checklist' from commit messages",id:"remove-test-plan-and-checklist-from-commit-messages",level:4},{value:"Add Rust macros to package.yml",id:"add-rust-macros-to-packageyml",level:4},{value:"Add guidance for SourceForge sources in package.yml",id:"add-guidance-for-sourceforge-sources-in-packageyml",level:4},{value:"February",id:"february",level:3},{value:"Begin addingmonitoring.yml
to packages",id:"begin-adding-monitoringyml-to-packages",level:4},{value:"2023",id:"2023",level:2},{value:"October",id:"october",level:3},{value:"Addingcheckdeps
inpackage.yml
",id:"adding-checkdeps-in-packageyml",level:4},{value:"Git hooks",id:"git-hooks",level:4},{value:"Requiringhomepage
inpackage.yml
",id:"requiring-homepage-in-packageyml",level:4},{value:"Recommending amending commits in Pull Requests",id:"recommending-amending-commits-in-pull-requests",level:4},{value:"September",id:"september",level:3},{value:"Switch to asterisk bolding for PR template",id:"switch-to-asterisk-bolding-for-pr-template",level:4},{value:"Switching Frommake
togo-task
",id:"switching-from-make-to-go-task",level:4},{value:"GitHub Monorepo Migration",id:"github-monorepo-migration",level:4},{value:"August",id:"august",level:3},{value:"Initial GitHub Migration from old Phabricator Dev Tracker",id:"initial-github-migration-from-old-phabricator-dev-tracker",level:4},{value:"April",id:"april",level:3},{value:"2022 and Earlier",id:"2022-and-earlier",level:2}];function d(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"packaging-changes",children:"Packaging Changes"})}),"\n",(0,s.jsx)(i.p,{children:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"This list is not exhaustive"}),"\n",(0,s.jsxs)(i.li,{children:["This list is in ",(0,s.jsx)(i.em,{children:"reverse chronological order"})," (newest first)"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2024",children:"2024"}),"\n",(0,s.jsx)(i.h3,{id:"may",children:"May"}),"\n",(0,s.jsx)(i.h4,{id:"remove-test-plan-and-checklist-from-commit-messages",children:"Remove 'Test Plan' and 'Checklist' from commit messages"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"These are no longer needed in commit messages."}),"\n",(0,s.jsx)(i.li,{children:"They must still be included in the pull request description."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-rust-macros-to-packageyml",children:"Add Rust macros to package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now have macros for building Rust packages. Example: ",(0,s.jsx)(i.code,{children:"%cargo_build"}),". Rust packages should be switched to use the new macros as they are updated."]}),"\n",(0,s.jsxs)(i.li,{children:['See the "Rust (cargo) actionable macros" section on the ',(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#rust-cargo-actionable-macros",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-guidance-for-sourceforge-sources-in-packageyml",children:"Add guidance for SourceForge sources in package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now require SourceForge sources used in ",(0,s.jsx)(i.code,{children:"package.yml"})," files to follow a specific format."]}),"\n",(0,s.jsxs)(i.li,{children:["See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#source-key",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"february",children:"February"}),"\n",(0,s.jsxs)(i.h4,{id:"begin-adding-monitoringyml-to-packages",children:["Begin adding ",(0,s.jsx)(i.code,{children:"monitoring.yml"})," to packages"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new per-package file was introduced: ",(0,s.jsx)(i.code,{children:"monitoring.yml"}),". Used to monitor packages for releases and security advisories; see ",(0,s.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml"}),"."]}),"\n",(0,s.jsx)(i.li,{children:"This is not enforced by automatic checks yet, but we may ask that it be added."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2023",children:"2023"}),"\n",(0,s.jsx)(i.h3,{id:"october",children:"October"}),"\n",(0,s.jsxs)(i.h4,{id:"adding-checkdeps-in-packageyml",children:["Adding ",(0,s.jsx)(i.code,{children:"checkdeps"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new type of packaging dependency was added: ",(0,s.jsx)(i.code,{children:"checkdeps"}),". They behave the same as ",(0,s.jsx)(i.code,{children:"builddeps"}),", except they are not considered when determining build order for automatic builds. See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"git-hooks",children:"Git hooks"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"go-task init"})," to initialize Git hooks for the packages repository. See ",(0,s.jsx)(i.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"Prepare for packaging"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Use ",(0,s.jsx)(i.code,{children:"git commit"})," for committing packaging changes and fill in the template shown.\nIt is no longer required to manually copy-paste the template or use ",(0,s.jsx)(i.code,{children:"git commit --cleanup=scissors"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"requiring-homepage-in-packageyml",children:["Requiring ",(0,s.jsx)(i.code,{children:"homepage"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"homepage"})," key in ",(0,s.jsx)(i.code,{children:"package.yml"})," has become mandatory. Use the address to the upstream source repository (eg: the GitHub page) if a package does not have a homepage."]}),"\n",(0,s.jsx)(i.li,{children:"This is enforced by checks on all pull requests."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"recommending-amending-commits-in-pull-requests",children:"Recommending amending commits in Pull Requests"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Amending commits and force pushing the changes works better with our build tooling.","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"It was thought that abandoning this practice would be okay, but it turns out not to be the case."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"september",children:"September"}),"\n",(0,s.jsx)(i.h4,{id:"switch-to-asterisk-bolding-for-pr-template",children:"Switch to asterisk bolding for PR template"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The initial PR template for the ",(0,s.jsx)(i.code,{children:"packages"})," repository used markdown header styling (",(0,s.jsx)(i.code,{children:"## Heading text"}),"), but ",(0,s.jsx)(i.code,{children:"solus-sc"})," does not render that styling, so the template was changed to asterisk bolding (",(0,s.jsx)(i.code,{children:"**Heading text**"}),")"]}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/pull/366",children:"https://github.com/getsolus/packages/pull/366"})}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"switching-from-make-to-go-task",children:["Switching From ",(0,s.jsx)(i.code,{children:"make"})," to ",(0,s.jsx)(i.code,{children:"go-task"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["All packaging actions are now handled by ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),".","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Building a package can be done using ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Commands are the same: ",(0,s.jsx)(i.code,{children:"make local"}),", for example, is replaced by ",(0,s.jsx)(i.code,{children:"go-task local"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["You can see all available commands by either browsing to ",(0,s.jsx)(i.code,{children:"Taskfile.yml"})," in the ",(0,s.jsxs)(i.a,{href:"https://github.com/getsolus/packages/blob/main/Taskfile.yml",children:[(0,s.jsx)(i.code,{children:"packages"})," repository"]})," OR running ",(0,s.jsx)(i.code,{children:"go-task -l"})," somewhere in your updated clone of the packages git monorepo."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should install ",(0,s.jsx)(i.code,{children:"go-task"})," on their machines if they have not already."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Makefile"})," included with every package is no longer required. Please delete it from a package when updating, and do not include it when making the initial commit of a new package."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"github-monorepo-migration",children:"GitHub Monorepo Migration"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Packages were moved from the initial multirepo setup to the ",(0,s.jsx)(i.code,{children:"packages"})," monorepo: ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"})," Now packagers only need to clone/fork one repository for all packages."]}),"\n",(0,s.jsx)(i.li,{children:"The recommended migration strategy is to fork this repository and start with a clean clone. Any local changes to packages should be moved over manually."}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should now title commits like ",(0,s.jsx)(i.code,{children:"packagename: Action"}),"; for example: ",(0,s.jsx)(i.code,{children:"nano: Update to 9.0"}),". Generic titles like ",(0,s.jsx)(i.code,{children:"Update to 9.0"})," should not be used, except for rebuilds."]}),"\n",(0,s.jsx)(i.li,{children:"Packagers should use the pull request template for package updates, filling out the Summary and Test Plan sections as usual."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"august",children:"August"}),"\n",(0,s.jsx)(i.h4,{id:"initial-github-migration-from-old-phabricator-dev-tracker",children:"Initial GitHub Migration from old Phabricator Dev Tracker"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.em,{children:"This change was superseded by the later monorepo migration."})}),"\n",(0,s.jsxs)(i.li,{children:["The new multirepo setup for packages was under ",(0,s.jsx)(i.code,{children:"github.com/solus-packages"})," organization, packages were updated with PRs to individual repositories."]}),"\n",(0,s.jsxs)(i.li,{children:["Issues were migrated to ",(0,s.jsx)(i.code,{children:"github.com/getsolus/packages"})," from Phabricator. ",(0,s.jsx)(i.em,{children:"Closed issues were not migrated."})]}),"\n",(0,s.jsxs)(i.li,{children:["A read-only instance of the old Dev Tracker is available at ",(0,s.jsx)(i.a,{href:"https://phab.getsol.us",children:"phab.getsol.us"}),". ",(0,s.jsx)(i.em,{children:"This will eventually be shut down."})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"april",children:"April"}),"\n",(0,s.jsxs)(i.p,{children:["The repository index was moved to ",(0,s.jsx)(i.code,{children:"cdn.getsol.us"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"2022-and-earlier",children:"2022 and Earlier"}),"\n",(0,s.jsx)(i.p,{children:"Not included in this list."})]})}function h(e={}){const{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>l,a:()=>c});var s=n(67294);const a={},o=s.createContext(a);function c(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c55c138b.f8000794.js b/assets/js/c55c138b.f8000794.js new file mode 100644 index 000000000..edcca5bf7 --- /dev/null +++ b/assets/js/c55c138b.f8000794.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2627"],{53826:function(e,i,n){n.r(i),n.d(i,{metadata:()=>a,contentTitle:()=>c,default:()=>h,assets:()=>r,toc:()=>t,frontMatter:()=>l});var a=JSON.parse('{"id":"packaging/packaging-changes","title":"Packaging Changes","description":"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details.","source":"@site/docs/packaging/packaging-changes.md","sourceDirName":"packaging","slug":"/packaging/packaging-changes","permalink":"/docs/packaging/packaging-changes","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-changes.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"sidebarPosition":7,"frontMatter":{"title":"Packaging Changes","summary":"Changes to packaging environment and instructions","sidebar_position":7},"sidebar":"packagingSidebar","previous":{"title":"Submitting a Pull Request for Review","permalink":"/docs/packaging/submitting-a-pull-request"},"next":{"title":"Advanced Configuration","permalink":"/docs/category/advanced-configuration"}}'),s=n("85893"),o=n("50065");let l={title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},c="Packaging Changes",r={},t=[{value:"2024",id:"2024",level:2},{value:"May",id:"may",level:3},{value:"Remove 'Test Plan' and 'Checklist' from commit messages",id:"remove-test-plan-and-checklist-from-commit-messages",level:4},{value:"Add Rust macros to package.yml",id:"add-rust-macros-to-packageyml",level:4},{value:"Add guidance for SourceForge sources in package.yml",id:"add-guidance-for-sourceforge-sources-in-packageyml",level:4},{value:"February",id:"february",level:3},{value:"Begin addingmonitoring.yml
to packages",id:"begin-adding-monitoringyml-to-packages",level:4},{value:"2023",id:"2023",level:2},{value:"October",id:"october",level:3},{value:"Addingcheckdeps
inpackage.yml
",id:"adding-checkdeps-in-packageyml",level:4},{value:"Git hooks",id:"git-hooks",level:4},{value:"Requiringhomepage
inpackage.yml
",id:"requiring-homepage-in-packageyml",level:4},{value:"Recommending amending commits in Pull Requests",id:"recommending-amending-commits-in-pull-requests",level:4},{value:"September",id:"september",level:3},{value:"Switch to asterisk bolding for PR template",id:"switch-to-asterisk-bolding-for-pr-template",level:4},{value:"Switching Frommake
togo-task
",id:"switching-from-make-to-go-task",level:4},{value:"GitHub Monorepo Migration",id:"github-monorepo-migration",level:4},{value:"August",id:"august",level:3},{value:"Initial GitHub Migration from old Phabricator Dev Tracker",id:"initial-github-migration-from-old-phabricator-dev-tracker",level:4},{value:"April",id:"april",level:3},{value:"2022 and Earlier",id:"2022-and-earlier",level:2}];function d(e){let i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"packaging-changes",children:"Packaging Changes"})}),"\n",(0,s.jsx)(i.p,{children:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"This list is not exhaustive"}),"\n",(0,s.jsxs)(i.li,{children:["This list is in ",(0,s.jsx)(i.em,{children:"reverse chronological order"})," (newest first)"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2024",children:"2024"}),"\n",(0,s.jsx)(i.h3,{id:"may",children:"May"}),"\n",(0,s.jsx)(i.h4,{id:"remove-test-plan-and-checklist-from-commit-messages",children:"Remove 'Test Plan' and 'Checklist' from commit messages"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"These are no longer needed in commit messages."}),"\n",(0,s.jsx)(i.li,{children:"They must still be included in the pull request description."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-rust-macros-to-packageyml",children:"Add Rust macros to package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now have macros for building Rust packages. Example: ",(0,s.jsx)(i.code,{children:"%cargo_build"}),". Rust packages should be switched to use the new macros as they are updated."]}),"\n",(0,s.jsxs)(i.li,{children:['See the "Rust (cargo) actionable macros" section on the ',(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#rust-cargo-actionable-macros",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-guidance-for-sourceforge-sources-in-packageyml",children:"Add guidance for SourceForge sources in package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now require SourceForge sources used in ",(0,s.jsx)(i.code,{children:"package.yml"})," files to follow a specific format."]}),"\n",(0,s.jsxs)(i.li,{children:["See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#source-key",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"february",children:"February"}),"\n",(0,s.jsxs)(i.h4,{id:"begin-adding-monitoringyml-to-packages",children:["Begin adding ",(0,s.jsx)(i.code,{children:"monitoring.yml"})," to packages"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new per-package file was introduced: ",(0,s.jsx)(i.code,{children:"monitoring.yml"}),". Used to monitor packages for releases and security advisories; see ",(0,s.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml"}),"."]}),"\n",(0,s.jsx)(i.li,{children:"This is not enforced by automatic checks yet, but we may ask that it be added."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2023",children:"2023"}),"\n",(0,s.jsx)(i.h3,{id:"october",children:"October"}),"\n",(0,s.jsxs)(i.h4,{id:"adding-checkdeps-in-packageyml",children:["Adding ",(0,s.jsx)(i.code,{children:"checkdeps"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new type of packaging dependency was added: ",(0,s.jsx)(i.code,{children:"checkdeps"}),". They behave the same as ",(0,s.jsx)(i.code,{children:"builddeps"}),", except they are not considered when determining build order for automatic builds. See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"git-hooks",children:"Git hooks"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"go-task init"})," to initialize Git hooks for the packages repository. See ",(0,s.jsx)(i.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"Prepare for packaging"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Use ",(0,s.jsx)(i.code,{children:"git commit"})," for committing packaging changes and fill in the template shown.\nIt is no longer required to manually copy-paste the template or use ",(0,s.jsx)(i.code,{children:"git commit --cleanup=scissors"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"requiring-homepage-in-packageyml",children:["Requiring ",(0,s.jsx)(i.code,{children:"homepage"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"homepage"})," key in ",(0,s.jsx)(i.code,{children:"package.yml"})," has become mandatory. Use the address to the upstream source repository (eg: the GitHub page) if a package does not have a homepage."]}),"\n",(0,s.jsx)(i.li,{children:"This is enforced by checks on all pull requests."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"recommending-amending-commits-in-pull-requests",children:"Recommending amending commits in Pull Requests"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Amending commits and force pushing the changes works better with our build tooling.","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"It was thought that abandoning this practice would be okay, but it turns out not to be the case."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"september",children:"September"}),"\n",(0,s.jsx)(i.h4,{id:"switch-to-asterisk-bolding-for-pr-template",children:"Switch to asterisk bolding for PR template"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The initial PR template for the ",(0,s.jsx)(i.code,{children:"packages"})," repository used markdown header styling (",(0,s.jsx)(i.code,{children:"## Heading text"}),"), but ",(0,s.jsx)(i.code,{children:"solus-sc"})," does not render that styling, so the template was changed to asterisk bolding (",(0,s.jsx)(i.code,{children:"**Heading text**"}),")"]}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/pull/366",children:"https://github.com/getsolus/packages/pull/366"})}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"switching-from-make-to-go-task",children:["Switching From ",(0,s.jsx)(i.code,{children:"make"})," to ",(0,s.jsx)(i.code,{children:"go-task"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["All packaging actions are now handled by ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),".","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Building a package can be done using ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Commands are the same: ",(0,s.jsx)(i.code,{children:"make local"}),", for example, is replaced by ",(0,s.jsx)(i.code,{children:"go-task local"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["You can see all available commands by either browsing to ",(0,s.jsx)(i.code,{children:"Taskfile.yml"})," in the ",(0,s.jsxs)(i.a,{href:"https://github.com/getsolus/packages/blob/main/Taskfile.yml",children:[(0,s.jsx)(i.code,{children:"packages"})," repository"]})," OR running ",(0,s.jsx)(i.code,{children:"go-task -l"})," somewhere in your updated clone of the packages git monorepo."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should install ",(0,s.jsx)(i.code,{children:"go-task"})," on their machines if they have not already."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Makefile"})," included with every package is no longer required. Please delete it from a package when updating, and do not include it when making the initial commit of a new package."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"github-monorepo-migration",children:"GitHub Monorepo Migration"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Packages were moved from the initial multirepo setup to the ",(0,s.jsx)(i.code,{children:"packages"})," monorepo: ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"})," Now packagers only need to clone/fork one repository for all packages."]}),"\n",(0,s.jsx)(i.li,{children:"The recommended migration strategy is to fork this repository and start with a clean clone. Any local changes to packages should be moved over manually."}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should now title commits like ",(0,s.jsx)(i.code,{children:"packagename: Action"}),"; for example: ",(0,s.jsx)(i.code,{children:"nano: Update to 9.0"}),". Generic titles like ",(0,s.jsx)(i.code,{children:"Update to 9.0"})," should not be used, except for rebuilds."]}),"\n",(0,s.jsx)(i.li,{children:"Packagers should use the pull request template for package updates, filling out the Summary and Test Plan sections as usual."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"august",children:"August"}),"\n",(0,s.jsx)(i.h4,{id:"initial-github-migration-from-old-phabricator-dev-tracker",children:"Initial GitHub Migration from old Phabricator Dev Tracker"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.em,{children:"This change was superseded by the later monorepo migration."})}),"\n",(0,s.jsxs)(i.li,{children:["The new multirepo setup for packages was under ",(0,s.jsx)(i.code,{children:"github.com/solus-packages"})," organization, packages were updated with PRs to individual repositories."]}),"\n",(0,s.jsxs)(i.li,{children:["Issues were migrated to ",(0,s.jsx)(i.code,{children:"github.com/getsolus/packages"})," from Phabricator. ",(0,s.jsx)(i.em,{children:"Closed issues were not migrated."})]}),"\n",(0,s.jsxs)(i.li,{children:["A read-only instance of the old Dev Tracker is available at ",(0,s.jsx)(i.a,{href:"https://phab.getsol.us",children:"phab.getsol.us"}),". ",(0,s.jsx)(i.em,{children:"This will eventually be shut down."})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"april",children:"April"}),"\n",(0,s.jsxs)(i.p,{children:["The repository index was moved to ",(0,s.jsx)(i.code,{children:"cdn.getsol.us"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"2022-and-earlier",children:"2022 and Earlier"}),"\n",(0,s.jsx)(i.p,{children:"Not included in this list."})]})}function h(e={}){let{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},50065:function(e,i,n){n.d(i,{Z:function(){return c},a:function(){return l}});var a=n(67294);let s={},o=a.createContext(s);function l(e){let i=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),a.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c5de29d4.159ae9df.js b/assets/js/c5de29d4.159ae9df.js deleted file mode 100644 index 3eb0e9154..000000000 --- a/assets/js/c5de29d4.159ae9df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3851],{44158:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>o});var i=a(85893),s=a(11151);const t={title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},r="Creating a New Package",l={id:"packaging/creating-a-new-package",title:"Creating a New Package",description:"This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility tree, which is already packaged for Solus, but we will pretend like it's not.",source:"@site/docs/packaging/creating-a-new-package.md",sourceDirName:"packaging",slug:"/packaging/creating-a-new-package",permalink:"/docs/packaging/creating-a-new-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/creating-a-new-package.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,sidebarPosition:3,frontMatter:{title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},sidebar:"packagingSidebar",previous:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"},next:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"}},c={},o=[{value:"Update an existing clone",id:"update-an-existing-clone",level:3},{value:"Create a new branch",id:"create-a-new-branch",level:2},{value:"Create theMAINTAINERS.md
file",id:"create-the-maintainersmd-file",level:2},{value:"Create thepackage.yml
file",id:"create-the-packageyml-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format for new packages",id:"commit-message-format-for-new-packages",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"creating-a-new-package",children:"Creating a New Package"})}),"\n",(0,i.jsxs)(n.p,{children:["This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility ",(0,i.jsx)(n.a,{href:"https://gitlab.com/OldManProgrammer/unix-tree",children:"tree"}),", which is already packaged for Solus, but we will pretend like it's not."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," and ",(0,i.jsx)(n.em,{children:"accepted"})," for the software or library you intend to package"]}),". If there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-an-existing-clone",children:"Update an existing clone"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"create-a-new-branch",children:"Create a new branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c your-branch\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-maintainersmd-file",children:["Create the ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["You must add a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Solus uses this to track the primary maintainer(s) for each package."]}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-packageyml-file",children:["Create the ",(0,i.jsx)(n.code,{children:"package.yml"})," file"]}),"\n",(0,i.jsx)(n.p,{children:"You will need a link to the most recent source tarball for this from the software's website."}),"\n",(0,i.jsxs)(n.p,{children:["To create a skeleton ",(0,i.jsx)(n.code,{children:"package.yml"})," file, use the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]}),"\n",(0,i.jsx)(n.p,{children:"This command takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Package name"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task new -- tree https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command will automatically place the new ",(0,i.jsx)(n.code,{children:"package.yml"})," in the proper directory according the package name, ",(0,i.jsxs)(n.em,{children:["and will overwrite any existing ",(0,i.jsx)(n.code,{children:"package.yml"})," file at that location"]}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["You can, of course, create your ",(0,i.jsx)(n.code,{children:"package.yml"})," file entirely from scratch, but ",(0,i.jsx)(n.code,{children:"go-task new"})," will give you a better starting point. We recommend using the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]})}),"\n",(0,i.jsxs)(n.p,{children:["Now you should have a ",(0,i.jsx)(n.code,{children:"package.yml"})," file that looks something like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : unix-tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : PLEASE FILL ME IN\nlicense : GPL-2.0-or-later # CHECK ME\ncomponent : PLEASE FILL ME IN\nsummary : PLEASE FILL ME IN\ndescription: |\n PLEASE FILL ME IN\nbuilddeps :\nsetup : |\n %configure\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command has filled many fields for us, but not all of them will be right, and some of them need to be filled in. Refer to the ",(0,i.jsx)(n.a,{href:"/docs/packaging/package.yml",children:"package.yml page"})," to see how each field should be used."]}),"\n",(0,i.jsx)(n.p,{children:"For this example, we need to fix the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The name needs to be ",(0,i.jsx)(n.code,{children:"tree"}),", so update it."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"license"}),' is correct, so we remove the comment. License values need to match an "Identifier" in the ',(0,i.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Fill in ",(0,i.jsx)(n.code,{children:"homepage"}),", ",(0,i.jsx)(n.code,{children:"component"}),", ",(0,i.jsx)(n.code,{children:"summary"}),", and ",(0,i.jsx)(n.code,{children:"description"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Remove ",(0,i.jsx)(n.code,{children:"builddeps"}),". This package has no build dependencies beyond the ones already available for every package (the ",(0,i.jsx)(n.code,{children:"system.devel"})," packages)."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"setup"})," step is not required, remove it."]}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.code,{children:"install"})," key, we can't use the ",(0,i.jsx)(n.code,{children:"%make_install"})," macro for this package. The files are installed in their correct locations individually."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"After updating the file, it will now look like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : https://gitlab.com/OldManProgrammer/unix-tree\nlicense : GPL-2.0-or-later\ncomponent : system.utils\nsummary : list contents of directories in a tree-like format.\ndescription: |\n Tree is a recursive directory listing command that produces a depth indented listing of files, which is colorized ala dircolors if the LS_COLORS environment variable is set and output is to tty\nbuild : |\n %make\ninstall : |\n install -Dm00664 $workdir/doc/tree.1 $installdir/usr/share/man/man1/tree.1\n install -Dm00755 $workdir/tree $installdir/usr/bin/tree\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To read more about finding and including dependencies and other parts of ",(0,i.jsx)(n.code,{children:"package.yml"})," please see ",(0,i.jsx)(n.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Understanding how to translate source code into a good ",(0,i.jsx)(n.code,{children:"package.yml"})," file is the heart of packaging. If you are stumped, or have questions, ",(0,i.jsxs)(n.strong,{children:["ask for help in our Solus Packaging room on ",(0,i.jsx)(n.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"}),"."]})]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once the build completes, your directory should now include the following files:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"\u251c\u2500\u2500 abi_used_libs\n\u251c\u2500\u2500 abi_used_symbols\n\u251c\u2500\u2500 package.yml\n\u251c\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 tree-2.1.1-1-1-x86_64.eopkg\n"})}),"\n",(0,i.jsxs)(n.p,{children:["All these files ",(0,i.jsx)(n.em,{children:"except"})," the ",(0,i.jsx)(n.code,{children:".eopkg"})," file(s) should be included in your pull request. You will remove the ",(0,i.jsx)(n.code,{children:".eopkg"})," files after testing the package."]}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h3,{id:"commit-message-format-for-new-packages",children:"Commit message format for new packages"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsx)(n.p,{children:"There should be a summary line (with the package name), a blank line, and then the rest of the commit message."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"There should at the minimum be a Summary."}),"\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsxs)(n.li,{children:["Link the package request using a ",(0,i.jsx)(n.code,{children:"Resolves"})," line."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"tree: Add at v2.1.1\n\n**Summary**\n\nAdd the tree package, which recursively lists directories in a tree like manner.\n\nResolves getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where ",(0,i.jsx)(n.code,{children:"issuenumber"})," is the issue number of the package request."]}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need a change to depend on another change, mention it in the commit message too (use the full URL): ",(0,i.jsx)(n.code,{children:"Depends on https://github.com/getsolus/packages/issues/234"})]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>l,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c5de29d4.69e499a8.js b/assets/js/c5de29d4.69e499a8.js new file mode 100644 index 000000000..182f40595 --- /dev/null +++ b/assets/js/c5de29d4.69e499a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3754"],{48580:function(e,n,a){a.r(n),a.d(n,{metadata:()=>i,contentTitle:()=>l,default:()=>h,assets:()=>c,toc:()=>o,frontMatter:()=>r});var i=JSON.parse('{"id":"packaging/creating-a-new-package","title":"Creating a New Package","description":"This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility tree, which is already packaged for Solus, but we will pretend like it\'s not.","source":"@site/docs/packaging/creating-a-new-package.md","sourceDirName":"packaging","slug":"/packaging/creating-a-new-package","permalink":"/docs/packaging/creating-a-new-package","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/creating-a-new-package.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"sidebarPosition":3,"frontMatter":{"title":"Creating a New Package","summary":"Creating a Package For Inclusion in the Repositories","sidebar_position":3},"sidebar":"packagingSidebar","previous":{"title":"Update Your Development Environment","permalink":"/docs/packaging/update-dev-environment"},"next":{"title":"Updating an Existing Package","permalink":"/docs/packaging/updating-an-existing-package"}}'),s=a("85893"),t=a("50065");let r={title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},l="Creating a New Package",c={},o=[{value:"Update an existing clone",id:"update-an-existing-clone",level:3},{value:"Create a new branch",id:"create-a-new-branch",level:2},{value:"Create theMAINTAINERS.md
file",id:"create-the-maintainersmd-file",level:2},{value:"Create thepackage.yml
file",id:"create-the-packageyml-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format for new packages",id:"commit-message-format-for-new-packages",level:3}];function d(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"creating-a-new-package",children:"Creating a New Package"})}),"\n",(0,s.jsxs)(n.p,{children:["This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility ",(0,s.jsx)(n.a,{href:"https://gitlab.com/OldManProgrammer/unix-tree",children:"tree"}),", which is already packaged for Solus, but we will pretend like it's not."]}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.p,{children:[(0,s.jsxs)(n.strong,{children:["Please ",(0,s.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," and ",(0,s.jsx)(n.em,{children:"accepted"})," for the software or library you intend to package"]}),". If there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"This PR resolves software request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,s.jsx)(n.h3,{id:"update-an-existing-clone",children:"Update an existing clone"}),"\n",(0,s.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,s.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,s.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,s.jsx)(n.h2,{id:"create-a-new-branch",children:"Create a new branch"}),"\n",(0,s.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git switch -c your-branch\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"create-the-maintainersmd-file",children:["Create the ",(0,s.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,s.jsxs)(n.p,{children:["You must add a file called ",(0,s.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,s.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Solus uses this to track the primary maintainer(s) for each package."]}),"\n",(0,s.jsxs)(n.h2,{id:"create-the-packageyml-file",children:["Create the ",(0,s.jsx)(n.code,{children:"package.yml"})," file"]}),"\n",(0,s.jsx)(n.p,{children:"You will need a link to the most recent source tarball for this from the software's website."}),"\n",(0,s.jsxs)(n.p,{children:["To create a skeleton ",(0,s.jsx)(n.code,{children:"package.yml"})," file, use the ",(0,s.jsx)(n.code,{children:"go-task new"})," command."]}),"\n",(0,s.jsx)(n.p,{children:"This command takes two arguments, in the following order:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Package name"}),"\n",(0,s.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task new -- tree https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"go-task new"})," command will automatically place the new ",(0,s.jsx)(n.code,{children:"package.yml"})," in the proper directory according the package name, ",(0,s.jsxs)(n.em,{children:["and will overwrite any existing ",(0,s.jsx)(n.code,{children:"package.yml"})," file at that location"]}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["You can, of course, create your ",(0,s.jsx)(n.code,{children:"package.yml"})," file entirely from scratch, but ",(0,s.jsx)(n.code,{children:"go-task new"})," will give you a better starting point. We recommend using the ",(0,s.jsx)(n.code,{children:"go-task new"})," command."]})}),"\n",(0,s.jsxs)(n.p,{children:["Now you should have a ",(0,s.jsx)(n.code,{children:"package.yml"})," file that looks something like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name : unix-tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : PLEASE FILL ME IN\nlicense : GPL-2.0-or-later # CHECK ME\ncomponent : PLEASE FILL ME IN\nsummary : PLEASE FILL ME IN\ndescription: |\n PLEASE FILL ME IN\nbuilddeps :\nsetup : |\n %configure\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"go-task new"})," command has filled many fields for us, but not all of them will be right, and some of them need to be filled in. Refer to the ",(0,s.jsx)(n.a,{href:"/docs/packaging/package.yml",children:"package.yml page"})," to see how each field should be used."]}),"\n",(0,s.jsx)(n.p,{children:"For this example, we need to fix the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The name needs to be ",(0,s.jsx)(n.code,{children:"tree"}),", so update it."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"license"}),' is correct, so we remove the comment. License values need to match an "Identifier" in the ',(0,s.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Fill in ",(0,s.jsx)(n.code,{children:"homepage"}),", ",(0,s.jsx)(n.code,{children:"component"}),", ",(0,s.jsx)(n.code,{children:"summary"}),", and ",(0,s.jsx)(n.code,{children:"description"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Remove ",(0,s.jsx)(n.code,{children:"builddeps"}),". This package has no build dependencies beyond the ones already available for every package (the ",(0,s.jsx)(n.code,{children:"system.devel"})," packages)."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"setup"})," step is not required, remove it."]}),"\n",(0,s.jsxs)(n.li,{children:["In the ",(0,s.jsx)(n.code,{children:"install"})," key, we can't use the ",(0,s.jsx)(n.code,{children:"%make_install"})," macro for this package. The files are installed in their correct locations individually."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"After updating the file, it will now look like:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"name : tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : https://gitlab.com/OldManProgrammer/unix-tree\nlicense : GPL-2.0-or-later\ncomponent : system.utils\nsummary : list contents of directories in a tree-like format.\ndescription: |\n Tree is a recursive directory listing command that produces a depth indented listing of files, which is colorized ala dircolors if the LS_COLORS environment variable is set and output is to tty\nbuild : |\n %make\ninstall : |\n install -Dm00664 $workdir/doc/tree.1 $installdir/usr/share/man/man1/tree.1\n install -Dm00755 $workdir/tree $installdir/usr/bin/tree\n"})}),"\n",(0,s.jsxs)(n.p,{children:["To read more about finding and including dependencies and other parts of ",(0,s.jsx)(n.code,{children:"package.yml"})," please see ",(0,s.jsx)(n.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Understanding how to translate source code into a good ",(0,s.jsx)(n.code,{children:"package.yml"})," file is the heart of packaging. If you are stumped, or have questions, ",(0,s.jsxs)(n.strong,{children:["ask for help in our Solus Packaging room on ",(0,s.jsx)(n.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"}),"."]})]}),"\n",(0,s.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,s.jsxs)(n.p,{children:["Build the package using ",(0,s.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,s.jsx)(n.p,{children:"Once the build completes, your directory should now include the following files:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"\u251C\u2500\u2500 abi_used_libs\n\u251C\u2500\u2500 abi_used_symbols\n\u251C\u2500\u2500 package.yml\n\u251C\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 tree-2.1.1-1-1-x86_64.eopkg\n"})}),"\n",(0,s.jsxs)(n.p,{children:["All these files ",(0,s.jsx)(n.em,{children:"except"})," the ",(0,s.jsx)(n.code,{children:".eopkg"})," file(s) should be included in your pull request. You will remove the ",(0,s.jsx)(n.code,{children:".eopkg"})," files after testing the package."]}),"\n",(0,s.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,s.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,s.jsxs)(n.p,{children:["Check the ",(0,s.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,s.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,s.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,s.jsx)(n.h3,{id:"commit-message-format-for-new-packages",children:"Commit message format for new packages"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"git commit"})," on ",(0,s.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,s.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,s.jsx)(n.p,{children:"There should be a summary line (with the package name), a blank line, and then the rest of the commit message."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"There should at the minimum be a Summary."}),"\n",(0,s.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,s.jsxs)(n.li,{children:["Link the package request using a ",(0,s.jsx)(n.code,{children:"Resolves"})," line."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"tree: Add at v2.1.1\n\n**Summary**\n\nAdd the tree package, which recursively lists directories in a tree like manner.\n\nResolves getsolus/packages#issuenumber\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Where ",(0,s.jsx)(n.code,{children:"issuenumber"})," is the issue number of the package request."]}),"\n",(0,s.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,s.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you need a change to depend on another change, mention it in the commit message too (use the full URL): ",(0,s.jsx)(n.code,{children:"Depends on https://github.com/getsolus/packages/issues/234"})]}),"\n",(0,s.jsxs)(n.p,{children:["Next, you'll ",(0,s.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){let{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},50065:function(e,n,a){a.d(n,{Z:function(){return l},a:function(){return r}});var i=a(67294);let s={},t=i.createContext(s);function r(e){let n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c99ea947.dc2e0edb.js b/assets/js/c99ea947.dc2e0edb.js new file mode 100644 index 000000000..eee65057e --- /dev/null +++ b/assets/js/c99ea947.dc2e0edb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6717"],{60305:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Camera","slug":"/category/camera","permalink":"/docs/category/camera","sidebar":"userSidebar","navigation":{"previous":{"title":"Software","permalink":"/docs/category/software"},"next":{"title":"DroidCam","permalink":"/docs/user/software/camera/droidcam"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/c99ea947.e547d0e0.js b/assets/js/c99ea947.e547d0e0.js deleted file mode 100644 index 8541a7197..000000000 --- a/assets/js/c99ea947.e547d0e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7018],{7768:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Camera","slug":"/category/camera","permalink":"/docs/category/camera","sidebar":"userSidebar","navigation":{"previous":{"title":"Software","permalink":"/docs/category/software"},"next":{"title":"DroidCam","permalink":"/docs/user/software/camera/droidcam"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/c9c1a3f4.86590624.js b/assets/js/c9c1a3f4.86590624.js new file mode 100644 index 000000000..2e060c674 --- /dev/null +++ b/assets/js/c9c1a3f4.86590624.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2384"],{27346:function(e,t,n){n.r(t),n.d(t,{metadata:()=>i,contentTitle:()=>d,default:()=>h,assets:()=>r,toc:()=>l,frontMatter:()=>a});var i=JSON.parse('{"id":"user/editions/budgie/configuration","title":"Configuration","description":"Date and Time","source":"@site/docs/user/editions/budgie/configuration.md","sourceDirName":"user/editions/budgie","slug":"/user/editions/budgie/configuration","permalink":"/docs/user/editions/budgie/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/configuration.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Configuration","summary":"Help for configuring the Budgie desktop on Solus"},"sidebar":"userSidebar","previous":{"title":"Budgie","permalink":"/docs/user/editions/budgie/"},"next":{"title":"Tips and Tricks","permalink":"/docs/user/editions/budgie/tips-and-tricks"}}'),o=n("85893"),s=n("50065");let a={title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},d="Configuration",r={},l=[{value:"Date and Time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Displays",id:"displays",level:2},{value:"Keyboard Layout",id:"keyboard-layout",level:2},{value:"Keyboard Layout Indicator",id:"keyboard-layout-indicator",level:3},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and Touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Network",id:"network",level:2},{value:"Non-Hidden Network",id:"non-hidden-network",level:3},{value:"Hidden Network",id:"hidden-network",level:3},{value:"Sound and Sound Devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a User",id:"adding-a-user",level:3},{value:"Removing a User",id:"removing-a-user",level:3},{value:"Desktop Background",id:"desktop-background",level:2},{value:"Desktop Icons",id:"desktop-icons",level:2},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces Configuration",id:"workspaces-configuration",level:3}];function c(e){let t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(t.h1,{id:"system",children:"System"}),"\n",(0,o.jsx)(t.h2,{id:"date-and-time",children:"Date and Time"}),"\n",(0,o.jsx)(t.p,{children:'In Budgie, the easiest way to access the date and time settings is by left clicking on the time in the bottom panel and clicking on "System time and date settings".'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Date and Time Right-Click",src:n(88236).Z+"",width:"289",height:"162"})}),"\n",(0,o.jsx)(t.p,{children:'Alternatively, you can open the Budgie Control Center, and scroll the left-hand sidebar down to the bottom to find "Date & Time".'}),"\n",(0,o.jsx)(t.p,{children:'You will be presented with the following window. From here, you can enable / disable automatic date & time, automatic time zone changing, and change between AM/PM and 24-hour time formats. Note that changing the system date & time and time zone information requires clicking the "Unlock" button at the top of the window, and entering your password.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Date and Time",src:n(84593).Z+"",width:"996",height:"702"})}),"\n",(0,o.jsx)(t.p,{children:'If you wish to change how the time is displayed in the bottom panel, open Budgie Desktop Settings from the Budgie Menu, choose the Bottom Panel from the left-hand sidebar, choose "Clock" from the list of applets in the middle, then adjust your desired settings on the right-hand side.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Clock Applet",src:n(88405).Z+"",width:"761",height:"609"})}),"\n",(0,o.jsxs)(t.p,{children:["If you want to set a custom date & time format, the ",(0,o.jsx)(t.a,{href:"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html",children:'"conversion specifications" referenced by the POSIX standards'})," list the options that can be entered."]}),"\n",(0,o.jsx)(t.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,o.jsx)(t.p,{children:'You can configure default applications in Budgie by opening the Budgie Control Center, and scrolling the left-hand sidebar down to "Default Applications".'}),"\n",(0,o.jsx)(t.p,{children:"The drop-down boxes here enable choosing the default application for each category of file. For most categories, you will need to have already installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from Celluloid to VLC, then you must first install VLC (available in the Software Center)."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Default Applications",src:n(21688).Z+"",width:"991",height:"697"})}),"\n",(0,o.jsx)(t.p,{children:'You can specify default applications for individual file types by right-clicking on a file and clicking on "Open With" from the popup menu, then choosing "Other Application".'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Context Menu",src:n(58866).Z+"",width:"879",height:"579"})}),"\n",(0,o.jsx)(t.p,{children:'Next, select the application you wish to use from the list, then click "Set as default" below the list. Finish by clicking "OK". In the future, all files with the same file type will open with the chosen application.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Application Selection",src:n(40530).Z+"",width:"914",height:"618"})}),"\n",(0,o.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,o.jsx)(t.p,{children:'You can configure your display(s) in Budgie by opening the Budgie Menu and then clicking on "Displays" in the System Settings category.'}),"\n",(0,o.jsx)(t.p,{children:"You will then be shown the following window."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Displays Overview",src:n(11126).Z+"",width:"742",height:"345"})}),"\n",(0,o.jsx)(t.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Individual Display Settings",src:n(92767).Z+"",width:"741",height:"365"})}),"\n",(0,o.jsx)(t.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201CArrange Combined Displays\u201D button and then drag your displays so they are arranged to your liking."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Arrange Displays",src:n(7325).Z+"",width:"742",height:"381"})}),"\n",(0,o.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration".'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Confirm Display Settings",src:n(94631).Z+"",width:"466",height:"114"})}),"\n",(0,o.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard Layout"}),"\n",(0,o.jsx)(t.p,{children:'Using Budgie, you can change your keyboard layout in the Budgie Control Center. Click on the Budgie Menu, click the System Settings icon at the bottom or "Budgie Control Center" in the application list, and then click on "Keyboard" in the System Settings category.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Keyboard Settings",src:n(25426).Z+"",width:"988",height:"695"})}),"\n",(0,o.jsx)(t.p,{children:'Click the "+" button to add an input source (keyboard layout). You will be shown the following dialog.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Add Input Source",src:n(99441).Z+"",width:"988",height:"696"})}),"\n",(0,o.jsx)(t.p,{children:'Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the "\u22EE" button (three vertical dots). This will enable you to search for the keyboard layout you wish to use.'}),"\n",(0,o.jsx)(t.p,{children:'After choosing the keyboard layout, click the "Add" button at the top of the window. You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US) and English (UK) layouts.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie New Layout Added",src:n(67967).Z+"",width:"987",height:"697"})}),"\n",(0,o.jsx)(t.p,{children:'You can remove a keyboard layout by clicking on one of the items, for instance English (UK), then clicking the "\u22EE" button, then choosing "Remove".'}),"\n",(0,o.jsxs)(t.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,o.jsx)(t.code,{children:"Super + Shift + Space"}),", or by adding the Keyboard Layout Indicator applet to your Budgie panel."]}),"\n",(0,o.jsx)(t.h3,{id:"keyboard-layout-indicator",children:"Keyboard Layout Indicator"}),"\n",(0,o.jsx)(t.p,{children:'To add the Keyboard Layout Indicator to your panel, open the Budgie Desktop Settings app from the Budgie Menu, then click "Bottom Panel" on the left-hand sidebar.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Bottom Panel Settings",src:n(88405).Z+"",width:"761",height:"609"})}),"\n",(0,o.jsx)(t.p,{children:'On the right side of the window, click the "+" button next to "Add applet".'}),"\n",(0,o.jsx)(t.p,{children:'Find the Keyboard Layout Indicator entry and select it, then click "Add" at the top of the window. This will add the Keyboard Layout Indicator (to the center section by default), as shown below.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet",src:n(21608).Z+"",width:"1850",height:"159"})}),"\n",(0,o.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,o.jsxs)(t.p,{children:["Budgie comes with IBus ready to go straight out of the box. If you need an additional IBus IME see: ",(0,o.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,o.jsxs)(t.p,{children:["You will now be able to switch between your keyboard layouts by using the keyboard shortcut ",(0,o.jsx)(t.code,{children:"Super + Shift + Space"})," or by using the Keyboard Layout Indicator applet."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet: IBus",src:n(9473).Z+"",width:"169",height:"140"})}),"\n",(0,o.jsx)(t.h2,{id:"language",children:"Language"}),"\n",(0,o.jsx)(t.p,{children:'You can change your language in Budgie by opening the Budgie Menu and then clicking on "Region and Language" in the System Settings category.'}),"\n",(0,o.jsx)(t.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Region and Languages",src:n(92766).Z+"",width:"742",height:"345"})}),"\n",(0,o.jsx)(t.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Selecting Language",src:n(35474).Z+"",width:"742",height:"489"})}),"\n",(0,o.jsx)(t.p,{children:"If your language does not appear in the list, click the \u22EE button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Language Search",src:n(37599).Z+"",width:"742",height:"489"})}),"\n",(0,o.jsxs)(t.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,o.jsx)(t.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,o.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and Touchpad"}),"\n",(0,o.jsx)(t.p,{children:'You can configure the settings of your mouse and / or touchpad by opening the Budgie Menu and then clicking on "Mouse and Touchpad" in the System Settings category. You will see either settings for your mouse or trackpad, depending on the device.'}),"\n",(0,o.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Mouse Settings",src:n(540).Z+"",width:"742",height:"585"})}),"\n",(0,o.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,o.jsx)(t.li,{children:"Mouse speed."}),"\n",(0,o.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Touchpad Settings",src:n(47523).Z+"",width:"742",height:"585"})}),"\n",(0,o.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,o.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,o.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,o.jsx)(t.li,{children:"Touchpad speed."}),"\n",(0,o.jsx)(t.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"testing",children:"Testing"}),"\n",(0,o.jsx)(t.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,o.jsx)(t.h2,{id:"network",children:"Network"}),"\n",(0,o.jsx)(t.p,{children:'To configure your network settings in Budgie, start by opening the Budgie Menu and then click on "Network" in the System Settings category.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Network Overview",src:n(74959).Z+"",width:"742",height:"491"})}),"\n",(0,o.jsx)(t.p,{children:"To configure wireless, go to the Wi-Fi section. If your wireless is currently turned off, click the toggle button, leave the Network section, and go back in."}),"\n",(0,o.jsx)(t.h3,{id:"non-hidden-network",children:"Non-Hidden Network"}),"\n",(0,o.jsx)(t.p,{children:"In the WiFi section of the Network settings window, click the access point you wish to connect to."}),"\n",(0,o.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Network Authentication",src:n(3268).Z+"",width:"742",height:"491"})}),"\n",(0,o.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,o.jsx)(t.h3,{id:"hidden-network",children:"Hidden Network"}),"\n",(0,o.jsx)(t.p,{children:"If you wish to connect to a hidden network, click \u201CConnect to Hidden Network...\u201D in the WiFi section of the Network settings window. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Hidden Network",src:n(48117).Z+"",width:"741",height:"490"})}),"\n",(0,o.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,o.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and Sound Devices"}),"\n",(0,o.jsx)(t.p,{children:"To change the volume in Budgie, simply left click on the speaker icon in the system tray and drag the slider or use the plus and minus icons to reach your desired level."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Volume Control",src:n(109).Z+"",width:"117",height:"249"})}),"\n",(0,o.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,o.jsxs)(t.p,{children:["You can access sound settings via the Sound applet in Raven, the Notification and Widget Center. Open Raven, either by clicking on its icon in the far right of the system tray or using the keyboard shortcut ",(0,o.jsx)(t.code,{children:"Super + A"}),". The Sound applet allows you to enable, disable and alter input and output methods as well as providing a simple volume slider."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Raven Sound Applet",src:n(62719).Z+"",width:"299",height:"235"})}),"\n",(0,o.jsx)(t.p,{children:'You can access further sound settings, including individual application volume controls, and a simple speaker test by opening the Budgie Menu and then clicking on "Sound" in the System Settings category.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Sound Settings",src:n(30695).Z+"",width:"742",height:"495"})}),"\n",(0,o.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,o.jsx)(t.p,{children:'To add and remove users with Budgie, start by opening the Budgie Menu and then click on "Users" in the System Settings category.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie User Settings",src:n(36862).Z+"",width:"742",height:"453"})}),"\n",(0,o.jsx)(t.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,o.jsx)(t.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,o.jsx)(t.h3,{id:"adding-a-user",children:"Adding a User"}),"\n",(0,o.jsx)(t.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Add User Button",src:n(46399).Z+"",width:"225",height:"65"})}),"\n",(0,o.jsx)(t.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Add User Dialog",src:n(32307).Z+"",width:"466",height:"546"})}),"\n",(0,o.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,o.jsx)(t.h3,{id:"removing-a-user",children:"Removing a User"}),"\n",(0,o.jsx)(t.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie User List",src:n(23629).Z+"",width:"742",height:"592"})}),"\n",(0,o.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Keep Files Prompt",src:n(47782).Z+"",width:"508",height:"162"})}),"\n",(0,o.jsx)(t.h1,{id:"user-interface",children:"User Interface"}),"\n",(0,o.jsx)(t.h2,{id:"desktop-background",children:"Desktop Background"}),"\n",(0,o.jsx)(t.p,{children:'To change the desktop background in Budgie, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Desktop Right-Click Menu",src:n(38407).Z+"",width:"390",height:"253"})}),"\n",(0,o.jsx)(t.p,{children:'Once the Budgie Control Center is open, click "Background" on the left-hand sidebar.'}),"\n",(0,o.jsx)(t.p,{children:'Click one of the images displayed on the right to choose a pre-installed background image, or click "Add Picture..." in the headerbar to add one of your own image files to the available options.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Control Center Background Section",src:n(73453).Z+"",width:"1017",height:"715"})}),"\n",(0,o.jsx)(t.h2,{id:"desktop-icons",children:"Desktop Icons"}),"\n",(0,o.jsx)(t.p,{children:'Desktop Icons are enabled by default. To disable them, open the Budgie Desktop Settings app by selecting "Budgie Desktop Settings" from the Budgie Menu, or from the pop-up menu when right-clicking on a blank spot on the desktop.'}),"\n",(0,o.jsx)(t.p,{children:'In the Budgie Desktop Settings app, click "Desktop" in the left-hand sidebar - Desktop Icons is the first toggle switch on that screen.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Desktop Icons",src:n(81215).Z+"",width:"781",height:"627"})}),"\n",(0,o.jsx)(t.p,{children:"To place files on your desktop, you can either drag them directly onto the Desktop, or move the files you want to the Desktop folder within the Nemo file manager app (as shown in the image below)."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Desktop Folder",src:n(91585).Z+"",width:"820",height:"602"})}),"\n",(0,o.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,o.jsx)(t.p,{children:"Budgie enables the switching of workspaces with the Workspace Switcher. You can enable workspaces in Budgie by adding the Workspace Switcher applet to your panel."}),"\n",(0,o.jsx)(t.p,{children:'To add this applet, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop. Once in the Budgie Control Center, in the left-hand sidebar, select the panel to which you want to add the Workspace Switcher (choose the default Bottom Panel if you don\'t want to add more panels at this time).'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Desktop Settings Panel Section",src:n(94683).Z+"",width:"763",height:"611"})}),"\n",(0,o.jsx)(t.p,{children:'Click the + button next to "Add applet" on the right side of the window. This will open the list of available applets - scroll down until you find "Workspace Switcher", select it, and then click the \'Add\' button in the top-right of the window.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Adding Budgie Workspaces Applet",src:n(74926).Z+"",width:"761",height:"610"})}),"\n",(0,o.jsx)(t.p,{children:"You should now see your workspaces available in the main Budgie panel. Applications can be moved between workspaces by dragging and dropping their icons within the Workspace Switcher."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Workspaces",src:n(47301).Z+"",width:"1850",height:"141"})}),"\n",(0,o.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,o.jsx)(t.p,{children:"Budgie provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,o.jsx)(t.p,{children:'To view these shortcuts, open the Budgie Control Center app, choose the "Keyboard" section in the left-hand sidebar, then scroll down in the right part of the window to choose "Keyboard Shortcuts".'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts",src:n(38122).Z+"",width:"995",height:"702"})}),"\n",(0,o.jsx)(t.p,{children:'Workspace shortcuts are contained in the "Navigation" section of the Keyboard Shortcuts window.'}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts Sections",src:n(58019).Z+"",width:"996",height:"699"})}),"\n",(0,o.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces Configuration"}),"\n",(0,o.jsx)(t.p,{children:'There are 4 workspaces available in Budgie by default. To add a new workspace, click on the "+" button.'}),"\n",(0,o.jsx)(t.p,{children:"If you wish to remove or rename your workspace, right click on the desired workspace and select rename or remove."}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Budgie Remove or Rename Workspaces",src:n(54277).Z+"",width:"1850",height:"187"})})]})}function h(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},46399:function(e,t,n){n.d(t,{Z:function(){return i}});let i="data:image/jpeg;base64,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"},32307:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},7325:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},99441:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-add-input-method-09685f6a24a0012c3d954350511f449e.jpg"},73453:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-background-08d0ef91e1aafde95ab900656618ae4b.jpg"},84593:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-date-time-2e2a41c3504dc830843f938bbd142981.jpg"},21688:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-default-applications-ba0f2bc0472afc29f3a3bfd62fff4019.jpg"},38122:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-keyboard-shortcuts-location-51ebaf6cc1a0f2d2581a35cf1b9a7116.jpg"},58019:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-keyboard-shortcuts-popup-e16d754e17feaf2519cfb56d76b95e6c.jpg"},25426:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-keyboard-c35874adf88277c7f6368628e9faab58.jpg"},74926:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-control-center-panel-add-workspace-switcher-4756fd9ee280619d8b3250bc42817117.jpg"},38407:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-desktop-blank-space-right-click-c41f4ca4d33cfcdbea6b0db8bf37e069.jpg"},88405:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-desktop-settings-bottom-panel-clock-62957b69b2028aed4498146d258826cf.jpg"},94683:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-desktop-settings-bottom-panel-4e14285d1a0df0b2b7f8ac1090064038.jpg"},81215:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-desktop-settings-desktop-section-dbeac4ca05a68e1d4aa726cc015b067c.jpg"},94631:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-display-confirm-a76d736f32f356662af758fb94f6aafc.jpg"},11126:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},92767:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},67967:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-input-sources-multiple-dd4489d88d1d5a55afa2528664e5f908.jpg"},47782:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},9473:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-keyboard-layout-applet-ibus-306635b913e0265ce1f47e1098002e0c.jpg"},21608:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-keyboard-layout-switcher-f8ab66e42e1f0f982ecb691869490507.jpg"},540:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},23629:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},91585:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-nemo-desktop-folder-898d96b13673ff56b0d1e9bed198808e.jpg"},3268:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-network-authentication-976c81d75e055000d1146dfd8d26f45f.jpg"},48117:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},74959:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},40530:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-open-with-other-deae0e7e2f5b6a1afc5f79813a668609.jpg"},58866:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-open-with-196e12963d47d150975ab06f51c54b28.jpg"},47301:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-panel-with-workspace-switcher-f5efe929dd564a1560a58ce5c108e7b1.jpg"},92766:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},37599:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},35474:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},36862:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},30695:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-sound-settings-83f0c82715b44956569594953085dad1.jpg"},88236:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-system-time-and-date-popup-cdcd8a6af79f4efe8cc7d4620468d2a4.jpg"},47523:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},109:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-volume-control-cf7733bc82bb3684cc809cf0ec743cef.jpg"},54277:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/budgie-workspace-context-menu-d7ddb2b7d5c1ae6ae9e4b0c0ca4ed11f.jpg"},62719:function(e,t,n){n.d(t,{Z:function(){return i}});let i=n.p+"assets/images/raven-sound-applet-84fdb76d11a39ca554f2bc756205d35e.jpg"},50065:function(e,t,n){n.d(t,{Z:function(){return d},a:function(){return a}});var i=n(67294);let o={},s=i.createContext(o);function a(e){let t=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c9c1a3f4.92bf0225.js b/assets/js/c9c1a3f4.92bf0225.js deleted file mode 100644 index 457e3163a..000000000 --- a/assets/js/c9c1a3f4.92bf0225.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6121],{24080:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var n=i(85893),s=i(11151);const o={title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},a="Configuration",d={id:"user/editions/budgie/configuration",title:"Configuration",description:"Date and Time",source:"@site/docs/user/editions/budgie/configuration.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/configuration",permalink:"/docs/user/editions/budgie/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/configuration.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},sidebar:"userSidebar",previous:{title:"Budgie",permalink:"/docs/user/editions/budgie/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"}},r={},h=[{value:"Date and Time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Displays",id:"displays",level:2},{value:"Keyboard Layout",id:"keyboard-layout",level:2},{value:"Keyboard Layout Indicator",id:"keyboard-layout-indicator",level:3},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and Touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Network",id:"network",level:2},{value:"Non-Hidden Network",id:"non-hidden-network",level:3},{value:"Hidden Network",id:"hidden-network",level:3},{value:"Sound and Sound Devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a User",id:"adding-a-user",level:3},{value:"Removing a User",id:"removing-a-user",level:3},{value:"Desktop Background",id:"desktop-background",level:2},{value:"Desktop Icons",id:"desktop-icons",level:2},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces Configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(t.h1,{id:"system",children:"System"}),"\n",(0,n.jsx)(t.h2,{id:"date-and-time",children:"Date and Time"}),"\n",(0,n.jsx)(t.p,{children:'In Budgie, the easiest way to access the date and time settings is by left clicking on the time in the bottom panel and clicking on "System time and date settings".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time Right-Click",src:i(87872).Z+"",width:"289",height:"162"})}),"\n",(0,n.jsx)(t.p,{children:'Alternatively, you can open the Budgie Control Center, and scroll the left-hand sidebar down to the bottom to find "Date & Time".'}),"\n",(0,n.jsx)(t.p,{children:'You will be presented with the following window. From here, you can enable / disable automatic date & time, automatic time zone changing, and change between AM/PM and 24-hour time formats. Note that changing the system date & time and time zone information requires clicking the "Unlock" button at the top of the window, and entering your password.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time",src:i(73249).Z+"",width:"996",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'If you wish to change how the time is displayed in the bottom panel, open Budgie Desktop Settings from the Budgie Menu, choose the Bottom Panel from the left-hand sidebar, choose "Clock" from the list of applets in the middle, then adjust your desired settings on the right-hand side.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Clock Applet",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsxs)(t.p,{children:["If you want to set a custom date & time format, the ",(0,n.jsx)(t.a,{href:"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html",children:'"conversion specifications" referenced by the POSIX standards'})," list the options that can be entered."]}),"\n",(0,n.jsx)(t.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,n.jsx)(t.p,{children:'You can configure default applications in Budgie by opening the Budgie Control Center, and scrolling the left-hand sidebar down to "Default Applications".'}),"\n",(0,n.jsx)(t.p,{children:"The drop-down boxes here enable choosing the default application for each category of file. For most categories, you will need to have already installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from Celluloid to VLC, then you must first install VLC (available in the Software Center)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Default Applications",src:i(74063).Z+"",width:"991",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can specify default applications for individual file types by right-clicking on a file and clicking on "Open With" from the popup menu, then choosing "Other Application".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Context Menu",src:i(45728).Z+"",width:"879",height:"579"})}),"\n",(0,n.jsx)(t.p,{children:'Next, select the application you wish to use from the list, then click "Set as default" below the list. Finish by clicking "OK". In the future, all files with the same file type will open with the chosen application.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Application Selection",src:i(23242).Z+"",width:"914",height:"618"})}),"\n",(0,n.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,n.jsx)(t.p,{children:'You can configure your display(s) in Budgie by opening the Budgie Menu and then clicking on "Displays" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will then be shown the following window."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Displays Overview",src:i(77218).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Individual Display Settings",src:i(27773).Z+"",width:"741",height:"365"})}),"\n",(0,n.jsx)(t.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Arrange Displays",src:i(26715).Z+"",width:"742",height:"381"})}),"\n",(0,n.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Confirm Display Settings",src:i(42677).Z+"",width:"466",height:"114"})}),"\n",(0,n.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard Layout"}),"\n",(0,n.jsx)(t.p,{children:'Using Budgie, you can change your keyboard layout in the Budgie Control Center. Click on the Budgie Menu, click the System Settings icon at the bottom or "Budgie Control Center" in the application list, and then click on "Keyboard" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Settings",src:i(12486).Z+"",width:"988",height:"695"})}),"\n",(0,n.jsx)(t.p,{children:'Click the "+" button to add an input source (keyboard layout). You will be shown the following dialog.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add Input Source",src:i(93747).Z+"",width:"988",height:"696"})}),"\n",(0,n.jsx)(t.p,{children:'Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the "\u22ee" button (three vertical dots). This will enable you to search for the keyboard layout you wish to use.'}),"\n",(0,n.jsx)(t.p,{children:'After choosing the keyboard layout, click the "Add" button at the top of the window. You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US) and English (UK) layouts.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie New Layout Added",src:i(63730).Z+"",width:"987",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can remove a keyboard layout by clicking on one of the items, for instance English (UK), then clicking the "\u22ee" button, then choosing "Remove".'}),"\n",(0,n.jsxs)(t.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"}),", or by adding the Keyboard Layout Indicator applet to your Budgie panel."]}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-layout-indicator",children:"Keyboard Layout Indicator"}),"\n",(0,n.jsx)(t.p,{children:'To add the Keyboard Layout Indicator to your panel, open the Budgie Desktop Settings app from the Budgie Menu, then click "Bottom Panel" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Bottom Panel Settings",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsx)(t.p,{children:'On the right side of the window, click the "+" button next to "Add applet".'}),"\n",(0,n.jsx)(t.p,{children:'Find the Keyboard Layout Indicator entry and select it, then click "Add" at the top of the window. This will add the Keyboard Layout Indicator (to the center section by default), as shown below.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet",src:i(85522).Z+"",width:"1850",height:"159"})}),"\n",(0,n.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,n.jsxs)(t.p,{children:["Budgie comes with IBus ready to go straight out of the box. If you need an additional IBus IME see: ",(0,n.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,n.jsxs)(t.p,{children:["You will now be able to switch between your keyboard layouts by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"})," or by using the Keyboard Layout Indicator applet."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet: IBus",src:i(38896).Z+"",width:"169",height:"140"})}),"\n",(0,n.jsx)(t.h2,{id:"language",children:"Language"}),"\n",(0,n.jsx)(t.p,{children:'You can change your language in Budgie by opening the Budgie Menu and then clicking on "Region and Language" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Region and Languages",src:i(21178).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Selecting Language",src:i(34067).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsx)(t.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Language Search",src:i(74738).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsxs)(t.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,n.jsx)(t.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,n.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and Touchpad"}),"\n",(0,n.jsx)(t.p,{children:'You can configure the settings of your mouse and / or touchpad by opening the Budgie Menu and then clicking on "Mouse and Touchpad" in the System Settings category. You will see either settings for your mouse or trackpad, depending on the device.'}),"\n",(0,n.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Mouse Settings",src:i(56272).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Mouse speed."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Touchpad Settings",src:i(7722).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,n.jsx)(t.li,{children:"Touchpad speed."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"testing",children:"Testing"}),"\n",(0,n.jsx)(t.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,n.jsx)(t.h2,{id:"network",children:"Network"}),"\n",(0,n.jsx)(t.p,{children:'To configure your network settings in Budgie, start by opening the Budgie Menu and then click on "Network" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Overview",src:i(18399).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"To configure wireless, go to the Wi-Fi section. If your wireless is currently turned off, click the toggle button, leave the Network section, and go back in."}),"\n",(0,n.jsx)(t.h3,{id:"non-hidden-network",children:"Non-Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"In the WiFi section of the Network settings window, click the access point you wish to connect to."}),"\n",(0,n.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Authentication",src:i(29656).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,n.jsx)(t.h3,{id:"hidden-network",children:"Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"If you wish to connect to a hidden network, click \u201cConnect to Hidden Network...\u201d in the WiFi section of the Network settings window. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Hidden Network",src:i(35320).Z+"",width:"741",height:"490"})}),"\n",(0,n.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,n.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and Sound Devices"}),"\n",(0,n.jsx)(t.p,{children:"To change the volume in Budgie, simply left click on the speaker icon in the system tray and drag the slider or use the plus and minus icons to reach your desired level."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Volume Control",src:i(48355).Z+"",width:"117",height:"249"})}),"\n",(0,n.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,n.jsxs)(t.p,{children:["You can access sound settings via the Sound applet in Raven, the Notification and Widget Center. Open Raven, either by clicking on its icon in the far right of the system tray or using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + A"}),". The Sound applet allows you to enable, disable and alter input and output methods as well as providing a simple volume slider."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Raven Sound Applet",src:i(11145).Z+"",width:"299",height:"235"})}),"\n",(0,n.jsx)(t.p,{children:'You can access further sound settings, including individual application volume controls, and a simple speaker test by opening the Budgie Menu and then clicking on "Sound" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Sound Settings",src:i(20315).Z+"",width:"742",height:"495"})}),"\n",(0,n.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,n.jsx)(t.p,{children:'To add and remove users with Budgie, start by opening the Budgie Menu and then click on "Users" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User Settings",src:i(79964).Z+"",width:"742",height:"453"})}),"\n",(0,n.jsx)(t.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,n.jsx)(t.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,n.jsx)(t.h3,{id:"adding-a-user",children:"Adding a User"}),"\n",(0,n.jsx)(t.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Button",src:i(11494).Z+"",width:"225",height:"65"})}),"\n",(0,n.jsx)(t.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Dialog",src:i(38645).Z+"",width:"466",height:"546"})}),"\n",(0,n.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,n.jsx)(t.h3,{id:"removing-a-user",children:"Removing a User"}),"\n",(0,n.jsx)(t.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User List",src:i(86781).Z+"",width:"742",height:"592"})}),"\n",(0,n.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keep Files Prompt",src:i(86420).Z+"",width:"508",height:"162"})}),"\n",(0,n.jsx)(t.h1,{id:"user-interface",children:"User Interface"}),"\n",(0,n.jsx)(t.h2,{id:"desktop-background",children:"Desktop Background"}),"\n",(0,n.jsx)(t.p,{children:'To change the desktop background in Budgie, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Right-Click Menu",src:i(99786).Z+"",width:"390",height:"253"})}),"\n",(0,n.jsx)(t.p,{children:'Once the Budgie Control Center is open, click "Background" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:'Click one of the images displayed on the right to choose a pre-installed background image, or click "Add Picture..." in the headerbar to add one of your own image files to the available options.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Background Section",src:i(17750).Z+"",width:"1017",height:"715"})}),"\n",(0,n.jsx)(t.h2,{id:"desktop-icons",children:"Desktop Icons"}),"\n",(0,n.jsx)(t.p,{children:'Desktop Icons are enabled by default. To disable them, open the Budgie Desktop Settings app by selecting "Budgie Desktop Settings" from the Budgie Menu, or from the pop-up menu when right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:'In the Budgie Desktop Settings app, click "Desktop" in the left-hand sidebar - Desktop Icons is the first toggle switch on that screen.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Icons",src:i(33784).Z+"",width:"781",height:"627"})}),"\n",(0,n.jsx)(t.p,{children:"To place files on your desktop, you can either drag them directly onto the Desktop, or move the files you want to the Desktop folder within the Nemo file manager app (as shown in the image below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Folder",src:i(50045).Z+"",width:"820",height:"602"})}),"\n",(0,n.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,n.jsx)(t.p,{children:"Budgie enables the switching of workspaces with the Workspace Switcher. You can enable workspaces in Budgie by adding the Workspace Switcher applet to your panel."}),"\n",(0,n.jsx)(t.p,{children:'To add this applet, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop. Once in the Budgie Control Center, in the left-hand sidebar, select the panel to which you want to add the Workspace Switcher (choose the default Bottom Panel if you don\'t want to add more panels at this time).'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Settings Panel Section",src:i(61881).Z+"",width:"763",height:"611"})}),"\n",(0,n.jsx)(t.p,{children:'Click the + button next to "Add applet" on the right side of the window. This will open the list of available applets - scroll down until you find "Workspace Switcher", select it, and then click the \'Add\' button in the top-right of the window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Adding Budgie Workspaces Applet",src:i(73099).Z+"",width:"761",height:"610"})}),"\n",(0,n.jsx)(t.p,{children:"You should now see your workspaces available in the main Budgie panel. Applications can be moved between workspaces by dragging and dropping their icons within the Workspace Switcher."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Workspaces",src:i(67713).Z+"",width:"1850",height:"141"})}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"Budgie provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,n.jsx)(t.p,{children:'To view these shortcuts, open the Budgie Control Center app, choose the "Keyboard" section in the left-hand sidebar, then scroll down in the right part of the window to choose "Keyboard Shortcuts".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts",src:i(72264).Z+"",width:"995",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'Workspace shortcuts are contained in the "Navigation" section of the Keyboard Shortcuts window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts Sections",src:i(7521).Z+"",width:"996",height:"699"})}),"\n",(0,n.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces Configuration"}),"\n",(0,n.jsx)(t.p,{children:'There are 4 workspaces available in Budgie by default. To add a new workspace, click on the "+" button.'}),"\n",(0,n.jsx)(t.p,{children:"If you wish to remove or rename your workspace, right click on the desired workspace and select rename or remove."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Remove or Rename Workspaces",src:i(65893).Z+"",width:"1850",height:"187"})})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11494:(e,t,i)=>{i.d(t,{Z:()=>n});const n="data:image/jpeg;base64,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"},38645:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},26715:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},93747:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-add-input-method-09685f6a24a0012c3d954350511f449e.jpg"},17750:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-background-08d0ef91e1aafde95ab900656618ae4b.jpg"},73249:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-date-time-2e2a41c3504dc830843f938bbd142981.jpg"},74063:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-default-applications-ba0f2bc0472afc29f3a3bfd62fff4019.jpg"},72264:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-location-51ebaf6cc1a0f2d2581a35cf1b9a7116.jpg"},7521:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-popup-e16d754e17feaf2519cfb56d76b95e6c.jpg"},12486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-c35874adf88277c7f6368628e9faab58.jpg"},73099:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-panel-add-workspace-switcher-4756fd9ee280619d8b3250bc42817117.jpg"},99786:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-blank-space-right-click-c41f4ca4d33cfcdbea6b0db8bf37e069.jpg"},65486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-clock-62957b69b2028aed4498146d258826cf.jpg"},61881:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-4e14285d1a0df0b2b7f8ac1090064038.jpg"},33784:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-desktop-section-dbeac4ca05a68e1d4aa726cc015b067c.jpg"},42677:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-display-confirm-a76d736f32f356662af758fb94f6aafc.jpg"},77218:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},27773:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},63730:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-input-sources-multiple-dd4489d88d1d5a55afa2528664e5f908.jpg"},86420:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},38896:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-applet-ibus-306635b913e0265ce1f47e1098002e0c.jpg"},85522:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-switcher-f8ab66e42e1f0f982ecb691869490507.jpg"},56272:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},86781:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},50045:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-nemo-desktop-folder-898d96b13673ff56b0d1e9bed198808e.jpg"},29656:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-authentication-976c81d75e055000d1146dfd8d26f45f.jpg"},35320:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},18399:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},23242:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-other-deae0e7e2f5b6a1afc5f79813a668609.jpg"},45728:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-196e12963d47d150975ab06f51c54b28.jpg"},67713:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-panel-with-workspace-switcher-f5efe929dd564a1560a58ce5c108e7b1.jpg"},21178:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},74738:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},34067:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},79964:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},20315:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-sound-settings-83f0c82715b44956569594953085dad1.jpg"},87872:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-system-time-and-date-popup-cdcd8a6af79f4efe8cc7d4620468d2a4.jpg"},7722:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},48355:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-volume-control-cf7733bc82bb3684cc809cf0ec743cef.jpg"},65893:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-workspace-context-menu-d7ddb2b7d5c1ae6ae9e4b0c0ca4ed11f.jpg"},11145:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/raven-sound-applet-84fdb76d11a39ca554f2bc756205d35e.jpg"},11151:(e,t,i)=>{i.d(t,{Z:()=>d,a:()=>a});var n=i(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cca891e2.a56180c1.js b/assets/js/cca891e2.a56180c1.js deleted file mode 100644 index e8eae02ec..000000000 --- a/assets/js/cca891e2.a56180c1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9773],{7857:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var s=i(85893),r=i(11151);const n={title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},o="Package Inclusion Policy",a={id:"packaging/procedures/package-inclusion",title:"Package Inclusion Policy",description:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected.",source:"@site/docs/packaging/procedures/package-inclusion.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/package-inclusion",permalink:"/docs/packaging/procedures/package-inclusion",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/package-inclusion.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},sidebar:"packagingSidebar",previous:{title:"Maintainership",permalink:"/docs/packaging/procedures/maintainership"},next:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"}},l={},c=[{value:"Criteria",id:"criteria",level:2},{value:"Explicitly redistributable",id:"explicitly-redistributable",level:3},{value:"Server software",id:"server-software",level:3},{value:"Software age",id:"software-age",level:3},{value:"Stack complexity",id:"stack-complexity",level:3},{value:"Value-add",id:"value-add",level:3},{value:"Rejection",id:"rejection",level:2}];function d(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"package-inclusion-policy",children:"Package Inclusion Policy"})}),"\n",(0,s.jsx)(t.p,{children:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected."}),"\n",(0,s.jsx)(t.h2,{id:"criteria",children:"Criteria"}),"\n",(0,s.jsx)(t.h3,{id:"explicitly-redistributable",children:"Explicitly redistributable"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Software under a free software or open source software license, or license text which explicitly states that it is ",(0,s.jsx)(t.strong,{children:"permissible"})," to redistribute the software. We use the ",(0,s.jsx)(t.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,s.jsx)(t.li,{children:"For anything that cannot be redistributed by Solus, there is the possibility for them to be provided as a Flatpak, for Third Party repository inclusion, however the Solus project is not responsible for flatpak or snap implementation of these items. These items should then fetch only at installation time, and not contain non distributable components."}),"\n",(0,s.jsx)(t.li,{children:"Solus supports both VCS (currently only git, this will expand) and traditional software sources (such as tarballs) for packages, equally."}),"\n",(0,s.jsxs)(t.li,{children:["Unless ",(0,s.jsx)(t.strong,{children:"absolutely unavoidable"}),", the sources for a package should be source, and not ",(0,s.jsx)(t.strong,{children:"binary, prebuilt"})," sources. Exceptions may be made in rare cases, such as stage1 bootstrap for a compiler, or requires custom components otherwise impossible to provide in Solus (patched libraries, etc.)"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"server-software",children:"Server software"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Mail servers such as Postfix, Dovecot, etc, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Solus does not provide a server operating system."]}),"\n",(0,s.jsxs)(t.li,{children:["Web servers and database daemons ",(0,s.jsx)(t.strong,{children:"are"})," eligible for inclusion, as they facilitate web developers to work locally."]}),"\n",(0,s.jsx)(t.li,{children:"Anything outside of these may be catered to by the usage of Docker, or other container technology. Thus, container technology must be supported by Solus to support access to ancillary cases."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"software-age",children:"Software age"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"DOA (dead-on-arrival) packages are generally rejected from Solus. However, they may be included at the discretion of the project, if they provide unique functionality."}),"\n",(0,s.jsx)(t.li,{children:"Projects with no tags/tarballs which lack traction, may be frozen until a suitable release is made. Tagging releases is an indicator for good release engineering practices."}),"\n",(0,s.jsxs)(t.li,{children:["Typically, we prefer ",(0,s.jsx)(t.strong,{children:"stable"})," tagged releases. However, this may be waived if:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The software has significant traction (i.e. prerelease)"}),"\n",(0,s.jsx)(t.li,{children:"A bug fix only exists beyond the latest stable release for a git source"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"stack-complexity",children:"Stack complexity"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Certain requests may tick all the boxes, but introduce a level of complexity or require a level of engagement not possible to balance for Solus Staff. Under certain situations, a request will be frozen until it has a dedicated maintainer."}),"\n",(0,s.jsx)(t.li,{children:"This extends to requests for full desktop environments. However, this does not extend to minor components like drop-in window managers or panels separate of a dependent stack (i.e. Awesome WM, tint2, etc.)"}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"value-add",children:"Value-add"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A web wrapper which ",(0,s.jsx)(t.strong,{children:"adds value"}),", such as Discord, with the global push-to-talk shortcut, is eligible for inclusion."]}),"\n",(0,s.jsxs)(t.li,{children:["A web page wrapper, that adds ",(0,s.jsx)(t.strong,{children:"no further value"})," other than \u201cconvenient desktop shortcut\u201d or \u201ctray icon\u201d, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Web browsers already support desktop notifications."]}),"\n",(0,s.jsx)(t.li,{children:"If the newly requested package offers no functionality above that of an alternative already in the repositories, it will very likely be rejected. \u201cIt\u2019s pretty\u201d is never a sufficient reason."}),"\n",(0,s.jsx)(t.li,{children:"If the requested package is curated towards, or developed with the intent to work on, a specific operating system, it will very likely be rejected. This includes packages which require libraries that are built with the intent to work on a specific operating system."}),"\n",(0,s.jsxs)(t.li,{children:["Likewise, when a new package offers a better alternative to an ",(0,s.jsx)(t.strong,{children:"existing"})," package, we should look to replace the old one with the new one, to ensure the repository is always deduplicating."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"rejection",children:"Rejection"}),"\n",(0,s.jsxs)(t.p,{children:["Solus Staff members reserve the right to permanently reject a package request without the need for further discussion once the rejection is issued. The limited time of contributors should be considered and respected, instead of dragging out and 'necromancing' old issues in a vain attempt to force inclusion of previously rejected software. In the event of any policy change, existing/expired package requests will NOT be reevaluated under new criteria as this would lead to an exponential growth in work upon every policy change, and is physically impossible to handle for a project of ",(0,s.jsx)(t.em,{children:"any"})," size."]})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>o});var s=i(67294);const r={},n=s.createContext(r);function o(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cca891e2.f0382551.js b/assets/js/cca891e2.f0382551.js new file mode 100644 index 000000000..efa8f9f38 --- /dev/null +++ b/assets/js/cca891e2.f0382551.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9132"],{36810:function(e,t,i){i.r(t),i.d(t,{metadata:()=>s,contentTitle:()=>a,default:()=>h,assets:()=>l,toc:()=>c,frontMatter:()=>o});var s=JSON.parse('{"id":"packaging/procedures/package-inclusion","title":"Package Inclusion Policy","description":"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected.","source":"@site/docs/packaging/procedures/package-inclusion.md","sourceDirName":"packaging/procedures","slug":"/packaging/procedures/package-inclusion","permalink":"/docs/packaging/procedures/package-inclusion","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/package-inclusion.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Package Inclusion Policy","summary":"What\'s needed to include packages into the repository"},"sidebar":"packagingSidebar","previous":{"title":"Maintainership","permalink":"/docs/packaging/procedures/maintainership"},"next":{"title":"Release Processes","permalink":"/docs/packaging/procedures/release-processes"}}'),r=i("85893"),n=i("50065");let o={title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},a="Package Inclusion Policy",l={},c=[{value:"Criteria",id:"criteria",level:2},{value:"Explicitly redistributable",id:"explicitly-redistributable",level:3},{value:"Server software",id:"server-software",level:3},{value:"Software age",id:"software-age",level:3},{value:"Stack complexity",id:"stack-complexity",level:3},{value:"Value-add",id:"value-add",level:3},{value:"Rejection",id:"rejection",level:2}];function d(e){let t={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"package-inclusion-policy",children:"Package Inclusion Policy"})}),"\n",(0,r.jsx)(t.p,{children:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected."}),"\n",(0,r.jsx)(t.h2,{id:"criteria",children:"Criteria"}),"\n",(0,r.jsx)(t.h3,{id:"explicitly-redistributable",children:"Explicitly redistributable"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Software under a free software or open source software license, or license text which explicitly states that it is ",(0,r.jsx)(t.strong,{children:"permissible"})," to redistribute the software. We use the ",(0,r.jsx)(t.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,r.jsx)(t.li,{children:"For anything that cannot be redistributed by Solus, there is the possibility for them to be provided as a Flatpak, for Third Party repository inclusion, however the Solus project is not responsible for flatpak or snap implementation of these items. These items should then fetch only at installation time, and not contain non distributable components."}),"\n",(0,r.jsx)(t.li,{children:"Solus supports both VCS (currently only git, this will expand) and traditional software sources (such as tarballs) for packages, equally."}),"\n",(0,r.jsxs)(t.li,{children:["Unless ",(0,r.jsx)(t.strong,{children:"absolutely unavoidable"}),", the sources for a package should be source, and not ",(0,r.jsx)(t.strong,{children:"binary, prebuilt"})," sources. Exceptions may be made in rare cases, such as stage1 bootstrap for a compiler, or requires custom components otherwise impossible to provide in Solus (patched libraries, etc.)"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"server-software",children:"Server software"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Mail servers such as Postfix, Dovecot, etc, are ",(0,r.jsx)(t.strong,{children:"not"})," eligible for inclusion. Solus does not provide a server operating system."]}),"\n",(0,r.jsxs)(t.li,{children:["Web servers and database daemons ",(0,r.jsx)(t.strong,{children:"are"})," eligible for inclusion, as they facilitate web developers to work locally."]}),"\n",(0,r.jsx)(t.li,{children:"Anything outside of these may be catered to by the usage of Docker, or other container technology. Thus, container technology must be supported by Solus to support access to ancillary cases."}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"software-age",children:"Software age"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"DOA (dead-on-arrival) packages are generally rejected from Solus. However, they may be included at the discretion of the project, if they provide unique functionality."}),"\n",(0,r.jsx)(t.li,{children:"Projects with no tags/tarballs which lack traction, may be frozen until a suitable release is made. Tagging releases is an indicator for good release engineering practices."}),"\n",(0,r.jsxs)(t.li,{children:["Typically, we prefer ",(0,r.jsx)(t.strong,{children:"stable"})," tagged releases. However, this may be waived if:","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"The software has significant traction (i.e. prerelease)"}),"\n",(0,r.jsx)(t.li,{children:"A bug fix only exists beyond the latest stable release for a git source"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"stack-complexity",children:"Stack complexity"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Certain requests may tick all the boxes, but introduce a level of complexity or require a level of engagement not possible to balance for Solus Staff. Under certain situations, a request will be frozen until it has a dedicated maintainer."}),"\n",(0,r.jsx)(t.li,{children:"This extends to requests for full desktop environments. However, this does not extend to minor components like drop-in window managers or panels separate of a dependent stack (i.e. Awesome WM, tint2, etc.)"}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"value-add",children:"Value-add"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["A web wrapper which ",(0,r.jsx)(t.strong,{children:"adds value"}),", such as Discord, with the global push-to-talk shortcut, is eligible for inclusion."]}),"\n",(0,r.jsxs)(t.li,{children:["A web page wrapper, that adds ",(0,r.jsx)(t.strong,{children:"no further value"})," other than \u201Cconvenient desktop shortcut\u201D or \u201Ctray icon\u201D, are ",(0,r.jsx)(t.strong,{children:"not"})," eligible for inclusion. Web browsers already support desktop notifications."]}),"\n",(0,r.jsx)(t.li,{children:"If the newly requested package offers no functionality above that of an alternative already in the repositories, it will very likely be rejected. \u201CIt\u2019s pretty\u201D is never a sufficient reason."}),"\n",(0,r.jsx)(t.li,{children:"If the requested package is curated towards, or developed with the intent to work on, a specific operating system, it will very likely be rejected. This includes packages which require libraries that are built with the intent to work on a specific operating system."}),"\n",(0,r.jsxs)(t.li,{children:["Likewise, when a new package offers a better alternative to an ",(0,r.jsx)(t.strong,{children:"existing"})," package, we should look to replace the old one with the new one, to ensure the repository is always deduplicating."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"rejection",children:"Rejection"}),"\n",(0,r.jsxs)(t.p,{children:["Solus Staff members reserve the right to permanently reject a package request without the need for further discussion once the rejection is issued. The limited time of contributors should be considered and respected, instead of dragging out and 'necromancing' old issues in a vain attempt to force inclusion of previously rejected software. In the event of any policy change, existing/expired package requests will NOT be reevaluated under new criteria as this would lead to an exponential growth in work upon every policy change, and is physically impossible to handle for a project of ",(0,r.jsx)(t.em,{children:"any"})," size."]})]})}function h(e={}){let{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},50065:function(e,t,i){i.d(t,{Z:function(){return a},a:function(){return o}});var s=i(67294);let r={},n=s.createContext(r);function o(e){let t=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.682cb85d.js b/assets/js/ccc49370.682cb85d.js new file mode 100644 index 000000000..690551b47 --- /dev/null +++ b/assets/js/ccc49370.682cb85d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2998"],{35825:function(e,t,n){n.d(t,{Z:()=>A});var r=n("85893");n("67294");var l=n("74904"),i=n("75700");function o(e){let{children:t,className:n}=e;return(0,r.jsx)("article",{className:n,children:t})}var a=n("27544");let s="title_f1Hy";function c(e){let{className:t}=e,{metadata:n,isBlogPostPage:o}=(0,i.nO)(),{permalink:c,title:u}=n;return(0,r.jsx)(o?"h1":"h2",{className:(0,l.Z)(s,t),children:o?u:(0,r.jsx)(a.Z,{to:c,children:u})})}var u=n("1822"),d=n("67984"),m=n("28291");let h="container_mt6G";function f(e){let{readingTime:t}=e,n=function(){let{selectMessage:e}=(0,d.c)();return t=>{let n=Math.ceil(t);return e(n,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:n}))}}();return(0,r.jsx)(r.Fragment,{children:n(t)})}function g(e){let{date:t,formattedDate:n}=e;return(0,r.jsx)("time",{dateTime:t,children:n})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function p(e){let t,{className:n}=e,{metadata:o}=(0,i.nO)(),{date:a,readingTime:s}=o,c=(0,m.P)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,l.Z)(h,"margin-vert--md",n),children:[(0,r.jsx)(g,{date:a,formattedDate:(t=a,c.format(new Date(t)))}),void 0!==s&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(f,{readingTime:s})]})]})}var j=n("91941");let v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function b(e){let{className:t}=e,{metadata:{authors:n},assets:o}=(0,i.nO)();if(0===n.length)return null;let a=n.every(e=>{let{name:t}=e;return!t}),s=1===n.length;return(0,r.jsx)("div",{className:(0,l.Z)("margin-top--md margin-bottom--sm",a?v.imageOnlyAuthorRow:"row",t),children:n.map((e,t)=>(0,r.jsx)("div",{className:(0,l.Z)(!a&&(s?"col col--12":"col col--6"),a?v.imageOnlyAuthorCol:v.authorCol),children:(0,r.jsx)(j.Z,{author:{...e,imageURL:o.authorsImageUrls[t]??e.imageURL}})},t))})}function Z(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(p,{}),(0,r.jsx)(b,{})]})}var y=n("3062"),_=n("27913");function N(e){let{children:t,className:n}=e,{isBlogPostPage:o}=(0,i.nO)();return(0,r.jsx)("div",{id:o?y.blogPostContainerID:void 0,className:(0,l.Z)("markdown",n),children:(0,r.jsx)(_.Z,{children:t})})}var w=n("50490"),O=n("57216"),k=n("50905");function L(){return(0,r.jsx)("b",{children:(0,r.jsx)(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function T(e){let{blogPostTitle:t,...n}=e;return(0,r.jsx)(a.Z,{"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...n,children:(0,r.jsx)(L,{})})}function C(){let{metadata:e,isBlogPostPage:t}=(0,i.nO)(),{tags:n,title:o,editUrl:a,hasTruncateMarker:s,lastUpdatedBy:c,lastUpdatedAt:u}=e,d=!t&&s,m=n.length>0;if(!(m||d||a))return null;if(!t)return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[m&&(0,r.jsx)("div",{className:(0,l.Z)("col",{"col--9":d}),children:(0,r.jsx)(k.Z,{tags:n})}),d&&(0,r.jsx)("div",{className:(0,l.Z)("col text--right",{"col--3":m}),children:(0,r.jsx)(T,{blogPostTitle:o,to:e.permalink})})]});{let e=!!(a||u||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[m&&(0,r.jsx)("div",{className:(0,l.Z)("row","margin-top--sm",w.k.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(k.Z,{tags:n})})}),e&&(0,r.jsx)(O.Z,{className:(0,l.Z)("margin-top--sm",w.k.blog.blogFooterEditMetaRow),editUrl:a,lastUpdatedAt:u,lastUpdatedBy:c})]})}}function A(e){let{children:t,className:n}=e,a=function(){let{isBlogPostPage:e}=(0,i.nO)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(o,{className:(0,l.Z)(a,n),children:[(0,r.jsx)(Z,{}),(0,r.jsx)(N,{children:t}),(0,r.jsx)(C,{})]})}},57647:function(e,t,n){n.r(t),n.d(t,{default:()=>v});var r=n("85893");n("67294");var l=n("74904"),i=n("81921"),o=n("50490"),a=n("75700"),s=n("30928"),c=n("35825"),u=n("1822"),d=n("15779");function m(e){let{nextItem:t,prevItem:n}=e;return(0,r.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,u.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,r.jsx)(d.Z,{...n,subLabel:(0,r.jsx)(u.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),t&&(0,r.jsx)(d.Z,{...t,subLabel:(0,r.jsx)(u.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){let{assets:e,metadata:t}=(0,a.nO)(),{title:n,description:l,date:o,tags:s,authors:c,frontMatter:u}=t,{keywords:d}=u,m=e.image??u.image;return(0,r.jsxs)(i.d,{title:u.title_meta??n,description:l,keywords:d,image:m,children:[(0,r.jsx)("meta",{property:"og:type",content:"article"}),(0,r.jsx)("meta",{property:"article:published_time",content:o}),c.some(e=>e.url)&&(0,r.jsx)("meta",{property:"article:author",content:c.map(e=>e.url).filter(Boolean).join(",")}),s.length>0&&(0,r.jsx)("meta",{property:"article:tag",content:s.map(e=>e.label).join(",")})]})}var f=n("50777");function g(){let e=(0,a.iZ)();return(0,r.jsx)(f.Z,{children:(0,r.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var x=n("28669"),p=n("38154");function j(e){let{sidebar:t,children:n}=e,{metadata:l,toc:i}=(0,a.nO)(),{nextItem:o,prevItem:u,frontMatter:d}=l,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:g}=d;return(0,r.jsxs)(s.Z,{sidebar:t,toc:!h&&i.length>0?(0,r.jsx)(x.Z,{toc:i,minHeadingLevel:f,maxHeadingLevel:g}):void 0,children:[(0,r.jsx)(p.Z,{metadata:l}),(0,r.jsx)(c.Z,{children:n}),(o||u)&&(0,r.jsx)(m,{nextItem:o,prevItem:u})]})}function v(e){let t=e.content;return(0,r.jsx)(a.n4,{content:e.content,isBlogPostPage:!0,children:(0,r.jsxs)(i.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogPostPage),children:[(0,r.jsx)(h,{}),(0,r.jsx)(g,{}),(0,r.jsx)(j,{sidebar:e.sidebar,children:(0,r.jsx)(t,{})})]})})}},43672:function(e,t,n){n.d(t,{Z:function(){return c}});var r=n(85893);n(67294);var l=n(74904),i=n(72372),o=n(50490),a=n(77793);function s(e){let{className:t}=e;return(0,r.jsx)(a.Z,{type:"caution",title:(0,r.jsx)(i.cI,{}),className:(0,l.Z)(t,o.k.common.unlistedBanner),children:(0,r.jsx)(i.eU,{})})}function c(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.T$,{}),(0,r.jsx)(s,{...e})]})}},38154:function(e,t,n){n.d(t,{Z:()=>u});var r=n("85893");n("67294");var l=n("74904"),i=n("72372"),o=n("50490"),a=n("77793");function s(e){let{className:t}=e;return(0,r.jsx)(a.Z,{type:"caution",title:(0,r.jsx)(i.ht,{}),className:(0,l.Z)(t,o.k.common.draftBanner),children:(0,r.jsx)(i.xo,{})})}var c=n("43672");function u(e){let{metadata:t}=e,{unlisted:n,frontMatter:l}=t;return(0,r.jsxs)(r.Fragment,{children:[(n||l.unlisted)&&(0,r.jsx)(c.Z,{}),l.draft&&(0,r.jsx)(s,{})]})}},28669:function(e,t,n){n.d(t,{Z:()=>a});var r=n("85893");n("67294");var l=n("74904"),i=n("51515");let o="tableOfContents_bqdL";function a(e){let{className:t,...n}=e;return(0,r.jsx)("div",{className:(0,l.Z)(o,"thin-scrollbar",t),children:(0,r.jsx)(i.Z,{...n,linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})})}},51515:function(e,t,n){n.d(t,{Z:()=>c});var r=n("85893"),l=n("67294"),i=n("45237");function o(e){let t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}var a=n("27544");let s=l.memo(function e(t){let{toc:n,className:l,linkClassName:i,isChild:o}=t;return n.length?(0,r.jsx)("ul",{className:o?void 0:l,children:n.map(t=>(0,r.jsxs)("li",{children:[(0,r.jsx)(a.Z,{to:`#${t.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:t.value}}),(0,r.jsx)(e,{isChild:!0,toc:t.children,className:l,linkClassName:i})]},t.id))}):null});function c(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:u,maxHeadingLevel:d,...m}=e,h=(0,i.L)(),f=u??h.tableOfContents.minHeadingLevel,g=d??h.tableOfContents.maxHeadingLevel,x=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:r}=e;return(0,l.useMemo)(()=>(function e(t){let{toc:n,minHeadingLevel:r,maxHeadingLevel:l}=t;return n.flatMap(t=>{var n;let i=e({toc:t.children,minHeadingLevel:r,maxHeadingLevel:l});return(n=t).level>=r&&n.level<=l?[{...t,children:i}]:i})})({toc:function(e){let t=e.map(e=>({...e,parentIndex:-1,children:[]})),n=Array(7).fill(-1);t.forEach((e,t)=>{let r=n.slice(2,e.level);e.parentIndex=Math.max(...r),n[e.level]=t});let r=[];return t.forEach(e=>{let{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):r.push(l)}),r}(t),minHeadingLevel:n,maxHeadingLevel:r}),[t,n,r])}({toc:t,minHeadingLevel:f,maxHeadingLevel:g});return!function(e){let t=(0,l.useRef)(void 0),n=function(){let e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,i.L)();return(0,l.useEffect)(()=>{e.current=t?0:document.querySelector(".navbar").clientHeight},[t]),e}();(0,l.useEffect)(()=>{if(!e)return()=>{};let{linkClassName:r,linkActiveClassName:l,minHeadingLevel:i,maxHeadingLevel:a}=e;function s(){var e;let s=(e=r,Array.from(document.getElementsByClassName(e))),c=function(e,t){let{anchorTopOffset:n}=t,r=e.find(e=>o(e).top>=n);if(r){var l;return(l=o(r)).top>0&&l.bottom{var t;return c&&c.id===decodeURIComponent((t=e).href.substring(t.href.indexOf("#")+1))});s.forEach(e=>{var n;n=e,e===u?(t.current&&t.current!==n&&t.current.classList.remove(l),n.classList.add(l),t.current=n):n.classList.remove(l)})}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}},[e,n])}((0,l.useMemo)(()=>{if(a&&c)return{linkClassName:a,linkActiveClassName:c,minHeadingLevel:f,maxHeadingLevel:g}},[a,c,f,g])),(0,r.jsx)(s,{toc:x,className:n,linkClassName:a,...m})}},72372:function(e,t,n){n.d(t,{T$:function(){return s},cI:function(){return o},eU:function(){return a},ht:function(){return c},xo:function(){return u}});var r=n(85893);n(67294);var l=n(1822),i=n(50777);function o(){return(0,r.jsx)(l.Z,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function a(){return(0,r.jsx)(l.Z,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function s(){return(0,r.jsx)(i.Z,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,r.jsx)(l.Z,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function u(){return(0,r.jsx)(l.Z,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.903a1abc.js b/assets/js/ccc49370.903a1abc.js deleted file mode 100644 index 95566c247..000000000 --- a/assets/js/ccc49370.903a1abc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6103],{88987:(e,n,t)=>{t.r(n),t.d(n,{default:()=>b});t(67294);var i=t(36905),a=t(96984),s=t(50563),r=t(58112),o=t(50429),l=t(81782),c=t(55361),d=t(60968),u=t(85893);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.Z,{...t,subLabel:(0,u.jsx)(c.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),n&&(0,u.jsx)(d.Z,{...n,subLabel:(0,u.jsx)(c.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){const{assets:e,metadata:n}=(0,r.nO)(),{title:t,description:i,date:s,tags:o,authors:l,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.d,{title:t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),o.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:o.map((e=>e.label)).join(",")})]})}var f=t(79722);function g(){const e=(0,r.iZ)();return(0,u.jsx)(f.Z,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var p=t(15556),x=t(46086);function v(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,r.nO)(),{nextItem:s,prevItem:c,frontMatter:d}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:g}=d;return(0,u.jsxs)(o.Z,{sidebar:n,toc:!h&&a.length>0?(0,u.jsx)(p.Z,{toc:a,minHeadingLevel:f,maxHeadingLevel:g}):void 0,children:[(0,u.jsx)(x.Z,{metadata:i}),(0,u.jsx)(l.Z,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function b(e){const n=e.content;return(0,u.jsx)(r.n4,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.FG,{className:(0,i.Z)(s.k.wrapper.blogPages,s.k.page.blogPostPage),children:[(0,u.jsx)(h,{}),(0,u.jsx)(g,{}),(0,u.jsx)(v,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},40591:(e,n,t)=>{t.d(n,{Z:()=>c});t(67294);var i=t(36905),a=t(64827),s=t(50563),r=t(20906),o=t(85893);function l(e){let{className:n}=e;return(0,o.jsx)(r.Z,{type:"caution",title:(0,o.jsx)(a.cI,{}),className:(0,i.Z)(n,s.k.common.unlistedBanner),children:(0,o.jsx)(a.eU,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.T$,{}),(0,o.jsx)(l,{...e})]})}},46086:(e,n,t)=>{t.d(n,{Z:()=>d});t(67294);var i=t(36905),a=t(64827),s=t(50563),r=t(20906),o=t(85893);function l(e){let{className:n}=e;return(0,o.jsx)(r.Z,{type:"caution",title:(0,o.jsx)(a.ht,{}),className:(0,i.Z)(n,s.k.common.draftBanner),children:(0,o.jsx)(a.xo,{})})}var c=t(40591);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,o.jsxs)(o.Fragment,{children:[(t||i.unlisted)&&(0,o.jsx)(c.Z,{}),i.draft&&(0,o.jsx)(l,{})]})}},15556:(e,n,t)=>{t.d(n,{Z:()=>c});t(67294);var i=t(36905),a=t(42536);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=t(85893);const o="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,r.jsx)("div",{className:(0,i.Z)(s.tableOfContents,"thin-scrollbar",n),children:(0,r.jsx)(a.Z,{...t,linkClassName:o,linkActiveClassName:l})})}},42536:(e,n,t)=>{t.d(n,{Z:()=>g});var i=t(67294),a=t(39581);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function r(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=r({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function l(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>o(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom {e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:r}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:r}),c=l(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(38208),m=t(85893);function h(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.Z,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const f=i.memo(h);function g(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const g=(0,a.L)(),p=c??g.tableOfContents.minHeadingLevel,x=u??g.tableOfContents.maxHeadingLevel,v=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:p,maxHeadingLevel:x});return d((0,i.useMemo)((()=>{if(o&&l)return{linkClassName:o,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:x}}),[o,l,p,x])),(0,m.jsx)(f,{toc:v,className:t,linkClassName:o,...h})}},64827:(e,n,t)=>{t.d(n,{T$:()=>l,cI:()=>r,eU:()=>o,ht:()=>c,xo:()=>d});t(67294);var i=t(55361),a=t(79722),s=t(85893);function r(){return(0,s.jsx)(i.Z,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,s.jsx)(i.Z,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function l(){return(0,s.jsx)(a.Z,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,s.jsx)(i.Z,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.Z,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/ce4855c1.52c0a384.js b/assets/js/ce4855c1.52c0a384.js new file mode 100644 index 000000000..ca040f0eb --- /dev/null +++ b/assets/js/ce4855c1.52c0a384.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2796"],{42202:function(n,e,t){t.r(e),t.d(e,{metadata:()=>s,contentTitle:()=>a,default:()=>d,assets:()=>l,toc:()=>c,frontMatter:()=>o});var s=JSON.parse('{"id":"packaging/translation-instructions","title":"Translation instructions","description":"Users will arrive here from the \\"Translation instructions\\" link on Transifex.","source":"@site/docs/packaging/translation-instructions.md","sourceDirName":"packaging","slug":"/packaging/translation-instructions","permalink":"/docs/packaging/translation-instructions","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/translation-instructions.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Translation instructions","summary":"Instructions for translators"},"sidebar":"packagingSidebar","previous":{"title":"Rebuilding a stack","permalink":"/docs/packaging/stack-rebuilds"},"next":{"title":"Troubleshooting for Packagers","permalink":"/docs/packaging/troubleshooting-packaging"}}'),i=t("85893"),r=t("50065");let o={title:"Translation instructions",summary:"Instructions for translators"},a="Translation instructions",l={},c=[{value:"Project specific instructions",id:"project-specific-instructions",level:2},{value:"Solus Mate Transition Tool",id:"solus-mate-transition-tool",level:3}];function u(n){let e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...n.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.header,{children:(0,i.jsx)(e.h1,{id:"translation-instructions",children:"Translation instructions"})}),"\n",(0,i.jsx)(e.p,{children:'Users will arrive here from the "Translation instructions" link on Transifex.'}),"\n",(0,i.jsxs)(e.p,{children:["Please join our ",(0,i.jsx)(e.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix rooms"})," if you have questions about our translation projects."]}),"\n",(0,i.jsx)(e.h2,{id:"project-specific-instructions",children:"Project specific instructions"}),"\n",(0,i.jsx)(e.h3,{id:"solus-mate-transition-tool",children:"Solus Mate Transition Tool"}),"\n",(0,i.jsx)(e.p,{children:(0,i.jsx)(e.a,{href:"https://app.transifex.com/solus/solus-mate-transition-tool/",children:"Transifex project link"})}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:["Strings which include curly braces ",(0,i.jsx)(e.code,{children:"{ }"})," should be translated leaving the curly braces, ",(0,i.jsx)(e.em,{children:"and anything inside the braces"}),", untouched."]}),"\n",(0,i.jsxs)(e.li,{children:["Examples:","\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"{DE} Successfully installed, please reboot to continue."})," translates to:"]}),"\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.code,{children:"{DE} Instalado exitosamente, reinicie para continuar."})}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"Successfully Installed {}"})," translates to:"]}),"\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.code,{children:"Instalado exitosamente {}"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(e.li,{children:["Do not translate the following strings; leave them untouched:","\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.code,{children:"Packagekit"})}),"\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.code,{children:"XDG_SESSION_DESKTOP"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(e.li,{children:"If a string includes a new-line character, be sure to include it in the same place in the translation."}),"\n"]})]})}function d(n={}){let{wrapper:e}={...(0,r.a)(),...n.components};return e?(0,i.jsx)(e,{...n,children:(0,i.jsx)(u,{...n})}):u(n)}},50065:function(n,e,t){t.d(e,{Z:function(){return a},a:function(){return o}});var s=t(67294);let i={},r=s.createContext(i);function o(n){let e=s.useContext(r);return s.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:o(n.components),s.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce4855c1.6a665116.js b/assets/js/ce4855c1.6a665116.js deleted file mode 100644 index 85582ca09..000000000 --- a/assets/js/ce4855c1.6a665116.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3440],{66855:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={title:"Translation instructions",summary:"Instructions for translators"},o="Translation instructions",a={id:"packaging/translation-instructions",title:"Translation instructions",description:'Users will arrive here from the "Translation instructions" link on Transifex.',source:"@site/docs/packaging/translation-instructions.md",sourceDirName:"packaging",slug:"/packaging/translation-instructions",permalink:"/docs/packaging/translation-instructions",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/translation-instructions.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Translation instructions",summary:"Instructions for translators"},sidebar:"packagingSidebar",previous:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"},next:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Project specific instructions",id:"project-specific-instructions",level:2},{value:"Solus Mate Transition Tool",id:"solus-mate-transition-tool",level:3}];function u(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"translation-instructions",children:"Translation instructions"})}),"\n",(0,s.jsx)(e.p,{children:'Users will arrive here from the "Translation instructions" link on Transifex.'}),"\n",(0,s.jsxs)(e.p,{children:["Please join our ",(0,s.jsx)(e.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix rooms"})," if you have questions about our translation projects."]}),"\n",(0,s.jsx)(e.h2,{id:"project-specific-instructions",children:"Project specific instructions"}),"\n",(0,s.jsx)(e.h3,{id:"solus-mate-transition-tool",children:"Solus Mate Transition Tool"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.a,{href:"https://app.transifex.com/solus/solus-mate-transition-tool/",children:"Transifex project link"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:["Strings which include curly braces ",(0,s.jsx)(e.code,{children:"{ }"})," should be translated leaving the curly braces, ",(0,s.jsx)(e.em,{children:"and anything inside the braces"}),", untouched."]}),"\n",(0,s.jsxs)(e.li,{children:["Examples:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"{DE} Successfully installed, please reboot to continue."})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"{DE} Instalado exitosamente, reinicie para continuar."})}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Successfully Installed {}"})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Instalado exitosamente {}"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["Do not translate the following strings; leave them untouched:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Packagekit"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"XDG_SESSION_DESKTOP"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(e.li,{children:"If a string includes a new-line character, be sure to include it in the same place in the translation."}),"\n"]})]})}function d(n={}){const{wrapper:e}={...(0,i.a)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(u,{...n})}):u(n)}},11151:(n,e,t)=>{t.d(e,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(n){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:o(n.components),s.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/cec10a63.96b0fffc.js b/assets/js/cec10a63.96b0fffc.js new file mode 100644 index 000000000..7d42913ec --- /dev/null +++ b/assets/js/cec10a63.96b0fffc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4886"],{87641:function(e,n,s){s.r(n),s.d(n,{metadata:()=>t,contentTitle:()=>l,default:()=>h,assets:()=>d,toc:()=>c,frontMatter:()=>o});var t=JSON.parse('{"id":"user/editions/plasma/configuration","title":"Configuration","description":"Opening System Settings","source":"@site/docs/user/editions/plasma/configuration.md","sourceDirName":"user/editions/plasma","slug":"/user/editions/plasma/configuration","permalink":"/docs/user/editions/plasma/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/configuration.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Configuration","summary":"Learn how to customize and configure the Plasma Desktop on Solus."},"sidebar":"userSidebar","previous":{"title":"Plasma","permalink":"/docs/user/editions/plasma/"},"next":{"title":"Tips and Tricks","permalink":"/docs/user/editions/plasma/tips-and-tricks"}}'),i=s("85893"),r=s("50065");let o={title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},l="Configuration",d={},c=[{value:"Opening System Settings",id:"opening-system-settings",level:2},{value:"Date and time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Configuring default applications from System Settings",id:"configuring-default-applications-from-system-settings",level:3},{value:"Configuring default applications from the file manager",id:"configuring-default-applications-from-the-file-manager",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"Configuring keyboard layouts",id:"configuring-keyboard-layouts",level:3},{value:"Using IBus",id:"using-ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Network settings",id:"network-settings",level:2},{value:"Connecting to a hidden Wi-Fi network",id:"connecting-to-a-hidden-wi-fi-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Users",id:"users",level:2},{value:"Adding user accounts",id:"adding-user-accounts",level:3},{value:"Removing user accounts",id:"removing-user-accounts",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Customizing the desktop",id:"customizing-the-desktop",level:3},{value:"Virtual desktops",id:"virtual-desktops",level:2},{value:"Creating virtual desktops",id:"creating-virtual-desktops",level:3},{value:"Switching between virtual desktops",id:"switching-between-virtual-desktops",level:3}];function a(e){let n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(n.h2,{id:"opening-system-settings",children:"Opening System Settings"}),"\n",(0,i.jsx)(n.p,{children:"You can open the system settings in Solus Plasma using any of the following methods:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Method"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Application menu"}),(0,i.jsxs)(n.td,{children:["Open the application menu and go to ",(0,i.jsx)(n.strong,{children:"Settings"})," > ",(0,i.jsx)(n.strong,{children:"System Settings"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"KRunner"}),(0,i.jsxs)(n.td,{children:["Press ",(0,i.jsx)(n.code,{children:"Alt + F2"})," or ",(0,i.jsx)(n.code,{children:"Alt + Space"}),", type ",(0,i.jsx)(n.code,{children:"systemsettings"}),", and press Enter"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Terminal"}),(0,i.jsxs)(n.td,{children:["Open a terminal window and execute ",(0,i.jsx)(n.code,{children:"systemsettings"})]})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"date-and-time",children:"Date and time"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Personalization"})," > ",(0,i.jsx)(n.strong,{children:"Regional Settings"})," > ",(0,i.jsx)(n.strong,{children:"Date and Time"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Configure the date and time of your system.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["If you want Solus to set the date and time automatically, select ",(0,i.jsx)(n.strong,{children:"Set date and time automatically"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["If you want to set the date and time manually, clear the ",(0,i.jsx)(n.strong,{children:"Set date and time automatically"})," checkbox, then use the available controls.\n",(0,i.jsx)(n.img,{alt:"Plasma date and time settings",src:s(16092).Z+"",width:"1022",height:"730"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["(Optional) Configure the time zone of your system.","\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Go to the ",(0,i.jsx)(n.strong,{children:"Time Zone"})," tab."]}),"\n",(0,i.jsx)(n.li,{children:"Select a time zone from the list."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.strong,{children:"Apply"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["(Optional) Customize how the time and date display in the bottom panel.","\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Right-click the digital clock widget on the bottom panel."}),"\n",(0,i.jsxs)(n.li,{children:["Select ",(0,i.jsx)(n.strong,{children:"Configure Digital Clock..."})]}),"\n",(0,i.jsx)(n.li,{children:"Configure the available settings as needed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,i.jsx)(n.h3,{id:"configuring-default-applications-from-system-settings",children:"Configuring default applications from System Settings"}),"\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Personalization"})," > ",(0,i.jsx)(n.strong,{children:"Applications"})," > ",(0,i.jsx)(n.strong,{children:"Default Applications"}),", then use the menus to select your preferred default applications."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Default applications",src:s(17494).Z+"",width:"1022",height:"731"})}),"\n",(0,i.jsx)(n.h3,{id:"configuring-default-applications-from-the-file-manager",children:"Configuring default applications from the file manager"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Open Dolphin."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Navigate to the folder that contains the file you want to open."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Right-click the file."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Context menu",src:s(26716).Z+"",width:"714",height:"456"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Go to ",(0,i.jsx)(n.strong,{children:"Open With"})," > ",(0,i.jsx)(n.strong,{children:"Other Application"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Choose Application"})," dialog appears."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Choose the application you want to use from the list."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Select ",(0,i.jsx)(n.strong,{children:"Remember application association for all files of type [file type]"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Choose application dialog",src:s(60364).Z+"",width:"373",height:"571"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"displays",children:"Displays"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Press ",(0,i.jsx)(n.code,{children:"Super + P"})," to access the screen layout settings."]})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Hardware"})," > ",(0,i.jsx)(n.strong,{children:"Display and Monitor"})," > ",(0,i.jsx)(n.strong,{children:"Display Configuration"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Select the display you want to configure."}),"\n",(0,i.jsxs)(n.li,{children:["Configure the available settings as needed.\n",(0,i.jsx)(n.img,{alt:"Screen settings available in Solus Plasma",src:s(94986).Z+"",width:"1021",height:"763"})]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,i.jsx)(n.h3,{id:"configuring-keyboard-layouts",children:"Configuring keyboard layouts"}),"\n",(0,i.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,i.jsxs)(n.p,{children:["If you need to input languages that do not use Latin characters (for example, Chinese or Japanese), ",(0,i.jsx)(n.a,{href:"#using-ibus",children:"use IBus instead"}),"."]})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Input Devices"})," > ",(0,i.jsx)(n.strong,{children:"Keyboard"})," > ",(0,i.jsx)(n.strong,{children:"Layouts"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The layouts screen appears.\n",(0,i.jsx)(n.img,{alt:"Keyboard layouts",src:s(12963).Z+"",width:"743",height:"728"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Select ",(0,i.jsx)(n.strong,{children:"Configure layouts"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configure keyboard layouts as you need."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To add a keyboard layout click ",(0,i.jsx)(n.strong,{children:"Add"}),", select a layout from the list, and click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["To remove a keyboard layout select a layout from the list and click ",(0,i.jsx)(n.strong,{children:"Remove"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["To order the list of keyboard layouts, select a layout from the list, then use the ",(0,i.jsx)(n.strong,{children:"Move Up"})," and ",(0,i.jsx)(n.strong,{children:"Move Down"})," buttons to reorder the list."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Configure a keyboard shortcut to switch between layouts by using the options under ",(0,i.jsx)(n.strong,{children:"Shortcuts for Switching Layout"}),"."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To use the default shortcuts Solus Plasma provides, use the ",(0,i.jsx)(n.strong,{children:"Main shortcuts"})," and ",(0,i.jsx)(n.strong,{children:"3rd level shortcuts"})," options."]}),"\n",(0,i.jsxs)(n.li,{children:["To use a custom shortcut, use the ",(0,i.jsx)(n.strong,{children:"Alternative shortcut"})," option."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Apply"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"using-ibus",children:"Using IBus"}),"\n",(0,i.jsx)(n.p,{children:"Solus Plasma includes IBus installed by default. However, you need to enable and integrate IBus with Plasma before usage."}),"\n",(0,i.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,i.jsxs)(n.p,{children:["Using IBus overrides the configuration in the ",(0,i.jsx)(n.strong,{children:"Layouts"})," section of ",(0,i.jsx)(n.strong,{children:"System Settings"})]})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Open the ",(0,i.jsx)(n.code,{children:"/home/[username]/.bashrc"})," file with a text editor."]}),"\n",(0,i.jsx)(n.li,{children:"Add the following lines at the end of the file."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"export GTK_IM_MODULE=ibus\nexport QT_IM_MODULE=ibus\nexport XMODIFIERS=@im=ibus\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Save the file."}),"\n",(0,i.jsxs)(n.li,{children:["Configure IBus to autostart.","\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Workspace"})," > ",(0,i.jsx)(n.strong,{children:"Startup and Shutdown"})," > ",(0,i.jsx)(n.strong,{children:"Autostart"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.strong,{children:"Add"}),", then ",(0,i.jsx)(n.strong,{children:"Add Application"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["In the search box, enter ",(0,i.jsx)(n.code,{children:"ibus-daemon -rxR"})," and press ",(0,i.jsx)(n.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Log out from your session, then log in again."}),"\n",(0,i.jsxs)(n.li,{children:["Configure keyboard layouts as you need.","\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Open ",(0,i.jsx)(n.strong,{children:"IBus Preferences"})," from the application launcher."]}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.strong,{children:"Input Method"})," tab, add the keyboard layout you need."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,i.jsxs)(n.p,{children:["Some keyboard layouts require ",(0,i.jsx)(n.a,{href:"/docs/user/software/localization/ibus",children:"installing additional packages"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to the appropriate configuration screen:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To configure the mouse, go to ",(0,i.jsx)(n.strong,{children:"Input Devices"})," > ",(0,i.jsx)(n.strong,{children:"Mouse"}),".\n",(0,i.jsx)(n.img,{alt:"Mouse settings",src:s(9975).Z+"",width:"749",height:"343"})]}),"\n",(0,i.jsxs)(n.li,{children:["To configure the touchpad, go to ",(0,i.jsx)(n.strong,{children:"Input Devices"})," > ",(0,i.jsx)(n.strong,{children:"Touchpad"}),".\n",(0,i.jsx)(n.img,{alt:"Touchpad settings",src:s(45608).Z+"",width:"748",height:"591"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Configure the available settings as needed."}),"\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"network-settings",children:"Network settings"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Networks"})," widget on the bottom panel allows you to perform frequent networking tasks, such as connecting to a Wi-Fi network or enabling airplane mode."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Networks widget",src:s(95038).Z+"",width:"460",height:"489"})}),"\n",(0,i.jsx)(n.h3,{id:"connecting-to-a-hidden-wi-fi-network",children:"Connecting to a hidden Wi-Fi network"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.strong,{children:"System Settings"})," screen, go to ",(0,i.jsx)(n.strong,{children:"Network"})," > ",(0,i.jsx)(n.strong,{children:"Connections"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click the ",(0,i.jsx)(n.strong,{children:"Add new connection"})," icon (+)."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Select ",(0,i.jsx)(n.strong,{children:"Wi-Fi"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Create"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"New Connection"})," window appears.\n",(0,i.jsx)(n.img,{alt:"New connection settings",src:s(37742).Z+"",width:"651",height:"656"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.strong,{children:"Wi-Fi"})," tab, specify the name (SSID) and basic network settings."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.strong,{children:"Wi-Fi Security"})," tab, configure the password or other authentication settings."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Use the ",(0,i.jsx)(n.strong,{children:"IPv4"}),", ",(0,i.jsx)(n.strong,{children:"IPv6"})," and ",(0,i.jsx)(n.strong,{children:"General configuration"})," tabs to configure additional settings, such as DNS servers."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Save"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Audio Volume widget",src:s(62716).Z+"",width:"497",height:"489"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Audio Volume"})," widget on the bottom panel allows you to perform the following tasks:"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Task"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Select the active output device"}),(0,i.jsx)(n.td,{children:"Select any of the available output devices to change the active output device of your system."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Select the active input device"}),(0,i.jsx)(n.td,{children:"Select any of the available input devices to change the active input device of your system."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Control the volume of a device"}),(0,i.jsx)(n.td,{children:"Use the sliders to adjust the master volume of an input/output device."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Adjust the volume for a specific app"}),(0,i.jsxs)(n.td,{children:["The ",(0,i.jsx)(n.strong,{children:"Volume"})," tab allows you to control the volume for a specific application."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Open the audio settings"}),(0,i.jsxs)(n.td,{children:["Click the ",(0,i.jsx)(n.strong,{children:"Configure Audio Devices"})," button to open the audio configuration screen in System Settings."]})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"users",children:"Users"}),"\n",(0,i.jsx)(n.h3,{id:"adding-user-accounts",children:"Adding user accounts"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Personalization"})," > ",(0,i.jsx)(n.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Add New User"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configure the necessary settings."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Add user account",src:s(26052).Z+"",width:"752",height:"731"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Create"})]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Authentication Required"})," window appears."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Specify your user password and click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"removing-user-accounts",children:"Removing user accounts"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Personalization"})," > ",(0,i.jsx)(n.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Select an account from the user list."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Delete User"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["To delete the the user account files, select ",(0,i.jsx)(n.strong,{children:"Delete files"}),"; to keep the files for posterior use, select ",(0,i.jsx)(n.strong,{children:"Keep files"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Keep or delete user files",src:s(2633).Z+"",width:"671",height:"525"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"user-interface",children:"User interface"}),"\n",(0,i.jsx)(n.h3,{id:"customizing-the-desktop",children:"Customizing the desktop"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Desktop Settings"})," screen allows you to customize various aspects of your desktop, such as the wallpaper and the desktop icons. To open ",(0,i.jsx)(n.strong,{children:"Desktop Settings"})," screen, right-click anywhere on the desktop and select ",(0,i.jsx)(n.strong,{children:"Configure Desktop and Wallpaper..."}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Desktop context menu",src:s(993).Z+"",width:"537",height:"355"})}),"\n",(0,i.jsxs)(n.p,{children:["The following table describes how to customize the desktop using the ",(0,i.jsx)(n.strong,{children:"Desktop Folder Settings"})," screen."]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Section"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Change the wallpaper"}),(0,i.jsxs)(n.td,{children:["Go to the ",(0,i.jsx)(n.strong,{children:"Wallpaper"})," section, choose an image from the list, and click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Hide the desktop icons"}),(0,i.jsxs)(n.td,{children:["Go to the ",(0,i.jsx)(n.strong,{children:"Wallpaper"})," section, change ",(0,i.jsx)(n.strong,{children:"Layout"})," to ",(0,i.jsx)(n.strong,{children:"Desktop"}),", and click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Configure mouse gestures"}),(0,i.jsxs)(n.td,{children:["Go to the ",(0,i.jsx)(n.strong,{children:"Mouse Actions"})," section to setup mouse gestures."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Change the folder displayed on the desktop"}),(0,i.jsxs)(n.td,{children:["Go to the ",(0,i.jsx)(n.strong,{children:"Location"})," section, select a location in your system, and click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Change the appearance of the desktop icons"}),(0,i.jsxs)(n.td,{children:["Go to the ",(0,i.jsx)(n.strong,{children:"Icons"})," section, configure the necessary settings, and click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Display only specific files in the desktop"}),(0,i.jsxs)(n.td,{children:["Go to the ",(0,i.jsx)(n.strong,{children:"Filter"})," section,configure the necessary settings, and click ",(0,i.jsx)(n.strong,{children:"OK"}),"."]})]})]})]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Icons"})," and ",(0,i.jsx)(n.strong,{children:"Location"})," are only available when the desktop layout is set to ",(0,i.jsx)(n.strong,{children:"Folder View"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"virtual-desktops",children:"Virtual desktops"}),"\n",(0,i.jsx)(n.p,{children:"Plasma allows you to have multiple desktops on your computer."}),"\n",(0,i.jsx)(n.p,{children:"Virtual desktops are helpful to keep tasks organized and avoid clutter. For example, you could have one virtual desktop for work, one for school, and one for personal use."}),"\n",(0,i.jsx)(n.p,{children:"Plasma arranges virtual desktops in a grid. You can configure the rows of the grid to suit your needs."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Solus Plasma has one virtual desktop and one row by default."})}),"\n",(0,i.jsx)(n.h3,{id:"creating-virtual-desktops",children:"Creating virtual desktops"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.a,{href:"#opening-system-settings",children:(0,i.jsx)(n.strong,{children:"System Settings"})})," screen, go to ",(0,i.jsx)(n.strong,{children:"Workspace"})," > ",(0,i.jsx)(n.strong,{children:"Workspace Behavior"})," > ",(0,i.jsx)(n.strong,{children:"Virtual Desktops"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Define the number of rows in the grid."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Create a new virtual desktop."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Click ",(0,i.jsx)(n.strong,{children:"Add"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["(Optional) Click the ",(0,i.jsx)(n.strong,{children:"Rename"})," button to change the name of the virtual desktop."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Repeat the previous step to add multiple virtual desktops."}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Plasma arranges the desktops by the rows automatically."})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"(Optional) Configure the behavior of the virtual desktops."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Navigation wraps around"}),": Lets you cycle through your virtual desktops in a loop using keyboard shortcuts or mouse gestures."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Show animation when switching"}),": Displays animations when switching between virtual desktops."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Show on-screen display when switching"}),": Displays the name of the current desktop when switching between desktops."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Show desktop layout indicators"}),": Displays the virtual desktop grid when you switch between desktops."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Apply"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Plasma displays the virtual desktop grid next to the application launcher button.\n",(0,i.jsx)(n.img,{alt:"Virtual desktop grid",src:s(66882).Z+"",width:"375",height:"325"})]})}),"\n",(0,i.jsx)(n.h3,{id:"switching-between-virtual-desktops",children:"Switching between virtual desktops"}),"\n",(0,i.jsx)(n.p,{children:"The following table outlines the methods to change between desktops in Solus Plasma."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Method"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Using the applet in the bottom panel"}),(0,i.jsx)(n.td,{children:"Use the the virtual desktop grid next to the application launcher button to change between your virtual desktops."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Using mouse gestures"}),(0,i.jsx)(n.td,{children:"Move the mouse pointer anywhere in the desktop, then move the mouse wheel to change between your virtual desktops."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Using keyboard shortcuts"}),(0,i.jsxs)(n.td,{children:["Open System Settings, go to ",(0,i.jsx)(n.strong,{children:"Workspace"})," > ",(0,i.jsx)(n.strong,{children:"Shortcuts"})," > ",(0,i.jsx)(n.strong,{children:"KWin"}),", then search for ",(0,i.jsx)(n.code,{children:"desktop"})," to see the available keyboard shortcuts to switch between virtual desktops"]})]})]})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Keyboard shortcuts to switch between desktops",src:s(45774).Z+"",width:"1150",height:"859"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Some of the keyboard shortcuts are disabled by default."})})]})}function h(e={}){let{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},26052:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/add-user-account-1e83f41522d5b43ae2f29250e52bb758.png"},62716:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/audio-widget-48a0e65d8e699ad8ca493a1e2dfcfb10.png"},60364:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/choose-application-f3747627db0cff378d7192b6c7b253f0.png"},16092:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/date-time-9e18cbfa859270a81d6973cab14ae1b6.png"},17494:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/default-apps-screen-3da638bbc4ab452b8242fb718543a132.png"},993:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/desktop-context-menu-2a7196d846dab6acdff78dacb64b3fd6.png"},26716:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/file-context-menu-default-app-0816ad4ab5c64beeef9817dad6cbaeb7.png"},2633:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/keep-delete-files-9a5622ed38b6dd5a1002312f0a7a01cd.png"},12963:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/keyboard-layouts-468ec6547841069b372a81ef4120a67b.png"},9975:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/mouse-settings-0ec1470b23397d7d0aba492f1f4806fe.png"},95038:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/networks-widget-5446dcc803349c7a20e445393930a00a.png"},37742:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/new-wifi-network-b1c4e7f299993318ae998c66b217fa69.png"},94986:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/screen-configuration-2fd6ef5f5d7a1d590ae67d553f6f58c9.png"},45774:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/switch-desktop-shortcut-list-8b9812e81259bd41b56730a22d11728b.png"},45608:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/touchpad-settings-71fa3d9caf82f2103b978f12bf73a5be.png"},66882:function(e,n,s){s.d(n,{Z:function(){return t}});let t=s.p+"assets/images/vd-grid-bb98a6b6492fe334b36271eac65b4acb.png"},50065:function(e,n,s){s.d(n,{Z:function(){return l},a:function(){return o}});var t=s(67294);let i={},r=t.createContext(i);function o(e){let n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cec10a63.c49b4863.js b/assets/js/cec10a63.c49b4863.js deleted file mode 100644 index c5622db1e..000000000 --- a/assets/js/cec10a63.c49b4863.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8422],{96928:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=n(85893),i=n(11151);const r={title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},o="Configuration",l={id:"user/editions/plasma/configuration",title:"Configuration",description:"Opening System Settings",source:"@site/docs/user/editions/plasma/configuration.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/configuration",permalink:"/docs/user/editions/plasma/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/configuration.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},sidebar:"userSidebar",previous:{title:"Plasma",permalink:"/docs/user/editions/plasma/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"}},d={},c=[{value:"Opening System Settings",id:"opening-system-settings",level:2},{value:"Date and time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Configuring default applications from System Settings",id:"configuring-default-applications-from-system-settings",level:3},{value:"Configuring default applications from the file manager",id:"configuring-default-applications-from-the-file-manager",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"Configuring keyboard layouts",id:"configuring-keyboard-layouts",level:3},{value:"Using IBus",id:"using-ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Network settings",id:"network-settings",level:2},{value:"Connecting to a hidden Wi-Fi network",id:"connecting-to-a-hidden-wi-fi-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Users",id:"users",level:2},{value:"Adding user accounts",id:"adding-user-accounts",level:3},{value:"Removing user accounts",id:"removing-user-accounts",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Customizing the desktop",id:"customizing-the-desktop",level:3},{value:"Virtual desktops",id:"virtual-desktops",level:2},{value:"Creating virtual desktops",id:"creating-virtual-desktops",level:3},{value:"Switching between virtual desktops",id:"switching-between-virtual-desktops",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(s.h2,{id:"opening-system-settings",children:"Opening System Settings"}),"\n",(0,t.jsx)(s.p,{children:"You can open the system settings in Solus Plasma using any of the following methods:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Application menu"}),(0,t.jsxs)(s.td,{children:["Open the application menu and go to ",(0,t.jsx)(s.strong,{children:"Settings"})," > ",(0,t.jsx)(s.strong,{children:"System Settings"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KRunner"}),(0,t.jsxs)(s.td,{children:["Press ",(0,t.jsx)(s.code,{children:"Alt + F2"})," or ",(0,t.jsx)(s.code,{children:"Alt + Space"}),", type ",(0,t.jsx)(s.code,{children:"systemsettings"}),", and press Enter"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Terminal"}),(0,t.jsxs)(s.td,{children:["Open a terminal window and execute ",(0,t.jsx)(s.code,{children:"systemsettings"})]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Regional Settings"})," > ",(0,t.jsx)(s.strong,{children:"Date and Time"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Configure the date and time of your system.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["If you want Solus to set the date and time automatically, select ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["If you want to set the date and time manually, clear the ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"})," checkbox, then use the available controls.\n",(0,t.jsx)(s.img,{alt:"Plasma date and time settings",src:n(46488).Z+"",width:"1022",height:"730"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Configure the time zone of your system.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Time Zone"})," tab."]}),"\n",(0,t.jsx)(s.li,{children:"Select a time zone from the list."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Customize how the time and date display in the bottom panel.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Right-click the digital clock widget on the bottom panel."}),"\n",(0,t.jsxs)(s.li,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure Digital Clock..."})]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-system-settings",children:"Configuring default applications from System Settings"}),"\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Applications"})," > ",(0,t.jsx)(s.strong,{children:"Default Applications"}),", then use the menus to select your preferred default applications."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Default applications",src:n(74995).Z+"",width:"1022",height:"731"})}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-the-file-manager",children:"Configuring default applications from the file manager"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open Dolphin."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Navigate to the folder that contains the file you want to open."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Right-click the file."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Context menu",src:n(9501).Z+"",width:"714",height:"456"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Go to ",(0,t.jsx)(s.strong,{children:"Open With"})," > ",(0,t.jsx)(s.strong,{children:"Other Application"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Choose Application"})," dialog appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Choose the application you want to use from the list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Remember application association for all files of type [file type]"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Choose application dialog",src:n(65400).Z+"",width:"373",height:"571"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Press ",(0,t.jsx)(s.code,{children:"Super + P"})," to access the screen layout settings."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Hardware"})," > ",(0,t.jsx)(s.strong,{children:"Display and Monitor"})," > ",(0,t.jsx)(s.strong,{children:"Display Configuration"}),"."]}),"\n",(0,t.jsx)(s.li,{children:"Select the display you want to configure."}),"\n",(0,t.jsxs)(s.li,{children:["Configure the available settings as needed.\n",(0,t.jsx)(s.img,{alt:"Screen settings available in Solus Plasma",src:n(56304).Z+"",width:"1021",height:"763"})]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-keyboard-layouts",children:"Configuring keyboard layouts"}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["If you need to input languages that do not use Latin characters (for example, Chinese or Japanese), ",(0,t.jsx)(s.a,{href:"#using-ibus",children:"use IBus instead"}),"."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Keyboard"})," > ",(0,t.jsx)(s.strong,{children:"Layouts"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The layouts screen appears.\n",(0,t.jsx)(s.img,{alt:"Keyboard layouts",src:n(52570).Z+"",width:"743",height:"728"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure layouts"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure keyboard layouts as you need."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To add a keyboard layout click ",(0,t.jsx)(s.strong,{children:"Add"}),", select a layout from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To remove a keyboard layout select a layout from the list and click ",(0,t.jsx)(s.strong,{children:"Remove"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To order the list of keyboard layouts, select a layout from the list, then use the ",(0,t.jsx)(s.strong,{children:"Move Up"})," and ",(0,t.jsx)(s.strong,{children:"Move Down"})," buttons to reorder the list."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Configure a keyboard shortcut to switch between layouts by using the options under ",(0,t.jsx)(s.strong,{children:"Shortcuts for Switching Layout"}),"."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To use the default shortcuts Solus Plasma provides, use the ",(0,t.jsx)(s.strong,{children:"Main shortcuts"})," and ",(0,t.jsx)(s.strong,{children:"3rd level shortcuts"})," options."]}),"\n",(0,t.jsxs)(s.li,{children:["To use a custom shortcut, use the ",(0,t.jsx)(s.strong,{children:"Alternative shortcut"})," option."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"using-ibus",children:"Using IBus"}),"\n",(0,t.jsx)(s.p,{children:"Solus Plasma includes IBus installed by default. However, you need to enable and integrate IBus with Plasma before usage."}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Using IBus overrides the configuration in the ",(0,t.jsx)(s.strong,{children:"Layouts"})," section of ",(0,t.jsx)(s.strong,{children:"System Settings"})]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open the ",(0,t.jsx)(s.code,{children:"/home/[username]/.bashrc"})," file with a text editor."]}),"\n",(0,t.jsx)(s.li,{children:"Add the following lines at the end of the file."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"export GTK_IM_MODULE=ibus\nexport QT_IM_MODULE=ibus\nexport XMODIFIERS=@im=ibus\n"})}),"\n",(0,t.jsxs)(s.ol,{start:"3",children:["\n",(0,t.jsx)(s.li,{children:"Save the file."}),"\n",(0,t.jsxs)(s.li,{children:["Configure IBus to autostart.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Startup and Shutdown"})," > ",(0,t.jsx)(s.strong,{children:"Autostart"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),", then ",(0,t.jsx)(s.strong,{children:"Add Application"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["In the search box, enter ",(0,t.jsx)(s.code,{children:"ibus-daemon -rxR"})," and press ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Log out from your session, then log in again."}),"\n",(0,t.jsxs)(s.li,{children:["Configure keyboard layouts as you need.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open ",(0,t.jsx)(s.strong,{children:"IBus Preferences"})," from the application launcher."]}),"\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.strong,{children:"Input Method"})," tab, add the keyboard layout you need."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Some keyboard layouts require ",(0,t.jsx)(s.a,{href:"/docs/user/software/localization/ibus",children:"installing additional packages"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to the appropriate configuration screen:","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To configure the mouse, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Mouse"}),".\n",(0,t.jsx)(s.img,{alt:"Mouse settings",src:n(70080).Z+"",width:"749",height:"343"})]}),"\n",(0,t.jsxs)(s.li,{children:["To configure the touchpad, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Touchpad"}),".\n",(0,t.jsx)(s.img,{alt:"Touchpad settings",src:n(95387).Z+"",width:"748",height:"591"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"network-settings",children:"Network settings"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Networks"})," widget on the bottom panel allows you to perform frequent networking tasks, such as connecting to a Wi-Fi network or enabling airplane mode."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Networks widget",src:n(80253).Z+"",width:"460",height:"489"})}),"\n",(0,t.jsx)(s.h3,{id:"connecting-to-a-hidden-wi-fi-network",children:"Connecting to a hidden Wi-Fi network"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"System Settings"})," screen, go to ",(0,t.jsx)(s.strong,{children:"Network"})," > ",(0,t.jsx)(s.strong,{children:"Connections"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Add new connection"})," icon (+)."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Wi-Fi"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"New Connection"})," window appears.\n",(0,t.jsx)(s.img,{alt:"New connection settings",src:n(98991).Z+"",width:"651",height:"656"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi"})," tab, specify the name (SSID) and basic network settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi Security"})," tab, configure the password or other authentication settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Use the ",(0,t.jsx)(s.strong,{children:"IPv4"}),", ",(0,t.jsx)(s.strong,{children:"IPv6"})," and ",(0,t.jsx)(s.strong,{children:"General configuration"})," tabs to configure additional settings, such as DNS servers."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Save"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Audio Volume widget",src:n(14781).Z+"",width:"497",height:"489"})}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Audio Volume"})," widget on the bottom panel allows you to perform the following tasks:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Task"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active output device"}),(0,t.jsx)(s.td,{children:"Select any of the available output devices to change the active output device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active input device"}),(0,t.jsx)(s.td,{children:"Select any of the available input devices to change the active input device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Control the volume of a device"}),(0,t.jsx)(s.td,{children:"Use the sliders to adjust the master volume of an input/output device."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Adjust the volume for a specific app"}),(0,t.jsxs)(s.td,{children:["The ",(0,t.jsx)(s.strong,{children:"Volume"})," tab allows you to control the volume for a specific application."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Open the audio settings"}),(0,t.jsxs)(s.td,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Configure Audio Devices"})," button to open the audio configuration screen in System Settings."]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(s.h3,{id:"adding-user-accounts",children:"Adding user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add New User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure the necessary settings."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Add user account",src:n(69367).Z+"",width:"752",height:"731"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"})]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Authentication Required"})," window appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Specify your user password and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"removing-user-accounts",children:"Removing user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Select an account from the user list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Delete User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["To delete the the user account files, select ",(0,t.jsx)(s.strong,{children:"Delete files"}),"; to keep the files for posterior use, select ",(0,t.jsx)(s.strong,{children:"Keep files"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keep or delete user files",src:n(49300).Z+"",width:"671",height:"525"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(s.h3,{id:"customizing-the-desktop",children:"Customizing the desktop"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen allows you to customize various aspects of your desktop, such as the wallpaper and the desktop icons. To open ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen, right-click anywhere on the desktop and select ",(0,t.jsx)(s.strong,{children:"Configure Desktop and Wallpaper..."}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Desktop context menu",src:n(53004).Z+"",width:"537",height:"355"})}),"\n",(0,t.jsxs)(s.p,{children:["The following table describes how to customize the desktop using the ",(0,t.jsx)(s.strong,{children:"Desktop Folder Settings"})," screen."]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Section"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the wallpaper"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, choose an image from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Hide the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, change ",(0,t.jsx)(s.strong,{children:"Layout"})," to ",(0,t.jsx)(s.strong,{children:"Desktop"}),", and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Configure mouse gestures"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Mouse Actions"})," section to setup mouse gestures."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the folder displayed on the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Location"})," section, select a location in your system, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the appearance of the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Icons"})," section, configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Display only specific files in the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Filter"})," section,configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]})]})]}),"\n",(0,t.jsx)(s.admonition,{type:"info",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Icons"})," and ",(0,t.jsx)(s.strong,{children:"Location"})," are only available when the desktop layout is set to ",(0,t.jsx)(s.strong,{children:"Folder View"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"virtual-desktops",children:"Virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"Plasma allows you to have multiple desktops on your computer."}),"\n",(0,t.jsx)(s.p,{children:"Virtual desktops are helpful to keep tasks organized and avoid clutter. For example, you could have one virtual desktop for work, one for school, and one for personal use."}),"\n",(0,t.jsx)(s.p,{children:"Plasma arranges virtual desktops in a grid. You can configure the rows of the grid to suit your needs."}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Solus Plasma has one virtual desktop and one row by default."})}),"\n",(0,t.jsx)(s.h3,{id:"creating-virtual-desktops",children:"Creating virtual desktops"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Workspace Behavior"})," > ",(0,t.jsx)(s.strong,{children:"Virtual Desktops"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Define the number of rows in the grid."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Create a new virtual desktop."}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Click the ",(0,t.jsx)(s.strong,{children:"Rename"})," button to change the name of the virtual desktop."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Repeat the previous step to add multiple virtual desktops."}),"\n",(0,t.jsx)(s.admonition,{type:"caution",children:(0,t.jsx)(s.p,{children:"Plasma arranges the desktops by the rows automatically."})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"(Optional) Configure the behavior of the virtual desktops."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Navigation wraps around"}),": Lets you cycle through your virtual desktops in a loop using keyboard shortcuts or mouse gestures."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show animation when switching"}),": Displays animations when switching between virtual desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show on-screen display when switching"}),": Displays the name of the current desktop when switching between desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show desktop layout indicators"}),": Displays the virtual desktop grid when you switch between desktops."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Plasma displays the virtual desktop grid next to the application launcher button.\n",(0,t.jsx)(s.img,{alt:"Virtual desktop grid",src:n(86582).Z+"",width:"375",height:"325"})]})}),"\n",(0,t.jsx)(s.h3,{id:"switching-between-virtual-desktops",children:"Switching between virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"The following table outlines the methods to change between desktops in Solus Plasma."}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using the applet in the bottom panel"}),(0,t.jsx)(s.td,{children:"Use the the virtual desktop grid next to the application launcher button to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using mouse gestures"}),(0,t.jsx)(s.td,{children:"Move the mouse pointer anywhere in the desktop, then move the mouse wheel to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using keyboard shortcuts"}),(0,t.jsxs)(s.td,{children:["Open System Settings, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Shortcuts"})," > ",(0,t.jsx)(s.strong,{children:"KWin"}),", then search for ",(0,t.jsx)(s.code,{children:"desktop"})," to see the available keyboard shortcuts to switch between virtual desktops"]})]})]})]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keyboard shortcuts to switch between desktops",src:n(79834).Z+"",width:"1150",height:"859"})}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Some of the keyboard shortcuts are disabled by default."})})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},69367:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/add-user-account-1e83f41522d5b43ae2f29250e52bb758.png"},14781:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/audio-widget-48a0e65d8e699ad8ca493a1e2dfcfb10.png"},65400:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/choose-application-f3747627db0cff378d7192b6c7b253f0.png"},46488:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/date-time-9e18cbfa859270a81d6973cab14ae1b6.png"},74995:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/default-apps-screen-3da638bbc4ab452b8242fb718543a132.png"},53004:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/desktop-context-menu-2a7196d846dab6acdff78dacb64b3fd6.png"},9501:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/file-context-menu-default-app-0816ad4ab5c64beeef9817dad6cbaeb7.png"},49300:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keep-delete-files-9a5622ed38b6dd5a1002312f0a7a01cd.png"},52570:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keyboard-layouts-468ec6547841069b372a81ef4120a67b.png"},70080:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/mouse-settings-0ec1470b23397d7d0aba492f1f4806fe.png"},80253:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/networks-widget-5446dcc803349c7a20e445393930a00a.png"},98991:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/new-wifi-network-b1c4e7f299993318ae998c66b217fa69.png"},56304:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/screen-configuration-2fd6ef5f5d7a1d590ae67d553f6f58c9.png"},79834:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/switch-desktop-shortcut-list-8b9812e81259bd41b56730a22d11728b.png"},95387:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/touchpad-settings-71fa3d9caf82f2103b978f12bf73a5be.png"},86582:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/vd-grid-bb98a6b6492fe334b36271eac65b4acb.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>o});var t=n(67294);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d00f7e62.20392454.js b/assets/js/d00f7e62.20392454.js deleted file mode 100644 index 5fba4cb8b..000000000 --- a/assets/js/d00f7e62.20392454.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[255],{67868:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=a(85893),t=a(11151);const s={title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},i="Your First Package Update",r={id:"packaging/your-first-package-update",title:"Your First Package Update",description:"This page will guide you through the steps required to build your first package. This is really a test to make sure that your build environment is set up correctly. You will clone an existing package, build it, then install it, and finally remove it.",source:"@site/docs/packaging/your-first-package-update.md",sourceDirName:"packaging",slug:"/packaging/your-first-package-update",permalink:"/docs/packaging/your-first-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/your-first-package-update.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},sidebar:"packagingSidebar",previous:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Cloning and building nano
",id:"cloning-and-building-nano",level:2},{value:"Installing your newnano
package",id:"installing-your-new-nano-package",level:2},{value:"Returning to the repository version (optional)",id:"returning-to-the-repository-version-optional",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"your-first-package-update",children:"Your First Package Update"})}),"\n",(0,o.jsxs)(n.p,{children:["This page will guide you through the steps required to build your first package. This is really a test to make sure that your ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging",children:"build environment is set up correctly"}),". You will clone an existing package, build it, then install it, and finally remove it."]}),"\n",(0,o.jsxs)(n.h2,{id:"cloning-and-building-nano",children:["Cloning and building ",(0,o.jsx)(n.code,{children:"nano"})]}),"\n",(0,o.jsxs)(n.p,{children:["For this example we will use the text editor ",(0,o.jsx)(n.code,{children:"nano"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Change to your packaging directory. Your directory may have a different name or location:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Switch to the directory containing the ",(0,o.jsx)(n.code,{children:"nano"})," recipe:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd packages/n/nano\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, if you've set up the ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"Monorepo Helper Functions"})," you can replace the above to steps by these simple commands",":n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"gotosoluspkgs\ngotopkg nano\n"})}),"\n",(0,o.jsx)(n.p,{children:'Increase the release number by one ("bump" the package) and then check the results:'}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task bump\ngit diff\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see output from git similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-diff",children:"diff --git a/package.yml b/package.yml\nindex 2ff1756..4bc344c 100644\n--- a/package.yml\n+++ b/package.yml\n@@ -1,6 +1,6 @@\n name : nano\n version : '7.2'\n-release : 161\n+release : 162\n source :\n - https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526\n homepage : https://www.nano-editor.org\n"})}),"\n",(0,o.jsx)(n.p,{children:"Next, build the package:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You will be prompted to enter your password by sudo, and the ",(0,o.jsx)(n.code,{children:"solbuild"})," tool will build the package.\nIf the build is successful, you will have a ",(0,o.jsx)(n.code,{children:"nano"})," package file with a name like ",(0,o.jsx)(n.code,{children:"nano-7.2-161-1-x86_64.eopkg"}),". Run the ",(0,o.jsx)(n.code,{children:"ls"})," tool to check the exact name:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ ls\nabi_used_libs files package.yml\nabi_used_symbols nano-7.2-162-1-x86_64.eopkg pspec_x86_64.xml\n"})}),"\n",(0,o.jsx)(n.p,{children:"Congratulations! You have successfully built your first package on Solus."}),"\n",(0,o.jsxs)(n.h2,{id:"installing-your-new-nano-package",children:["Installing your new ",(0,o.jsx)(n.code,{children:"nano"})," package"]}),"\n",(0,o.jsxs)(n.p,{children:["To install your new ",(0,o.jsx)(n.code,{children:"nano"})," package, run the following command. Your filename will probably be slightly different."]}),"\n",(0,o.jsx)(n.p,{children:"This is done so you can test that the package works as expected. Each package submission will require you to describe what testing you did."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it nano-7.2-162-1-x86_64.eopkg\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Testing ",(0,o.jsx)(n.code,{children:"nano"})," is pretty easy. Testing other packages may be more complicated, depending on what they do."]}),"\n",(0,o.jsxs)(n.p,{children:["To test your newly built ",(0,o.jsx)(n.code,{children:"nano"})," package, simply run it on command line, then make sure you can edit and save a file."]}),"\n",(0,o.jsx)(n.h2,{id:"returning-to-the-repository-version-optional",children:"Returning to the repository version (optional)"}),"\n",(0,o.jsx)(n.p,{children:"It is a good idea to remove the package you built, and return to the repository version, once you are done testing."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it --reinstall nano\n"})})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>i});var o=a(67294);const t={},s=o.createContext(t);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d00f7e62.c0883b3e.js b/assets/js/d00f7e62.c0883b3e.js new file mode 100644 index 000000000..d4f124226 --- /dev/null +++ b/assets/js/d00f7e62.c0883b3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8332"],{55637:function(e,n,a){a.r(n),a.d(n,{metadata:()=>o,contentTitle:()=>r,default:()=>p,assets:()=>l,toc:()=>c,frontMatter:()=>s});var o=JSON.parse('{"id":"packaging/your-first-package-update","title":"Your First Package Update","description":"This page will guide you through the steps required to build your first package. This is really a test to make sure that your build environment is set up correctly. You will clone an existing package, build it, then install it, and finally remove it.","source":"@site/docs/packaging/your-first-package-update.md","sourceDirName":"packaging","slug":"/packaging/your-first-package-update","permalink":"/docs/packaging/your-first-package-update","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/your-first-package-update.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Your First Package Update","summary":"An example of how to build a package that exists in the Solus repos for new packagers."},"sidebar":"packagingSidebar","previous":{"title":"Troubleshooting for Packagers","permalink":"/docs/packaging/troubleshooting-packaging"}}'),t=a("85893"),i=a("50065");let s={title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},r="Your First Package Update",l={},c=[{value:"Cloning and buildingnano
",id:"cloning-and-building-nano",level:2},{value:"Installing your newnano
package",id:"installing-your-new-nano-package",level:2},{value:"Returning to the repository version (optional)",id:"returning-to-the-repository-version-optional",level:2}];function d(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"your-first-package-update",children:"Your First Package Update"})}),"\n",(0,t.jsxs)(n.p,{children:["This page will guide you through the steps required to build your first package. This is really a test to make sure that your ",(0,t.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging",children:"build environment is set up correctly"}),". You will clone an existing package, build it, then install it, and finally remove it."]}),"\n",(0,t.jsxs)(n.h2,{id:"cloning-and-building-nano",children:["Cloning and building ",(0,t.jsx)(n.code,{children:"nano"})]}),"\n",(0,t.jsxs)(n.p,{children:["For this example we will use the text editor ",(0,t.jsx)(n.code,{children:"nano"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Change to your packaging directory. Your directory may have a different name or location:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Switch to the directory containing the ",(0,t.jsx)(n.code,{children:"nano"})," recipe:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd packages/n/nano\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, if you've set up the ",(0,t.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"Monorepo Helper Functions"})," you can replace the above to steps by these simple commands",":n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"gotosoluspkgs\ngotopkg nano\n"})}),"\n",(0,t.jsx)(n.p,{children:'Increase the release number by one ("bump" the package) and then check the results:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"go-task bump\ngit diff\n"})}),"\n",(0,t.jsx)(n.p,{children:"You should see output from git similar to the following:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-diff",children:"diff --git a/package.yml b/package.yml\nindex 2ff1756..4bc344c 100644\n--- a/package.yml\n+++ b/package.yml\n@@ -1,6 +1,6 @@\n name : nano\n version : '7.2'\n-release : 161\n+release : 162\n source :\n - https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526\n homepage : https://www.nano-editor.org\n"})}),"\n",(0,t.jsx)(n.p,{children:"Next, build the package:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You will be prompted to enter your password by sudo, and the ",(0,t.jsx)(n.code,{children:"solbuild"})," tool will build the package.\nIf the build is successful, you will have a ",(0,t.jsx)(n.code,{children:"nano"})," package file with a name like ",(0,t.jsx)(n.code,{children:"nano-7.2-161-1-x86_64.eopkg"}),". Run the ",(0,t.jsx)(n.code,{children:"ls"})," tool to check the exact name:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ ls\nabi_used_libs files package.yml\nabi_used_symbols nano-7.2-162-1-x86_64.eopkg pspec_x86_64.xml\n"})}),"\n",(0,t.jsx)(n.p,{children:"Congratulations! You have successfully built your first package on Solus."}),"\n",(0,t.jsxs)(n.h2,{id:"installing-your-new-nano-package",children:["Installing your new ",(0,t.jsx)(n.code,{children:"nano"})," package"]}),"\n",(0,t.jsxs)(n.p,{children:["To install your new ",(0,t.jsx)(n.code,{children:"nano"})," package, run the following command. Your filename will probably be slightly different."]}),"\n",(0,t.jsx)(n.p,{children:"This is done so you can test that the package works as expected. Each package submission will require you to describe what testing you did."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it nano-7.2-162-1-x86_64.eopkg\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Testing ",(0,t.jsx)(n.code,{children:"nano"})," is pretty easy. Testing other packages may be more complicated, depending on what they do."]}),"\n",(0,t.jsxs)(n.p,{children:["To test your newly built ",(0,t.jsx)(n.code,{children:"nano"})," package, simply run it on command line, then make sure you can edit and save a file."]}),"\n",(0,t.jsx)(n.h2,{id:"returning-to-the-repository-version-optional",children:"Returning to the repository version (optional)"}),"\n",(0,t.jsx)(n.p,{children:"It is a good idea to remove the package you built, and return to the repository version, once you are done testing."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it --reinstall nano\n"})})]})}function p(e={}){let{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},50065:function(e,n,a){a.d(n,{Z:function(){return r},a:function(){return s}});var o=a(67294);let t={},i=o.createContext(t);function s(e){let n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d0d2faf6.69666dde.js b/assets/js/d0d2faf6.69666dde.js new file mode 100644 index 000000000..17a0a8d22 --- /dev/null +++ b/assets/js/d0d2faf6.69666dde.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7744"],{64348:function(e,s,a){a.r(s),a.d(s,{metadata:()=>t,contentTitle:()=>o,default:()=>h,assets:()=>c,toc:()=>l,frontMatter:()=>i});var t=JSON.parse('{"id":"packaging/procedures/release-processes","title":"Release Processes","description":"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model.","source":"@site/docs/packaging/procedures/release-processes.md","sourceDirName":"packaging/procedures","slug":"/packaging/procedures/release-processes","permalink":"/docs/packaging/procedures/release-processes","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/release-processes.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Release Processes","summary":"Release Processes"},"sidebar":"packagingSidebar","previous":{"title":"Package Inclusion Policy","permalink":"/docs/packaging/procedures/package-inclusion"},"next":{"title":"Requesting a Package Update","permalink":"/docs/packaging/procedures/request-a-package-update"}}'),n=a("85893"),r=a("50065");let i={title:"Release Processes",summary:"Release Processes"},o="Release Processes",c={},l=[{value:"Repository staging",id:"repository-staging",level:2},{value:"Weekly Sync - Every Friday",id:"weekly-sync---every-friday",level:2},{value:"Package deprecation",id:"package-deprecation",level:2},{value:"Deprecating a package",id:"deprecating-a-package",level:3},{value:"Un-deprecating a package",id:"un-deprecating-a-package",level:3},{value:"Major stack changes",id:"major-stack-changes",level:2}];function d(e){let s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"release-processes",children:"Release Processes"})}),"\n",(0,n.jsx)(s.p,{children:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model."}),"\n",(0,n.jsx)(s.h2,{id:"repository-staging",children:"Repository staging"}),"\n",(0,n.jsxs)(s.p,{children:["All package builds for Solus, updates or otherwise, will always enter the ",(0,n.jsx)(s.code,{children:"unstable"})," repository first. Consequently, all Solus developers and contributors should ensure ",(0,n.jsx)(s.code,{children:"solbuild"})," is configured to use the unstable target. As and when the weekly stabilization efforts have completed, the ",(0,n.jsx)(s.code,{children:"unstable"})," repository will be pulled into ",(0,n.jsx)(s.code,{children:"shannon"}),", the stable target."]}),"\n",(0,n.jsxs)(s.p,{children:["This effectively means that ",(0,n.jsx)(s.code,{children:"shannon"})," is a rolling snapshot of ",(0,n.jsx)(s.code,{children:"unstable"}),". Note that the weekly sync will not make each repository match identically - the ",(0,n.jsx)(s.strong,{children:"tip"})," of every package in ",(0,n.jsx)(s.code,{children:"unstable"})," will be merged into ",(0,n.jsx)(s.code,{children:"shannon"}),". This ensures that the ",(0,n.jsx)(s.code,{children:"shannon"})," update path is cost-efficient in terms of package availability, and that the delta packages provided on ",(0,n.jsx)(s.code,{children:"shannon"})," match the true update path for those users. Lastly, this also ensures that there are no unintended packages arriving in shannon from older builds."]}),"\n",(0,n.jsxs)(s.p,{children:["Solus installations always default to the ",(0,n.jsx)(s.code,{children:"shannon"})," repository, making shannon the published distribution, and ",(0,n.jsx)(s.code,{children:"unstable"})," the development distribution."]}),"\n",(0,n.jsx)(s.h2,{id:"weekly-sync---every-friday",children:"Weekly Sync - Every Friday"}),"\n",(0,n.jsx)(s.p,{children:"At minimum there shall be one sync per week - this will always be on a Friday. As a result, users are never more than a few days away from unstable. This allows packagers to make deeper changes to Solus and still have time to stabilize the repository before releasing changes on the Friday."}),"\n",(0,n.jsxs)(s.p,{children:["Given the high volume of changes within Solus in any sync window, the Friday sync should be viewed more as a release than a simple sync. All developers and contributors should try their best to ensure that their changes do not introduce regressions, and that existing update paths are ",(0,n.jsx)(s.strong,{children:"always respected"}),"."]}),"\n",(0,n.jsx)(s.p,{children:"Minor syncs during the week, and correctional syncs shortly after the Friday-sync, are permitted assuming they do not introduce breaking changes to shannon. These may include minor packaging changes, security updates, etc."}),"\n",(0,n.jsx)(s.h2,{id:"package-deprecation",children:"Package deprecation"}),"\n",(0,n.jsx)(s.p,{children:"There are times when a package may need to be deprecated or even renamed. Packagers owning these changes must first communicate the need to ensure a coordinated deprecation."}),"\n",(0,n.jsxs)(s.p,{children:["Deprecated packages will remove themselves from the users systems as the first operation in an update or package install using the package manager, once marked as ",(0,n.jsx)(s.code,{children:"Obsolete"})," in the index."]}),"\n",(0,n.jsx)(s.h3,{id:"deprecating-a-package",children:"Deprecating a package"}),"\n",(0,n.jsx)(s.p,{children:"Follow these steps to submit a package for deprecation:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,n.jsx)(s.code,{children:"packages"})," repository ",(0,n.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "deprecate-foobar"']}),"\n",(0,n.jsxs)(s.li,{children:["Edit ",(0,n.jsx)(s.code,{children:"repo_data/distribution.xml.in"})]}),"\n",(0,n.jsxs)(s.li,{children:["Add the package you wish to deprecate at the end of the ",(0,n.jsx)(s.code,{children:""})," section"]}),"\n",(0,n.jsxs)(s.li,{children:["Change directory to repo_data (",(0,n.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,n.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,n.jsxs)(s.li,{children:["Remove the package from the Solus ",(0,n.jsx)(s.code,{children:"packages"})," repository, for example ",(0,n.jsx)(s.code,{children:"rm -fr packages/f/foobar"})]}),"\n",(0,n.jsx)(s.li,{children:"Commit and push your changes to your repository/branch"}),"\n",(0,n.jsx)(s.li,{children:"Open a Pull Request on GitHub"}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"un-deprecating-a-package",children:"Un-deprecating a package"}),"\n",(0,n.jsx)(s.p,{children:"The above steps also apply to un-deprecating a package, with the following additions:"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,n.jsx)(s.code,{children:"packages"})," repository ",(0,n.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "undeprecate-foobar"']}),"\n",(0,n.jsxs)(s.li,{children:["Find the commit deprecating the package and restore the package within the repository structure. For example restore all files in packages/f/foobar or use ",(0,n.jsx)(s.code,{children:"git revert"})," if appropriate"]}),"\n",(0,n.jsxs)(s.li,{children:["Edit ",(0,n.jsx)(s.code,{children:"repo_data/distribution.xml.in"})," and remove the package you wish to undeprecate in the ",(0,n.jsx)(s.code,{children:" "})," section"]}),"\n",(0,n.jsxs)(s.li,{children:["Change directory to repo_data (",(0,n.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,n.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,n.jsxs)(s.li,{children:["Open a Pull Request on GitHub and ask a Solus Staff member to use available tooling to update the repository files, then index the repository with ",(0,n.jsx)(s.code,{children:"ferryctl index unstable"})," (or do it yourself if you have the ability)"]}),"\n",(0,n.jsx)(s.li,{children:"Bump or update the package"}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"major-stack-changes",children:"Major stack changes"}),"\n",(0,n.jsx)(s.p,{children:"Large stack upgrades should begin as closely to the last Friday sync as possible, to ensure there is plenty of time for the work to be completed, integrated, and tested for regressions."})]})}function h(e={}){let{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},50065:function(e,s,a){a.d(s,{Z:function(){return o},a:function(){return i}});var t=a(67294);let n={},r=t.createContext(n);function i(e){let s=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d0d2faf6.f0f9583d.js b/assets/js/d0d2faf6.f0f9583d.js deleted file mode 100644 index 77212a107..000000000 --- a/assets/js/d0d2faf6.f0f9583d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4507],{79267:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var t=a(85893),n=a(11151);const r={title:"Release Processes",summary:"Release Processes"},o="Release Processes",i={id:"packaging/procedures/release-processes",title:"Release Processes",description:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model.",source:"@site/docs/packaging/procedures/release-processes.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/release-processes",permalink:"/docs/packaging/procedures/release-processes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/release-processes.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Release Processes",summary:"Release Processes"},sidebar:"packagingSidebar",previous:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"},next:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"}},c={},l=[{value:"Repository staging",id:"repository-staging",level:2},{value:"Weekly Sync - Every Friday",id:"weekly-sync---every-friday",level:2},{value:"Package deprecation",id:"package-deprecation",level:2},{value:"Deprecating a package",id:"deprecating-a-package",level:3},{value:"Un-deprecating a package",id:"un-deprecating-a-package",level:3},{value:"Major stack changes",id:"major-stack-changes",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"release-processes",children:"Release Processes"})}),"\n",(0,t.jsx)(s.p,{children:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model."}),"\n",(0,t.jsx)(s.h2,{id:"repository-staging",children:"Repository staging"}),"\n",(0,t.jsxs)(s.p,{children:["All package builds for Solus, updates or otherwise, will always enter the ",(0,t.jsx)(s.code,{children:"unstable"})," repository first. Consequently, all Solus developers and contributors should ensure ",(0,t.jsx)(s.code,{children:"solbuild"})," is configured to use the unstable target. As and when the weekly stabilization efforts have completed, the ",(0,t.jsx)(s.code,{children:"unstable"})," repository will be pulled into ",(0,t.jsx)(s.code,{children:"shannon"}),", the stable target."]}),"\n",(0,t.jsxs)(s.p,{children:["This effectively means that ",(0,t.jsx)(s.code,{children:"shannon"})," is a rolling snapshot of ",(0,t.jsx)(s.code,{children:"unstable"}),". Note that the weekly sync will not make each repository match identically - the ",(0,t.jsx)(s.strong,{children:"tip"})," of every package in ",(0,t.jsx)(s.code,{children:"unstable"})," will be merged into ",(0,t.jsx)(s.code,{children:"shannon"}),". This ensures that the ",(0,t.jsx)(s.code,{children:"shannon"})," update path is cost-efficient in terms of package availability, and that the delta packages provided on ",(0,t.jsx)(s.code,{children:"shannon"})," match the true update path for those users. Lastly, this also ensures that there are no unintended packages arriving in shannon from older builds."]}),"\n",(0,t.jsxs)(s.p,{children:["Solus installations always default to the ",(0,t.jsx)(s.code,{children:"shannon"})," repository, making shannon the published distribution, and ",(0,t.jsx)(s.code,{children:"unstable"})," the development distribution."]}),"\n",(0,t.jsx)(s.h2,{id:"weekly-sync---every-friday",children:"Weekly Sync - Every Friday"}),"\n",(0,t.jsx)(s.p,{children:"At minimum there shall be one sync per week - this will always be on a Friday. As a result, users are never more than a few days away from unstable. This allows packagers to make deeper changes to Solus and still have time to stabilize the repository before releasing changes on the Friday."}),"\n",(0,t.jsxs)(s.p,{children:["Given the high volume of changes within Solus in any sync window, the Friday sync should be viewed more as a release than a simple sync. All developers and contributors should try their best to ensure that their changes do not introduce regressions, and that existing update paths are ",(0,t.jsx)(s.strong,{children:"always respected"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Minor syncs during the week, and correctional syncs shortly after the Friday-sync, are permitted assuming they do not introduce breaking changes to shannon. These may include minor packaging changes, security updates, etc."}),"\n",(0,t.jsx)(s.h2,{id:"package-deprecation",children:"Package deprecation"}),"\n",(0,t.jsx)(s.p,{children:"There are times when a package may need to be deprecated or even renamed. Packagers owning these changes must first communicate the need to ensure a coordinated deprecation."}),"\n",(0,t.jsxs)(s.p,{children:["Deprecated packages will remove themselves from the users systems as the first operation in an update or package install using the package manager, once marked as ",(0,t.jsx)(s.code,{children:"Obsolete"})," in the index."]}),"\n",(0,t.jsx)(s.h3,{id:"deprecating-a-package",children:"Deprecating a package"}),"\n",(0,t.jsx)(s.p,{children:"Follow these steps to submit a package for deprecation:"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "deprecate-foobar"']}),"\n",(0,t.jsxs)(s.li,{children:["Edit ",(0,t.jsx)(s.code,{children:"repo_data/distribution.xml.in"})]}),"\n",(0,t.jsxs)(s.li,{children:["Add the package you wish to deprecate at the end of the ",(0,t.jsx)(s.code,{children:" "})," section"]}),"\n",(0,t.jsxs)(s.li,{children:["Change directory to repo_data (",(0,t.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,t.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,t.jsxs)(s.li,{children:["Remove the package from the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository, for example ",(0,t.jsx)(s.code,{children:"rm -fr packages/f/foobar"})]}),"\n",(0,t.jsx)(s.li,{children:"Commit and push your changes to your repository/branch"}),"\n",(0,t.jsx)(s.li,{children:"Open a Pull Request on GitHub"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"un-deprecating-a-package",children:"Un-deprecating a package"}),"\n",(0,t.jsx)(s.p,{children:"The above steps also apply to un-deprecating a package, with the following additions:"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "undeprecate-foobar"']}),"\n",(0,t.jsxs)(s.li,{children:["Find the commit deprecating the package and restore the package within the repository structure. For example restore all files in packages/f/foobar or use ",(0,t.jsx)(s.code,{children:"git revert"})," if appropriate"]}),"\n",(0,t.jsxs)(s.li,{children:["Edit ",(0,t.jsx)(s.code,{children:"repo_data/distribution.xml.in"})," and remove the package you wish to undeprecate in the ",(0,t.jsx)(s.code,{children:" "})," section"]}),"\n",(0,t.jsxs)(s.li,{children:["Change directory to repo_data (",(0,t.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,t.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,t.jsxs)(s.li,{children:["Open a Pull Request on GitHub and ask a Solus Staff member to use available tooling to update the repository files, then index the repository with ",(0,t.jsx)(s.code,{children:"ferryctl index unstable"})," (or do it yourself if you have the ability)"]}),"\n",(0,t.jsx)(s.li,{children:"Bump or update the package"}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"major-stack-changes",children:"Major stack changes"}),"\n",(0,t.jsx)(s.p,{children:"Large stack upgrades should begin as closely to the last Friday sync as possible, to ensure there is plenty of time for the work to be completed, integrated, and tested for regressions."})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>i,a:()=>o});var t=a(67294);const n={},r=t.createContext(n);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d20919b7.02c2f2df.js b/assets/js/d20919b7.02c2f2df.js deleted file mode 100644 index ce4374597..000000000 --- a/assets/js/d20919b7.02c2f2df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2627],{20570:e=>{e.exports=JSON.parse('{"tag":{"label":"cleanup","permalink":"/blog/tags/cleanup","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/cleanup","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/d20919b7.cf59cb9e.js b/assets/js/d20919b7.cf59cb9e.js new file mode 100644 index 000000000..54ff8ce37 --- /dev/null +++ b/assets/js/d20919b7.cf59cb9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3237"],{33273:function(e){e.exports=JSON.parse('{"tag":{"label":"cleanup","permalink":"/blog/tags/cleanup","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/cleanup","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/d2363c7a.3ca2df4f.js b/assets/js/d2363c7a.3ca2df4f.js deleted file mode 100644 index 20f137ed1..000000000 --- a/assets/js/d2363c7a.3ca2df4f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2741],{1629:e=>{e.exports=JSON.parse('{"author":{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi","count":1},"listMetadata":{"permalink":"/blog/authors/alfi","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/d2363c7a.ffbb0747.js b/assets/js/d2363c7a.ffbb0747.js new file mode 100644 index 000000000..89380369d --- /dev/null +++ b/assets/js/d2363c7a.ffbb0747.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4154"],{1846:function(t){t.exports=JSON.parse('{"author":{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi","count":1},"listMetadata":{"permalink":"/blog/authors/alfi","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/d4762887.462d875b.js b/assets/js/d4762887.462d875b.js deleted file mode 100644 index 5d7cbfaf6..000000000 --- a/assets/js/d4762887.462d875b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3624],{1108:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var s=o(85893),n=o(11151);const i={title:"Installation Issues",summary:"Troubleshooting the Solus installation process"},l="Installation Issues",a={id:"user/troubleshooting/installation",title:"Installation Issues",description:"This article covers various issues that you may come across during installation of Solus.",source:"@site/docs/user/troubleshooting/installation.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/installation",permalink:"/docs/user/troubleshooting/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/installation.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Installation Issues",summary:"Troubleshooting the Solus installation process"},sidebar:"userSidebar",previous:{title:"Boot Rescue",permalink:"/docs/user/troubleshooting/boot-rescue"},next:{title:"Plasma Troubleshooting",permalink:"/docs/user/troubleshooting/plasma"}},r={},u=[{value:"Can't install in EFI mode",id:"cant-install-in-efi-mode",level:2},{value:"I can't boot into Solus after installation!",id:"i-cant-boot-into-solus-after-installation",level:2},{value:"Legacy/BIOS installation",id:"legacybios-installation",level:3},{value:"EFI",id:"efi",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"installation-issues",children:"Installation Issues"})}),"\n",(0,s.jsx)(t.p,{children:"This article covers various issues that you may come across during installation of Solus."}),"\n",(0,s.jsx)(t.h2,{id:"cant-install-in-efi-mode",children:"Can't install in EFI mode"}),"\n",(0,s.jsxs)(t.p,{children:["The live ISO will attempt to install Solus by the same method it was booted. If it is unable to install the boot loader to the ESP, then it is likely booted in legacy mode. Ensure that the ISO has been created via a ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/installation",children:"supported method"})," and that an EFI boot is selected from the boot options."]}),"\n",(0,s.jsxs)(t.p,{children:["You can check whether the Solus ISO has booted in EFI mode by checking the for the existence of ",(0,s.jsx)(t.code,{children:"ls /sys/firmware/efi"})," (if it's not found, then it's booted in legacy mode)."]}),"\n",(0,s.jsx)(t.h2,{id:"i-cant-boot-into-solus-after-installation",children:"I can't boot into Solus after installation!"}),"\n",(0,s.jsx)(t.p,{children:"There are some misunderstandings with how legacy and EFI boot work (usually implemented as UEFI). These sections cover the common misconceptions."}),"\n",(0,s.jsx)(t.h3,{id:"legacybios-installation",children:"Legacy/BIOS installation"}),"\n",(0,s.jsx)(t.p,{children:"Legacy installations on Solus use the GRUB boot loader on an MBR disk. Only one boot loader can be used on an MBR disk, so if you haven't installed the Solus boot loader on the MBR, you will need to boot into the other OS and update GRUB prior to being able to boot Solus. This will also be required on each update of the kernel to ensure you're booting the latest release."}),"\n",(0,s.jsx)(t.h3,{id:"efi",children:"EFI"}),"\n",(0,s.jsxs)(t.p,{children:["EFI allows for multiple boot loaders to be installed, which means you can boot the Solus boot loader directly. To ensure you are booting Solus you need to boot ",(0,s.jsx)(t.code,{children:"Linux Boot Manager"})," from the EFI options. Common keys for bringing up a boot menu or the options during boot are hitting ",(0,s.jsx)(t.code,{children:"Esc/F2/F9/F10/F11/F12"})," during boot (this differs per motherboard). If a boot loader for another OS is not listed in the menu, then it is not correctly registered (and therefore not installed correctly). You can make the Solus boot menu appear via ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/boot-management#displaying-the-boot-menu-by-default-every-boot",children:"Displaying the Solus boot menu on boot"})," which should be able to boot Windows (as it's registered with UEFI properly) as well as Solus, but not other systems."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d4762887.879a74c2.js b/assets/js/d4762887.879a74c2.js new file mode 100644 index 000000000..bea2d074d --- /dev/null +++ b/assets/js/d4762887.879a74c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["151"],{4984:function(e,t,o){o.r(t),o.d(t,{metadata:()=>n,contentTitle:()=>a,default:()=>d,assets:()=>r,toc:()=>u,frontMatter:()=>l});var n=JSON.parse('{"id":"user/troubleshooting/installation","title":"Installation Issues","description":"This article covers various issues that you may come across during installation of Solus.","source":"@site/docs/user/troubleshooting/installation.md","sourceDirName":"user/troubleshooting","slug":"/user/troubleshooting/installation","permalink":"/docs/user/troubleshooting/installation","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/installation.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Installation Issues","summary":"Troubleshooting the Solus installation process"},"sidebar":"userSidebar","previous":{"title":"Boot Rescue","permalink":"/docs/user/troubleshooting/boot-rescue"},"next":{"title":"Plasma Troubleshooting","permalink":"/docs/user/troubleshooting/plasma"}}'),s=o("85893"),i=o("50065");let l={title:"Installation Issues",summary:"Troubleshooting the Solus installation process"},a="Installation Issues",r={},u=[{value:"Can't install in EFI mode",id:"cant-install-in-efi-mode",level:2},{value:"I can't boot into Solus after installation!",id:"i-cant-boot-into-solus-after-installation",level:2},{value:"Legacy/BIOS installation",id:"legacybios-installation",level:3},{value:"EFI",id:"efi",level:3}];function c(e){let t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"installation-issues",children:"Installation Issues"})}),"\n",(0,s.jsx)(t.p,{children:"This article covers various issues that you may come across during installation of Solus."}),"\n",(0,s.jsx)(t.h2,{id:"cant-install-in-efi-mode",children:"Can't install in EFI mode"}),"\n",(0,s.jsxs)(t.p,{children:["The live ISO will attempt to install Solus by the same method it was booted. If it is unable to install the boot loader to the ESP, then it is likely booted in legacy mode. Ensure that the ISO has been created via a ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/installation",children:"supported method"})," and that an EFI boot is selected from the boot options."]}),"\n",(0,s.jsxs)(t.p,{children:["You can check whether the Solus ISO has booted in EFI mode by checking the for the existence of ",(0,s.jsx)(t.code,{children:"ls /sys/firmware/efi"})," (if it's not found, then it's booted in legacy mode)."]}),"\n",(0,s.jsx)(t.h2,{id:"i-cant-boot-into-solus-after-installation",children:"I can't boot into Solus after installation!"}),"\n",(0,s.jsx)(t.p,{children:"There are some misunderstandings with how legacy and EFI boot work (usually implemented as UEFI). These sections cover the common misconceptions."}),"\n",(0,s.jsx)(t.h3,{id:"legacybios-installation",children:"Legacy/BIOS installation"}),"\n",(0,s.jsx)(t.p,{children:"Legacy installations on Solus use the GRUB boot loader on an MBR disk. Only one boot loader can be used on an MBR disk, so if you haven't installed the Solus boot loader on the MBR, you will need to boot into the other OS and update GRUB prior to being able to boot Solus. This will also be required on each update of the kernel to ensure you're booting the latest release."}),"\n",(0,s.jsx)(t.h3,{id:"efi",children:"EFI"}),"\n",(0,s.jsxs)(t.p,{children:["EFI allows for multiple boot loaders to be installed, which means you can boot the Solus boot loader directly. To ensure you are booting Solus you need to boot ",(0,s.jsx)(t.code,{children:"Linux Boot Manager"})," from the EFI options. Common keys for bringing up a boot menu or the options during boot are hitting ",(0,s.jsx)(t.code,{children:"Esc/F2/F9/F10/F11/F12"})," during boot (this differs per motherboard). If a boot loader for another OS is not listed in the menu, then it is not correctly registered (and therefore not installed correctly). You can make the Solus boot menu appear via ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/boot-management#displaying-the-boot-menu-by-default-every-boot",children:"Displaying the Solus boot menu on boot"})," which should be able to boot Windows (as it's registered with UEFI properly) as well as Solus, but not other systems."]})]})}function d(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},50065:function(e,t,o){o.d(t,{Z:function(){return a},a:function(){return l}});var n=o(67294);let s={},i=n.createContext(s);function l(e){let t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5670106.484a3fb0.js b/assets/js/d5670106.484a3fb0.js deleted file mode 100644 index 22d4fbd6d..000000000 --- a/assets/js/d5670106.484a3fb0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1950],{60908:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>t,toc:()=>a});var n=o(85893),r=o(11151);const i={title:"Plasma Troubleshooting",summary:"Troubleshooting Issues With the Plasma Desktop"},l="Plasma Desktop Troubleshooting",t={id:"user/troubleshooting/plasma",title:"Plasma Troubleshooting",description:"This contains fixes for various issues you might encounter with the Plasma desktop environment.",source:"@site/docs/user/troubleshooting/plasma.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/plasma",permalink:"/docs/user/troubleshooting/plasma",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/plasma.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Plasma Troubleshooting",summary:"Troubleshooting Issues With the Plasma Desktop"},sidebar:"userSidebar",previous:{title:"Installation Issues",permalink:"/docs/user/troubleshooting/installation"}},c={},a=[{value:"Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)",id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",level:2},{value:"Application windows look corrupt / incomplete",id:"application-windows-look-corrupt--incomplete",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma-desktop-troubleshooting",children:"Plasma Desktop Troubleshooting"})}),"\n",(0,n.jsx)(s.p,{children:"This contains fixes for various issues you might encounter with the Plasma desktop environment."}),"\n",(0,n.jsx)(s.h2,{id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",children:'Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)'}),"\n",(0,n.jsx)(s.p,{children:"This is often caused by a Firefox bug. It can be triggered by various things, like moving Firefox windows."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Symptoms:"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Can't click on anything on the desktop."}),"\n",(0,n.jsx)(s.li,{children:"Bringing up windows with keyboard shortcuts (ex: Super for the app menu, F9 for a drop down terminal) works, but they don't get focused. You can't interact with them."}),"\n",(0,n.jsx)(s.li,{children:"Mouse cursor is stuck in move mode, it looks like a cross."}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["You may not need to reboot to recover from this state. Killing all ",(0,n.jsx)(s.code,{children:"firefox"})," processes may be all that's necessary. To do so:"]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Open a virtual terminal by pressing ",(0,n.jsx)(s.code,{children:"Ctrl+Alt+F3"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Run the following to kill all ",(0,n.jsx)(s.code,{children:"firefox"})," windows:"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"killall firefox\n"})}),"\n",(0,n.jsx)(s.p,{children:"This should close all Firefox windows."}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Return to the Plasma session by pressing ",(0,n.jsx)(s.code,{children:"Ctrl+Alt+F2"}),".\nYou should now be able to use Plasma normally."]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"application-windows-look-corrupt--incomplete",children:"Application windows look corrupt / incomplete"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Symptoms"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Application windows look corrupt. For example, NeoChat does not display room or user icons."}),"\n",(0,n.jsx)(s.li,{children:"Menus in an application are blank."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"You may be able to fix this by clearing KDE / Plasma cache files."}),"\n",(0,n.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,n.jsx)(s.p,{children:"You should not be logged into your Plasma session while deleting the cache files, booting from a live USB is necessary."})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"While still logged into your Plasma session, go to your home directory:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cd\n"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Run these commands to back up the following directories:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cp -av ~/.kde{,.bak}\ncp -av ~/.config{,.bak}\ncp -av ~/.local{,.bak}\ncp -av ~/share{,.bak}\n"})}),"\n",(0,n.jsxs)(s.p,{children:["The commands create a copy of the folders. Each copy has the ",(0,n.jsx)(s.code,{children:".bak"})," extension (Example: ",(0,n.jsx)(s.code,{children:"~/.config.bak"}),"). These can be used to recover configuration files, if necessary."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Shut down the system."}),"\n",(0,n.jsxs)(s.li,{children:["Boot from a live USB, which you can create from one of the ",(0,n.jsx)(s.a,{href:"https://getsol.us/download/",children:"Solus installers"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.a,{href:"/docs/user/troubleshooting/boot-rescue#mounting-your-system",children:"Mount your hard drive's file system"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Change to your user's directory where you mounted your file system. For example, if you used ",(0,n.jsx)(s.code,{children:"/mount"}),":"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cd /mount/home/username\n"})}),"\n",(0,n.jsx)(s.p,{children:'Replace "username" with the username you use for Solus.\nYou can make sure the directory is correct by listing the files:'}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"ls -laH\n"})}),"\n",(0,n.jsx)(s.p,{children:"You should see the files you would usually see in your home directory when logged into Solus normally."}),"\n",(0,n.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,n.jsxs)(s.p,{children:["Avoid deleting the following directories: ",(0,n.jsx)(s.code,{children:"~/.kde"}),", ",(0,n.jsx)(s.code,{children:"~/.kde4"}),", ",(0,n.jsx)(s.code,{children:"~/.local"}),", and ",(0,n.jsx)(s.code,{children:"~/.config"})]})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Remove the various caches that Plasma uses.\nExecute the following commands:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"rm -rf .cache/plasmashell*\nrm -rf .cache/org.kde.dirmodel-qml.kcache\nrm -rf .cache/kioexec/ .cache/krunner/ .cache/ksycoca5*\nrm -rf .cache/krunnerbookmarkrunnerfirefoxdbfile.sqlite\n\ncd ../.local/\nrm -rf kate/ kded5/ klipper/ knewstuff3/ kscreen/ konsole/ kwalletd/ ksysguard/ kmail2/ kcookiejar/ kactivitymanagerd/\n\ncd ../share/\nrm -rf dolphin kate kcookiejar kded5 keyrings klipper kmail2 knewstuff3 konsole kscreen ksysguard kwalletd kxmlgui5 plasma_engine_comic plasma plasma_notes org.kde.gwenview\n\ncd ../.config/\nrm -f plasma*\nrm -rf kde* akonadi* KDE kconf_updaterc baloo* dolphinrc drkonqirc gwenviewrc kmail2rc k*rc katemetainfos\n"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Shut down the live environment and remove the live USB drive."}),"\n",(0,n.jsx)(s.li,{children:"Reboot back into your regular Plasma session. Verify the issue is fixed."}),"\n",(0,n.jsx)(s.li,{children:"If you experience system instability, restore the previously backed up folders."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"To restore an entire directory:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{children:"cp -rav .kde.bak/share/config/ .kde/share/config\n"})}),"\n",(0,n.jsx)(s.p,{children:"After restoring the files or directories, restart your system."})]})}function h(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},11151:(e,s,o)=>{o.d(s,{Z:()=>t,a:()=>l});var n=o(67294);const r={},i=n.createContext(r);function l(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5670106.cbe2d220.js b/assets/js/d5670106.cbe2d220.js new file mode 100644 index 000000000..85213523c --- /dev/null +++ b/assets/js/d5670106.cbe2d220.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1265"],{3302:function(e,n,o){o.r(n),o.d(n,{metadata:()=>s,contentTitle:()=>t,default:()=>h,assets:()=>c,toc:()=>a,frontMatter:()=>l});var s=JSON.parse('{"id":"user/troubleshooting/plasma","title":"Plasma Troubleshooting","description":"This contains fixes for various issues you might encounter with the Plasma desktop environment.","source":"@site/docs/user/troubleshooting/plasma.md","sourceDirName":"user/troubleshooting","slug":"/user/troubleshooting/plasma","permalink":"/docs/user/troubleshooting/plasma","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/plasma.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Plasma Troubleshooting","summary":"Troubleshooting Issues With the Plasma Desktop"},"sidebar":"userSidebar","previous":{"title":"Installation Issues","permalink":"/docs/user/troubleshooting/installation"}}'),r=o("85893"),i=o("50065");let l={title:"Plasma Troubleshooting",summary:"Troubleshooting Issues With the Plasma Desktop"},t="Plasma Desktop Troubleshooting",c={},a=[{value:"Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)",id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",level:2},{value:"Application windows look corrupt / incomplete",id:"application-windows-look-corrupt--incomplete",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"plasma-desktop-troubleshooting",children:"Plasma Desktop Troubleshooting"})}),"\n",(0,r.jsx)(n.p,{children:"This contains fixes for various issues you might encounter with the Plasma desktop environment."}),"\n",(0,r.jsx)(n.h2,{id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",children:'Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)'}),"\n",(0,r.jsx)(n.p,{children:"This is often caused by a Firefox bug. It can be triggered by various things, like moving Firefox windows."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Symptoms:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Can't click on anything on the desktop."}),"\n",(0,r.jsx)(n.li,{children:"Bringing up windows with keyboard shortcuts (ex: Super for the app menu, F9 for a drop down terminal) works, but they don't get focused. You can't interact with them."}),"\n",(0,r.jsx)(n.li,{children:"Mouse cursor is stuck in move mode, it looks like a cross."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You may not need to reboot to recover from this state. Killing all ",(0,r.jsx)(n.code,{children:"firefox"})," processes may be all that's necessary. To do so:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Open a virtual terminal by pressing ",(0,r.jsx)(n.code,{children:"Ctrl+Alt+F3"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Run the following to kill all ",(0,r.jsx)(n.code,{children:"firefox"})," windows:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"killall firefox\n"})}),"\n",(0,r.jsx)(n.p,{children:"This should close all Firefox windows."}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Return to the Plasma session by pressing ",(0,r.jsx)(n.code,{children:"Ctrl+Alt+F2"}),".\nYou should now be able to use Plasma normally."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"application-windows-look-corrupt--incomplete",children:"Application windows look corrupt / incomplete"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Symptoms"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Application windows look corrupt. For example, NeoChat does not display room or user icons."}),"\n",(0,r.jsx)(n.li,{children:"Menus in an application are blank."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You may be able to fix this by clearing KDE / Plasma cache files."}),"\n",(0,r.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,r.jsx)(n.p,{children:"You should not be logged into your Plasma session while deleting the cache files, booting from a live USB is necessary."})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"While still logged into your Plasma session, go to your home directory:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd\n"})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Run these commands to back up the following directories:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cp -av ~/.kde{,.bak}\ncp -av ~/.config{,.bak}\ncp -av ~/.local{,.bak}\ncp -av ~/share{,.bak}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The commands create a copy of the folders. Each copy has the ",(0,r.jsx)(n.code,{children:".bak"})," extension (Example: ",(0,r.jsx)(n.code,{children:"~/.config.bak"}),"). These can be used to recover configuration files, if necessary."]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Shut down the system."}),"\n",(0,r.jsxs)(n.li,{children:["Boot from a live USB, which you can create from one of the ",(0,r.jsx)(n.a,{href:"https://getsol.us/download/",children:"Solus installers"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/user/troubleshooting/boot-rescue#mounting-your-system",children:"Mount your hard drive's file system"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Change to your user's directory where you mounted your file system. For example, if you used ",(0,r.jsx)(n.code,{children:"/mount"}),":"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd /mount/home/username\n"})}),"\n",(0,r.jsx)(n.p,{children:'Replace "username" with the username you use for Solus.\nYou can make sure the directory is correct by listing the files:'}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"ls -laH\n"})}),"\n",(0,r.jsx)(n.p,{children:"You should see the files you would usually see in your home directory when logged into Solus normally."}),"\n",(0,r.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,r.jsxs)(n.p,{children:["Avoid deleting the following directories: ",(0,r.jsx)(n.code,{children:"~/.kde"}),", ",(0,r.jsx)(n.code,{children:"~/.kde4"}),", ",(0,r.jsx)(n.code,{children:"~/.local"}),", and ",(0,r.jsx)(n.code,{children:"~/.config"})]})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Remove the various caches that Plasma uses.\nExecute the following commands:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"rm -rf .cache/plasmashell*\nrm -rf .cache/org.kde.dirmodel-qml.kcache\nrm -rf .cache/kioexec/ .cache/krunner/ .cache/ksycoca5*\nrm -rf .cache/krunnerbookmarkrunnerfirefoxdbfile.sqlite\n\ncd ../.local/\nrm -rf kate/ kded5/ klipper/ knewstuff3/ kscreen/ konsole/ kwalletd/ ksysguard/ kmail2/ kcookiejar/ kactivitymanagerd/\n\ncd ../share/\nrm -rf dolphin kate kcookiejar kded5 keyrings klipper kmail2 knewstuff3 konsole kscreen ksysguard kwalletd kxmlgui5 plasma_engine_comic plasma plasma_notes org.kde.gwenview\n\ncd ../.config/\nrm -f plasma*\nrm -rf kde* akonadi* KDE kconf_updaterc baloo* dolphinrc drkonqirc gwenviewrc kmail2rc k*rc katemetainfos\n"})}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Shut down the live environment and remove the live USB drive."}),"\n",(0,r.jsx)(n.li,{children:"Reboot back into your regular Plasma session. Verify the issue is fixed."}),"\n",(0,r.jsx)(n.li,{children:"If you experience system instability, restore the previously backed up folders."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"To restore an entire directory:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cp -rav .kde.bak/share/config/ .kde/share/config\n"})}),"\n",(0,r.jsx)(n.p,{children:"After restoring the files or directories, restart your system."})]})}function h(e={}){let{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},50065:function(e,n,o){o.d(n,{Z:function(){return t},a:function(){return l}});var s=o(67294);let r={},i=s.createContext(r);function l(e){let n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d9c798e8.7a81ce36.js b/assets/js/d9c798e8.7a81ce36.js deleted file mode 100644 index 7b5e362f0..000000000 --- a/assets/js/d9c798e8.7a81ce36.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[807],{37275:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Peripherals","slug":"/category/peripherals","permalink":"/docs/category/peripherals","sidebar":"userSidebar","navigation":{"previous":{"title":"Apple","permalink":"/docs/user/hardware/mobile/apple"},"next":{"title":"Mice and Touchpads","permalink":"/docs/user/hardware/peripherals/mice-and-touchpads"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/d9c798e8.bb19fe27.js b/assets/js/d9c798e8.bb19fe27.js new file mode 100644 index 000000000..d83cb589f --- /dev/null +++ b/assets/js/d9c798e8.bb19fe27.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9661"],{16618:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Peripherals","slug":"/category/peripherals","permalink":"/docs/category/peripherals","sidebar":"userSidebar","navigation":{"previous":{"title":"Apple","permalink":"/docs/user/hardware/mobile/apple"},"next":{"title":"Mice and Touchpads","permalink":"/docs/user/hardware/peripherals/mice-and-touchpads"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/da0423b8.bc82e401.js b/assets/js/da0423b8.bc82e401.js new file mode 100644 index 000000000..24cc1d183 --- /dev/null +++ b/assets/js/da0423b8.bc82e401.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7469"],{81125:function(e){e.exports=JSON.parse('{"tag":{"label":"housekeeping","permalink":"/blog/tags/housekeeping","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/housekeeping","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/da0423b8.d2dff3fd.js b/assets/js/da0423b8.d2dff3fd.js deleted file mode 100644 index e66503a8a..000000000 --- a/assets/js/da0423b8.d2dff3fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3090],{5930:e=>{e.exports=JSON.parse('{"tag":{"label":"housekeeping","permalink":"/blog/tags/housekeeping","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/housekeeping","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/da62f019.3506ee34.js b/assets/js/da62f019.3506ee34.js deleted file mode 100644 index c443d9c06..000000000 --- a/assets/js/da62f019.3506ee34.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1821],{98171:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Quick Start","slug":"/category/quick-start","permalink":"/docs/category/quick-start","sidebar":"userSidebar","navigation":{"previous":{"title":"Welcome","permalink":"/docs/user/intro"},"next":{"title":"Boot Management","permalink":"/docs/user/quick-start/boot-management"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/da62f019.a85685fc.js b/assets/js/da62f019.a85685fc.js new file mode 100644 index 000000000..1385e5b83 --- /dev/null +++ b/assets/js/da62f019.a85685fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["506"],{53158:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Quick Start","slug":"/category/quick-start","permalink":"/docs/category/quick-start","sidebar":"userSidebar","navigation":{"previous":{"title":"Welcome","permalink":"/docs/user/intro"},"next":{"title":"Boot Management","permalink":"/docs/user/quick-start/boot-management"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/dabd6b33.60a83e2a.js b/assets/js/dabd6b33.60a83e2a.js new file mode 100644 index 000000000..b2ac765b3 --- /dev/null +++ b/assets/js/dabd6b33.60a83e2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8194"],{70032:function(e,o,t){t.r(o),t.d(o,{metadata:()=>n,contentTitle:()=>a,default:()=>g,assets:()=>c,toc:()=>d,frontMatter:()=>s});var n=JSON.parse('{"id":"packaging/advanced-config/eopkg-configuration","title":"Eopkg Configuration","description":"The eopkg configuration file changes how eopkg works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that eopkg uses for various operations. Lastly, the [general] section contains settings for the general operation of eopkg.","source":"@site/docs/packaging/advanced-config/eopkg-configuration.md","sourceDirName":"packaging/advanced-config","slug":"/packaging/advanced-config/eopkg-configuration","permalink":"/docs/packaging/advanced-config/eopkg-configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/eopkg-configuration.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Eopkg Configuration","summary":"Modifying the eopkg configuration"},"sidebar":"packagingSidebar","previous":{"title":"Advanced Configuration","permalink":"/docs/category/advanced-configuration"},"next":{"title":"Local Repository","permalink":"/docs/packaging/advanced-config/local-repository"}}'),i=t("85893"),r=t("50065");let s={title:"Eopkg Configuration",summary:"Modifying the eopkg configuration"},a="Eopkg Configuration",c={},d=[{value:"Copying the default configuration",id:"copying-the-default-configuration",level:2},{value:"Notable keys",id:"notable-keys",level:2},{value:"Restoring defaults",id:"restoring-defaults",level:2}];function l(e){let o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"eopkg-configuration",children:"Eopkg Configuration"})}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"eopkg"})," configuration file changes how ",(0,i.jsx)(o.code,{children:"eopkg"})," works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that ",(0,i.jsx)(o.code,{children:"eopkg"})," uses for various operations. Lastly, the ",(0,i.jsx)(o.code,{children:"[general]"})," section contains settings for the general operation of ",(0,i.jsx)(o.code,{children:"eopkg"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"copying-the-default-configuration",children:"Copying the default configuration"}),"\n",(0,i.jsxs)(o.p,{children:["Solus aims to be a stateless operating system, so the default configuration file for ",(0,i.jsx)(o.code,{children:"eopkg"})," is saved to ",(0,i.jsx)(o.code,{children:"/usr/share/defaults/eopkg/eopkg.conf"}),". To modify the configuration, you'll have to start by copying the default configuration file into ",(0,i.jsx)(o.code,{children:"/etc/eopkg"})," so it will override the default file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo mkdir -p /etc/eopkg && sudo cp /usr/share/defaults/eopkg/eopkg.conf /etc/eopkg/eopkg.conf\n"})}),"\n",(0,i.jsx)(o.p,{children:"Once the file has been copied, you can edit it with your text editor of choice."}),"\n",(0,i.jsx)(o.h2,{id:"notable-keys",children:"Notable keys"}),"\n",(0,i.jsx)(o.p,{children:"Most keys in the config you'll probably want to leave untouched. However, some are useful to know about:"}),"\n",(0,i.jsxs)(o.table,{children:[(0,i.jsx)(o.thead,{children:(0,i.jsxs)(o.tr,{children:[(0,i.jsx)(o.th,{children:"Key"}),(0,i.jsx)(o.th,{children:"Description"}),(0,i.jsx)(o.th,{children:"Values"})]})}),(0,i.jsxs)(o.tbody,{children:[(0,i.jsxs)(o.tr,{children:[(0,i.jsx)(o.td,{children:"generateDebug"}),(0,i.jsx)(o.td,{children:"Whether or not debug symbol subpackages will be generated"}),(0,i.jsx)(o.td,{children:"True / False"})]}),(0,i.jsxs)(o.tr,{children:[(0,i.jsx)(o.td,{children:"jobs"}),(0,i.jsx)(o.td,{children:"How many building jobs to use when compiling the source"}),(0,i.jsx)(o.td,{children:"auto / number"})]}),(0,i.jsxs)(o.tr,{children:[(0,i.jsx)(o.td,{children:"retry_attempts"}),(0,i.jsx)(o.td,{children:"How many times to retry downloading a package during install"}),(0,i.jsx)(o.td,{children:"number"})]})]})]}),"\n",(0,i.jsx)(o.h2,{id:"restoring-defaults",children:"Restoring defaults"}),"\n",(0,i.jsxs)(o.p,{children:["If at any time you want to go back to the default configuration, simply remove the config file in ",(0,i.jsx)(o.code,{children:"/etc/eopkg"}),"."]})]})}function g(e={}){let{wrapper:o}={...(0,r.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},50065:function(e,o,t){t.d(o,{Z:function(){return a},a:function(){return s}});var n=t(67294);let i={},r=n.createContext(i);function s(e){let o=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dabd6b33.ca399a8f.js b/assets/js/dabd6b33.ca399a8f.js deleted file mode 100644 index bf07139db..000000000 --- a/assets/js/dabd6b33.ca399a8f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1059],{37101:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>g,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var n=t(85893),i=t(11151);const s={title:"Eopkg Configuration",summary:"Modifying the eopkg configuration"},r="Eopkg Configuration",a={id:"packaging/advanced-config/eopkg-configuration",title:"Eopkg Configuration",description:"The eopkg configuration file changes how eopkg works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that eopkg uses for various operations. Lastly, the [general] section contains settings for the general operation of eopkg.",source:"@site/docs/packaging/advanced-config/eopkg-configuration.md",sourceDirName:"packaging/advanced-config",slug:"/packaging/advanced-config/eopkg-configuration",permalink:"/docs/packaging/advanced-config/eopkg-configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/eopkg-configuration.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Eopkg Configuration",summary:"Modifying the eopkg configuration"},sidebar:"packagingSidebar",previous:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"},next:{title:"Local Repository",permalink:"/docs/packaging/advanced-config/local-repository"}},c={},d=[{value:"Copying the default configuration",id:"copying-the-default-configuration",level:2},{value:"Notable keys",id:"notable-keys",level:2},{value:"Restoring defaults",id:"restoring-defaults",level:2}];function l(e){const o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"eopkg-configuration",children:"Eopkg Configuration"})}),"\n",(0,n.jsxs)(o.p,{children:["The ",(0,n.jsx)(o.code,{children:"eopkg"})," configuration file changes how ",(0,n.jsx)(o.code,{children:"eopkg"})," works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that ",(0,n.jsx)(o.code,{children:"eopkg"})," uses for various operations. Lastly, the ",(0,n.jsx)(o.code,{children:"[general]"})," section contains settings for the general operation of ",(0,n.jsx)(o.code,{children:"eopkg"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"copying-the-default-configuration",children:"Copying the default configuration"}),"\n",(0,n.jsxs)(o.p,{children:["Solus aims to be a stateless operating system, so the default configuration file for ",(0,n.jsx)(o.code,{children:"eopkg"})," is saved to ",(0,n.jsx)(o.code,{children:"/usr/share/defaults/eopkg/eopkg.conf"}),". To modify the configuration, you'll have to start by copying the default configuration file into ",(0,n.jsx)(o.code,{children:"/etc/eopkg"})," so it will override the default file:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo mkdir -p /etc/eopkg && sudo cp /usr/share/defaults/eopkg/eopkg.conf /etc/eopkg/eopkg.conf\n"})}),"\n",(0,n.jsx)(o.p,{children:"Once the file has been copied, you can edit it with your text editor of choice."}),"\n",(0,n.jsx)(o.h2,{id:"notable-keys",children:"Notable keys"}),"\n",(0,n.jsx)(o.p,{children:"Most keys in the config you'll probably want to leave untouched. However, some are useful to know about:"}),"\n",(0,n.jsxs)(o.table,{children:[(0,n.jsx)(o.thead,{children:(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.th,{children:"Key"}),(0,n.jsx)(o.th,{children:"Description"}),(0,n.jsx)(o.th,{children:"Values"})]})}),(0,n.jsxs)(o.tbody,{children:[(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"generateDebug"}),(0,n.jsx)(o.td,{children:"Whether or not debug symbol subpackages will be generated"}),(0,n.jsx)(o.td,{children:"True / False"})]}),(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"jobs"}),(0,n.jsx)(o.td,{children:"How many building jobs to use when compiling the source"}),(0,n.jsx)(o.td,{children:"auto / number"})]}),(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"retry_attempts"}),(0,n.jsx)(o.td,{children:"How many times to retry downloading a package during install"}),(0,n.jsx)(o.td,{children:"number"})]})]})]}),"\n",(0,n.jsx)(o.h2,{id:"restoring-defaults",children:"Restoring defaults"}),"\n",(0,n.jsxs)(o.p,{children:["If at any time you want to go back to the default configuration, simply remove the config file in ",(0,n.jsx)(o.code,{children:"/etc/eopkg"}),"."]})]})}function g(e={}){const{wrapper:o}={...(0,i.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var n=t(67294);const i={},s=n.createContext(i);function r(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddc41e4a.571d60b8.js b/assets/js/ddc41e4a.571d60b8.js new file mode 100644 index 000000000..b06bb3f11 --- /dev/null +++ b/assets/js/ddc41e4a.571d60b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5297"],{58737:function(e,t,n){n.r(t),n.d(t,{metadata:()=>s,contentTitle:()=>i,default:()=>l,assets:()=>d,toc:()=>a,frontMatter:()=>u});var s=JSON.parse('{"id":"user/software/sound/index","title":"Sound","description":"Solus comes with PipeWire configured by default.","source":"@site/docs/user/software/sound/index.md","sourceDirName":"user/software/sound","slug":"/user/software/sound/","permalink":"/docs/user/software/sound/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/sound/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Sound","summary":"Configuration of sound systems on Solus"},"sidebar":"userSidebar","previous":{"title":"XRDP","permalink":"/docs/user/software/networking/xrdp"},"next":{"title":"Third Party","permalink":"/docs/user/software/third-party/"}}'),r=n("85893"),o=n("50065");let u={title:"Sound",summary:"Configuration of sound systems on Solus"},i="Sound",d={},a=[];function c(e){let t={h1:"h1",header:"header",p:"p",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"sound",children:"Sound"})}),"\n",(0,r.jsx)(t.p,{children:"Solus comes with PipeWire configured by default."})]})}function l(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return i},a:function(){return u}});var s=n(67294);let r={},o=s.createContext(r);function u(e){let t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:u(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddc41e4a.f4d67b46.js b/assets/js/ddc41e4a.f4d67b46.js deleted file mode 100644 index 8b57d82fd..000000000 --- a/assets/js/ddc41e4a.f4d67b46.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9451],{3619:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>u,default:()=>l,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var n=s(85893),o=s(11151);const r={title:"Sound",summary:"Configuration of sound systems on Solus"},u="Sound",d={id:"user/software/sound/index",title:"Sound",description:"Solus comes with PipeWire configured by default.",source:"@site/docs/user/software/sound/index.md",sourceDirName:"user/software/sound",slug:"/user/software/sound/",permalink:"/docs/user/software/sound/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/sound/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Sound",summary:"Configuration of sound systems on Solus"},sidebar:"userSidebar",previous:{title:"XRDP",permalink:"/docs/user/software/networking/xrdp"},next:{title:"Third Party",permalink:"/docs/user/software/third-party/"}},i={},a=[];function c(e){const t={h1:"h1",header:"header",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"sound",children:"Sound"})}),"\n",(0,n.jsx)(t.p,{children:"Solus comes with PipeWire configured by default."})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>u});var n=s(67294);const o={},r=n.createContext(o);function u(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:u(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e083e94b.534a88b9.js b/assets/js/e083e94b.534a88b9.js new file mode 100644 index 000000000..822a6a308 --- /dev/null +++ b/assets/js/e083e94b.534a88b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5826"],{37925:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,contentTitle:()=>o,default:()=>p,assets:()=>l,toc:()=>c,frontMatter:()=>r});var s=JSON.parse('{"id":"user/software/third-party/snap","title":"Snap","description":"Note that snaps are going to be removed from Solus in the future,","source":"@site/docs/user/software/third-party/snap.md","sourceDirName":"user/software/third-party","slug":"/user/software/third-party/snap","permalink":"/docs/user/software/third-party/snap","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/snap.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Snap","summary":"Working with snaps"},"sidebar":"userSidebar","previous":{"title":"Third Party","permalink":"/docs/user/software/third-party/"},"next":{"title":"Utilities","permalink":"/docs/category/utilities"}}'),a=t("85893"),i=t("50065");let r={title:"Snap",summary:"Working with snaps"},o="Snap",l={},c=[{value:"Confinement warning",id:"confinement-warning",level:2},{value:"Migrating to Flatpak",id:"migrating-to-flatpak",level:2}];function d(e){let n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"snap",children:"Snap"})}),"\n",(0,a.jsx)(n.admonition,{type:"warning",children:(0,a.jsxs)(n.p,{children:["Note that snaps are going to be ",(0,a.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/325",children:"removed from Solus in the future"}),",\nand are not fully confined in Solus with Linux 6.9 and newer.\nSee the section on confinement below."]})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.a,{href:"https://snapcraft.io/",children:"Snaps"})," are a way of installing third-party packages.\nThe ",(0,a.jsx)(n.code,{children:"snapd"})," package installs the CLI client that can be used to install and run snaps."]}),"\n",(0,a.jsx)(n.h2,{id:"confinement-warning",children:"Confinement warning"}),"\n",(0,a.jsxs)(n.p,{children:["Snaps are usually protected using ",(0,a.jsx)(n.code,{children:"strict"})," confinement,\nensuring that snaps can't access more of your system than needed.\nThe ",(0,a.jsx)(n.code,{children:"snap"})," command provided by Solus shows a warning when strict confinement is not available.\nFor example:"]}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["WARNING: snap is running with partial confinement. See ",(0,a.jsx)(n.a,{href:"https://help.getsol.us/docs/user/software/third-party/snap",children:"https://help.getsol.us/docs/user/software/third-party/snap"})," for details"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["We recommend ",(0,a.jsx)(n.a,{href:"#migrating-to-flatpak",children:"migrating to Flatpak"})," when possible.\nThe warning can be silenced by running ",(0,a.jsx)(n.code,{children:"sudo snap hide-confinement-warning"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"migrating-to-flatpak",children:"Migrating to Flatpak"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"unsnap"})," package can be used to migrate from snap to Flatpak.\nWhile it does not actively remove user data in ",(0,a.jsx)(n.code,{children:"~/snap"})," or ",(0,a.jsx)(n.code,{children:"/var/lib/snapd"}),",\nwe cannot guarantee that no data gets removed on accident.\nPlease ensure you have system backups that include snap data."]}),"\n",(0,a.jsxs)(n.p,{children:["Run ",(0,a.jsx)(n.code,{children:"sudo unsnap"})," before migrating to see if all your snaps have known equivalents.\nLook for lines containing ",(0,a.jsx)(n.code,{children:"No equivalent flatpak for found"}),".\nCheck out ",(0,a.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"this issue"})," if you encounter such snaps."]}),"\n",(0,a.jsxs)(n.p,{children:["Running ",(0,a.jsx)(n.code,{children:"sudo unsnap auto"})," will migrate as many snaps to Flatpak as possible.\nIt will also uninstall ",(0,a.jsx)(n.code,{children:"snapd"})," if all snaps were migrated."]}),"\n",(0,a.jsxs)(n.p,{children:["If ",(0,a.jsx)(n.code,{children:"unsnap"})," is unable to find an equivalent Flatpak for a snap, you have the following options:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Search for an equivalent Flatpak manually, and ",(0,a.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"report it"})," if possible."]}),"\n",(0,a.jsx)(n.li,{children:"Install an equivalent tool from the package manager if possible."}),"\n",(0,a.jsx)(n.li,{children:"Uninstall the snap manually if it is not needed."}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["It is possible to rerun ",(0,a.jsx)(n.code,{children:"sudo unsnap auto"})," to finish removing ",(0,a.jsx)(n.code,{children:"snapd"}),"."]})]})}function p(e={}){let{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return o},a:function(){return r}});var s=t(67294);let a={},i=s.createContext(a);function r(e){let n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e083e94b.f1de6fb8.js b/assets/js/e083e94b.f1de6fb8.js deleted file mode 100644 index 63a826fd3..000000000 --- a/assets/js/e083e94b.f1de6fb8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3056],{83514:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var t=s(85893),a=s(11151);const i={title:"Snap",summary:"Working with snaps"},r="Snap",o={id:"user/software/third-party/snap",title:"Snap",description:"Note that snaps are going to be removed from Solus in the future,",source:"@site/docs/user/software/third-party/snap.md",sourceDirName:"user/software/third-party",slug:"/user/software/third-party/snap",permalink:"/docs/user/software/third-party/snap",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/snap.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Snap",summary:"Working with snaps"},sidebar:"userSidebar",previous:{title:"Third Party",permalink:"/docs/user/software/third-party/"},next:{title:"Utilities",permalink:"/docs/category/utilities"}},l={},c=[{value:"Confinement warning",id:"confinement-warning",level:2},{value:"Migrating to Flatpak",id:"migrating-to-flatpak",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"snap",children:"Snap"})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsxs)(n.p,{children:["Note that snaps are going to be ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/325",children:"removed from Solus in the future"}),",\nand are not fully confined in Solus with Linux 6.9 and newer.\nSee the section on confinement below."]})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://snapcraft.io/",children:"Snaps"})," are a way of installing third-party packages.\nThe ",(0,t.jsx)(n.code,{children:"snapd"})," package installs the CLI client that can be used to install and run snaps."]}),"\n",(0,t.jsx)(n.h2,{id:"confinement-warning",children:"Confinement warning"}),"\n",(0,t.jsxs)(n.p,{children:["Snaps are usually protected using ",(0,t.jsx)(n.code,{children:"strict"})," confinement,\nensuring that snaps can't access more of your system than needed.\nThe ",(0,t.jsx)(n.code,{children:"snap"})," command provided by Solus shows a warning when strict confinement is not available.\nFor example:"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["WARNING: snap is running with partial confinement. See ",(0,t.jsx)(n.a,{href:"https://help.getsol.us/docs/user/software/third-party/snap",children:"https://help.getsol.us/docs/user/software/third-party/snap"})," for details"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["We recommend ",(0,t.jsx)(n.a,{href:"#migrating-to-flatpak",children:"migrating to Flatpak"})," when possible.\nThe warning can be silenced by running ",(0,t.jsx)(n.code,{children:"sudo snap hide-confinement-warning"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"migrating-to-flatpak",children:"Migrating to Flatpak"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"unsnap"})," package can be used to migrate from snap to Flatpak.\nWhile it does not actively remove user data in ",(0,t.jsx)(n.code,{children:"~/snap"})," or ",(0,t.jsx)(n.code,{children:"/var/lib/snapd"}),",\nwe cannot guarantee that no data gets removed on accident.\nPlease ensure you have system backups that include snap data."]}),"\n",(0,t.jsxs)(n.p,{children:["Run ",(0,t.jsx)(n.code,{children:"sudo unsnap"})," before migrating to see if all your snaps have known equivalents.\nLook for lines containing ",(0,t.jsx)(n.code,{children:"No equivalent flatpak for found"}),".\nCheck out ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"this issue"})," if you encounter such snaps."]}),"\n",(0,t.jsxs)(n.p,{children:["Running ",(0,t.jsx)(n.code,{children:"sudo unsnap auto"})," will migrate as many snaps to Flatpak as possible.\nIt will also uninstall ",(0,t.jsx)(n.code,{children:"snapd"})," if all snaps were migrated."]}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"unsnap"})," is unable to find an equivalent Flatpak for a snap, you have the following options:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Search for an equivalent Flatpak manually, and ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"report it"})," if possible."]}),"\n",(0,t.jsx)(n.li,{children:"Install an equivalent tool from the package manager if possible."}),"\n",(0,t.jsx)(n.li,{children:"Uninstall the snap manually if it is not needed."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["It is possible to rerun ",(0,t.jsx)(n.code,{children:"sudo unsnap auto"})," to finish removing ",(0,t.jsx)(n.code,{children:"snapd"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>o,a:()=>r});var t=s(67294);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e4134e95.baf1413e.js b/assets/js/e4134e95.baf1413e.js new file mode 100644 index 000000000..438030b3b --- /dev/null +++ b/assets/js/e4134e95.baf1413e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["3928"],{42288:function(e){e.exports=JSON.parse('{"tag":{"label":"devlog","permalink":"/blog/tags/devlog","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/devlog","page":1,"postsPerPage":4,"totalPages":1,"totalCount":4,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/e4134e95.e4a2ef15.js b/assets/js/e4134e95.e4a2ef15.js deleted file mode 100644 index a5e047f21..000000000 --- a/assets/js/e4134e95.e4a2ef15.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8621],{80700:e=>{e.exports=JSON.parse('{"tag":{"label":"devlog","permalink":"/blog/tags/devlog","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/devlog","page":1,"postsPerPage":4,"totalPages":1,"totalCount":4,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/e5595530.3c3b46b7.js b/assets/js/e5595530.3c3b46b7.js deleted file mode 100644 index 50af604ad..000000000 --- a/assets/js/e5595530.3c3b46b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1648],{4183:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>d,toc:()=>a});var r=n(85893),o=n(11151);const l={title:"Boot Management",summary:"Guide to customizing the Solus boot process"},s="Boot Management",d={id:"user/quick-start/boot-management",title:"Boot Management",description:"clr-boot-manager",source:"@site/docs/user/quick-start/boot-management.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/boot-management",permalink:"/docs/user/quick-start/boot-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/boot-management.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Boot Management",summary:"Guide to customizing the Solus boot process"},sidebar:"userSidebar",previous:{title:"Quick Start",permalink:"/docs/category/quick-start"},next:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"}},i={},a=[{value:"clr-boot-manager",id:"clr-boot-manager",level:2},{value:"Open the boot menu",id:"open-the-boot-menu",level:3},{value:"Displaying the boot menu by default every boot",id:"displaying-the-boot-menu-by-default-every-boot",level:3},{value:"Adding kernel parameters",id:"adding-kernel-parameters",level:3},{value:"Kernels",id:"kernels",level:2},{value:"Installing a different kernel branch",id:"installing-a-different-kernel-branch",level:3},{value:"Change the default kernel branch to boot",id:"change-the-default-kernel-branch-to-boot",level:3}];function c(e){const t={br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"boot-management",children:"Boot Management"})}),"\n",(0,r.jsx)(t.h2,{id:"clr-boot-manager",children:"clr-boot-manager"}),"\n",(0,r.jsxs)(t.p,{children:["Solus leverages ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," from the Clear Linux* project to manage its boot process.\nOn legacy BIOS systems, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,r.jsx)(t.code,{children:"GRUB2"})," to properly boot your system.",(0,r.jsx)(t.br,{}),"\n","On modern UEFI systems, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,r.jsx)(t.code,{children:"systemd-boot"})," instead.",(0,r.jsx)(t.br,{}),"\n","This means that any time we want to modify the boot process, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will be involved.",(0,r.jsx)(t.br,{}),"\n","Trying to modify the configurations manually may work temporarily, but will be overwritten eventually."]}),"\n",(0,r.jsx)(t.h3,{id:"open-the-boot-menu",children:"Open the boot menu"}),"\n",(0,r.jsx)(t.p,{children:"By default, EFI installs will not show the boot menu and boot directly into Solus. By hitting space bar (repeatedly) during boot, the boot menu will appear (it may take a couple of goes to get the timing right)."}),"\n",(0,r.jsx)(t.h3,{id:"displaying-the-boot-menu-by-default-every-boot",children:"Displaying the boot menu by default every boot"}),"\n",(0,r.jsx)(t.p,{children:"The following command will set the timeout of the boot loader to five seconds so that it appears by default:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo clr-boot-manager set-timeout 5 && sudo clr-boot-manager update\n"})}),"\n",(0,r.jsx)(t.h3,{id:"adding-kernel-parameters",children:"Adding kernel parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Kernel parameters can be appended to boot via creating a file for ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," to use when updating kernels. For example, to add ",(0,r.jsx)(t.code,{children:"nomodeset"})," to boot options, you would create a file in ",(0,r.jsx)(t.code,{children:"/etc/kernel/cmdline.d"})," (as sudo):"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo mkdir -p /etc/kernel/cmdline.d\necho 'nomodeset' | sudo tee /etc/kernel/cmdline.d/40_nomodeset.conf\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The settings should be on one line with a space between them. You will need to run ",(0,r.jsx)(t.code,{children:"sudo clr-boot-manager update"})," for the options to be appended to boot."]}),"\n",(0,r.jsx)(t.h2,{id:"kernels",children:"Kernels"}),"\n",(0,r.jsx)(t.h3,{id:"installing-a-different-kernel-branch",children:"Installing a different kernel branch"}),"\n",(0,r.jsxs)(t.p,{children:["By default, Solus utilizes our linux-current kernel. The separate kernel branches can be added by installing the ",(0,r.jsx)(t.code,{children:"linux-lts"})," or ",(0,r.jsx)(t.code,{children:"linux-current"})," packages. Note that each kernel has separate module packages, so if you use these kernel modules, you'll need to install the one related to the kernel you are adding."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"linux-lts"}),(0,r.jsx)(t.th,{children:"linux-current"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"bbswitch"}),(0,r.jsx)(t.td,{children:"bbswitch-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"broadcom-sta"}),(0,r.jsx)(t.td,{children:"broadcom-sta-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"linux-lts-headers"}),(0,r.jsx)(t.td,{children:"linux-current-headers"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-470-glx-driver"}),(0,r.jsx)(t.td,{children:"nvidia-470-glx-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-beta-driver"}),(0,r.jsx)(t.td,{children:"nvidia-beta-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-developer-driver"}),(0,r.jsx)(t.td,{children:"nvidia-developer-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-glx-driver"}),(0,r.jsx)(t.td,{children:"nvidia-glx-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"openrazer"}),(0,r.jsx)(t.td,{children:"openrazer-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"rtl8852bu"}),(0,r.jsx)(t.td,{children:"rtl8852bu-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"v4l2loopback"}),(0,r.jsx)(t.td,{children:"v4l2loopback-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"vhba-module"}),(0,r.jsx)(t.td,{children:"vhba-module-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"virtualbox"}),(0,r.jsx)(t.td,{children:"virtualbox-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"xone"}),(0,r.jsx)(t.td,{children:"xone-current"})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"change-the-default-kernel-branch-to-boot",children:"Change the default kernel branch to boot"}),"\n",(0,r.jsxs)(t.p,{children:["After successfully booting into a kernel from the ",(0,r.jsx)(t.code,{children:"current"})," or ",(0,r.jsx)(t.code,{children:"lts"})," branches running ",(0,r.jsx)(t.code,{children:"sudo clr-boot-manager update"})," will make the booted kernel branch the default boot option going forward."]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>s});var r=n(67294);const o={},l=r.createContext(o);function s(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e5595530.8eb3fe79.js b/assets/js/e5595530.8eb3fe79.js new file mode 100644 index 000000000..f7bc18c4d --- /dev/null +++ b/assets/js/e5595530.8eb3fe79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7220"],{54587:function(e,t,n){n.r(t),n.d(t,{metadata:()=>r,contentTitle:()=>s,default:()=>h,assets:()=>i,toc:()=>a,frontMatter:()=>d});var r=JSON.parse('{"id":"user/quick-start/boot-management","title":"Boot Management","description":"clr-boot-manager","source":"@site/docs/user/quick-start/boot-management.md","sourceDirName":"user/quick-start","slug":"/user/quick-start/boot-management","permalink":"/docs/user/quick-start/boot-management","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/boot-management.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Boot Management","summary":"Guide to customizing the Solus boot process"},"sidebar":"userSidebar","previous":{"title":"Quick Start","permalink":"/docs/category/quick-start"},"next":{"title":"Default Applications","permalink":"/docs/user/quick-start/default-applications"}}'),o=n("85893"),l=n("50065");let d={title:"Boot Management",summary:"Guide to customizing the Solus boot process"},s="Boot Management",i={},a=[{value:"clr-boot-manager",id:"clr-boot-manager",level:2},{value:"Open the boot menu",id:"open-the-boot-menu",level:3},{value:"Displaying the boot menu by default every boot",id:"displaying-the-boot-menu-by-default-every-boot",level:3},{value:"Adding kernel parameters",id:"adding-kernel-parameters",level:3},{value:"Kernels",id:"kernels",level:2},{value:"Installing a different kernel branch",id:"installing-a-different-kernel-branch",level:3},{value:"Change the default kernel branch to boot",id:"change-the-default-kernel-branch-to-boot",level:3}];function c(e){let t={br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"boot-management",children:"Boot Management"})}),"\n",(0,o.jsx)(t.h2,{id:"clr-boot-manager",children:"clr-boot-manager"}),"\n",(0,o.jsxs)(t.p,{children:["Solus leverages ",(0,o.jsx)(t.code,{children:"clr-boot-manager"})," from the Clear Linux* project to manage its boot process.\nOn legacy BIOS systems, ",(0,o.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,o.jsx)(t.code,{children:"GRUB2"})," to properly boot your system.",(0,o.jsx)(t.br,{}),"\n","On modern UEFI systems, ",(0,o.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,o.jsx)(t.code,{children:"systemd-boot"})," instead.",(0,o.jsx)(t.br,{}),"\n","This means that any time we want to modify the boot process, ",(0,o.jsx)(t.code,{children:"clr-boot-manager"})," will be involved.",(0,o.jsx)(t.br,{}),"\n","Trying to modify the configurations manually may work temporarily, but will be overwritten eventually."]}),"\n",(0,o.jsx)(t.h3,{id:"open-the-boot-menu",children:"Open the boot menu"}),"\n",(0,o.jsx)(t.p,{children:"By default, EFI installs will not show the boot menu and boot directly into Solus. By hitting space bar (repeatedly) during boot, the boot menu will appear (it may take a couple of goes to get the timing right)."}),"\n",(0,o.jsx)(t.h3,{id:"displaying-the-boot-menu-by-default-every-boot",children:"Displaying the boot menu by default every boot"}),"\n",(0,o.jsx)(t.p,{children:"The following command will set the timeout of the boot loader to five seconds so that it appears by default:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo clr-boot-manager set-timeout 5 && sudo clr-boot-manager update\n"})}),"\n",(0,o.jsx)(t.h3,{id:"adding-kernel-parameters",children:"Adding kernel parameters"}),"\n",(0,o.jsxs)(t.p,{children:["Kernel parameters can be appended to boot via creating a file for ",(0,o.jsx)(t.code,{children:"clr-boot-manager"})," to use when updating kernels. For example, to add ",(0,o.jsx)(t.code,{children:"nomodeset"})," to boot options, you would create a file in ",(0,o.jsx)(t.code,{children:"/etc/kernel/cmdline.d"})," (as sudo):"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo mkdir -p /etc/kernel/cmdline.d\necho 'nomodeset' | sudo tee /etc/kernel/cmdline.d/40_nomodeset.conf\n"})}),"\n",(0,o.jsxs)(t.p,{children:["The settings should be on one line with a space between them. You will need to run ",(0,o.jsx)(t.code,{children:"sudo clr-boot-manager update"})," for the options to be appended to boot."]}),"\n",(0,o.jsx)(t.h2,{id:"kernels",children:"Kernels"}),"\n",(0,o.jsx)(t.h3,{id:"installing-a-different-kernel-branch",children:"Installing a different kernel branch"}),"\n",(0,o.jsxs)(t.p,{children:["By default, Solus utilizes our linux-current kernel. The separate kernel branches can be added by installing the ",(0,o.jsx)(t.code,{children:"linux-lts"})," or ",(0,o.jsx)(t.code,{children:"linux-current"})," packages. Note that each kernel has separate module packages, so if you use these kernel modules, you'll need to install the one related to the kernel you are adding."]}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"linux-lts"}),(0,o.jsx)(t.th,{children:"linux-current"})]})}),(0,o.jsxs)(t.tbody,{children:[(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"bbswitch"}),(0,o.jsx)(t.td,{children:"bbswitch-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"broadcom-sta"}),(0,o.jsx)(t.td,{children:"broadcom-sta-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"linux-lts-headers"}),(0,o.jsx)(t.td,{children:"linux-current-headers"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"nvidia-470-glx-driver"}),(0,o.jsx)(t.td,{children:"nvidia-470-glx-driver-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"nvidia-beta-driver"}),(0,o.jsx)(t.td,{children:"nvidia-beta-driver-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"nvidia-developer-driver"}),(0,o.jsx)(t.td,{children:"nvidia-developer-driver-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"nvidia-glx-driver"}),(0,o.jsx)(t.td,{children:"nvidia-glx-driver-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"openrazer"}),(0,o.jsx)(t.td,{children:"openrazer-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"rtl8852bu"}),(0,o.jsx)(t.td,{children:"rtl8852bu-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"v4l2loopback"}),(0,o.jsx)(t.td,{children:"v4l2loopback-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"vhba-module"}),(0,o.jsx)(t.td,{children:"vhba-module-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"virtualbox"}),(0,o.jsx)(t.td,{children:"virtualbox-current"})]}),(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"xone"}),(0,o.jsx)(t.td,{children:"xone-current"})]})]})]}),"\n",(0,o.jsx)(t.h3,{id:"change-the-default-kernel-branch-to-boot",children:"Change the default kernel branch to boot"}),"\n",(0,o.jsxs)(t.p,{children:["After successfully booting into a kernel from the ",(0,o.jsx)(t.code,{children:"current"})," or ",(0,o.jsx)(t.code,{children:"lts"})," branches running ",(0,o.jsx)(t.code,{children:"sudo clr-boot-manager update"})," will make the booted kernel branch the default boot option going forward."]})]})}function h(e={}){let{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return s},a:function(){return d}});var r=n(67294);let o={},l=r.createContext(o);function d(e){let t=r.useContext(l);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ea6d9109.ade06918.js b/assets/js/ea6d9109.ade06918.js new file mode 100644 index 000000000..0a55ffba6 --- /dev/null +++ b/assets/js/ea6d9109.ade06918.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6381"],{92145:function(e){e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Web","slug":"/category/web","permalink":"/docs/category/web","sidebar":"userSidebar","navigation":{"previous":{"title":"VirtualBox","permalink":"/docs/user/software/virtualization/virtualbox"},"next":{"title":"Open Broadcaster Software (OBS)","permalink":"/docs/user/software/web/obs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/ea6d9109.f94baf95.js b/assets/js/ea6d9109.f94baf95.js deleted file mode 100644 index 7659d5c53..000000000 --- a/assets/js/ea6d9109.f94baf95.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[812],{88930:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Web","slug":"/category/web","permalink":"/docs/category/web","sidebar":"userSidebar","navigation":{"previous":{"title":"VirtualBox","permalink":"/docs/user/software/virtualization/virtualbox"},"next":{"title":"Open Broadcaster Software (OBS)","permalink":"/docs/user/software/web/obs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/eb074ba1.42ac8859.js b/assets/js/eb074ba1.42ac8859.js deleted file mode 100644 index c9aa9f38d..000000000 --- a/assets/js/eb074ba1.42ac8859.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3705],{45247:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var r=t(85893),n=t(11151);const i={title:"Configuration File Locations",summary:"Location of configuration files on Solus"},o="Configuration File Locations",d={id:"user/software/configuration_files",title:"Configuration File Locations",description:"These are the standard locations on a Solus installation for software configuration files.",source:"@site/docs/user/software/configuration_files.md",sourceDirName:"user/software",slug:"/user/software/configuration_files",permalink:"/docs/user/software/configuration_files",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/configuration_files.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Configuration File Locations",summary:"Location of configuration files on Solus"},sidebar:"userSidebar",previous:{title:"Command Line",permalink:"/docs/user/software/command-line/"},next:{title:"Desktops",permalink:"/docs/user/software/desktops/"}},c={},a=[];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"configuration-file-locations",children:"Configuration File Locations"})}),"\n",(0,r.jsx)(s.p,{children:"These are the standard locations on a Solus installation for software configuration files."}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:['Solus uses a "stateless" system configuration. For what that means see the ',(0,r.jsx)(s.a,{href:"https://www.clearlinux.org/clear-linux-documentation/reference/manpages/stateless.7.html",children:"Clear Linux Guide to Stateless Configuration"}),"."]})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Applies to"}),(0,r.jsx)(s.th,{children:"Location(s)"}),(0,r.jsx)(s.th,{children:"Priority"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"User"}),(0,r.jsx)("br",{}),"- preserved during package updates"]}),(0,r.jsx)(s.td,{children:"Per-user"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"~/.config/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"~/"}),(0,r.jsx)("br",{}),"others"]}),(0,r.jsx)(s.td,{children:"Highest"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"System"}),(0,r.jsx)("br",{}),"- preserved during package updates"]}),(0,r.jsx)(s.td,{children:"All users on the system"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"OS provided"})," (aka defaults)",(0,r.jsx)("br",{}),"- ",(0,r.jsx)(s.strong,{children:"overridden"})," by package updates"]}),(0,r.jsx)(s.td,{children:"All users on the system"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/usr/share/defaults/"})}),(0,r.jsx)(s.td,{children:"Lowest"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"A user configuration file overrides the system configuration, and the system configuration overrides the OS provided configuration. If no user configuration is provided, then the system configuration is used, and if no system configuration is provided, then the OS provided configuration is used."}),"\n",(0,r.jsxs)(s.p,{children:["Different software expects user configuration files in different places. Many software packages store these under the ",(0,r.jsx)(s.code,{children:"XDG_CONFIG_HOME"})," directory: ",(0,r.jsx)(s.code,{children:"~/.config"}),". Some applications insist on placing them straight into the home directory. For example the ",(0,r.jsx)(s.code,{children:"fish"})," shell uses the ",(0,r.jsx)(s.code,{children:"~/.config/fish"})," directory to store user configurations, while the ",(0,r.jsx)(s.code,{children:"bash"})," shell uses the ",(0,r.jsx)(s.code,{children:"~/.bashrc"})," configuration file straight from the home directory. Consult documentation before customizing software to ensure you put things in the right place."]}),"\n",(0,r.jsx)(s.p,{children:"Some common configuration files:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Software"}),(0,r.jsx)(s.th,{children:"Configuration files"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"apcupsd"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/changeme"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"cups"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/cups/"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/samba",children:"samba"})}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/samba/smb.conf"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/samba/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"pam"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/pam.d/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/pam.d/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssh"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"$HOME/.ssh/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/ssh/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/ssl/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/ssl/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/tigervnc",children:"tigervnc"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"$HOME/.vnc/xstartup"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/xrdp",children:"xrdp"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/X11/Xwrapper.config"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>d,a:()=>o});var r=t(67294);const n={},i=r.createContext(n);function o(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/eb074ba1.7903bbcc.js b/assets/js/eb074ba1.7903bbcc.js new file mode 100644 index 000000000..e3a05132c --- /dev/null +++ b/assets/js/eb074ba1.7903bbcc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["6218"],{76283:function(e,s,t){t.r(s),t.d(s,{metadata:()=>r,contentTitle:()=>d,default:()=>h,assets:()=>c,toc:()=>l,frontMatter:()=>o});var r=JSON.parse('{"id":"user/software/configuration_files","title":"Configuration File Locations","description":"These are the standard locations on a Solus installation for software configuration files.","source":"@site/docs/user/software/configuration_files.md","sourceDirName":"user/software","slug":"/user/software/configuration_files","permalink":"/docs/user/software/configuration_files","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/configuration_files.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Configuration File Locations","summary":"Location of configuration files on Solus"},"sidebar":"userSidebar","previous":{"title":"Command Line","permalink":"/docs/user/software/command-line/"},"next":{"title":"Desktops","permalink":"/docs/user/software/desktops/"}}'),n=t("85893"),i=t("50065");let o={title:"Configuration File Locations",summary:"Location of configuration files on Solus"},d="Configuration File Locations",c={},l=[];function a(e){let s={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"configuration-file-locations",children:"Configuration File Locations"})}),"\n",(0,n.jsx)(s.p,{children:"These are the standard locations on a Solus installation for software configuration files."}),"\n",(0,n.jsx)(s.admonition,{type:"note",children:(0,n.jsxs)(s.p,{children:['Solus uses a "stateless" system configuration. For what that means see the ',(0,n.jsx)(s.a,{href:"https://www.clearlinux.org/clear-linux-documentation/reference/manpages/stateless.7.html",children:"Clear Linux Guide to Stateless Configuration"}),"."]})}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Type"}),(0,n.jsx)(s.th,{children:"Applies to"}),(0,n.jsx)(s.th,{children:"Location(s)"}),(0,n.jsx)(s.th,{children:"Priority"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.strong,{children:"User"}),(0,n.jsx)("br",{}),"- preserved during package updates"]}),(0,n.jsx)(s.td,{children:"Per-user"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"~/.config/"}),(0,n.jsx)("br",{}),(0,n.jsx)(s.code,{children:"~/"}),(0,n.jsx)("br",{}),"others"]}),(0,n.jsx)(s.td,{children:"Highest"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.strong,{children:"System"}),(0,n.jsx)("br",{}),"- preserved during package updates"]}),(0,n.jsx)(s.td,{children:"All users on the system"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"/etc/"})}),(0,n.jsx)(s.td,{})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.strong,{children:"OS provided"})," (aka defaults)",(0,n.jsx)("br",{}),"- ",(0,n.jsx)(s.strong,{children:"overridden"})," by package updates"]}),(0,n.jsx)(s.td,{children:"All users on the system"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"/usr/share/defaults/"})}),(0,n.jsx)(s.td,{children:"Lowest"})]})]})]}),"\n",(0,n.jsx)(s.p,{children:"A user configuration file overrides the system configuration, and the system configuration overrides the OS provided configuration. If no user configuration is provided, then the system configuration is used, and if no system configuration is provided, then the OS provided configuration is used."}),"\n",(0,n.jsxs)(s.p,{children:["Different software expects user configuration files in different places. Many software packages store these under the ",(0,n.jsx)(s.code,{children:"XDG_CONFIG_HOME"})," directory: ",(0,n.jsx)(s.code,{children:"~/.config"}),". Some applications insist on placing them straight into the home directory. For example the ",(0,n.jsx)(s.code,{children:"fish"})," shell uses the ",(0,n.jsx)(s.code,{children:"~/.config/fish"})," directory to store user configurations, while the ",(0,n.jsx)(s.code,{children:"bash"})," shell uses the ",(0,n.jsx)(s.code,{children:"~/.bashrc"})," configuration file straight from the home directory. Consult documentation before customizing software to ensure you put things in the right place."]}),"\n",(0,n.jsx)(s.p,{children:"Some common configuration files:"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Software"}),(0,n.jsx)(s.th,{children:"Configuration files"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"apcupsd"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"/etc/changeme"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"cups"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"/etc/cups/"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"/docs/user/software/networking/samba",children:"samba"})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"/etc/samba/smb.conf"}),(0,n.jsx)("br",{}),(0,n.jsx)(s.code,{children:"/usr/share/defaults/samba/"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"pam"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"/etc/pam.d/"}),(0,n.jsx)("br",{}),(0,n.jsx)(s.code,{children:"/usr/share/defaults/etc/pam.d/"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"ssh"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"$HOME/.ssh/"}),(0,n.jsx)("br",{}),(0,n.jsx)(s.code,{children:"/usr/share/defaults/etc/ssh/"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"ssl"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"/etc/ssl/"}),(0,n.jsx)("br",{}),(0,n.jsx)(s.code,{children:"/usr/share/defaults/etc/ssl/"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"/docs/user/software/networking/tigervnc",children:"tigervnc"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"$HOME/.vnc/xstartup"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"/docs/user/software/networking/xrdp",children:"xrdp"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"/etc/X11/Xwrapper.config"})})]})]})]})]})}function h(e={}){let{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},50065:function(e,s,t){t.d(s,{Z:function(){return d},a:function(){return o}});var r=t(67294);let n={},i=r.createContext(n);function o(e){let s=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec4e4367.b33b2a81.js b/assets/js/ec4e4367.b33b2a81.js deleted file mode 100644 index f497cc2a5..000000000 --- a/assets/js/ec4e4367.b33b2a81.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4529],{76130:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var n=r(85893),t=r(11151);const i={title:"Android",summary:"Quick guide to working with Android devices on Solus"},s="Android",d={id:"user/hardware/mobile/android",title:"Android",description:"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems.",source:"@site/docs/user/hardware/mobile/android.md",sourceDirName:"user/hardware/mobile",slug:"/user/hardware/mobile/android",permalink:"/docs/user/hardware/mobile/android",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/android.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Android",summary:"Quick guide to working with Android devices on Solus"},sidebar:"userSidebar",previous:{title:"Mobile",permalink:"/docs/category/mobile"},next:{title:"Apple",permalink:"/docs/user/hardware/mobile/apple"}},a={},l=[{value:"File management",id:"file-management",level:2},{value:"Developer tools",id:"developer-tools",level:2}];function c(e){const o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"android",children:"Android"})}),"\n",(0,n.jsx)(o.p,{children:"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems."}),"\n",(0,n.jsx)(o.h2,{id:"file-management",children:"File management"}),"\n",(0,n.jsx)(o.p,{children:"TODO: Tutorial on accessing files from a file browser. Android screenshots would be nice to have."}),"\n",(0,n.jsx)(o.h2,{id:"developer-tools",children:"Developer tools"}),"\n",(0,n.jsxs)(o.p,{children:["Whether you are an Android developer or just need ",(0,n.jsx)(o.code,{children:"adb"})," or ",(0,n.jsx)(o.code,{children:"fastboot"})," for installing a ROM, we've got you covered! We just need to install ",(0,n.jsx)(o.code,{children:"android-tools"})," from the Software Center or command-line:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install android-tools\n"})})]})}function u(e={}){const{wrapper:o}={...(0,t.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,o,r)=>{r.d(o,{Z:()=>d,a:()=>s});var n=r(67294);const t={},i=n.createContext(t);function s(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec4e4367.b8aea460.js b/assets/js/ec4e4367.b8aea460.js new file mode 100644 index 000000000..e00fafa4b --- /dev/null +++ b/assets/js/ec4e4367.b8aea460.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8410"],{74675:function(e,o,r){r.r(o),r.d(o,{metadata:()=>n,contentTitle:()=>d,default:()=>u,assets:()=>l,toc:()=>a,frontMatter:()=>s});var n=JSON.parse('{"id":"user/hardware/mobile/android","title":"Android","description":"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems.","source":"@site/docs/user/hardware/mobile/android.md","sourceDirName":"user/hardware/mobile","slug":"/user/hardware/mobile/android","permalink":"/docs/user/hardware/mobile/android","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/android.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Android","summary":"Quick guide to working with Android devices on Solus"},"sidebar":"userSidebar","previous":{"title":"Mobile","permalink":"/docs/category/mobile"},"next":{"title":"Apple","permalink":"/docs/user/hardware/mobile/apple"}}'),t=r("85893"),i=r("50065");let s={title:"Android",summary:"Quick guide to working with Android devices on Solus"},d="Android",l={},a=[{value:"File management",id:"file-management",level:2},{value:"Developer tools",id:"developer-tools",level:2}];function c(e){let o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"android",children:"Android"})}),"\n",(0,t.jsx)(o.p,{children:"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems."}),"\n",(0,t.jsx)(o.h2,{id:"file-management",children:"File management"}),"\n",(0,t.jsx)(o.p,{children:"TODO: Tutorial on accessing files from a file browser. Android screenshots would be nice to have."}),"\n",(0,t.jsx)(o.h2,{id:"developer-tools",children:"Developer tools"}),"\n",(0,t.jsxs)(o.p,{children:["Whether you are an Android developer or just need ",(0,t.jsx)(o.code,{children:"adb"})," or ",(0,t.jsx)(o.code,{children:"fastboot"})," for installing a ROM, we've got you covered! We just need to install ",(0,t.jsx)(o.code,{children:"android-tools"})," from the Software Center or command-line:"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install android-tools\n"})})]})}function u(e={}){let{wrapper:o}={...(0,i.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},50065:function(e,o,r){r.d(o,{Z:function(){return d},a:function(){return s}});var n=r(67294);let t={},i=n.createContext(t);function s(e){let o=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ecdeb26c.1fe9d20f.js b/assets/js/ecdeb26c.1fe9d20f.js new file mode 100644 index 000000000..45d522c54 --- /dev/null +++ b/assets/js/ecdeb26c.1fe9d20f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1828"],{76047:function(e,t,n){n.r(t),n.d(t,{assets:function(){return r},contentTitle:function(){return i},default:function(){return c},frontMatter:function(){return l},metadata:function(){return o},toc:function(){return u}});var o=n(82417),a=n(85893),s=n(50065);let l={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},i=void 0,r={authorsImageUrls:[void 0]},u=[];function d(e){let t={a:"a",em:"em",p:"p",...(0,s.a)(),...e.components};return(0,a.jsxs)(t.p,{children:["Back in our ",(0,a.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,a.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]})}function c(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return i},a:function(){return l}});var o=n(67294);let a={},s=o.createContext(a);function l(e){let t=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),o.createElement(s.Provider,{value:t},e.children)}},82417:function(e){e.exports=JSON.parse('{"permalink":"/blog/don\'t-call-me-mate-pal","source":"@site/devlog/2024-01-29-dont-call-me-mate.md","title":"Don\'t call me MATE, pal!","description":"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.","date":"2024-01-29T00:00:00.000Z","tags":[{"inline":true,"label":"MATE","permalink":"/blog/tags/mate"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":2.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"Don\'t call me MATE, pal!","slug":"don\'t-call-me-mate-pal","authors":"david","tags":["MATE","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"},"nextItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}}')}}]); \ No newline at end of file diff --git a/assets/js/ecdeb26c.df2e94ce.js b/assets/js/ecdeb26c.df2e94ce.js deleted file mode 100644 index 962854046..000000000 --- a/assets/js/ecdeb26c.df2e94ce.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1971],{35247:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var n=o(85893),a=o(11151);const s={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},l=void 0,i={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},d=[];function u(e){const t={a:"a",em:"em",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]})}function p(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>i,a:()=>l});var n=o(67294);const a={},s=n.createContext(a);function l(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed2a5927.ee16d26e.js b/assets/js/ed2a5927.ee16d26e.js new file mode 100644 index 000000000..351e6ef69 --- /dev/null +++ b/assets/js/ed2a5927.ee16d26e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7265"],{62077:function(e,t,r){r.r(t),r.d(t,{metadata:()=>n,contentTitle:()=>i,default:()=>d,assets:()=>c,toc:()=>u,frontMatter:()=>o});var n=JSON.parse('{"id":"user/quick-start/software-center/index","title":"Software Center","description":"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center.","source":"@site/docs/user/quick-start/software-center/index.md","sourceDirName":"user/quick-start/software-center","slug":"/user/quick-start/software-center/","permalink":"/docs/user/quick-start/software-center/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/software-center/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Software Center","summary":"Introduction to the Solus Software Center"},"sidebar":"userSidebar","previous":{"title":"System Requirements","permalink":"/docs/user/quick-start/installation/system-requirements"},"next":{"title":"Contributing","permalink":"/docs/category/contributing"}}'),s=r("85893"),a=r("50065");let o={title:"Software Center",summary:"Introduction to the Solus Software Center"},i="Software Center",c={},u=[];function l(e){let t={a:"a",code:"code",h1:"h1",header:"header",img:"img",p:"p",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"software-center",children:"Software Center"})}),"\n",(0,s.jsx)(t.p,{children:"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Software Center",src:r(56326).Z+"",width:"949",height:"698"})}),"\n",(0,s.jsxs)(t.p,{children:["Solus uses the ",(0,s.jsx)(t.code,{children:"eopkg"})," package manager, which is not compatible with either ",(0,s.jsx)(t.code,{children:"deb"})," or ",(0,s.jsx)(t.code,{children:"rpm"})," packages offered by other Linux-based operating systems.\nFor information on how to use eopkg directly, see the ",(0,s.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package Management section"})]}),"\n",(0,s.jsx)(t.p,{children:'You can also use a number of distribution-agnostic (or "universal") package managers to install applications, including Snap, Flatpak, and AppImage.'})]})}function d(e={}){let{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},56326:function(e,t,r){r.d(t,{Z:function(){return n}});let n=r.p+"assets/images/solus-sc-563436dafaad570539db7231fc5ed77e.jpg"},50065:function(e,t,r){r.d(t,{Z:function(){return i},a:function(){return o}});var n=r(67294);let s={},a=n.createContext(s);function o(e){let t=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed2a5927.f68db7ff.js b/assets/js/ed2a5927.f68db7ff.js deleted file mode 100644 index 947734893..000000000 --- a/assets/js/ed2a5927.f68db7ff.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4560],{18653:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(85893),s=r(11151);const o={title:"Software Center",summary:"Introduction to the Solus Software Center"},a="Software Center",i={id:"user/quick-start/software-center/index",title:"Software Center",description:"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center.",source:"@site/docs/user/quick-start/software-center/index.md",sourceDirName:"user/quick-start/software-center",slug:"/user/quick-start/software-center/",permalink:"/docs/user/quick-start/software-center/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/software-center/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Software Center",summary:"Introduction to the Solus Software Center"},sidebar:"userSidebar",previous:{title:"System Requirements",permalink:"/docs/user/quick-start/installation/system-requirements"},next:{title:"Contributing",permalink:"/docs/category/contributing"}},c={},u=[];function d(e){const t={a:"a",code:"code",h1:"h1",header:"header",img:"img",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"software-center",children:"Software Center"})}),"\n",(0,n.jsx)(t.p,{children:"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Software Center",src:r(34830).Z+"",width:"949",height:"698"})}),"\n",(0,n.jsxs)(t.p,{children:["Solus uses the ",(0,n.jsx)(t.code,{children:"eopkg"})," package manager, which is not compatible with either ",(0,n.jsx)(t.code,{children:"deb"})," or ",(0,n.jsx)(t.code,{children:"rpm"})," packages offered by other Linux-based operating systems.\nFor information on how to use eopkg directly, see the ",(0,n.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package Management section"})]}),"\n",(0,n.jsx)(t.p,{children:'You can also use a number of distribution-agnostic (or "universal") package managers to install applications, including Snap, Flatpak, and AppImage.'})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},34830:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/solus-sc-563436dafaad570539db7231fc5ed77e.jpg"},11151:(e,t,r)=>{r.d(t,{Z:()=>i,a:()=>a});var n=r(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef8b811a.38a80317.js b/assets/js/ef8b811a.38a80317.js new file mode 100644 index 000000000..e003096cf --- /dev/null +++ b/assets/js/ef8b811a.38a80317.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2134"],{96007:function(t){t.exports=JSON.parse('{"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey","count":2},{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david","count":2},{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/ef8b811a.5c57c19d.js b/assets/js/ef8b811a.5c57c19d.js deleted file mode 100644 index 6d4ea9a72..000000000 --- a/assets/js/ef8b811a.5c57c19d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2644],{89441:t=>{t.exports=JSON.parse('{"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey","count":2},{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david","count":2},{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/f0629c21.220ef5fc.js b/assets/js/f0629c21.220ef5fc.js deleted file mode 100644 index 38c6dce7d..000000000 --- a/assets/js/f0629c21.220ef5fc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3375],{53126:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var s=o(85893),i=o(11151);const t={title:"Open Broadcaster Software (OBS)",summary:"A quick start guide to OBS on Solus"},l="Open Broadcaster Software (OBS)",r={id:"user/software/web/obs",title:"Open Broadcaster Software (OBS)",description:"This article covers the installation of OBS Studio as well as the use of third-party plugins.",source:"@site/docs/user/software/web/obs.md",sourceDirName:"user/software/web",slug:"/user/software/web/obs",permalink:"/docs/user/software/web/obs",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/web/obs.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Open Broadcaster Software (OBS)",summary:"A quick start guide to OBS on Solus"},sidebar:"userSidebar",previous:{title:"Web",permalink:"/docs/category/web"},next:{title:"Troubleshooting",permalink:"/docs/user/troubleshooting/"}},a={},d=[{value:"Installation",id:"installation",level:2},{value:"Virtual camera",id:"virtual-camera",level:2},{value:"Plugins",id:"plugins",level:2},{value:"Known working plugins",id:"known-working-plugins",level:3},{value:"Input Overlay",id:"input-overlay",level:4}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"open-broadcaster-software-obs",children:"Open Broadcaster Software (OBS)"})}),"\n",(0,s.jsx)(n.p,{children:"This article covers the installation of OBS Studio as well as the use of third-party plugins."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(n.p,{children:["To install OBS Studio, either open up the Software Center and type ",(0,s.jsx)(n.code,{children:"obs-studio"})," into the Search section or run the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install obs-studio\n"})}),"\n",(0,s.jsx)(n.h2,{id:"virtual-camera",children:"Virtual camera"}),"\n",(0,s.jsx)(n.p,{children:'OBS includes a virtual webcam device which can be used to send your OBS stream to video conferencing programs. In order to use this on Solus, you must first install from our repository a separate kernel module that is responsible for creating the necessary "loopback" device. There are two versions of this software available in the repository, you must choose the version that corresponds to the kernel you have installed.'}),"\n",(0,s.jsx)(n.p,{children:"To find out which kernel is installed, run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This should return a version which ends in ",(0,s.jsx)(n.code,{children:".current"})," or ",(0,s.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,s.jsx)(n.code,{children:"v4l2loopback-current"}),": ",(0,s.jsx)(n.code,{children:"sudo eopkg install v4l2loopback-current"})]}),"\n",(0,s.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,s.jsx)(n.code,{children:"v4l2loopback"}),": ",(0,s.jsx)(n.code,{children:"sudo eopkg install v4l2loopback"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Once v4l2loopback is installed, reboot your computer. Next time you start OBS, it will prompt you for your password to set up v4l2loopback. After that, the virtual camera should be available as a webcam in other programs."}),"\n",(0,s.jsx)(n.h2,{id:"plugins",children:"Plugins"}),"\n",(0,s.jsxs)(n.p,{children:["All OBS Studio plugins should be installed into their own respective folders inside the ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," folder. If this folder does not exist for you, you'll need to create it before copying plugins into it."]}),"\n",(0,s.jsx)(n.p,{children:"When installing a plugin, the directory tree should look something like the following:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"plugins\n\u2514\u2500\u2500 plugin-name\n \u251c\u2500\u2500 bin\n \u2502\xa0\xa0 \u2514\u2500\u2500 64bit\n \u2502\xa0\xa0 \u2514\u2500\u2500 filename.so\n \u251c\u2500\u2500 data\n \u2502\xa0\xa0 \u2514\u2500\u2500 locale\n \u2502\xa0\xa0 \u2514\u2500\u2500 en-US.ini\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In essence, you should have ",(0,s.jsx)(n.code,{children:"bin/64bit"})," folders inside the plugin folder, with any shared object plugin files inside that. As OBS Studio for Solus only supports 64-bit, the plugin ",(0,s.jsx)(n.strong,{children:"must"})," support 64-bit as well."]}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, the plugin may come with additional files or folders, such as locale information. That locale information should be located in ",(0,s.jsx)(n.code,{children:"data/locale"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Most Linux-supporting plugins should provide pre-compiled tarballs or zip files that you can extract to get a pre-made / ready folder structure that you can simply copy / paste into ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})]}),"\n",(0,s.jsx)(n.h3,{id:"known-working-plugins",children:"Known working plugins"}),"\n",(0,s.jsx)(n.h4,{id:"input-overlay",children:"Input Overlay"}),"\n",(0,s.jsxs)(n.p,{children:["The Input Overlay plugin enables you to show an input overlay of your gamepad, mouse, or keyboard. Pre-compiled release files are available on the Releases section of the ",(0,s.jsx)(n.a,{href:"https://github.com/univrsal/input-overlay",children:"developer's website"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"To install Input Overlay, download the input-overlay-vNUM.zip file from their releases page, where NUM is the latest release number, such as 4.4."}),"\n",(0,s.jsx)(n.p,{children:"Next, we'll install a library necessary to use the Input Overlay plugin, as well as an unzip tool to make the installation process easier. Run the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libuiohook unzip\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, click on the zip file in your File Manager to open up the Extract tool (such as File Roller). You will be presented with contents like the following."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay Zip",src:o(45594).Z+"",width:"770",height:"348"})}),"\n",(0,s.jsxs)(n.p,{children:["Let's extract this to our Downloads folder to make the process of copying the contents we need more easily. Click the Extract button in the image indicated above. This will present you with a file dialog. Navigate to the Downloads folder and click Extract. This will create a folder, likely called something similar to ",(0,s.jsx)(n.code,{children:"input-overlay.v4.4"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Next let's run the following commands in the Terminal. The commands below will:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Remove our zip file to make our directory renaming more reliable."}),"\n",(0,s.jsx)(n.li,{children:"Move our extracted input overlay in our Downloads directory to one which is without a version number, to make it easier for future commands."}),"\n",(0,s.jsx)(n.li,{children:"Extract all the preset zips and remove their zip files"}),"\n",(0,s.jsxs)(n.li,{children:["Create an ",(0,s.jsx)(n.code,{children:"input-overlay"})," folder in ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," as well as creating the ",(0,s.jsx)(n.code,{children:"plugins"})," folder if needed."]}),"\n",(0,s.jsx)(n.li,{children:"Copy over the necessary and recommended folders and files to our input-overlay plugin folder."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'rm ~/Downloads/input-overlay*.zip\nmv ~/Downloads/input-overlay.v* ~/Downloads/input-overlay\ncd ~/Downloads/input-overlay/presets\nfor file in `ls *.zip`; do unzip "${file}" -d "${file:0:-4}"; done\nrm *.zip\nmkdir -p ~/.config/obs-studio/plugins/input-overlay\ncp -R ~/Downloads/input-overlay/plugin-linux/* ~/.config/obs-studio/plugins/input-overlay/\ncp -R ~/Downloads/input-overlay/presets ~/.config/obs-studio/plugins/input-overlay/\n'})}),"\n",(0,s.jsx)(n.p,{children:"Now the Input Overlay source is available to us as a source (if you have OBS Studio already open, restart it), as shown in the below screenshot."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Source Menu",src:o(27549).Z+"",width:"1000",height:"600"})}),"\n",(0,s.jsx)(n.p,{children:"Upon clicking on this source, we'll be presented with the usual add / use existing source dialog."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Add Existing Source",src:o(52985).Z+"",width:"791",height:"540"})}),"\n",(0,s.jsx)(n.p,{children:"After naming a source, such as \"Mouse\", click OK and you'll be presented with a dialog that looks similar to below. Do note that yours will be empty by default, as you've not yet selected an Overlay image file and Layout config file yet."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Main Source",src:o(1515).Z+"",width:"1032",height:"783"})}),"\n",(0,s.jsxs)(n.p,{children:["This is where the presets come in handy. Click the Browse button for Overlay image file and navigate to ",(0,s.jsx)(n.code,{children:".config/obs-studio/plugins/presets"})," and then the respective preset you want, such as mouse, and then the PNG within it. ",(0,s.jsx)(n.strong,{children:"You will need to enable hidden files"})," in the file dialog by using the keyboard combination ",(0,s.jsx)(n.code,{children:"Ctrl+H"})," to see ",(0,s.jsx)(n.code,{children:".config"})]}),"\n",(0,s.jsxs)(n.p,{children:["Next, do the same for Layout config overlay, but instead go to the same folder as your PNG and select the ",(0,s.jsx)(n.code,{children:"ini"})," file."]}),"\n",(0,s.jsx)(n.p,{children:'If you\'re using a mouse or gamepad, be sure to check the "Mouse overlay" or "Gamepad overlay" boxes respectively and tweak settings as you see fit.'})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},52985:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-add-existing-d472cc90ae7590dd14f41fa8e7a249d5.jpg"},1515:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-main-8fdfb8ec5ad7ba5006f03737eebcc8c8.jpg"},27549:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-menu-ef421b6d9afa2c80e8f2c84e15adb843.jpg"},45594:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-zip-12cbf3b807ebdf130723291e940f425d.jpg"},11151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var s=o(67294);const i={},t=s.createContext(i);function l(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f0629c21.8c4a1e13.js b/assets/js/f0629c21.8c4a1e13.js new file mode 100644 index 000000000..fff6334fa --- /dev/null +++ b/assets/js/f0629c21.8c4a1e13.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4639"],{19549:function(e,n,o){o.r(n),o.d(n,{metadata:()=>i,contentTitle:()=>r,default:()=>u,assets:()=>a,toc:()=>d,frontMatter:()=>l});var i=JSON.parse('{"id":"user/software/web/obs","title":"Open Broadcaster Software (OBS)","description":"This article covers the installation of OBS Studio as well as the use of third-party plugins.","source":"@site/docs/user/software/web/obs.md","sourceDirName":"user/software/web","slug":"/user/software/web/obs","permalink":"/docs/user/software/web/obs","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/web/obs.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Open Broadcaster Software (OBS)","summary":"A quick start guide to OBS on Solus"},"sidebar":"userSidebar","previous":{"title":"Web","permalink":"/docs/category/web"},"next":{"title":"Troubleshooting","permalink":"/docs/user/troubleshooting/"}}'),t=o("85893"),s=o("50065");let l={title:"Open Broadcaster Software (OBS)",summary:"A quick start guide to OBS on Solus"},r="Open Broadcaster Software (OBS)",a={},d=[{value:"Installation",id:"installation",level:2},{value:"Virtual camera",id:"virtual-camera",level:2},{value:"Plugins",id:"plugins",level:2},{value:"Known working plugins",id:"known-working-plugins",level:3},{value:"Input Overlay",id:"input-overlay",level:4}];function c(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"open-broadcaster-software-obs",children:"Open Broadcaster Software (OBS)"})}),"\n",(0,t.jsx)(n.p,{children:"This article covers the installation of OBS Studio as well as the use of third-party plugins."}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(n.p,{children:["To install OBS Studio, either open up the Software Center and type ",(0,t.jsx)(n.code,{children:"obs-studio"})," into the Search section or run the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install obs-studio\n"})}),"\n",(0,t.jsx)(n.h2,{id:"virtual-camera",children:"Virtual camera"}),"\n",(0,t.jsx)(n.p,{children:'OBS includes a virtual webcam device which can be used to send your OBS stream to video conferencing programs. In order to use this on Solus, you must first install from our repository a separate kernel module that is responsible for creating the necessary "loopback" device. There are two versions of this software available in the repository, you must choose the version that corresponds to the kernel you have installed.'}),"\n",(0,t.jsx)(n.p,{children:"To find out which kernel is installed, run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This should return a version which ends in ",(0,t.jsx)(n.code,{children:".current"})," or ",(0,t.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,t.jsx)(n.code,{children:"v4l2loopback-current"}),": ",(0,t.jsx)(n.code,{children:"sudo eopkg install v4l2loopback-current"})]}),"\n",(0,t.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,t.jsx)(n.code,{children:"v4l2loopback"}),": ",(0,t.jsx)(n.code,{children:"sudo eopkg install v4l2loopback"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Once v4l2loopback is installed, reboot your computer. Next time you start OBS, it will prompt you for your password to set up v4l2loopback. After that, the virtual camera should be available as a webcam in other programs."}),"\n",(0,t.jsx)(n.h2,{id:"plugins",children:"Plugins"}),"\n",(0,t.jsxs)(n.p,{children:["All OBS Studio plugins should be installed into their own respective folders inside the ",(0,t.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," folder. If this folder does not exist for you, you'll need to create it before copying plugins into it."]}),"\n",(0,t.jsx)(n.p,{children:"When installing a plugin, the directory tree should look something like the following:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"plugins\n\u2514\u2500\u2500 plugin-name\n \u251C\u2500\u2500 bin\n \u2502\xa0\xa0 \u2514\u2500\u2500 64bit\n \u2502\xa0\xa0 \u2514\u2500\u2500 filename.so\n \u251C\u2500\u2500 data\n \u2502\xa0\xa0 \u2514\u2500\u2500 locale\n \u2502\xa0\xa0 \u2514\u2500\u2500 en-US.ini\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In essence, you should have ",(0,t.jsx)(n.code,{children:"bin/64bit"})," folders inside the plugin folder, with any shared object plugin files inside that. As OBS Studio for Solus only supports 64-bit, the plugin ",(0,t.jsx)(n.strong,{children:"must"})," support 64-bit as well."]}),"\n",(0,t.jsxs)(n.p,{children:["Additionally, the plugin may come with additional files or folders, such as locale information. That locale information should be located in ",(0,t.jsx)(n.code,{children:"data/locale"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Most Linux-supporting plugins should provide pre-compiled tarballs or zip files that you can extract to get a pre-made / ready folder structure that you can simply copy / paste into ",(0,t.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})]}),"\n",(0,t.jsx)(n.h3,{id:"known-working-plugins",children:"Known working plugins"}),"\n",(0,t.jsx)(n.h4,{id:"input-overlay",children:"Input Overlay"}),"\n",(0,t.jsxs)(n.p,{children:["The Input Overlay plugin enables you to show an input overlay of your gamepad, mouse, or keyboard. Pre-compiled release files are available on the Releases section of the ",(0,t.jsx)(n.a,{href:"https://github.com/univrsal/input-overlay",children:"developer's website"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"To install Input Overlay, download the input-overlay-vNUM.zip file from their releases page, where NUM is the latest release number, such as 4.4."}),"\n",(0,t.jsx)(n.p,{children:"Next, we'll install a library necessary to use the Input Overlay plugin, as well as an unzip tool to make the installation process easier. Run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libuiohook unzip\n"})}),"\n",(0,t.jsx)(n.p,{children:"Next, click on the zip file in your File Manager to open up the Extract tool (such as File Roller). You will be presented with contents like the following."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Input Overlay Zip",src:o(10307).Z+"",width:"770",height:"348"})}),"\n",(0,t.jsxs)(n.p,{children:["Let's extract this to our Downloads folder to make the process of copying the contents we need more easily. Click the Extract button in the image indicated above. This will present you with a file dialog. Navigate to the Downloads folder and click Extract. This will create a folder, likely called something similar to ",(0,t.jsx)(n.code,{children:"input-overlay.v4.4"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Next let's run the following commands in the Terminal. The commands below will:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Remove our zip file to make our directory renaming more reliable."}),"\n",(0,t.jsx)(n.li,{children:"Move our extracted input overlay in our Downloads directory to one which is without a version number, to make it easier for future commands."}),"\n",(0,t.jsx)(n.li,{children:"Extract all the preset zips and remove their zip files"}),"\n",(0,t.jsxs)(n.li,{children:["Create an ",(0,t.jsx)(n.code,{children:"input-overlay"})," folder in ",(0,t.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," as well as creating the ",(0,t.jsx)(n.code,{children:"plugins"})," folder if needed."]}),"\n",(0,t.jsx)(n.li,{children:"Copy over the necessary and recommended folders and files to our input-overlay plugin folder."}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'rm ~/Downloads/input-overlay*.zip\nmv ~/Downloads/input-overlay.v* ~/Downloads/input-overlay\ncd ~/Downloads/input-overlay/presets\nfor file in `ls *.zip`; do unzip "${file}" -d "${file:0:-4}"; done\nrm *.zip\nmkdir -p ~/.config/obs-studio/plugins/input-overlay\ncp -R ~/Downloads/input-overlay/plugin-linux/* ~/.config/obs-studio/plugins/input-overlay/\ncp -R ~/Downloads/input-overlay/presets ~/.config/obs-studio/plugins/input-overlay/\n'})}),"\n",(0,t.jsx)(n.p,{children:"Now the Input Overlay source is available to us as a source (if you have OBS Studio already open, restart it), as shown in the below screenshot."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Input Overlay: Source Menu",src:o(39785).Z+"",width:"1000",height:"600"})}),"\n",(0,t.jsx)(n.p,{children:"Upon clicking on this source, we'll be presented with the usual add / use existing source dialog."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Input Overlay: Add Existing Source",src:o(62470).Z+"",width:"791",height:"540"})}),"\n",(0,t.jsx)(n.p,{children:"After naming a source, such as \"Mouse\", click OK and you'll be presented with a dialog that looks similar to below. Do note that yours will be empty by default, as you've not yet selected an Overlay image file and Layout config file yet."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Input Overlay: Main Source",src:o(22768).Z+"",width:"1032",height:"783"})}),"\n",(0,t.jsxs)(n.p,{children:["This is where the presets come in handy. Click the Browse button for Overlay image file and navigate to ",(0,t.jsx)(n.code,{children:".config/obs-studio/plugins/presets"})," and then the respective preset you want, such as mouse, and then the PNG within it. ",(0,t.jsx)(n.strong,{children:"You will need to enable hidden files"})," in the file dialog by using the keyboard combination ",(0,t.jsx)(n.code,{children:"Ctrl+H"})," to see ",(0,t.jsx)(n.code,{children:".config"})]}),"\n",(0,t.jsxs)(n.p,{children:["Next, do the same for Layout config overlay, but instead go to the same folder as your PNG and select the ",(0,t.jsx)(n.code,{children:"ini"})," file."]}),"\n",(0,t.jsx)(n.p,{children:'If you\'re using a mouse or gamepad, be sure to check the "Mouse overlay" or "Gamepad overlay" boxes respectively and tweak settings as you see fit.'})]})}function u(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},62470:function(e,n,o){o.d(n,{Z:function(){return i}});let i=o.p+"assets/images/input-overlay-source-add-existing-d472cc90ae7590dd14f41fa8e7a249d5.jpg"},22768:function(e,n,o){o.d(n,{Z:function(){return i}});let i=o.p+"assets/images/input-overlay-source-main-8fdfb8ec5ad7ba5006f03737eebcc8c8.jpg"},39785:function(e,n,o){o.d(n,{Z:function(){return i}});let i=o.p+"assets/images/input-overlay-source-menu-ef421b6d9afa2c80e8f2c84e15adb843.jpg"},10307:function(e,n,o){o.d(n,{Z:function(){return i}});let i=o.p+"assets/images/input-overlay-zip-12cbf3b807ebdf130723291e940f425d.jpg"},50065:function(e,n,o){o.d(n,{Z:function(){return r},a:function(){return l}});var i=o(67294);let t={},s=i.createContext(t);function l(e){let n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1d13e1b.736a2c39.js b/assets/js/f1d13e1b.736a2c39.js deleted file mode 100644 index 8ff07203a..000000000 --- a/assets/js/f1d13e1b.736a2c39.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5462],{16467:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var r=s(85893),n=s(11151);const i={title:"Tips and Tricks",summary:"Helpful tips and tricks for using MATE on Solus"},o="Tips and Tricks",a={id:"user/editions/mate/tips-and-tricks",title:"Tips and Tricks",description:"MATE Keyboard Shortcuts",source:"@site/docs/user/editions/mate/tips-and-tricks.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/tips-and-tricks",permalink:"/docs/user/editions/mate/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using MATE on Solus"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"},next:{title:"Plasma",permalink:"/docs/user/editions/plasma/"}},d={},c=[{value:"MATE Keyboard Shortcuts",id:"mate-keyboard-shortcuts",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,r.jsx)(t.h2,{id:"mate-keyboard-shortcuts",children:"MATE Keyboard Shortcuts"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to MATE users"})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>o});var r=s(67294);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1d13e1b.a2a60264.js b/assets/js/f1d13e1b.a2a60264.js new file mode 100644 index 000000000..a5ab5e3fa --- /dev/null +++ b/assets/js/f1d13e1b.a2a60264.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9227"],{64954:function(e,t,s){s.r(t),s.d(t,{metadata:()=>r,contentTitle:()=>a,default:()=>l,assets:()=>d,toc:()=>c,frontMatter:()=>o});var r=JSON.parse('{"id":"user/editions/mate/tips-and-tricks","title":"Tips and Tricks","description":"MATE Keyboard Shortcuts","source":"@site/docs/user/editions/mate/tips-and-tricks.md","sourceDirName":"user/editions/mate","slug":"/user/editions/mate/tips-and-tricks","permalink":"/docs/user/editions/mate/tips-and-tricks","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/tips-and-tricks.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Tips and Tricks","summary":"Helpful tips and tricks for using MATE on Solus"},"sidebar":"userSidebar","previous":{"title":"Configuration","permalink":"/docs/user/editions/mate/configuration"},"next":{"title":"Plasma","permalink":"/docs/user/editions/plasma/"}}'),n=s("85893"),i=s("50065");let o={title:"Tips and Tricks",summary:"Helpful tips and tricks for using MATE on Solus"},a="Tips and Tricks",d={},c=[{value:"MATE Keyboard Shortcuts",id:"mate-keyboard-shortcuts",level:2}];function u(e){let t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(t.h2,{id:"mate-keyboard-shortcuts",children:"MATE Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to MATE users"})]})}function l(e={}){let{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},50065:function(e,t,s){s.d(t,{Z:function(){return a},a:function(){return o}});var r=s(67294);let n={},i=r.createContext(n);function o(e){let t=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f32bcb79.1a54b319.js b/assets/js/f32bcb79.1a54b319.js new file mode 100644 index 000000000..900ab4004 --- /dev/null +++ b/assets/js/f32bcb79.1a54b319.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8025"],{24816:function(t){t.exports=JSON.parse('{"tag":{"label":"firstpost","permalink":"/blog/tags/firstpost","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/firstpost","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f32bcb79.c99ad29c.js b/assets/js/f32bcb79.c99ad29c.js deleted file mode 100644 index 77a1f5362..000000000 --- a/assets/js/f32bcb79.c99ad29c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6515],{15631:e=>{e.exports=JSON.parse('{"tag":{"label":"firstpost","permalink":"/blog/tags/firstpost","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/firstpost","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f35b91b6.239937fe.js b/assets/js/f35b91b6.239937fe.js deleted file mode 100644 index 2f81052b4..000000000 --- a/assets/js/f35b91b6.239937fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9749],{78677:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>u});var s=t(85893),l=t(11151);const n={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/welcome-solus-devlog-v1",source:"@site/devlog/2024-01-13-welcome-devlog.md",title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",date:"2024-01-13T00:00:00.000Z",tags:[{inline:!0,label:"hello",permalink:"/blog/tags/hello"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"firstpost",permalink:"/blog/tags/firstpost"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:.9,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},u=[];function c(e){const o={a:"a",p:"p",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,s.jsx)(o.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."}),"\n",(0,s.jsx)(o.p,{children:"The Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space."}),"\n",(0,s.jsxs)(o.p,{children:["The DevLog has been setup as a separate entity to the ",(0,s.jsx)(o.a,{href:"https://getsol.us/blog/",children:"Solus Blog"})," to encourage more short form development content that doesn't require the same level of polish as an official blog post."]}),"\n",(0,s.jsx)(o.p,{children:"It is hoped that this will be used to help communicate what's going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world."}),"\n",(0,s.jsxs)(o.p,{children:["Additionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the ",(0,s.jsx)(o.a,{href:"https://github.com/getsolus/",children:"getsolus"})," GitHub organization page and the ",(0,s.jsx)(o.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Solus"})," Matrix channels."]}),"\n",(0,s.jsx)(o.p,{children:"Hope to see you back at this space soon with more content!"})]})}function h(e={}){const{wrapper:o}={...(0,l.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>i});var s=t(67294);const l={},n=s.createContext(l);function i(e){const o=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f35b91b6.d946cc37.js b/assets/js/f35b91b6.d946cc37.js new file mode 100644 index 000000000..5ad079a43 --- /dev/null +++ b/assets/js/f35b91b6.d946cc37.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["8719"],{74298:function(e,t,o){o.r(t),o.d(t,{assets:function(){return a},contentTitle:function(){return r},default:function(){return h},frontMatter:function(){return i},metadata:function(){return n},toc:function(){return u}});var n=o(42650),s=o(85893),l=o(50065);let i={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},r=void 0,a={authorsImageUrls:[void 0]},u=[];function c(e){let t={a:"a",p:"p",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,s.jsx)(t.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."}),"\n",(0,s.jsx)(t.p,{children:"The Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space."}),"\n",(0,s.jsxs)(t.p,{children:["The DevLog has been setup as a separate entity to the ",(0,s.jsx)(t.a,{href:"https://getsol.us/blog/",children:"Solus Blog"})," to encourage more short form development content that doesn't require the same level of polish as an official blog post."]}),"\n",(0,s.jsx)(t.p,{children:"It is hoped that this will be used to help communicate what's going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world."}),"\n",(0,s.jsxs)(t.p,{children:["Additionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/",children:"getsolus"})," GitHub organization page and the ",(0,s.jsx)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Solus"})," Matrix channels."]}),"\n",(0,s.jsx)(t.p,{children:"Hope to see you back at this space soon with more content!"})]})}function h(e={}){let{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},50065:function(e,t,o){o.d(t,{Z:function(){return r},a:function(){return i}});var n=o(67294);let s={},l=n.createContext(s);function i(e){let t=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(l.Provider,{value:t},e.children)}},42650:function(e){e.exports=JSON.parse('{"permalink":"/blog/welcome-solus-devlog-v1","source":"@site/devlog/2024-01-13-welcome-devlog.md","title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","date":"2024-01-13T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"firstpost","permalink":"/blog/tags/firstpost"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":0.9,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","slug":"welcome-solus-devlog-v1","authors":"joey","tags":["hello","devlog","firstpost","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}}')}}]); \ No newline at end of file diff --git a/assets/js/f3d58343.a6934cc2.js b/assets/js/f3d58343.a6934cc2.js new file mode 100644 index 000000000..7f006c2e5 --- /dev/null +++ b/assets/js/f3d58343.a6934cc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7269"],{50073:function(e){e.exports=JSON.parse('{"author":{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david","count":2},"listMetadata":{"permalink":"/blog/authors/david","page":1,"postsPerPage":2,"totalPages":1,"totalCount":2,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f3d58343.c90fcc92.js b/assets/js/f3d58343.c90fcc92.js deleted file mode 100644 index 870b5c5e7..000000000 --- a/assets/js/f3d58343.c90fcc92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8812],{11741:e=>{e.exports=JSON.parse('{"author":{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david","count":2},"listMetadata":{"permalink":"/blog/authors/david","page":1,"postsPerPage":2,"totalPages":1,"totalCount":2,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f4aa4739.a946a5ba.js b/assets/js/f4aa4739.a946a5ba.js new file mode 100644 index 000000000..d15def7b6 --- /dev/null +++ b/assets/js/f4aa4739.a946a5ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["9832"],{19332:function(e,i,t){t.r(i),t.d(i,{metadata:()=>n,contentTitle:()=>r,default:()=>a,assets:()=>u,toc:()=>c,frontMatter:()=>d});var n=JSON.parse('{"id":"user/editions/budgie/index","title":"Budgie","description":"TODO: Add Budgie branding image","source":"@site/docs/user/editions/budgie/index.md","sourceDirName":"user/editions/budgie","slug":"/user/editions/budgie/","permalink":"/docs/user/editions/budgie/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Budgie","summary":"A quick introduction to the Budgie Edition of Solus"},"sidebar":"userSidebar","previous":{"title":"Editions","permalink":"/docs/user/editions/"},"next":{"title":"Configuration","permalink":"/docs/user/editions/budgie/configuration"}}'),s=t("85893"),o=t("50065");let d={title:"Budgie",summary:"A quick introduction to the Budgie Edition of Solus"},r="Budgie Desktop",u={},c=[];function l(e){let i={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"budgie-desktop",children:"Budgie Desktop"})}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"TODO: Add Budgie branding image"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Budgie is the flagship Edition of Solus. It was originally started by Solus and has now been spun off into its own distro-agnostic project. They describe it as:"}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"The Budgie Desktop is a feature-rich, modern desktop designed to keep out the way of the user."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie",children:"Homepage"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://blog.buddiesofbudgie.org/",children:"News"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Support"})}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.a,{href:"configuration",children:"Go to Budgie Configuration"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.a,{href:"tips-and-tricks",children:"Go to Budgie Tips and Tricks"})})]})}function a(e={}){let{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},50065:function(e,i,t){t.d(i,{Z:function(){return r},a:function(){return d}});var n=t(67294);let s={},o=n.createContext(s);function d(e){let i=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4aa4739.af7c7acb.js b/assets/js/f4aa4739.af7c7acb.js deleted file mode 100644 index d34864a30..000000000 --- a/assets/js/f4aa4739.af7c7acb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9170],{75340:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>u,contentTitle:()=>d,default:()=>a,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var n=t(85893),s=t(11151);const o={title:"Budgie",summary:"A quick introduction to the Budgie Edition of Solus"},d="Budgie Desktop",r={id:"user/editions/budgie/index",title:"Budgie",description:"TODO: Add Budgie branding image",source:"@site/docs/user/editions/budgie/index.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/",permalink:"/docs/user/editions/budgie/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Budgie",summary:"A quick introduction to the Budgie Edition of Solus"},sidebar:"userSidebar",previous:{title:"Editions",permalink:"/docs/user/editions/"},next:{title:"Configuration",permalink:"/docs/user/editions/budgie/configuration"}},u={},c=[];function l(e){const i={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"budgie-desktop",children:"Budgie Desktop"})}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"TODO: Add Budgie branding image"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Budgie is the flagship Edition of Solus. It was originally started by Solus and has now been spun off into its own distro-agnostic project. They describe it as:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"The Budgie Desktop is a feature-rich, modern desktop designed to keep out the way of the user."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie",children:"Homepage"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://blog.buddiesofbudgie.org/",children:"News"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Support"})}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"configuration",children:"Go to Budgie Configuration"})}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"tips-and-tricks",children:"Go to Budgie Tips and Tricks"})})]})}function a(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,i,t)=>{t.d(i,{Z:()=>r,a:()=>d});var n=t(67294);const s={},o=n.createContext(s);function d(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4c9601b.556d1b17.js b/assets/js/f4c9601b.556d1b17.js new file mode 100644 index 000000000..754c25d12 --- /dev/null +++ b/assets/js/f4c9601b.556d1b17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["2991"],{5545:function(A,g,C){C.r(g),C.d(g,{metadata:()=>e,contentTitle:()=>t,default:()=>B,assets:()=>r,toc:()=>i,frontMatter:()=>n});var e=JSON.parse('{"id":"user/quick-start/installation/secure-boot","title":"Booting with Secure Boot Enabled","description":"Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead here.","source":"@site/docs/user/quick-start/installation/secure-boot.md","sourceDirName":"user/quick-start/installation","slug":"/user/quick-start/installation/secure-boot","permalink":"/docs/user/quick-start/installation/secure-boot","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/secure-boot.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Booting with Secure Boot Enabled","summary":"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},"sidebar":"userSidebar","previous":{"title":"Disk Partitioning","permalink":"/docs/user/quick-start/installation/disks"},"next":{"title":"System Requirements","permalink":"/docs/user/quick-start/installation/system-requirements"}}'),o=C("85893"),I=C("50065");let n={title:"Booting with Secure Boot Enabled",summary:"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},t="Booting with Secure Boot Enabled",r={},i=[{value:"Enrolling the Solus certificate",id:"enrolling-the-solus-certificate",level:2},{value:"Enabling Secure Boot on an existing install",id:"enabling-secure-boot-on-an-existing-install",level:2},{value:"Final tips",id:"final-tips",level:3},{value:"Useful links for additional reading",id:"useful-links-for-additional-reading",level:2}];function a(A){let g={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,I.a)(),...A.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(g.header,{children:(0,o.jsx)(g.h1,{id:"booting-with-secure-boot-enabled",children:"Booting with Secure Boot Enabled"})}),"\n",(0,o.jsxs)(g.p,{children:["Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead ",(0,o.jsx)(g.a,{href:"#enabling-secure-boot-on-an-existing-install",children:"here"}),"."]}),"\n",(0,o.jsx)("em",{children:"Note that this only applies to machines with UEFI firmware, if your machine uses the older BIOS firmware you can safely ignore this article. If you wish to avoid having to do this step then you may disable Secure Boot in your machine's UEFI firmware interface."}),"\n",(0,o.jsx)(g.h2,{id:"enrolling-the-solus-certificate",children:"Enrolling the Solus certificate"}),"\n",(0,o.jsxs)(g.p,{children:["After ",(0,o.jsx)(g.a,{href:"/docs/user/quick-start/installation/#boot-the-media",children:"booting"})," the ISO from USB/DVD and, if Secure Boot is enabled in your device's UEFI firmware. A warning will appear concerning a Secure Boot violation, press ",(0,o.jsx)(g.code,{children:"Enter"})," on your keyboard to continue."]}),"\n",(0,o.jsx)(g.p,{children:(0,o.jsx)(g.img,{alt:"Secure Boot violation",src:C(26071).Z+"",width:"807",height:"577"})}),"\n",(0,o.jsxs)(g.p,{children:["Now, it will provide 10 seconds in order to continue to MOK (Machine Owner Key) Management, press ",(0,o.jsx)(g.code,{children:"Enter"})," again within the timeframe to do so."]}),"\n",(0,o.jsx)(g.p,{children:(0,o.jsx)(g.img,{alt:"Continue to MOK Management",src:C(62572).Z+"",width:"811",height:"581"})}),"\n",(0,o.jsxs)(g.p,{children:["Use the down ",(0,o.jsx)(g.code,{children:"\u2193"})," arrow key on your keyboard to select ",(0,o.jsx)(g.code,{children:"Enroll Key from Disk"})," and press ",(0,o.jsx)(g.code,{children:"Enter"})," to continue."]}),"\n",(0,o.jsx)(g.p,{children:(0,o.jsx)(g.img,{alt:"Enroll Key from Disk",src:C(30485).Z+"",width:"809",height:"581"})}),"\n",(0,o.jsxs)(g.p,{children:["Here you'll need to find the ",(0,o.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, it should normally be located in the ",(0,o.jsx)(g.code,{children:"SOLUSESP"})," directory. Use the arrow keys to select a directory, ",(0,o.jsx)(g.code,{children:"Enter"})," to enter it and ",(0,o.jsx)(g.code,{children:"Esc"})," to go back."]}),"\n",(0,o.jsx)(g.p,{children:(0,o.jsx)(g.img,{alt:"Enroll the Solus Certificate",src:C(68409).Z+"",width:"804",height:"577"})}),"\n",(0,o.jsxs)(g.p,{children:["Once you found the ",(0,o.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, press ",(0,o.jsx)(g.code,{children:"Enter"})," to enroll it, and press the ",(0,o.jsx)(g.code,{children:"\u2193"})," and ",(0,o.jsx)(g.code,{children:"Enter"})," key to continue. Finally, when confirming you wish to Enroll the key(s) press the ",(0,o.jsx)(g.code,{children:"\u2193"}),' key to select "Yes" and ',(0,o.jsx)(g.code,{children:"Enter"})," again."]}),"\n",(0,o.jsxs)(g.p,{children:["Now, with the Solus certificate enrolled, press ",(0,o.jsx)(g.code,{children:"Enter"})," to reboot the machine, boot the ISO from USB/DVD again and it should continue booting to the installer."]}),"\n",(0,o.jsx)(g.p,{children:(0,o.jsx)(g.img,{alt:"Confirm Key Enrollment",src:C(29468).Z+"",width:"816",height:"586"})}),"\n",(0,o.jsx)("em",{children:"Once Solus is installed you will not have to enroll the certificate again as it will stay enrolled."}),"\n",(0,o.jsx)(g.h2,{id:"enabling-secure-boot-on-an-existing-install",children:"Enabling Secure Boot on an existing install"}),"\n",(0,o.jsxs)(g.p,{children:["If you already have Solus installed and wish to enable Secure Boot then there is one extra step you must perform BEFORE continuing with ",(0,o.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"})," as normal."]}),"\n",(0,o.jsxs)(g.p,{children:["Firstly, you must confirm you have ",(0,o.jsx)(g.code,{children:"clr-boot-manager, version: 3.2.12, release: 29"})," (or later) installed, run ",(0,o.jsx)(g.code,{children:"eopkg info clr-boot-manager"})," to confirm this. This version of ",(0,o.jsx)(g.code,{children:"clr-boot-manager"})," will have created a new UEFI boot entry on your machine called ",(0,o.jsx)(g.code,{children:"Solus Linux Bootloader"})," that can be booted from with Secure Boot enabled."]}),"\n",(0,o.jsx)(g.admonition,{title:"Before continuing, it is important to note the screenshots provided here are for example only, your UEFI firmware interface will almost certainly look different.",type:"note"}),"\n",(0,o.jsxs)(g.p,{children:["Reboot your machine and select the appropriate keyboard button during startup to choose a boot device. The correct key will vary from machine to machine but some common keys are ",(0,o.jsx)(g.code,{children:"F2"}),", ",(0,o.jsx)(g.code,{children:"F11"}),", ",(0,o.jsx)(g.code,{children:"F12"}),", or ",(0,o.jsx)(g.code,{children:"Esc"}),". From the boot selection interface, select the ",(0,o.jsx)(g.code,{children:"Solus Linux Bootloader"})," entry and boot from it. If you've manage to successfully boot then you can continue with enabling Secure Boot."]}),"\n",(0,o.jsxs)("em",{children:["If there is no entry called ",(0,o.jsx)(g.code,{children:"Solus Linux Bootloader"}),", reboot, log back in, open a terminal and run ",(0,o.jsx)(g.code,{children:"sudo clr-boot-manager update"}),"."]}),"\n",(0,o.jsx)(g.p,{children:(0,o.jsx)(g.img,{alt:"UEFI Choose Boot Device",src:C(5011).Z+"",width:"645",height:"463"})}),"\n",(0,o.jsxs)(g.p,{children:["After successfully booting from the new ",(0,o.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry, open a terminal, input ",(0,o.jsx)(g.code,{children:"systemctl reboot --firmware-setup"})," and press ",(0,o.jsx)(g.code,{children:"Enter"}),". This will reboot you into your machine's UEFI firmware interface. Once there, you will have to find and enable the Secure Boot setting. Where this is located varies from machine to machine. Some common places it can be located under are ",(0,o.jsx)(g.code,{children:"Windows OS Configuration"}),", ",(0,o.jsx)(g.code,{children:"Security"})," or ",(0,o.jsx)(g.code,{children:"Device Manager"}),"."]}),"\n",(0,o.jsx)(g.p,{children:(0,o.jsx)(g.img,{alt:"UEFI Secure Boot Configuration",src:C(78463).Z+"",width:"645",height:"460"})}),"\n",(0,o.jsxs)(g.p,{children:["Once you've found and enabled the Secure Boot setting then reboot once again from the ",(0,o.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry. From there you can continue with the instructions: ",(0,o.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"}),", bearing in mind you are booting from a disk rather than from a USB/DVD."]}),"\n",(0,o.jsxs)("em",{children:[" Remember to save settings after enabling Secure Boot! (usually ",(0,o.jsx)(g.code,{children:"F10"}),")"]}),"\n",(0,o.jsx)(g.h3,{id:"final-tips",children:"Final tips"}),"\n",(0,o.jsxs)(g.p,{children:["Once you've successfully enabled and booted your Solus install with Secure Boot enabled. Go back into your machine's UEFI firmware interface and change the default boot device to ",(0,o.jsx)(g.code,{children:"Solus Linux Bootloader"}),"."]}),"\n",(0,o.jsxs)(g.p,{children:["You can run ",(0,o.jsx)(g.code,{children:'bootctl status | grep "Secure Boot"'})," in a terminal to verify Secure Boot is enabled."]}),"\n",(0,o.jsxs)(g.p,{children:["It is possible to delete the old Solus UEFI boot entry with ",(0,o.jsx)(g.code,{children:"efibootmgr"})," once Secure Boot is enabled successfully, However, caution is required and as such, instructions to do so are not provided here."]}),"\n",(0,o.jsx)(g.h1,{id:"why-is-enrolling-the-solus-certificate-necessary",children:"Why is enrolling the Solus certificate necessary?"}),"\n",(0,o.jsxs)(g.p,{children:["In order to avoid the one time step of enrolling the Solus certificate, Solus would have to get it's own ",(0,o.jsx)(g.code,{children:"shim"})," EFI executable signed by Microsoft. Currently, the following actions must be completed to do this:"]}),"\n",(0,o.jsxs)(g.ul,{children:["\n",(0,o.jsx)(g.li,{children:"Obtain an EV Certificate (expensive!)"}),"\n",(0,o.jsx)(g.li,{children:"Register for the Microsoft Windows Hardware Developer Program."}),"\n",(0,o.jsxs)(g.li,{children:["Implement any additional security requirements as required by the ",(0,o.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"shim-review"})," process."]}),"\n"]}),"\n",(0,o.jsxs)(g.p,{children:["Currently, we are using a third-party ",(0,o.jsx)(g.code,{children:"shim"})," that is already signed by Microsoft, the downside is the Solus (vendor) certificate is not already embedded and trusted in the ",(0,o.jsx)(g.code,{children:"shim"})," executable, and as such, requires the user to enroll the Solus certificate manually on first boot."]}),"\n",(0,o.jsx)(g.p,{children:"We appreciate that having the enroll the certificate may be confusing to users and, the process to do so may not be self-explanatory. Especially, as Secure Boot is generally enabled by default for the majority of machines."}),"\n",(0,o.jsx)(g.p,{children:"However, it is also important to consider the following:"}),"\n",(0,o.jsxs)(g.ul,{children:["\n",(0,o.jsx)(g.li,{children:"Obtaining an EV certificate is an expensive investment."}),"\n",(0,o.jsx)(g.li,{children:"Enrolling the Solus certificate is only required once, and, only if Secure Boot is enabled."}),"\n"]}),"\n",(0,o.jsxs)(g.p,{children:["As such, we are not currently looking to our get our own ",(0,o.jsx)(g.code,{children:"shim"})," signed by Microsoft. However, thanks to our supporters on ",(0,o.jsx)(g.a,{href:"https://opencollective.com/getsolus",children:"OpenCollective"}),", it is indeed within our budget to obtain an EV certificate in the future which would unblock the additional requirements."]}),"\n",(0,o.jsx)(g.h2,{id:"useful-links-for-additional-reading",children:"Useful links for additional reading"}),"\n",(0,o.jsxs)(g.ul,{children:["\n",(0,o.jsx)(g.li,{children:(0,o.jsx)(g.a,{href:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs",children:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs"})}),"\n",(0,o.jsx)(g.li,{children:(0,o.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"https://github.com/rhboot/shim-review/"})}),"\n",(0,o.jsx)(g.li,{children:(0,o.jsx)(g.a,{href:"https://github.com/rhboot/shim/",children:"https://github.com/rhboot/shim/"})}),"\n"]})]})}function B(A={}){let{wrapper:g}={...(0,I.a)(),...A.components};return g?(0,o.jsx)(g,{...A,children:(0,o.jsx)(a,{...A})}):a(A)}},26071:function(A,g,C){C.d(g,{Z:function(){return e}});let e="data:image/png;base64,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6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKPxeDvznfF6OAADwab+GZZ0FAPBY02XJO4wAAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQAAAAAAANzu/9RxiIRrIM4UAAAAAElFTkSuQmCC"},62572:function(A,g,C){C.d(g,{Z:function(){return e}});let e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAysAAAJFCAIAAABSvP+VAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAQEklEQVR4Xu3d227iyAJAUfpoPpZP4nPPgyPH7VsgwMbQa2k0gsIUhXPxlp1OTicAAAAAAAAAAADe2Z/5wJfLfAAAgLucx1v/m4wCAFBQYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAAtf/mA3+7+M2sAAB3OH//HtZvPxTYYPWZAADs2DmT5SokAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEDtqr8LCbzW7C+LDX+qdRx80l9uHeYfJx/vrv6Zs5vG9xf87Pf18S4Xuw7egHNgcHRj+gz/TUf2XS4r9XO/8XXH9fw4vvXQqh83YMczPuLAMygw4C5bwbQ1DsDJVUj4YFkDbb3Q1vhNrjzhB/BeFBgc3fn8dT1xqJBli6z+4NRycDryqKzZ+ZGjnYeuN1vn7BLbML66zc5L7+yH6fzLCXd26XRwOj57iZ31D3d31jOOb61nuvGPOwF4OVch4Q2Mh9jZIXm0PAZfc/Tdmu1KW0/fWedNVnPkvPh5uPtNU2Y5+Xh39aHl4HSd07dw/fqH8a3tt9Yz3p3dBo5JgcF72Dls33qsXc7wO1uv+8DD/6PmWfWo/fAoR1sP8FSuQsI7Of99RfIXhhmG/99vZxk7D11v+U4fsuzTxn64dfJbtz9tP2V1Paft7YF3p8CAg1rNzYeE3aqhdYb5r+meW7cf3Lr+W7cH3oWrkHB0Q4Uc2cGXB3BACgy4y1Pza+cM0/HDdN+t63/29kDMVUg4uvFi3HTktNElo/HRy+JHqa704+vOFrD1itPNhtv769l6X1vrWY7/znSe8fbOUre231rPcnxn8tPt2w9mqwIO68984MvXF70vY+C9HOq71qEWA/QW3wS+b7kKCXyOxTe7F1g9AQYw4yok8N5mufPa/Dotrh6+fD3AMSkw4L0dMHEOuCTgaFyFBACoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgNp/8wH4OJfLfOR8no98kvH9PvttXi5Pf4mbTD/QwcKGlxtfaHp39ik3G5zeDdZ5WEf7/IGYc2B8vvG7/Pk8PxZ+pOaodrR9OAZN/CEeXmj6ctOViK0t2QcIDss5MODTHL91NBngHBh8uMvF+YbnsnuBX3AOjH/XeB5iPIKO5yRmx9Rfj2+Zbj+bZLme2fmSm06frD539Lv5p5OsPne0M8lp+/2OD41m61xuv+WmeaZ3f9wJ97hy8p31TN/XbHD5vsaHZoPT8dlL7Oy34e7OesbxrfVMN75yV8BHcg6Mf9d4PDj//fM641HhzvEdqxtvrefXZoe3X6xz1fj02e1b5996v1vzbG2/emO8fdM8M1vjU8MMw/+vd+v2g3E9yzc1DA53Vx9aDk73z2zPbD1lZhjf2n5rPePd2W341zgHxj9kdqyaWR3csbX91vhLHGoxjzV9a+fFWZnrLZ+yFRxbljP8aOiSK926nmc72nrgTSkw/iHXH/NOa4eZ4TA/HR8m3BrfsZz8SZZH+uyl7/SqdQ4fzTHpnmH8hPnx8+S0sZ5b13br9qftp6yu57S9PbBFgcG61aPjdHB6EN0aXzUcq4YNnnrcWj3S7yzsUN5lnb1bP39u3X5w6/6/dXvAz4EB1G7tIeDzKDD4wXAaaXpjZmv8CHaO9I9a9qPm2fLs+dl36/5/9vbwMRQYn2/8/j77Rr81PlbLeGyYXmq8fnzLdPudQhot59+3tc1ynq31X2O68q159vfD6Mf1zPbScpGrD/1inof48XXvNJ3/mpm3tp+OT22tf8ut2w+WK4F/zZ/5wJevr0hfHnA0z/6qfPb8U+VrscMHAp5k8cX1fcs5MHgniy/mB3v2/BzHeMoKeAn/FhKObnaYfHgePXv+LePrXnb/6ShPcv77t6j4EEBMgcHRPfvQ+Oz5t7zqdRn5EMALuQoJAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFD7bz7wK5fLfOR8no/c5HK5d4ZXme2Kg7+LcbUHXycAfJjHnAMbj9/n89ftZZNdb+e5l8veo/e7c/7hucNOuH8/BIQXALzEYwoMAIDrPeYqZObZ52yePT8AwCkosK2fi1odnw6OV/RmI9PBcZuth6aP/lhXW5Oszv8oq/vhUeP76589ZbA6DwDwWH/mA1++jsNXtstp48g9e/osCJbjq3enlg9NR1bnXz5lx3LjW6ea7YfT7vZbb/xR49fcXh0cXPN+AYAtiyPp960HnwMbD+SXt/3HjHeavuthv1/v1j126/ajxSfEuh83AAB+58EFxk2GU1DTULsn4O63vx4A4FEU2IvNkmt67vAl9bOzHgDgUfw2CgCA2qELbHZF7L1c87NWV77Brc22xn/t4RMCAKse828hl4ft8Smzh34cH4yPbv1c1Gye4e7y9ujHt3C6cf4tq5Ps2FrnY8eX659tvzV+zVsAAFYtyuH71mMK7Mg+4C0AAO9oESHftw59FfLXLq6mAQAH9pkFNl5QW7QnAMDrfexvo1BdAMBhfeY5MACAI1NgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAULvqd+L7G4sAAA/0Zz7wRXMBADzW999MdBUSAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAAAAAAAAAAAAAAAAAAAAAAOB1/g8woPo/FVU5nQAAAABJRU5ErkJggg=="},30485:function(A,g,C){C.d(g,{Z:function(){return e}});let e="data:image/png;base64,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z79/vcB7cs8RDuXqmftyOZ3/+yGnrfH52WH8FdY1s17pnu3ZGh8Mc06ePw5b47N5qrX14JfrvTEb8Clc94JDOS8u4ezXn8sfW+P6VeuRLfORufGSG08Ndh7kL9d429UXXh0EPoj2gqP50HPz1ZqZgml9pepnTVv1WObetmd/p1UDn8s9R+DnLe+1DabB+alvz513c3t/rw4Cn0V7wTE5PQO8J+0FB3SY8BpuwB3env116Qs+nfaCI5jPxHtO3qf/Lr80n9fneZY3AbdetTW+trXAcr3Lttjanq15bri6kVcHT9vrvddynsnttW+t94H9Bd7Wr8XjP2/uZ77RAN/L+5Fn+PcDvdX7bnwHuu4FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAnd/jAPB+pt/MCsABaC94a+fzOALAR3PPEQCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCg83sc+MflMo4AAPCkX4vHagsA4Hudh6/dcwQA6GgvAICO9gIA6GgvAICO9gIA6GgvAICO9gIA6GgvAAAAAAAAAAAAAAAAAAAAgOP7P/7OB7w235xvAAAAAElFTkSuQmCC"},68409:function(A,g,C){C.d(g,{Z:function(){return e}});let e="data:image/png;base64,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AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACC/ls2TNP9vmwBAOCYP9M0TZN4BQBwrtv8P6cRAQCChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAAAAAAAAAAAADgK/w/O572RyDxlzcAAAAASUVORK5CYII="},29468:function(A,g,C){C.d(g,{Z:function(){return e}});let e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzAAAAJKCAIAAAB8pDdfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAM3ElEQVR4Xu3d0VLiygJAUeaWH5tP4nPvA8eYaQiiMu4krFXzgE1sMloFu7ojnE4AAAAAAAAAAAAAAEDizzjw4TwOAADwI9M4cDqdTqf/jQMAAPwuQQYAEBNkAAAxQQYAEBNkAAAxQQYAEBNkAAAxQQYAEHsbB66cvUEsAMAPTLffDvbD50F28elEAAAMHlzYsmUJABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABB79LMsgQO4+ZFqT/+k2vlRhpnXxu84n/86+Bsz3PSseQaXae/MeeeA4Vdz8xjgwKyQwQuZX+an6R++5K/NvDa+5jofvzrDmmfNs3QntmaXe6//X/P3zr+X62OAYxNk8Lru1wMAv0aQwUvTZKfT6Xz+6YrUI8tjFzcXwJYLlo9PBRyJa8jgRS0vz5ojYLi4am18vmv23IBYTn4zUJ54PsP8N+e5ecz9h7g5D8AaK2Twim7mwiXRrhPkeny+dxh/lnna4fbSU85nrbS+Os/g2/MM5wO8Ditk8IqmxaLX47YTCk88kydOteYXHgLYO0EGL+p4lfCNxDy9r/8NIz906d3lPMf7aQPPJciAg/hG9MzltPzeb8xzbTnJ9UOseeQY4JBcQwYv7eerQZzeQ+qRH6arxICbBBm8rkcCYguG7b9Pfen4Oy31pXmWfv8bgb0TZPBC5hf7B1/4l8cvzREzzzPs0A037o+vWabSnWw6fXY+1746z/X4tZtnO8zzyLkBr+nPOPDhv2cdzyAAS54VgcddPWPcfu6wQgbwBVfPrQBP4K8sAT4xbFOqMeDpBBnAJxQY8K/ZsgQAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAIDY2zgA8OvO53FkC6ZpHAH4RwQZsBXbCaBtBiJwYLYsAQBiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggzYjfP5r0+ZHL4E2C9BBuyMCAOOR5AB+6PJgIMRZAAAsbdxAGCHhjWzafrrS4CNs0IG7Mwltoar+y/jl3/DvQDbJ8iA/bEABhyMIAMAiAkyYJcskgFHIsgAAGKCDAAg5m0vgN2bpvFjlGxoAvsiyIDdGDJr+aUCA3bNliUAQEyQAQDEBBkAQMw1ZEBovvLrckH+di4EG87HJzEB/5YVMgCAmCADAIgJMmA3zufz+f3dxpa3AfZOkAEAxAQZAEBMkAEAxLztBXAEw/Vk0/tHKa2NA2yKFTJgNy45NV/OP1TX9G4eWRsH2BpBBuzJHGHzjcfNWQawNbYsgYO4Xv2apml4dwxBBmyTIAMO4mZsLQcvcXbzMICWLUsAgJggA45m3qYc9isBNsuWJbAnc2AtNx/XrhVbGwfYGkEG7MlaUX11HGBTbFkCAMQEGQBATJABAMRcQwaEhj+B3NpfRG7tfIDDskIGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMW8MC2zF2fuwAq9KkAG9aRpHAF6KLUsAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgNjbOLDifB5HAAB4ij/jwAcJBgDwXNM4cDqdbFkCAOQEGQBATJABAMQEGQBATJABAMQEGQBATJABAMQEGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDr+D+VT1dp1SpSzAAAAABJRU5ErkJggg=="},5011:function(A,g,C){C.d(g,{Z:function(){return e}});let e=C.p+"assets/images/uefi-choosing-boot-device-62df6cbf7123313a863cc3e6199c5eae.png"},78463:function(A,g,C){C.d(g,{Z:function(){return e}});let e="data:image/png;base64,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Zc/4568jAHMX5nFXd46uAqCMhG7/E316/avtGv/kdQRg7trfr07T8fZrrCtUF21M3OH1AviZrs3jiRyTG/Ny1G3Uvteozqh9r7Pq7HXWfp/WedoBgInzf786T8rlxVb3wivvcW97Uu1oYlTncPta/Dpx2Xk0wmQ+zjbM2v1ubE82Hp+qW35e5aqyQ9u+POsPwESaPM/PY36UMr8BOCBNpGH3q/kGhDHAWd79+9V8OjelAa4gj9lHAANcwf1qAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA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"},50065:function(A,g,C){C.d(g,{Z:function(){return t},a:function(){return n}});var e=C(67294);let o={},I=e.createContext(o);function n(A){let g=e.useContext(I);return e.useMemo(function(){return"function"==typeof A?A(g):{...g,...A}},[g,A])}function t(A){let g;return g=A.disableParentContext?"function"==typeof A.components?A.components(o):A.components||o:n(A.components),e.createElement(I.Provider,{value:g},A.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4c9601b.688d28e5.js b/assets/js/f4c9601b.688d28e5.js deleted file mode 100644 index bf38c95d0..000000000 --- a/assets/js/f4c9601b.688d28e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2595],{39910:(A,g,C)=>{C.r(g),C.d(g,{assets:()=>r,contentTitle:()=>n,default:()=>s,frontMatter:()=>I,metadata:()=>t,toc:()=>i});var e=C(85893),o=C(11151);const I={title:"Booting with Secure Boot Enabled",summary:"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},n="Booting with Secure Boot Enabled",t={id:"user/quick-start/installation/secure-boot",title:"Booting with Secure Boot Enabled",description:"Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead here.",source:"@site/docs/user/quick-start/installation/secure-boot.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/secure-boot",permalink:"/docs/user/quick-start/installation/secure-boot",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/secure-boot.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Booting with Secure Boot Enabled",summary:"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},sidebar:"userSidebar",previous:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"},next:{title:"System Requirements",permalink:"/docs/user/quick-start/installation/system-requirements"}},r={},i=[{value:"Enrolling the Solus certificate",id:"enrolling-the-solus-certificate",level:2},{value:"Enabling Secure Boot on an existing install",id:"enabling-secure-boot-on-an-existing-install",level:2},{value:"Final tips",id:"final-tips",level:3},{value:"Useful links for additional reading",id:"useful-links-for-additional-reading",level:2}];function a(A){const g={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...A.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(g.header,{children:(0,e.jsx)(g.h1,{id:"booting-with-secure-boot-enabled",children:"Booting with Secure Boot Enabled"})}),"\n",(0,e.jsxs)(g.p,{children:["Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead ",(0,e.jsx)(g.a,{href:"#enabling-secure-boot-on-an-existing-install",children:"here"}),"."]}),"\n",(0,e.jsx)("em",{children:"Note that this only applies to machines with UEFI firmware, if your machine uses the older BIOS firmware you can safely ignore this article. If you wish to avoid having to do this step then you may disable Secure Boot in your machine's UEFI firmware interface."}),"\n",(0,e.jsx)(g.h2,{id:"enrolling-the-solus-certificate",children:"Enrolling the Solus certificate"}),"\n",(0,e.jsxs)(g.p,{children:["After ",(0,e.jsx)(g.a,{href:"/docs/user/quick-start/installation/#boot-the-media",children:"booting"})," the ISO from USB/DVD and, if Secure Boot is enabled in your device's UEFI firmware. A warning will appear concerning a Secure Boot violation, press ",(0,e.jsx)(g.code,{children:"Enter"})," on your keyboard to continue."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Secure Boot violation",src:C(95762).Z+"",width:"807",height:"577"})}),"\n",(0,e.jsxs)(g.p,{children:["Now, it will provide 10 seconds in order to continue to MOK (Machine Owner Key) Management, press ",(0,e.jsx)(g.code,{children:"Enter"})," again within the timeframe to do so."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Continue to MOK Management",src:C(48979).Z+"",width:"811",height:"581"})}),"\n",(0,e.jsxs)(g.p,{children:["Use the down ",(0,e.jsx)(g.code,{children:"\u2193"})," arrow key on your keyboard to select ",(0,e.jsx)(g.code,{children:"Enroll Key from Disk"})," and press ",(0,e.jsx)(g.code,{children:"Enter"})," to continue."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Enroll Key from Disk",src:C(35529).Z+"",width:"809",height:"581"})}),"\n",(0,e.jsxs)(g.p,{children:["Here you'll need to find the ",(0,e.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, it should normally be located in the ",(0,e.jsx)(g.code,{children:"SOLUSESP"})," directory. Use the arrow keys to select a directory, ",(0,e.jsx)(g.code,{children:"Enter"})," to enter it and ",(0,e.jsx)(g.code,{children:"Esc"})," to go back."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Enroll the Solus Certificate",src:C(91370).Z+"",width:"804",height:"577"})}),"\n",(0,e.jsxs)(g.p,{children:["Once you found the ",(0,e.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, press ",(0,e.jsx)(g.code,{children:"Enter"})," to enroll it, and press the ",(0,e.jsx)(g.code,{children:"\u2193"})," and ",(0,e.jsx)(g.code,{children:"Enter"})," key to continue. Finally, when confirming you wish to Enroll the key(s) press the ",(0,e.jsx)(g.code,{children:"\u2193"}),' key to select "Yes" and ',(0,e.jsx)(g.code,{children:"Enter"})," again."]}),"\n",(0,e.jsxs)(g.p,{children:["Now, with the Solus certificate enrolled, press ",(0,e.jsx)(g.code,{children:"Enter"})," to reboot the machine, boot the ISO from USB/DVD again and it should continue booting to the installer."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Confirm Key Enrollment",src:C(51754).Z+"",width:"816",height:"586"})}),"\n",(0,e.jsx)("em",{children:"Once Solus is installed you will not have to enroll the certificate again as it will stay enrolled."}),"\n",(0,e.jsx)(g.h2,{id:"enabling-secure-boot-on-an-existing-install",children:"Enabling Secure Boot on an existing install"}),"\n",(0,e.jsxs)(g.p,{children:["If you already have Solus installed and wish to enable Secure Boot then there is one extra step you must perform BEFORE continuing with ",(0,e.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"})," as normal."]}),"\n",(0,e.jsxs)(g.p,{children:["Firstly, you must confirm you have ",(0,e.jsx)(g.code,{children:"clr-boot-manager, version: 3.2.12, release: 29"})," (or later) installed, run ",(0,e.jsx)(g.code,{children:"eopkg info clr-boot-manager"})," to confirm this. This version of ",(0,e.jsx)(g.code,{children:"clr-boot-manager"})," will have created a new UEFI boot entry on your machine called ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," that can be booted from with Secure Boot enabled."]}),"\n",(0,e.jsx)(g.admonition,{title:"Before continuing, it is important to note the screenshots provided here are for example only, your UEFI firmware interface will almost certainly look different.",type:"note"}),"\n",(0,e.jsxs)(g.p,{children:["Reboot your machine and select the appropriate keyboard button during startup to choose a boot device. The correct key will vary from machine to machine but some common keys are ",(0,e.jsx)(g.code,{children:"F2"}),", ",(0,e.jsx)(g.code,{children:"F11"}),", ",(0,e.jsx)(g.code,{children:"F12"}),", or ",(0,e.jsx)(g.code,{children:"Esc"}),". From the boot selection interface, select the ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," entry and boot from it. If you've manage to successfully boot then you can continue with enabling Secure Boot."]}),"\n",(0,e.jsxs)("em",{children:["If there is no entry called ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"}),", reboot, log back in, open a terminal and run ",(0,e.jsx)(g.code,{children:"sudo clr-boot-manager update"}),"."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"UEFI Choose Boot Device",src:C(23506).Z+"",width:"645",height:"463"})}),"\n",(0,e.jsxs)(g.p,{children:["After successfully booting from the new ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry, open a terminal, input ",(0,e.jsx)(g.code,{children:"systemctl reboot --firmware-setup"})," and press ",(0,e.jsx)(g.code,{children:"Enter"}),". This will reboot you into your machine's UEFI firmware interface. Once there, you will have to find and enable the Secure Boot setting. Where this is located varies from machine to machine. Some common places it can be located under are ",(0,e.jsx)(g.code,{children:"Windows OS Configuration"}),", ",(0,e.jsx)(g.code,{children:"Security"})," or ",(0,e.jsx)(g.code,{children:"Device Manager"}),"."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"UEFI Secure Boot Configuration",src:C(61857).Z+"",width:"645",height:"460"})}),"\n",(0,e.jsxs)(g.p,{children:["Once you've found and enabled the Secure Boot setting then reboot once again from the ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry. From there you can continue with the instructions: ",(0,e.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"}),", bearing in mind you are booting from a disk rather than from a USB/DVD."]}),"\n",(0,e.jsxs)("em",{children:[" Remember to save settings after enabling Secure Boot! (usually ",(0,e.jsx)(g.code,{children:"F10"}),")"]}),"\n",(0,e.jsx)(g.h3,{id:"final-tips",children:"Final tips"}),"\n",(0,e.jsxs)(g.p,{children:["Once you've successfully enabled and booted your Solus install with Secure Boot enabled. Go back into your machine's UEFI firmware interface and change the default boot device to ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"}),"."]}),"\n",(0,e.jsxs)(g.p,{children:["You can run ",(0,e.jsx)(g.code,{children:'bootctl status | grep "Secure Boot"'})," in a terminal to verify Secure Boot is enabled."]}),"\n",(0,e.jsxs)(g.p,{children:["It is possible to delete the old Solus UEFI boot entry with ",(0,e.jsx)(g.code,{children:"efibootmgr"})," once Secure Boot is enabled successfully, However, caution is required and as such, instructions to do so are not provided here."]}),"\n",(0,e.jsx)(g.h1,{id:"why-is-enrolling-the-solus-certificate-necessary",children:"Why is enrolling the Solus certificate necessary?"}),"\n",(0,e.jsxs)(g.p,{children:["In order to avoid the one time step of enrolling the Solus certificate, Solus would have to get it's own ",(0,e.jsx)(g.code,{children:"shim"})," EFI executable signed by Microsoft. Currently, the following actions must be completed to do this:"]}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:"Obtain an EV Certificate (expensive!)"}),"\n",(0,e.jsx)(g.li,{children:"Register for the Microsoft Windows Hardware Developer Program."}),"\n",(0,e.jsxs)(g.li,{children:["Implement any additional security requirements as required by the ",(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"shim-review"})," process."]}),"\n"]}),"\n",(0,e.jsxs)(g.p,{children:["Currently, we are using a third-party ",(0,e.jsx)(g.code,{children:"shim"})," that is already signed by Microsoft, the downside is the Solus (vendor) certificate is not already embedded and trusted in the ",(0,e.jsx)(g.code,{children:"shim"})," executable, and as such, requires the user to enroll the Solus certificate manually on first boot."]}),"\n",(0,e.jsx)(g.p,{children:"We appreciate that having the enroll the certificate may be confusing to users and, the process to do so may not be self-explanatory. Especially, as Secure Boot is generally enabled by default for the majority of machines."}),"\n",(0,e.jsx)(g.p,{children:"However, it is also important to consider the following:"}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:"Obtaining an EV certificate is an expensive investment."}),"\n",(0,e.jsx)(g.li,{children:"Enrolling the Solus certificate is only required once, and, only if Secure Boot is enabled."}),"\n"]}),"\n",(0,e.jsxs)(g.p,{children:["As such, we are not currently looking to our get our own ",(0,e.jsx)(g.code,{children:"shim"})," signed by Microsoft. However, thanks to our supporters on ",(0,e.jsx)(g.a,{href:"https://opencollective.com/getsolus",children:"OpenCollective"}),", it is indeed within our budget to obtain an EV certificate in the future which would unblock the additional requirements."]}),"\n",(0,e.jsx)(g.h2,{id:"useful-links-for-additional-reading",children:"Useful links for additional reading"}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs",children:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs"})}),"\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"https://github.com/rhboot/shim-review/"})}),"\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim/",children:"https://github.com/rhboot/shim/"})}),"\n"]})]})}function s(A={}){const{wrapper:g}={...(0,o.a)(),...A.components};return g?(0,e.jsx)(g,{...A,children:(0,e.jsx)(a,{...A})}):a(A)}},95762:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKPxeDvznfF6OAADwab+GZZ0FAPBY02XJO4wAAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQAAAAAAANzu/9RxiIRrIM4UAAAAAElFTkSuQmCC"},48979:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAysAAAJFCAIAAABSvP+VAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAQEklEQVR4Xu3d227iyAJAUfpoPpZP4nPPgyPH7VsgwMbQa2k0gsIUhXPxlp1OTicAAAAAAAAAAADe2Z/5wJfLfAAAgLucx1v/m4wCAFBQYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAAtf/mA3+7+M2sAAB3OH//HtZvPxTYYPWZAADs2DmT5SokAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEDtqr8LCbzW7C+LDX+qdRx80l9uHeYfJx/vrv6Zs5vG9xf87Pf18S4Xuw7egHNgcHRj+gz/TUf2XS4r9XO/8XXH9fw4vvXQqh83YMczPuLAMygw4C5bwbQ1DsDJVUj4YFkDbb3Q1vhNrjzhB/BeFBgc3fn8dT1xqJBli6z+4NRycDryqKzZ+ZGjnYeuN1vn7BLbML66zc5L7+yH6fzLCXd26XRwOj57iZ31D3d31jOOb61nuvGPOwF4OVch4Q2Mh9jZIXm0PAZfc/Tdmu1KW0/fWedNVnPkvPh5uPtNU2Y5+Xh39aHl4HSd07dw/fqH8a3tt9Yz3p3dBo5JgcF72Dls33qsXc7wO1uv+8DD/6PmWfWo/fAoR1sP8FSuQsI7Of99RfIXhhmG/99vZxk7D11v+U4fsuzTxn64dfJbtz9tP2V1Paft7YF3p8CAg1rNzYeE3aqhdYb5r+meW7cf3Lr+W7cH3oWrkHB0Q4Uc2cGXB3BACgy4y1Pza+cM0/HDdN+t63/29kDMVUg4uvFi3HTktNElo/HRy+JHqa704+vOFrD1itPNhtv769l6X1vrWY7/znSe8fbOUre231rPcnxn8tPt2w9mqwIO68984MvXF70vY+C9HOq71qEWA/QW3wS+b7kKCXyOxTe7F1g9AQYw4yok8N5mufPa/Dotrh6+fD3AMSkw4L0dMHEOuCTgaFyFBACoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgNp/8wH4OJfLfOR8no98kvH9PvttXi5Pf4mbTD/QwcKGlxtfaHp39ik3G5zeDdZ5WEf7/IGYc2B8vvG7/Pk8PxZ+pOaodrR9OAZN/CEeXmj6ctOViK0t2QcIDss5MODTHL91NBngHBh8uMvF+YbnsnuBX3AOjH/XeB5iPIKO5yRmx9Rfj2+Zbj+bZLme2fmSm06frD539Lv5p5OsPne0M8lp+/2OD41m61xuv+WmeaZ3f9wJ97hy8p31TN/XbHD5vsaHZoPT8dlL7Oy34e7OesbxrfVMN75yV8BHcg6Mf9d4PDj//fM641HhzvEdqxtvrefXZoe3X6xz1fj02e1b5996v1vzbG2/emO8fdM8M1vjU8MMw/+vd+v2g3E9yzc1DA53Vx9aDk73z2zPbD1lZhjf2n5rPePd2W341zgHxj9kdqyaWR3csbX91vhLHGoxjzV9a+fFWZnrLZ+yFRxbljP8aOiSK926nmc72nrgTSkw/iHXH/NOa4eZ4TA/HR8m3BrfsZz8SZZH+uyl7/SqdQ4fzTHpnmH8hPnx8+S0sZ5b13br9qftp6yu57S9PbBFgcG61aPjdHB6EN0aXzUcq4YNnnrcWj3S7yzsUN5lnb1bP39u3X5w6/6/dXvAz4EB1G7tIeDzKDD4wXAaaXpjZmv8CHaO9I9a9qPm2fLs+dl36/5/9vbwMRQYn2/8/j77Rr81PlbLeGyYXmq8fnzLdPudQhot59+3tc1ynq31X2O68q159vfD6Mf1zPbScpGrD/1inof48XXvNJ3/mpm3tp+OT22tf8ut2w+WK4F/zZ/5wJevr0hfHnA0z/6qfPb8U+VrscMHAp5k8cX1fcs5MHgniy/mB3v2/BzHeMoKeAn/FhKObnaYfHgePXv+LePrXnb/6ShPcv77t6j4EEBMgcHRPfvQ+Oz5t7zqdRn5EMALuQoJAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFD7bz7wK5fLfOR8no/c5HK5d4ZXme2Kg7+LcbUHXycAfJjHnAMbj9/n89ftZZNdb+e5l8veo/e7c/7hucNOuH8/BIQXALzEYwoMAIDrPeYqZObZ52yePT8AwCkosK2fi1odnw6OV/RmI9PBcZuth6aP/lhXW5Oszv8oq/vhUeP76589ZbA6DwDwWH/mA1++jsNXtstp48g9e/osCJbjq3enlg9NR1bnXz5lx3LjW6ea7YfT7vZbb/xR49fcXh0cXPN+AYAtiyPp960HnwMbD+SXt/3HjHeavuthv1/v1j126/ajxSfEuh83AAB+58EFxk2GU1DTULsn4O63vx4A4FEU2IvNkmt67vAl9bOzHgDgUfw2CgCA2qELbHZF7L1c87NWV77Brc22xn/t4RMCAKse828hl4ft8Smzh34cH4yPbv1c1Gye4e7y9ujHt3C6cf4tq5Ps2FrnY8eX659tvzV+zVsAAFYtyuH71mMK7Mg+4C0AAO9oESHftw59FfLXLq6mAQAH9pkFNl5QW7QnAMDrfexvo1BdAMBhfeY5MACAI1NgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAULvqd+L7G4sAAA/0Zz7wRXMBADzW999MdBUSAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAAAAAAAAAAAAAAAAAAAAAAOB1/g8woPo/FVU5nQAAAABJRU5ErkJggg=="},35529:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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z79/vcB7cs8RDuXqmftyOZ3/+yGnrfH52WH8FdY1s17pnu3ZGh8Mc06ePw5b47N5qrX14JfrvTEb8Clc94JDOS8u4ezXn8sfW+P6VeuRLfORufGSG08Ndh7kL9d429UXXh0EPoj2gqP50HPz1ZqZgml9pepnTVv1WObetmd/p1UDn8s9R+DnLe+1DabB+alvz513c3t/rw4Cn0V7wTE5PQO8J+0FB3SY8BpuwB3env116Qs+nfaCI5jPxHtO3qf/Lr80n9fneZY3AbdetTW+trXAcr3Lttjanq15bri6kVcHT9vrvddynsnttW+t94H9Bd7Wr8XjP2/uZ77RAN/L+5Fn+PcDvdX7bnwHuu4FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAnd/jAPB+pt/MCsABaC94a+fzOALAR3PPEQCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCg83sc+MflMo4AAPCkX4vHagsA4Hudh6/dcwQA6GgvAICO9gIA6GgvAICO9gIA6GgvAICO9gIA6GgvAAAAAAAAAAAAAAAAAAAAgOP7P/7OB7w235xvAAAAAElFTkSuQmCC"},91370:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACC/ls2TNP9vmwBAOCYP9M0TZN4BQBwrtv8P6cRAQCChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAAAAAAAAAAAADgK/w/O572RyDxlzcAAAAASUVORK5CYII="},51754:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzAAAAJKCAIAAAB8pDdfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAM3ElEQVR4Xu3d0VLiygJAUeaWH5tP4nPvA8eYaQiiMu4krFXzgE1sMloFu7ojnE4AAAAAAAAAAAAAAEDizzjw4TwOAADwI9M4cDqdTqf/jQMAAPwuQQYAEBNkAAAxQQYAEBNkAAAxQQYAEBNkAAAxQQYAEHsbB66cvUEsAMAPTLffDvbD50F28elEAAAMHlzYsmUJABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABB79LMsgQO4+ZFqT/+k2vlRhpnXxu84n/86+Bsz3PSseQaXae/MeeeA4Vdz8xjgwKyQwQuZX+an6R++5K/NvDa+5jofvzrDmmfNs3QntmaXe6//X/P3zr+X62OAYxNk8Lru1wMAv0aQwUvTZKfT6Xz+6YrUI8tjFzcXwJYLlo9PBRyJa8jgRS0vz5ojYLi4am18vmv23IBYTn4zUJ54PsP8N+e5ecz9h7g5D8AaK2Twim7mwiXRrhPkeny+dxh/lnna4fbSU85nrbS+Os/g2/MM5wO8Ditk8IqmxaLX47YTCk88kydOteYXHgLYO0EGL+p4lfCNxDy9r/8NIz906d3lPMf7aQPPJciAg/hG9MzltPzeb8xzbTnJ9UOseeQY4JBcQwYv7eerQZzeQ+qRH6arxICbBBm8rkcCYguG7b9Pfen4Oy31pXmWfv8bgb0TZPBC5hf7B1/4l8cvzREzzzPs0A037o+vWabSnWw6fXY+1746z/X4tZtnO8zzyLkBr+nPOPDhv2cdzyAAS54VgcddPWPcfu6wQgbwBVfPrQBP4K8sAT4xbFOqMeDpBBnAJxQY8K/ZsgQAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAIDY2zgA8OvO53FkC6ZpHAH4RwQZsBXbCaBtBiJwYLYsAQBiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggzYjfP5r0+ZHL4E2C9BBuyMCAOOR5AB+6PJgIMRZAAAsbdxAGCHhjWzafrrS4CNs0IG7Mwltoar+y/jl3/DvQDbJ8iA/bEABhyMIAMAiAkyYJcskgFHIsgAAGKCDAAg5m0vgN2bpvFjlGxoAvsiyIDdGDJr+aUCA3bNliUAQEyQAQDEBBkAQMw1ZEBovvLrckH+di4EG87HJzEB/5YVMgCAmCADAIgJMmA3zufz+f3dxpa3AfZOkAEAxAQZAEBMkAEAxLztBXAEw/Vk0/tHKa2NA2yKFTJgNy45NV/OP1TX9G4eWRsH2BpBBuzJHGHzjcfNWQawNbYsgYO4Xv2apml4dwxBBmyTIAMO4mZsLQcvcXbzMICWLUsAgJggA45m3qYc9isBNsuWJbAnc2AtNx/XrhVbGwfYGkEG7MlaUX11HGBTbFkCAMQEGQBATJABAMRcQwaEhj+B3NpfRG7tfIDDskIGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMW8MC2zF2fuwAq9KkAG9aRpHAF6KLUsAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgNjbOLDifB5HAAB4ij/jwAcJBgDwXNM4cDqdbFkCAOQEGQBATJABAMQEGQBATJABAMQEGQBATJABAMQEGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDr+D+VT1dp1SpSzAAAAABJRU5ErkJggg=="},23506:(A,g,C)=>{C.d(g,{Z:()=>e});const e=C.p+"assets/images/uefi-choosing-boot-device-62df6cbf7123313a863cc3e6199c5eae.png"},61857:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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Zc/4568jAHMX5nFXd46uAqCMhG7/E316/avtGv/kdQRg7trfr07T8fZrrCtUF21M3OH1AviZrs3jiRyTG/Ny1G3Uvteozqh9r7Pq7HXWfp/WedoBgInzf786T8rlxVb3wivvcW97Uu1oYlTncPta/Dpx2Xk0wmQ+zjbM2v1ubE82Hp+qW35e5aqyQ9u+POsPwESaPM/PY36UMr8BOCBNpGH3q/kGhDHAWd79+9V8OjelAa4gj9lHAANcwf1qAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA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"},11151:(A,g,C)=>{C.d(g,{Z:()=>t,a:()=>n});var e=C(67294);const o={},I=e.createContext(o);function n(A){const g=e.useContext(I);return e.useMemo((function(){return"function"==typeof A?A(g):{...g,...A}}),[g,A])}function t(A){let g;return g=A.disableParentContext?"function"==typeof A.components?A.components(o):A.components||o:n(A.components),e.createElement(I.Provider,{value:g},A.children)}}}]); \ No newline at end of file diff --git a/assets/js/f6faa2b4.27a4bd74.js b/assets/js/f6faa2b4.27a4bd74.js new file mode 100644 index 000000000..0761e6b88 --- /dev/null +++ b/assets/js/f6faa2b4.27a4bd74.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1878"],{51472:function(e,n,t){t.r(n),t.d(n,{metadata:()=>o,contentTitle:()=>d,default:()=>u,assets:()=>l,toc:()=>a,frontMatter:()=>r});var o=JSON.parse('{"id":"user/hardware/peripherals/midi-keyboard","title":"MIDI Keyboards","description":"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments.","source":"@site/docs/user/hardware/peripherals/midi-keyboard.md","sourceDirName":"user/hardware/peripherals","slug":"/user/hardware/peripherals/midi-keyboard","permalink":"/docs/user/hardware/peripherals/midi-keyboard","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/midi-keyboard.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"MIDI Keyboards","summary":"Guide for installing and configuring MIDI keyboards on Solus"},"sidebar":"userSidebar","previous":{"title":"Mice and Touchpads","permalink":"/docs/user/hardware/peripherals/mice-and-touchpads"},"next":{"title":"Printers and Scanners","permalink":"/docs/user/hardware/peripherals/printers-and-scanners"}}'),s=t("85893"),i=t("50065");let r={title:"MIDI Keyboards",summary:"Guide for installing and configuring MIDI keyboards on Solus"},d="MIDI Keyboards",l={},a=[{value:"Installing required software",id:"installing-required-software",level:2},{value:"Setting up the soundfont in qsynth",id:"setting-up-the-soundfont-in-qsynth",level:2},{value:"Connecting the keyboard",id:"connecting-the-keyboard",level:2},{value:"Keyboard compatibility",id:"keyboard-compatibility",level:2},{value:"M-audio",id:"m-audio",level:3}];function c(e){let n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"midi-keyboards",children:"MIDI Keyboards"})}),"\n",(0,s.jsx)(n.p,{children:"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments."}),"\n",(0,s.jsx)(n.h2,{id:"installing-required-software",children:"Installing required software"}),"\n",(0,s.jsx)(n.p,{children:"We will need to install three packages in order to use the keyboard:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"qsynth"})," - A frontend for ",(0,s.jsx)(n.code,{children:"fluidsynth"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"qjackctl"})," - A controller for the JACK audio server"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"fluid-soundfont"})," - An open source soundfont to use with ",(0,s.jsx)(n.code,{children:"fluidsynth"})]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it qsynth qjackctl fluid-soundfont\n"})}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-the-soundfont-in-qsynth",children:"Setting up the soundfont in qsynth"}),"\n",(0,s.jsxs)(n.p,{children:["In order to use the soundfont, we need to open up ",(0,s.jsx)(n.code,{children:"qsynth"})," and set the soundfont. For the purposes of this article, it would be ",(0,s.jsx)(n.code,{children:"FluidR3.sf2"}),", however any other soundfont should work fine too. You set the soundfont by clicking on ",(0,s.jsx)(n.code,{children:"Setup..."})," and navigating to ",(0,s.jsx)(n.code,{children:"Soundfonts"}),". There you just need click ",(0,s.jsx)(n.code,{children:"Open..."})," and navigate to the soundfont of your liking. The soundfont that we will be using will be placed in ",(0,s.jsx)(n.code,{children:"/usr/share/sounds/sf2/"})," by default."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"QSynth SoundFont",src:t(917).Z+"",width:"1039",height:"517"})}),"\n",(0,s.jsx)(n.h2,{id:"connecting-the-keyboard",children:"Connecting the keyboard"}),"\n",(0,s.jsxs)(n.p,{children:["At this stage you need to first verify that the keyboard is plugged in and turned on. Now we just need to open up ",(0,s.jsx)(n.code,{children:"qjackctl"})," to connect the keyboard on a software level. In ",(0,s.jsx)(n.code,{children:"qjackctl"})," you press on ",(0,s.jsx)(n.code,{children:"Graph"})," and drag the keyboard's output to the input called ",(0,s.jsx)(n.code,{children:"FLUID Synth"})," (Your keyboard name will probably differ from the on in the image below). This step will need to be done every time you disconnect or turn off you keyboard."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"QJackCtl Connect",src:t(94433).Z+"",width:"717",height:"629"})}),"\n",(0,s.jsxs)(n.p,{children:["You should now be ready to play on the keyboard using ",(0,s.jsx)(n.code,{children:"qsynth"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"keyboard-compatibility",children:"Keyboard compatibility"}),"\n",(0,s.jsx)(n.p,{children:"The following keyboards have been tested and/or suggested to function correctly by our users."}),"\n",(0,s.jsxs)(n.p,{children:["This list should not suggest that ",(0,s.jsx)(n.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,s.jsx)(n.h3,{id:"m-audio",children:"M-audio"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"KeyRig 49"}),"\n"]})]})}function u(e={}){let{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},94433:function(e,n,t){t.d(n,{Z:function(){return o}});let o=t.p+"assets/images/qjackctl-connect-ec819e2ca49b8af3c5a395ebad0a2bba.jpg"},917:function(e,n,t){t.d(n,{Z:function(){return o}});let o=t.p+"assets/images/qsynth-soundfont-3bfc213f843495358dedf524b6ed7fc6.jpg"},50065:function(e,n,t){t.d(n,{Z:function(){return d},a:function(){return r}});var o=t(67294);let s={},i=o.createContext(s);function r(e){let n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f6faa2b4.d52872e4.js b/assets/js/f6faa2b4.d52872e4.js deleted file mode 100644 index 3c5139b99..000000000 --- a/assets/js/f6faa2b4.d52872e4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8143],{40396:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var o=t(85893),s=t(11151);const i={title:"MIDI Keyboards",summary:"Guide for installing and configuring MIDI keyboards on Solus"},r="MIDI Keyboards",d={id:"user/hardware/peripherals/midi-keyboard",title:"MIDI Keyboards",description:"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments.",source:"@site/docs/user/hardware/peripherals/midi-keyboard.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/midi-keyboard",permalink:"/docs/user/hardware/peripherals/midi-keyboard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/midi-keyboard.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"MIDI Keyboards",summary:"Guide for installing and configuring MIDI keyboards on Solus"},sidebar:"userSidebar",previous:{title:"Mice and Touchpads",permalink:"/docs/user/hardware/peripherals/mice-and-touchpads"},next:{title:"Printers and Scanners",permalink:"/docs/user/hardware/peripherals/printers-and-scanners"}},a={},l=[{value:"Installing required software",id:"installing-required-software",level:2},{value:"Setting up the soundfont in qsynth",id:"setting-up-the-soundfont-in-qsynth",level:2},{value:"Connecting the keyboard",id:"connecting-the-keyboard",level:2},{value:"Keyboard compatibility",id:"keyboard-compatibility",level:2},{value:"M-audio",id:"m-audio",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"midi-keyboards",children:"MIDI Keyboards"})}),"\n",(0,o.jsx)(n.p,{children:"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments."}),"\n",(0,o.jsx)(n.h2,{id:"installing-required-software",children:"Installing required software"}),"\n",(0,o.jsx)(n.p,{children:"We will need to install three packages in order to use the keyboard:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"qsynth"})," - A frontend for ",(0,o.jsx)(n.code,{children:"fluidsynth"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"qjackctl"})," - A controller for the JACK audio server"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"fluid-soundfont"})," - An open source soundfont to use with ",(0,o.jsx)(n.code,{children:"fluidsynth"})]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it qsynth qjackctl fluid-soundfont\n"})}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-the-soundfont-in-qsynth",children:"Setting up the soundfont in qsynth"}),"\n",(0,o.jsxs)(n.p,{children:["In order to use the soundfont, we need to open up ",(0,o.jsx)(n.code,{children:"qsynth"})," and set the soundfont. For the purposes of this article, it would be ",(0,o.jsx)(n.code,{children:"FluidR3.sf2"}),", however any other soundfont should work fine too. You set the soundfont by clicking on ",(0,o.jsx)(n.code,{children:"Setup..."})," and navigating to ",(0,o.jsx)(n.code,{children:"Soundfonts"}),". There you just need click ",(0,o.jsx)(n.code,{children:"Open..."})," and navigate to the soundfont of your liking. The soundfont that we will be using will be placed in ",(0,o.jsx)(n.code,{children:"/usr/share/sounds/sf2/"})," by default."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"QSynth SoundFont",src:t(3815).Z+"",width:"1039",height:"517"})}),"\n",(0,o.jsx)(n.h2,{id:"connecting-the-keyboard",children:"Connecting the keyboard"}),"\n",(0,o.jsxs)(n.p,{children:["At this stage you need to first verify that the keyboard is plugged in and turned on. Now we just need to open up ",(0,o.jsx)(n.code,{children:"qjackctl"})," to connect the keyboard on a software level. In ",(0,o.jsx)(n.code,{children:"qjackctl"})," you press on ",(0,o.jsx)(n.code,{children:"Graph"})," and drag the keyboard's output to the input called ",(0,o.jsx)(n.code,{children:"FLUID Synth"})," (Your keyboard name will probably differ from the on in the image below). This step will need to be done every time you disconnect or turn off you keyboard."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"QJackCtl Connect",src:t(68950).Z+"",width:"717",height:"629"})}),"\n",(0,o.jsxs)(n.p,{children:["You should now be ready to play on the keyboard using ",(0,o.jsx)(n.code,{children:"qsynth"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"keyboard-compatibility",children:"Keyboard compatibility"}),"\n",(0,o.jsx)(n.p,{children:"The following keyboards have been tested and/or suggested to function correctly by our users."}),"\n",(0,o.jsxs)(n.p,{children:["This list should not suggest that ",(0,o.jsx)(n.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,o.jsx)(n.h3,{id:"m-audio",children:"M-audio"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"KeyRig 49"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},68950:(e,n,t)=>{t.d(n,{Z:()=>o});const o=t.p+"assets/images/qjackctl-connect-ec819e2ca49b8af3c5a395ebad0a2bba.jpg"},3815:(e,n,t)=>{t.d(n,{Z:()=>o});const o=t.p+"assets/images/qsynth-soundfont-3bfc213f843495358dedf524b6ed7fc6.jpg"},11151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>r});var o=t(67294);const s={},i=o.createContext(s);function r(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f81c1134.0ddf9775.js b/assets/js/f81c1134.0ddf9775.js new file mode 100644 index 000000000..328e263b1 --- /dev/null +++ b/assets/js/f81c1134.0ddf9775.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5524"],{5865:function(e){e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"clean-clean-clean","metadata":{"permalink":"/blog/clean-clean-clean","source":"@site/devlog/2024-11-21-clean-cleanl-clean.md","title":"Clean, clean, clean!","description":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.","date":"2024-11-21T00:00:00.000Z","tags":[{"inline":true,"label":"housekeeping","permalink":"/blog/tags/housekeeping"},{"inline":true,"label":"cleanup","permalink":"/blog/tags/cleanup"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":5.585,"hasTruncateMarker":true,"authors":[{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi"}],"frontMatter":{"title":"Clean, clean, clean!","slug":"clean-clean-clean","authors":"alfi","tags":["housekeeping","cleanup","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"}},"content":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.\\n\\n\x3c!-- truncate --\x3e\\n\\n## A bit of background\\n\\nI started contributing in October 2023, when Solus participated in [Hacktoberfest](https://getsol.us/2023/10/01/solus-and-hacktoberfest-2023/). Hacktoberfest is a month-long event that encourage people to contribute to open source project in exchange for some digital merchandise. Finally, an excuse to contribute to something I use every day. Although, as an accountant, all of this is new experience to me. It was confusing at first, but I persisted. Finally, I got the hang of it and I managed to submit around 100 pull request during the month of the event. I was very excited and motivated. During the month, a few people joined the event and contributed to Solus, but then November came and most of the contribution slowed down. I was the only one left that continued doing the beginner tasks, mostly adding homepage to packages.\\n\\nAt the start of January 2024, Jakob Gezelius ([androidnisse](https://github.com/androidnisse)) comes in and starts contributing to homepage task too. Worried that we would stepped on each other\'s feet, we started a private chat to organize the tasks between ourselves. Until May, the two of us had been chipping away at the homepage task which at this point left 650 packages without a homepage. Then we had more contributors joining. I decided to make a group chat to accommodate all the people joining. It was called \\"Solus Homepage Team\\" at the time. More contributors and staff members joined the room, then it was renamed as \\"Solus Cleanup Crew\\" and moved under the official Solus matrix space.\\n\\n## What is it?\\n\\nSolus cleanup crew is a group of community contributors as as well staff members with the goal of bringing the Solus package repository up to current standard. It is a subset of the packaging room on our matrix channel. We organize the work on all the cleanup related tasks.\\n\\n## Why bother?\\n\\nSolus has been updating their tooling and infrastructure since its resurrection. While most of the tooling changes can be accomplished by staff members alone, there are things that they cannot do. While many consider Solus repository as small, it still contains more than 6000 packages. Some packages have never even gotten an update since Solus was first created! We want to get rid of all its cruft before we can migrate to a better tooling. That\'s where the community contributor can come in and help.\\n\\nFor me personally, it is a chance to learn something new and fill my time with more purpose. Sometimes, I feel like a slob scrolling through things, opening the same three apps over and over or sleeping midday. Technically speaking, doing packaging is still scrolling through things, still opening the same three apps over and over, and I still get my midday nap, but now it is with purpose. I love that what I do can be enjoyed by other people. It is mostly invisible and not even noticed by people, but the chance of it helping people gives me so much joy. Why bother? Because I love it.\\n\\n## What we accomplished\\n\\nWe create a few repository wide task that can done with little reading of our packaging guide. The keen-eyed of you may have already seen these tasks. It is always attached at the end of every Sync Updates since July. These are the tasks we did:\\n|No. | Task | Date Started | Start count | Current count|\\n|----|-------------| ------| ------------|--------------|\\n|1.| [Adding homepage key to package.yml](https://github.com/getsolus/packages/issues/411)|30-09-2023|2300|8\\n|2.| [Adding AppStream metainfo to all font packages](https://github.com/getsolus/packages/issues/449)|06-10-2023| 38 | Done \uD83C\uDF89|\\n|3.| [Adding AppStream metainfo to all graphical applications](https://github.com/getsolus/packages/issues/1389)|22-01-2024|316|198|\\n|4.| [Applying new cargo macros](https://github.com/getsolus/packages/issues/3111)|27-06-2024|37| Done \uD83C\uDF89|\\n|5.| [Changing all packages with homepages pointing to wiki.gnome.org](https://github.com/getsolus/packages/issues/4116)|20-10-2024|87|62|\\n|6.| [Adding monitoring.yml](https://github.com/getsolus/packages/issues/4121)|21-10-2024|3070|2937|\\n|7.| [Tagging packages that do not build](https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Packaging+Problem%22)|Ongoing| N/A| 13\\n|8.| [Tagging packages that should be deprecated](https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Package%3A+Removal+Request%22)|Ongoing| N/A| 25\\n\\nAs you can see from the table above, we just completed two tasks and we are close to completing homepage task. Packages that do not build also are also getting solved one by one. Right now, there are 12 people in Solus Cleanup Crew Matrix room, 6 of them are new contributors. We also create a new AppStream metainfo documentation, clean up our issue templates, implement a better tagging system for organizing issues and much more. Solus Cleanup Crew is also becoming a place where we can onboard new contributors and recruit new staff. I thought we accomplished a lot and I am happy with it.\\n\\n## What next?\\n\\nWe want to focus on adding appstream metainfo for remaining 200 packages, in line with the goal of 4.7 ISO. It will not be easy nor quick, but we will try our best. We want Solus users to have the best experience possible when we finally say goodbye to `solus-sc` and switch to modern software center (Gnome Software and KDE Discover). We want you to be able to install all graphical application from software center and have all the relevant information (Legible screenshot, Hi-Res Icon, good description, etc).\\n\\nWe also want to add more [monitoring.yml](https://help.getsol.us/docs/packaging/monitoring.yml) files to packages, so we can utilize our proof-of-concept [\\"Package Update Monitor\\"](https://shared.getsol.us/justin/updates/) created by [Justin Zobel](https://github.com/Justinzobel). I, myself and [Joey Riches](https://github.com/joebonrichie) will explore the possibility of curating our own \\"Editor\'s Choice\\" and \\"Featured Apps\\" in Gnome Software, made possible by [`gnome-app-list`](https://gitlab.gnome.org/GNOME/gnome-app-list). I think the road ahead is very exciting for us and hopefully for you too!\\n\\n## Want to help?\\n\\nWe are always eager for people to join and spend their time contributing to Solus. There are many ways you can [contribute](https://help.getsol.us/docs/user/contributing/getting-involved), but for me it is packaging. For me, packaging can be relaxing, sometimes frustrating, but always gives me joy at the end. If you are interested to dip your toe on packaging and want to help us, here are the simple steps:\\n\\n1. Join the Solus Packaging Room on Matrix\\n2. Read and practice our [packaging documentation](https://help.getsol.us/docs/packaging/)\\n3. Submit your first Pull Request. We recommend doing the wiki gnome task or monitoring task\\n4. Follow along the review process until your PR gets merged\\n5. Continue on contributing and you might get invited to Solus Cleanup Crew\\n\\n## Closing thoughts\\n\\nI want to thank all the contributors that made all of this possible. It was such a wonderful effort from everyone and we will strive to keep that up. Let me know if you are interested in a follow-up blog about the detail of doing packaging for Solus. _Terima kasih dan sampai jumpa_!"},{"id":"solus-optimizing-packages","metadata":{"permalink":"/blog/solus-optimizing-packages","source":"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md","title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","date":"2024-02-09T00:00:00.000Z","tags":[{"inline":true,"label":"pgo","permalink":"/blog/tags/pgo"},{"inline":true,"label":"lto","permalink":"/blog/tags/lto"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"},{"inline":true,"label":"packaging","permalink":"/blog/tags/packaging"},{"inline":true,"label":"optimization","permalink":"/blog/tags/optimization"},{"inline":true,"label":"3","permalink":"/blog/tags/3"},{"inline":true,"label":"clang","permalink":"/blog/tags/clang"},{"inline":true,"label":"gnu","permalink":"/blog/tags/gnu"},{"inline":true,"label":"llvm","permalink":"/blog/tags/llvm"},{"inline":true,"label":"glibc","permalink":"/blog/tags/glibc"},{"inline":true,"label":"hwcaps","permalink":"/blog/tags/hwcaps"},{"inline":true,"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3"}],"readingTime":22.32,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","slug":"solus-optimizing-packages","authors":"joey","tags":["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Clean, clean, clean!","permalink":"/blog/clean-clean-clean"},"nextItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"}},"content":"We\'ll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We\'ll be using the story of how `libwebp` was optimized for and how it led to an unexpected side quest.\\n\\n\x3c!-- truncate --\x3e\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n# Cual es la causa\\n\\nLinux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements.\\n\\nPart of the problem is, a packager\'s time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for _all_ packages, such as enabling [LTO](https://en.wikipedia.org/wiki/Interprocedural_optimization) by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as [PGO](https://en.wikipedia.org/wiki/Profile-guided_optimization) without too much faffing around on a _targeted_ package.\\n\\nThe benefits of such an approach are:\\n\\n- Can target the performance of a specific package to benefit _all_ users\\n- A compiler optimization may improve one package, but may not apply globally to all packages.\\n\\nThe downsides are such:\\n\\n- Requires additional packager time to benchmark and experiment with different optimization strategies.\\n- Requires the packager to _choose_ and invest time into improving performance of a package.\\n- Requires the packager to find an appropriate benchmark to test the package against.\\n- Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck.\\n\\n# Optimization Techniques Available\\n\\n- speed:\\n - As simple as it gets really, build a package with `-O3` instead of `-O2` as well as any other flags deemed worthy to be included as part of the `speed` flags. The main drawback of this is that `-O3` is not guaranteed to produce faster results than building with `-O2` and typically will produce bigger binaries. The days of `-O3` outright breaking your program in weird unexpected ways is largely behind us.\\n- LTO:\\n - Compared to some other distributions `-flto` is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!\\n- Clang:\\n - Not strictly an optimization, but, building a package with `clang` instead of `gcc` and `ld.ldd` to link instead of the infamous `ld.bfd` may provide a faster package out of the box. You\'ll have to be careful of subtle ABI differences if building with `clang`. If in doubt, and, `clang` is the obvious choice, perform safety rebuilds on all reverse dependencies of the package.\\n- PGO:\\n - Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant.\\n- BOLT:\\n - Binary optimization and layout tool. You can think of this as \\"post-link PGO\\" where you instrument a binary with `bolt` to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new.\\n\\nRegardless, that\'s enough word spaghetti, let\'s look at the process to actually optimize a package.\\n\\n# Optimizing a Package\\n\\nRight, to begin with we\'ll have to start on choosing an actual package to benchmark and optimize. I\'ve heard the `.webp` file format is becoming increasingly common on the web, slowly replacing `.png` and `.jpg` file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for `.webp` files would benefit any user using a web browser casually browsing the web.\\n\\nLet\'s have a look at the `package.yml` build recipe for `libwebp`.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : libwebp\\nversion : 1.3.2\\nrelease : 25\\nsource :\\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\\nhomepage : https://developers.google.com/speed/webp/\\nlicense : BSD-3-Clause\\ncomponent : multimedia.codecs\\nsummary : A new image format for the web\\ndescription: |\\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\nemul32 : yes\\npatterns :\\n - devel : /usr/share/man\\nbuilddeps :\\n - pkgconfig32(glu)\\n - pkgconfig32(glut)\\n - pkgconfig32(libpng)\\n - pkgconfig32(libtiff-4)\\n - pkgconfig32(libturbojpeg)\\n - pkgconfig32(zlib)\\n - giflib-devel\\nsetup : |\\n %reconfigure --disable-static --enable-everything\\nbuild : |\\n %make\\ninstall : |\\n %make_install\\n```\\n\\nOkay, looks to be a quite simple affair. A simple configure, make, make install as well as `emul32` being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We\'ll begin by looking at the `pspec_x86_64.xml` file which lists all the files produced from the `package.yml` recipe as well as some metadata.\\n\\n```xml\\n libwebp \\nA new image format for the web \\nWebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\n \\nmultimedia.codecs \\n\\n /usr/bin/cwebp \\n/usr/bin/dwebp \\n/usr/bin/gif2webp \\n/usr/bin/img2webp \\n/usr/bin/vwebp \\n/usr/bin/webpinfo \\n/usr/bin/webpmux \\n```\\n\\nPerfect, we have `dwebp` and `cwebp` binaries available in the main package, which from a guess can be used to decode and encode `.webp` files. Let\'s try it out.\\n\\n```\\n$ dwebp -h\\nUsage: dwebp in_file [options] [-o out_file]\\n\\nDecodes the WebP image file to PNG format [Default].\\nNote: Animated WebP files are not supported.\\n$ cwebp -h\\nUsage:\\n\\n cwebp [options] -q quality input.png -o output.webp\\n```\\n\\nAwesome, these binaries do exactly what we need to benchmark `libwebp`, but, we are also indirectly testing `libpng` as well for this benchmark, we\'ll have to keep an eye out for that.\\n\\nOne extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don\'t link against their own libraries and end up being self-contained. Run `ldd` to verify.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffed8733000)\\n\\tlibwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\\n\\tlibwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\\n\\tlibsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\\n\\tlibz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAwesome in this case both `dwebp` and `cwebp` link against `libwebp.so` so we can be confident that any performance improvements will be applicable to all packages in the repository linking against `libwebp`.\\n\\nLet\'s grab a couple of `.webp` files from [here](https://developers.google.com/speed/webp/gallery1) to test with. We\'ll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more.\\n\\nNow having done the prep work, lets actually benchmark the damn thing using `hyperfine` for the time being.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03C3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03C3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\\n```\\n\\nThere, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss.\\n\\n## Let\'s Start Obvious\\n\\nLet\'s start basic, enabling the `speed` optimization which basically builds with `-O3` instead of `-O2` as well as any other flags that are deemed to be worthy to be part of the `speed` group. As well as, the `lto` optimization which builds with link time optimization allowing for inter-procedural optimizations to take place.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\noptimize:\\n - speed\\n - lto\\n```\\n\\nMoment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03C3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03C3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\\n```\\n\\nWell okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore...\\n\\n## PGO is great, except, when it isn\'t.\\n\\nNext step is to explore PGO (Profile Guided Optimization). For our `libwebp` package, looks like we already hit a bit of a snafu. There\'s no test suite included in the tarball! That\'s a bit of a disappointment as a test suite such as `make check` is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built `dwebp` and `cwebp` binaries as a suitable workload for PGO.\\n\\nLuckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nprofile : |\\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\\n ./examples/cwebp test_png.png -o /dev/null\\n```\\n\\nAfter specifying that, 6 builds will now be performed instead of 2:\\n\\n- emul32:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n- x86_64:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n\\nFor this relatively small package it increases the build time from 1m1.672s to 1m42.199s\\n\\nThe next moment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03C3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03C3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\\n```\\n\\nWell... That\'s interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of `profile count data file not found [-Wmissing-profile]` warning messages during the optimized build indicating to us our profiling workload isn\'t comprehensive enough and doesn\'t cover enough code paths. The lack of a handy `make check` that could be used as a profiling workload is really hurting us here. For now, let\'s put a pin in exploring PGO, it isn\'t a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us.\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## 256 Vector Units go brrrrrr...\\n\\nThe next obvious step is to explore `glibc` hardware capabilities. For those unaware both `clang` and `gnu` compilers provide `x86_64-v2`, `x86_64-v3` and `x86_64-v4` micro-architecture build options on top of the baseline of `x86_64`. These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, `-sse4.2` for `x86_64-v2`, `-avx2` for `x86_64-v3`, and `-avx512` for `x86_64-v4`.\\n\\nWhilst that\'s great \'n all, if a program is built with `x86_64-v3` and gains an additional ~10% uplift in performance, it\'s no good if a `x86_64-v2` compatible cpu can\'t run it. Luckily the `glibc` loader that\'s found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they\'re installed and supported.\\n\\nOn top of all that, the `package.yml` format provides an incredibly simple way of providing `x86_64-v3` built libraries by enabling the `avx2 : yes` flag.\\n\\nWith `avx2 : yes` enabled in the `libwebp` package three builds are performed.\\n\\n- emul32\\n- x86_64-v3\\n- x86_64\\n\\nWe now see these additional files in the `pspec_x86_64.xml` file\\n\\n```diff\\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13 \\n```\\n\\nLet\'s rerun `lld` on `dwebp` after installing the new package and...\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffeab5b1000)\\n\\tlibwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\\n\\tlibwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\\n\\tlibsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\\n\\tlibz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nWe can crucially see that `dwebp` is now loading the `x86-64-v3` built `libwebp.so` lib from `/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8`, success! Let\'s what our performance looks like.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03C3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03C3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\\n```\\n\\nLet\'s recap so far:\\n\\n| Optimization | Decode | Encode | Size |\\n| ----------------------- | ------------------ | ------- | ------- |\\n| Baseline | 202.2 ms | 1.399 s | 1.33 MB |\\n| Speed + LTO | 200.0 ms | 1.353 s | 1.73 MB |\\n| Speed + LTO + PGO | 204.1 ms :warning: | 1.349 s | 1.07 MB |\\n| Speed + LTO + x86_64-v3 | 198.2 ms | 1.313 s | 3.17 MB |\\n\\nWhilst we\'re still getting an additional speedup it isn\'t really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in `/usr/lib/glibc-hwcaps/x86-64-v3/` just ain\'t worth it. This hints that either the compiler optimizations aren\'t really effective here or we\'re being bottle-necked by something else.\\n\\nSo far, we\'ve been benchmarking fairly simply using `hyperfine`, let\'s swap that out for `perf` so we can get a callgraph.\\n\\n## Something about `perf` to the rescue\\n\\n`perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null`\\n\\n`perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null`\\n\\nLet\'s look at `dwebp` first with `perf report -i dwebp.data`.\\n\\n![Perf report dwebp](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_png.webp)\\n\\nWell god damn, literally all of our time is being spent in `libz.so` it\'s no wonder our compiler optimizations were hardly improving performance.\\n\\nLet\'s also look at the `cwebp` report, we\'ve generally been getting better results from it.\\n\\n![Perf report cwebp](img/2024-02-09-intro-to-optimizing/perf_report_cwebp_png.webp)\\n\\nOkay, much more of our time is being spent in `libwebp.so` itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in `libz`.\\n\\n## Choosing Wisely\\n\\nYou may remember early on, when I said we are also indirectly testing `libpng`. Well... after some more digging, that\'s exactly what\'s happening here. Re-running the `dwebp` binary it says this\\n\\n> Decodes the WebP image file to PNG format\\n\\nTurns out, it\'s more accurate to say we are _directly_ testing `libpng` and by extension `zlib`. It isn\'t `libwebp` that\'s spending all of its time in `libz.so`, it\'s `libpng`! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they\'re doing.\\n\\nHowever, the good news about this little snafu is:\\n\\n1. `dwebp` can be used to translate to another image format such as `.yuv` that\'ll more accurately remove the bottleneck from `libz.so`.\\n2. We now know that `libpng` has a huge bottleneck in `libz.so` and speeding up `zlib` _should_ dramatically speed up `libpng` performance.\\n\\n## Adjusting the Benchmark\\n\\nAfter reverting the `libwebp` package to the baseline let\'s use our adjusted decoding benchmark.\\n\\nWe\'ll now use `dwebp ~/3.webp -yuv -o /dev/null` for a decoding test, let\'s run that with `perf` to ensure we\'re exclusively testing `libwebp.so` here.\\n\\n![Perf report dwebp to yuv](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_yuv.webp)\\n\\nOkay that\'s awesome, no `libpng.so` or `libz.so` to mess with our tests!\\n\\nLet\'s reapply our optimizations, keeping those which apply an uplift\\n\\n| Optimization | Decode | Size |\\n| ----------------------- | ----------------- | ------- |\\n| Baseline | 14.7 ms | 1.33 MB |\\n| Speed | 14.5 ms | 1.56 MB |\\n| LTO | 14.6 ms | 1.40 MB |\\n| PGO | 18.0 ms :warning: | 1.07 MB |\\n| x86-64-v3 | 12.7 ms | 2.35 MB |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n\\nOkay, this is great, whilst we aren\'t getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we\'re getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size.\\n\\n### Partial Profiling\\n\\nOnce again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn\'t very comprehensive due to the bunch of `-Wmissing-profile` warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that\'s part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn\'t matter is small. However, what happens when you can\'t craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that `-fprofile-partial-training`. GCC docs state that:\\n\\n> In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code.\\n\\nOkay, let\'s try it out, all we need to do is specify in our `package.yml` recipe.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nenvironment: |\\n if [[ -n ${PGO_USE_BUILD} ]]; then\\n export CFLAGS=\\"${CFLAGS} -fprofile-partial-training\\"\\n export CXXFLAGS=\\"${CXXFLAGS} -fprofile-partial-training\\"\\n fi\\n```\\n\\nAnd the results:\\n\\n| Optimization | Decode | Size |\\n| ------------------------------------- | ------- | ------- |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n| Speed + LTO + x86-64-v3 + Partial PGO | 12.5 ms | 3.13 MB |\\n\\nWell, it was worth a try. This highlights how useless PGO can be when you don\'t or can\'t provide it a good workload. Interestingly, we don\'t get the size bloat that was promised, in fact, the opposite.\\n\\n# Final libwebp Results\\n\\n| Benchmark | Time Before | Time After | Size Before | Size After |\\n| ----------------------------------- | ----------- | ---------- | ----------- | ---------- |\\n| \\"dwebp ~/3.webp -yuv -o /dev/null\\" | 14.5 ms | 12.3 ms | 1.33 MB | 3.17 MB |\\n| \\"cwebp ~/PNG_Test.png -o /dev/null\\" | 1.399 s | 1.313 s | -- | -- |\\n\\nIn the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It\'s possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level.\\n\\n# \\"Next-Generation\\" Side Quest\\n\\nNow, you probably remember earlier due to our unrepresentative benchmark we found out that `libpng` is getting highly bottlenecked by `libz.so`. This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using.\\n\\nZlib is widely employed throughout the ecosystem and, as such you\'d think it would be highly-optimized for performance. However, that isn\'t really the case. Zlib is written in an old-fashioned way of C and tries to be _extremely_ portable; supporting dozens of systems that have fallen out of common use. As such, it\'s hard to apply architecture specific optimizations that wouldn\'t break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success.\\n\\nHowever, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to [zlib-ng](https://github.com/zlib-ng/zlib-ng/). When built in compatible mode, it promises to be API compatible with canonical zlib and _tries_ to be as ABI compatible as possible.\\n\\nLet\'s just go for it, replacing Solus\' `zlib` package with zlib-ng built in compatible mode. It\'s a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## I Zee a Purty lil\' Package\\n\\nWell that was simple. Here\'s what our zlib-ng `package.yml` recipe looks like.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : zlib\\nversion : 2.1.5\\nrelease : 28\\nsource :\\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\\nhomepage : https://github.com/zlib-ng/zlib-ng\\nlicense : ZLIB\\ncomponent : system.base\\nsummary : zlib replacement with optimizations for next generation systems.\\ndescription:\\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\\ndevel : yes\\nemul32 : yes\\nsetup : |\\n %cmake_ninja \\\\\\n -DZLIB_COMPAT=ON \\\\\\n -DWITH_GTEST=OFF \\\\\\n -DBUILD_SHARED_LIBS=ON \\\\\\n -DINSTALL_LIB_DIR=%libdir%\\nbuild : |\\n %ninja_build\\ninstall : |\\n %ninja_install\\ncheck : |\\n %ninja_check\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAfter building it, all the files seem to be in the right place and the test suite is passing. Let\'s just install it overwriting our canonical `zlib` package and hope our system doesn\'t die... I think the word is YOLO.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03C3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\\n...\\n$ $ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03C3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\\n```\\n\\nWell, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time.\\n\\nWe need to find a more contained `libpng` benchmark here that removes the `libwebp` stuff to really confirm the findings here. After some sleuthing the `libpng` source repository has a [pngtopng.c](https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c) file we can compile to use the system libpng library.\\n\\nChanging the header from `#include \\"../../png.h\\"` to `#include` then running `gcc -Ofast pngtopng.c -lpng16 -o pngtopng` to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: `./pngtopng ~/PNG_Test.png /dev/null` for our benchmark.\\n\\n| Library | Time |\\n| ---------------- | -------- |\\n| zlib (canonical) | 1.464 s |\\n| zlib-ng (compat) | 896.6 ms |\\n\\nWell. This is pretty much inline with our flawed `dwebp` benchmark from earlier. Swapping out zlib almost halves `libpng` decoding time.\\n\\n## Squeezing more from zlib-ng\\n\\nHowever, we\'re not done yet. We still have our compiler optimizations available to us to squeeze more performance from `zlib-ng`.\\n\\n| Optimization | Decode | Size |\\n| ----------------------------- | -------- | --------- |\\n| Baseline | 896.6 ms | 141.00 KB |\\n| Speed | 883.6 ms | 182.00 KB |\\n| LTO | 892.7 ms | 133.00 KB |\\n| PGO | 894.6 ms | 141.00 KB |\\n| x86-64-v3 | 892.5 ms | 295.00 KB |\\n| Speed + LTO | 882.6 ms | 170.00 KB |\\n| Speed + LTO + PGO + x86-64-v3 | 882.5 ms | 250.00 KB |\\n\\nIt looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it\'s only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it\'s so performant right out of the gate.\\n\\n# Final Words\\n\\nWe\'ve shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it\'ll be good material for a future blog post.\\n\\nSome other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind.\\n\\nRegardless, I hope the story of how `libwebp` was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."},{"id":"don\'t-call-me-mate-pal","metadata":{"permalink":"/blog/don\'t-call-me-mate-pal","source":"@site/devlog/2024-01-29-dont-call-me-mate.md","title":"Don\'t call me MATE, pal!","description":"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.","date":"2024-01-29T00:00:00.000Z","tags":[{"inline":true,"label":"MATE","permalink":"/blog/tags/mate"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":2.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"Don\'t call me MATE, pal!","slug":"don\'t-call-me-mate-pal","authors":"david","tags":["MATE","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"},"nextItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Back in our [4.4 release post](https://getsol.us/2023/07/08/solus-4-4-released/) we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the _Solus MATE Transition Tool_ to move existing users off of MATE.\\n\\n\x3c!-- truncate --\x3e\\n\\n## The problem\\n\\nMATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of `eopkg` commands. We\'re pretty sure our resident `bash` script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know _you_ follow Solus news; after all, you\'re reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?\\n\\n## Introducing the Solus MATE Transition Tool\\n\\nWe\'re pleased to show off the _MATE Transition Tool_, which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here\'s how MATE users will encounter the tool:\\n\\n:::note\\n\\nThese screenshots are current as of the publishing of this post, we may change things as we continue testing.\\n\\n:::\\n\\n1. Users will get a notification on every start-up informing them that they need to transition away from MATE.\\n\\n![Notification: Solus Transition Service](img/2024-01-29-dont-call-me-mate/notification.png)\\n\\n2. Clicking on that notification will launch the Solus MATE Transition Tool.\\n\\n![MATE Transition Tool Launch](img/2024-01-29-dont-call-me-mate/MTT-launch.png)\\n\\n3. Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot\\n4. The tool removes itself after a successful transition.\\n\\nSimple. At least, that\'s what we want users to think.\\n\\n## How the Mate Transition Tool is actually part of our Python2 work\\n\\nThe story of the MATE Transition Tool is actually tied up in our fight to drag `eopkg` into the current decade. As I wrote previously, we\'re somewhat embarrassed by the amount of Solus tooling which _still_ relies on Python2. One such tool is the Solus Software Center `solus-sc`. A while back, the team decided the sane thing to do was to ditch `solus-sc` in favor of _KDE Discover_ and _GNOME Software_ . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is _Discover_ and _Software_ have no way to talk to our package manager `eopkg`. We need an API. Luckily, other projects have encountered the same issue, leading to [`packagekit`](https://www.freedesktop.org/software/PackageKit/pk-intro.html).\\n\\nJoey has been doing the dirty work of bolting `packagekit` support onto `eopkg`, and saw an opportunity: If `eopkg` could be upgraded to understand some of `packagekit`, then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We\'re rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking `solus-sc` off [the list.](https://github.com/getsolus/packages/issues/270)"},{"id":"eopkg-is-dead-long-live-eopkg","metadata":{"permalink":"/blog/eopkg-is-dead-long-live-eopkg","source":"@site/devlog/2024-01-19-eopkg-is-dead.md","title":"eopkg is dead, long live eopkg","description":"Close watchers of our packages repository may have noticed some strange looking items:","date":"2024-01-19T00:00:00.000Z","tags":[{"inline":true,"label":"eopkg","permalink":"/blog/tags/eopkg"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"moss","permalink":"/blog/tags/moss"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":1.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"eopkg is dead, long live eopkg","slug":"eopkg-is-dead-long-live-eopkg","authors":"david","tags":["eopkg","devlog","moss","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"},"nextItem":{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1"}},"content":"Close watchers of our [packages repository](https://github.com/getsolus/packages) may have noticed some strange looking items:\\n\\n- [Initial inclusion of eopkg4-bin](https://github.com/getsolus/packages/pull/1305)\\n- [Testing the eopkg4-bin package](https://github.com/getsolus/packages/issues/1316) Warning: Minions GIF\\n\\nIt\'s a long story.\\n\\n\x3c!-- truncate --\x3e\\n\\nOur package manager `eopkg` is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:\\n\\n- Do we really want to just port `eopkg` to python3? Surely we could build something newer and shinier.\\n- How exactly do we want to port `eopkg` to Python3? (We\'ll call this ported version `eopkg3` for short)\\n- How do we make sure `eopkg3` works even if something goes wrong with the Python3 libraries on someone\'s machine?\\n\\nHere\'s the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager [_moss_](https://github.com/serpent-os/moss) that we are excited about. And they\'re building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we\'re taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things.\\n\\nSheepman, Livingsilver, and others completed a [direct Python3 port](https://github.com/getsolus/eopkg/commits/python3), which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a _binary_ using [nuitka](https://nuitka.net/doc/download.html). We\'re calling this compiled `eopkg3` binary `eopkg4-bin` for now. Critically, this binary will have _no dependencies_ other than `libc`. If we can successfully swap `eopkg` with `eopkg4-bin` on user\'s machines, then we\'ve solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?\\n\\nBut what about Python2? Well, now that Evan and Joey have seen off a [successful ISO release](https://getsol.us/2024/01/08/solus-4-5-released/) with a `calamares` based installer, we can cross `os-installer` [off the list](https://github.com/getsolus/packages/issues/270). And `eopkg4-bin` will let us cross off a whole bunch more. The rest of that list is a story for another day."},{"id":"welcome-solus-devlog-v1","metadata":{"permalink":"/blog/welcome-solus-devlog-v1","source":"@site/devlog/2024-01-13-welcome-devlog.md","title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","date":"2024-01-13T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"firstpost","permalink":"/blog/tags/firstpost"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":0.9,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","slug":"welcome-solus-devlog-v1","authors":"joey","tags":["hello","devlog","firstpost","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Welcome to the Solus Development Log.\\n\\nThe Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space.\\n\\n\x3c!-- truncate --\x3e\\n\\nThe Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space.\\n\\nThe DevLog has been setup as a separate entity to the [Solus Blog](https://getsol.us/blog/) to encourage more short form development content that doesn\'t require the same level of polish as an official blog post.\\n\\nIt is hoped that this will be used to help communicate what\'s going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world.\\n\\nAdditionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the [getsolus](https://github.com/getsolus/) GitHub organization page and the [Solus](https://matrix.to/#/#solus:matrix.org) Matrix channels.\\n\\nHope to see you back at this space soon with more content!"}]}}')}}]); \ No newline at end of file diff --git a/assets/js/f81c1134.ac31f1df.js b/assets/js/f81c1134.ac31f1df.js deleted file mode 100644 index 5a33afebb..000000000 --- a/assets/js/f81c1134.ac31f1df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4031],{4108:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"clean-clean-clean","metadata":{"permalink":"/blog/clean-clean-clean","source":"@site/devlog/2024-11-21-clean-cleanl-clean.md","title":"Clean, clean, clean!","description":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.","date":"2024-11-21T00:00:00.000Z","tags":[{"inline":true,"label":"housekeeping","permalink":"/blog/tags/housekeeping"},{"inline":true,"label":"cleanup","permalink":"/blog/tags/cleanup"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":5.585,"hasTruncateMarker":true,"authors":[{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi"}],"frontMatter":{"title":"Clean, clean, clean!","slug":"clean-clean-clean","authors":"alfi","tags":["housekeeping","cleanup","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"}},"content":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.\\n\\n\x3c!-- truncate --\x3e\\n\\n## A bit of background\\n\\nI started contributing in October 2023, when Solus participated in [Hacktoberfest](https://getsol.us/2023/10/01/solus-and-hacktoberfest-2023/). Hacktoberfest is a month-long event that encourage people to contribute to open source project in exchange for some digital merchandise. Finally, an excuse to contribute to something I use every day. Although, as an accountant, all of this is new experience to me. It was confusing at first, but I persisted. Finally, I got the hang of it and I managed to submit around 100 pull request during the month of the event. I was very excited and motivated. During the month, a few people joined the event and contributed to Solus, but then November came and most of the contribution slowed down. I was the only one left that continued doing the beginner tasks, mostly adding homepage to packages.\\n\\nAt the start of January 2024, Jakob Gezelius ([androidnisse](https://github.com/androidnisse)) comes in and starts contributing to homepage task too. Worried that we would stepped on each other\'s feet, we started a private chat to organize the tasks between ourselves. Until May, the two of us had been chipping away at the homepage task which at this point left 650 packages without a homepage. Then we had more contributors joining. I decided to make a group chat to accommodate all the people joining. It was called \\"Solus Homepage Team\\" at the time. More contributors and staff members joined the room, then it was renamed as \\"Solus Cleanup Crew\\" and moved under the official Solus matrix space.\\n\\n## What is it?\\n\\nSolus cleanup crew is a group of community contributors as as well staff members with the goal of bringing the Solus package repository up to current standard. It is a subset of the packaging room on our matrix channel. We organize the work on all the cleanup related tasks.\\n\\n## Why bother?\\n\\nSolus has been updating their tooling and infrastructure since its resurrection. While most of the tooling changes can be accomplished by staff members alone, there are things that they cannot do. While many consider Solus repository as small, it still contains more than 6000 packages. Some packages have never even gotten an update since Solus was first created! We want to get rid of all its cruft before we can migrate to a better tooling. That\'s where the community contributor can come in and help.\\n\\nFor me personally, it is a chance to learn something new and fill my time with more purpose. Sometimes, I feel like a slob scrolling through things, opening the same three apps over and over or sleeping midday. Technically speaking, doing packaging is still scrolling through things, still opening the same three apps over and over, and I still get my midday nap, but now it is with purpose. I love that what I do can be enjoyed by other people. It is mostly invisible and not even noticed by people, but the chance of it helping people gives me so much joy. Why bother? Because I love it.\\n\\n## What we accomplished\\n\\nWe create a few repository wide task that can done with little reading of our packaging guide. The keen-eyed of you may have already seen these tasks. It is always attached at the end of every Sync Updates since July. These are the tasks we did:\\n|No. | Task | Date Started | Start count | Current count|\\n|----|-------------| ------| ------------|--------------|\\n|1.| [Adding homepage key to package.yml](https://github.com/getsolus/packages/issues/411)|30-09-2023|2300|8\\n|2.| [Adding AppStream metainfo to all font packages](https://github.com/getsolus/packages/issues/449)|06-10-2023| 38 | Done \ud83c\udf89|\\n|3.| [Adding AppStream metainfo to all graphical applications](https://github.com/getsolus/packages/issues/1389)|22-01-2024|316|198|\\n|4.| [Applying new cargo macros](https://github.com/getsolus/packages/issues/3111)|27-06-2024|37| Done \ud83c\udf89|\\n|5.| [Changing all packages with homepages pointing to wiki.gnome.org](https://github.com/getsolus/packages/issues/4116)|20-10-2024|87|62|\\n|6.| [Adding monitoring.yml](https://github.com/getsolus/packages/issues/4121)|21-10-2024|3070|2937|\\n|7.| [Tagging packages that do not build](https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Packaging+Problem%22)|Ongoing| N/A| 13\\n|8.| [Tagging packages that should be deprecated](https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Package%3A+Removal+Request%22)|Ongoing| N/A| 25\\n\\nAs you can see from the table above, we just completed two tasks and we are close to completing homepage task. Packages that do not build also are also getting solved one by one. Right now, there are 12 people in Solus Cleanup Crew Matrix room, 6 of them are new contributors. We also create a new AppStream metainfo documentation, clean up our issue templates, implement a better tagging system for organizing issues and much more. Solus Cleanup Crew is also becoming a place where we can onboard new contributors and recruit new staff. I thought we accomplished a lot and I am happy with it.\\n\\n## What next?\\n\\nWe want to focus on adding appstream metainfo for remaining 200 packages, in line with the goal of 4.7 ISO. It will not be easy nor quick, but we will try our best. We want Solus users to have the best experience possible when we finally say goodbye to `solus-sc` and switch to modern software center (Gnome Software and KDE Discover). We want you to be able to install all graphical application from software center and have all the relevant information (Legible screenshot, Hi-Res Icon, good description, etc).\\n\\nWe also want to add more [monitoring.yml](https://help.getsol.us/docs/packaging/monitoring.yml) files to packages, so we can utilize our proof-of-concept [\\"Package Update Monitor\\"](https://shared.getsol.us/justin/updates/) created by [Justin Zobel](https://github.com/Justinzobel). I, myself and [Joey Riches](https://github.com/joebonrichie) will explore the possibility of curating our own \\"Editor\'s Choice\\" and \\"Featured Apps\\" in Gnome Software, made possible by [`gnome-app-list`](https://gitlab.gnome.org/GNOME/gnome-app-list). I think the road ahead is very exciting for us and hopefully for you too!\\n\\n## Want to help?\\n\\nWe are always eager for people to join and spend their time contributing to Solus. There are many ways you can [contribute](https://help.getsol.us/docs/user/contributing/getting-involved), but for me it is packaging. For me, packaging can be relaxing, sometimes frustrating, but always gives me joy at the end. If you are interested to dip your toe on packaging and want to help us, here are the simple steps:\\n\\n1. Join the Solus Packaging Room on Matrix\\n2. Read and practice our [packaging documentation](https://help.getsol.us/docs/packaging/)\\n3. Submit your first Pull Request. We recommend doing the wiki gnome task or monitoring task\\n4. Follow along the review process until your PR gets merged\\n5. Continue on contributing and you might get invited to Solus Cleanup Crew\\n\\n## Closing thoughts\\n\\nI want to thank all the contributors that made all of this possible. It was such a wonderful effort from everyone and we will strive to keep that up. Let me know if you are interested in a follow-up blog about the detail of doing packaging for Solus. _Terima kasih dan sampai jumpa_!"},{"id":"solus-optimizing-packages","metadata":{"permalink":"/blog/solus-optimizing-packages","source":"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md","title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","date":"2024-02-09T00:00:00.000Z","tags":[{"inline":true,"label":"pgo","permalink":"/blog/tags/pgo"},{"inline":true,"label":"lto","permalink":"/blog/tags/lto"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"},{"inline":true,"label":"packaging","permalink":"/blog/tags/packaging"},{"inline":true,"label":"optimization","permalink":"/blog/tags/optimization"},{"inline":true,"label":"3","permalink":"/blog/tags/3"},{"inline":true,"label":"clang","permalink":"/blog/tags/clang"},{"inline":true,"label":"gnu","permalink":"/blog/tags/gnu"},{"inline":true,"label":"llvm","permalink":"/blog/tags/llvm"},{"inline":true,"label":"glibc","permalink":"/blog/tags/glibc"},{"inline":true,"label":"hwcaps","permalink":"/blog/tags/hwcaps"},{"inline":true,"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3"}],"readingTime":22.32,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","slug":"solus-optimizing-packages","authors":"joey","tags":["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Clean, clean, clean!","permalink":"/blog/clean-clean-clean"},"nextItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"}},"content":"We\'ll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We\'ll be using the story of how `libwebp` was optimized for and how it led to an unexpected side quest.\\n\\n\x3c!-- truncate --\x3e\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n# Cual es la causa\\n\\nLinux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements.\\n\\nPart of the problem is, a packager\'s time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for _all_ packages, such as enabling [LTO](https://en.wikipedia.org/wiki/Interprocedural_optimization) by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as [PGO](https://en.wikipedia.org/wiki/Profile-guided_optimization) without too much faffing around on a _targeted_ package.\\n\\nThe benefits of such an approach are:\\n\\n- Can target the performance of a specific package to benefit _all_ users\\n- A compiler optimization may improve one package, but may not apply globally to all packages.\\n\\nThe downsides are such:\\n\\n- Requires additional packager time to benchmark and experiment with different optimization strategies.\\n- Requires the packager to _choose_ and invest time into improving performance of a package.\\n- Requires the packager to find an appropriate benchmark to test the package against.\\n- Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck.\\n\\n# Optimization Techniques Available\\n\\n- speed:\\n - As simple as it gets really, build a package with `-O3` instead of `-O2` as well as any other flags deemed worthy to be included as part of the `speed` flags. The main drawback of this is that `-O3` is not guaranteed to produce faster results than building with `-O2` and typically will produce bigger binaries. The days of `-O3` outright breaking your program in weird unexpected ways is largely behind us.\\n- LTO:\\n - Compared to some other distributions `-flto` is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!\\n- Clang:\\n - Not strictly an optimization, but, building a package with `clang` instead of `gcc` and `ld.ldd` to link instead of the infamous `ld.bfd` may provide a faster package out of the box. You\'ll have to be careful of subtle ABI differences if building with `clang`. If in doubt, and, `clang` is the obvious choice, perform safety rebuilds on all reverse dependencies of the package.\\n- PGO:\\n - Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant.\\n- BOLT:\\n - Binary optimization and layout tool. You can think of this as \\"post-link PGO\\" where you instrument a binary with `bolt` to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new.\\n\\nRegardless, that\'s enough word spaghetti, let\'s look at the process to actually optimize a package.\\n\\n# Optimizing a Package\\n\\nRight, to begin with we\'ll have to start on choosing an actual package to benchmark and optimize. I\'ve heard the `.webp` file format is becoming increasingly common on the web, slowly replacing `.png` and `.jpg` file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for `.webp` files would benefit any user using a web browser casually browsing the web.\\n\\nLet\'s have a look at the `package.yml` build recipe for `libwebp`.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : libwebp\\nversion : 1.3.2\\nrelease : 25\\nsource :\\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\\nhomepage : https://developers.google.com/speed/webp/\\nlicense : BSD-3-Clause\\ncomponent : multimedia.codecs\\nsummary : A new image format for the web\\ndescription: |\\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\nemul32 : yes\\npatterns :\\n - devel : /usr/share/man\\nbuilddeps :\\n - pkgconfig32(glu)\\n - pkgconfig32(glut)\\n - pkgconfig32(libpng)\\n - pkgconfig32(libtiff-4)\\n - pkgconfig32(libturbojpeg)\\n - pkgconfig32(zlib)\\n - giflib-devel\\nsetup : |\\n %reconfigure --disable-static --enable-everything\\nbuild : |\\n %make\\ninstall : |\\n %make_install\\n```\\n\\nOkay, looks to be a quite simple affair. A simple configure, make, make install as well as `emul32` being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We\'ll begin by looking at the `pspec_x86_64.xml` file which lists all the files produced from the `package.yml` recipe as well as some metadata.\\n\\n```xml\\n libwebp \\nA new image format for the web \\nWebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\n \\nmultimedia.codecs \\n\\n /usr/bin/cwebp \\n/usr/bin/dwebp \\n/usr/bin/gif2webp \\n/usr/bin/img2webp \\n/usr/bin/vwebp \\n/usr/bin/webpinfo \\n/usr/bin/webpmux \\n```\\n\\nPerfect, we have `dwebp` and `cwebp` binaries available in the main package, which from a guess can be used to decode and encode `.webp` files. Let\'s try it out.\\n\\n```\\n$ dwebp -h\\nUsage: dwebp in_file [options] [-o out_file]\\n\\nDecodes the WebP image file to PNG format [Default].\\nNote: Animated WebP files are not supported.\\n$ cwebp -h\\nUsage:\\n\\n cwebp [options] -q quality input.png -o output.webp\\n```\\n\\nAwesome, these binaries do exactly what we need to benchmark `libwebp`, but, we are also indirectly testing `libpng` as well for this benchmark, we\'ll have to keep an eye out for that.\\n\\nOne extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don\'t link against their own libraries and end up being self-contained. Run `ldd` to verify.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffed8733000)\\n\\tlibwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\\n\\tlibwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\\n\\tlibsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\\n\\tlibz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAwesome in this case both `dwebp` and `cwebp` link against `libwebp.so` so we can be confident that any performance improvements will be applicable to all packages in the repository linking against `libwebp`.\\n\\nLet\'s grab a couple of `.webp` files from [here](https://developers.google.com/speed/webp/gallery1) to test with. We\'ll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more.\\n\\nNow having done the prep work, lets actually benchmark the damn thing using `hyperfine` for the time being.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\\n```\\n\\nThere, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss.\\n\\n## Let\'s Start Obvious\\n\\nLet\'s start basic, enabling the `speed` optimization which basically builds with `-O3` instead of `-O2` as well as any other flags that are deemed to be worthy to be part of the `speed` group. As well as, the `lto` optimization which builds with link time optimization allowing for inter-procedural optimizations to take place.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\noptimize:\\n - speed\\n - lto\\n```\\n\\nMoment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\\n```\\n\\nWell okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore...\\n\\n## PGO is great, except, when it isn\'t.\\n\\nNext step is to explore PGO (Profile Guided Optimization). For our `libwebp` package, looks like we already hit a bit of a snafu. There\'s no test suite included in the tarball! That\'s a bit of a disappointment as a test suite such as `make check` is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built `dwebp` and `cwebp` binaries as a suitable workload for PGO.\\n\\nLuckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nprofile : |\\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\\n ./examples/cwebp test_png.png -o /dev/null\\n```\\n\\nAfter specifying that, 6 builds will now be performed instead of 2:\\n\\n- emul32:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n- x86_64:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n\\nFor this relatively small package it increases the build time from 1m1.672s to 1m42.199s\\n\\nThe next moment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\\n```\\n\\nWell... That\'s interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of `profile count data file not found [-Wmissing-profile]` warning messages during the optimized build indicating to us our profiling workload isn\'t comprehensive enough and doesn\'t cover enough code paths. The lack of a handy `make check` that could be used as a profiling workload is really hurting us here. For now, let\'s put a pin in exploring PGO, it isn\'t a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us.\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## 256 Vector Units go brrrrrr...\\n\\nThe next obvious step is to explore `glibc` hardware capabilities. For those unaware both `clang` and `gnu` compilers provide `x86_64-v2`, `x86_64-v3` and `x86_64-v4` micro-architecture build options on top of the baseline of `x86_64`. These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, `-sse4.2` for `x86_64-v2`, `-avx2` for `x86_64-v3`, and `-avx512` for `x86_64-v4`.\\n\\nWhilst that\'s great \'n all, if a program is built with `x86_64-v3` and gains an additional ~10% uplift in performance, it\'s no good if a `x86_64-v2` compatible cpu can\'t run it. Luckily the `glibc` loader that\'s found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they\'re installed and supported.\\n\\nOn top of all that, the `package.yml` format provides an incredibly simple way of providing `x86_64-v3` built libraries by enabling the `avx2 : yes` flag.\\n\\nWith `avx2 : yes` enabled in the `libwebp` package three builds are performed.\\n\\n- emul32\\n- x86_64-v3\\n- x86_64\\n\\nWe now see these additional files in the `pspec_x86_64.xml` file\\n\\n```diff\\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3 \\n+/usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13 \\n```\\n\\nLet\'s rerun `lld` on `dwebp` after installing the new package and...\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffeab5b1000)\\n\\tlibwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\\n\\tlibwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\\n\\tlibsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\\n\\tlibz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nWe can crucially see that `dwebp` is now loading the `x86-64-v3` built `libwebp.so` lib from `/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8`, success! Let\'s what our performance looks like.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\\n```\\n\\nLet\'s recap so far:\\n\\n| Optimization | Decode | Encode | Size |\\n| ----------------------- | ------------------ | ------- | ------- |\\n| Baseline | 202.2 ms | 1.399 s | 1.33 MB |\\n| Speed + LTO | 200.0 ms | 1.353 s | 1.73 MB |\\n| Speed + LTO + PGO | 204.1 ms :warning: | 1.349 s | 1.07 MB |\\n| Speed + LTO + x86_64-v3 | 198.2 ms | 1.313 s | 3.17 MB |\\n\\nWhilst we\'re still getting an additional speedup it isn\'t really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in `/usr/lib/glibc-hwcaps/x86-64-v3/` just ain\'t worth it. This hints that either the compiler optimizations aren\'t really effective here or we\'re being bottle-necked by something else.\\n\\nSo far, we\'ve been benchmarking fairly simply using `hyperfine`, let\'s swap that out for `perf` so we can get a callgraph.\\n\\n## Something about `perf` to the rescue\\n\\n`perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null`\\n\\n`perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null`\\n\\nLet\'s look at `dwebp` first with `perf report -i dwebp.data`.\\n\\n![Perf report dwebp](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_png.webp)\\n\\nWell god damn, literally all of our time is being spent in `libz.so` it\'s no wonder our compiler optimizations were hardly improving performance.\\n\\nLet\'s also look at the `cwebp` report, we\'ve generally been getting better results from it.\\n\\n![Perf report cwebp](img/2024-02-09-intro-to-optimizing/perf_report_cwebp_png.webp)\\n\\nOkay, much more of our time is being spent in `libwebp.so` itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in `libz`.\\n\\n## Choosing Wisely\\n\\nYou may remember early on, when I said we are also indirectly testing `libpng`. Well... after some more digging, that\'s exactly what\'s happening here. Re-running the `dwebp` binary it says this\\n\\n> Decodes the WebP image file to PNG format\\n\\nTurns out, it\'s more accurate to say we are _directly_ testing `libpng` and by extension `zlib`. It isn\'t `libwebp` that\'s spending all of its time in `libz.so`, it\'s `libpng`! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they\'re doing.\\n\\nHowever, the good news about this little snafu is:\\n\\n1. `dwebp` can be used to translate to another image format such as `.yuv` that\'ll more accurately remove the bottleneck from `libz.so`.\\n2. We now know that `libpng` has a huge bottleneck in `libz.so` and speeding up `zlib` _should_ dramatically speed up `libpng` performance.\\n\\n## Adjusting the Benchmark\\n\\nAfter reverting the `libwebp` package to the baseline let\'s use our adjusted decoding benchmark.\\n\\nWe\'ll now use `dwebp ~/3.webp -yuv -o /dev/null` for a decoding test, let\'s run that with `perf` to ensure we\'re exclusively testing `libwebp.so` here.\\n\\n![Perf report dwebp to yuv](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_yuv.webp)\\n\\nOkay that\'s awesome, no `libpng.so` or `libz.so` to mess with our tests!\\n\\nLet\'s reapply our optimizations, keeping those which apply an uplift\\n\\n| Optimization | Decode | Size |\\n| ----------------------- | ----------------- | ------- |\\n| Baseline | 14.7 ms | 1.33 MB |\\n| Speed | 14.5 ms | 1.56 MB |\\n| LTO | 14.6 ms | 1.40 MB |\\n| PGO | 18.0 ms :warning: | 1.07 MB |\\n| x86-64-v3 | 12.7 ms | 2.35 MB |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n\\nOkay, this is great, whilst we aren\'t getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we\'re getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size.\\n\\n### Partial Profiling\\n\\nOnce again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn\'t very comprehensive due to the bunch of `-Wmissing-profile` warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that\'s part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn\'t matter is small. However, what happens when you can\'t craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that `-fprofile-partial-training`. GCC docs state that:\\n\\n> In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code.\\n\\nOkay, let\'s try it out, all we need to do is specify in our `package.yml` recipe.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nenvironment: |\\n if [[ -n ${PGO_USE_BUILD} ]]; then\\n export CFLAGS=\\"${CFLAGS} -fprofile-partial-training\\"\\n export CXXFLAGS=\\"${CXXFLAGS} -fprofile-partial-training\\"\\n fi\\n```\\n\\nAnd the results:\\n\\n| Optimization | Decode | Size |\\n| ------------------------------------- | ------- | ------- |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n| Speed + LTO + x86-64-v3 + Partial PGO | 12.5 ms | 3.13 MB |\\n\\nWell, it was worth a try. This highlights how useless PGO can be when you don\'t or can\'t provide it a good workload. Interestingly, we don\'t get the size bloat that was promised, in fact, the opposite.\\n\\n# Final libwebp Results\\n\\n| Benchmark | Time Before | Time After | Size Before | Size After |\\n| ----------------------------------- | ----------- | ---------- | ----------- | ---------- |\\n| \\"dwebp ~/3.webp -yuv -o /dev/null\\" | 14.5 ms | 12.3 ms | 1.33 MB | 3.17 MB |\\n| \\"cwebp ~/PNG_Test.png -o /dev/null\\" | 1.399 s | 1.313 s | -- | -- |\\n\\nIn the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It\'s possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level.\\n\\n# \\"Next-Generation\\" Side Quest\\n\\nNow, you probably remember earlier due to our unrepresentative benchmark we found out that `libpng` is getting highly bottlenecked by `libz.so`. This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using.\\n\\nZlib is widely employed throughout the ecosystem and, as such you\'d think it would be highly-optimized for performance. However, that isn\'t really the case. Zlib is written in an old-fashioned way of C and tries to be _extremely_ portable; supporting dozens of systems that have fallen out of common use. As such, it\'s hard to apply architecture specific optimizations that wouldn\'t break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success.\\n\\nHowever, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to [zlib-ng](https://github.com/zlib-ng/zlib-ng/). When built in compatible mode, it promises to be API compatible with canonical zlib and _tries_ to be as ABI compatible as possible.\\n\\nLet\'s just go for it, replacing Solus\' `zlib` package with zlib-ng built in compatible mode. It\'s a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## I Zee a Purty lil\' Package\\n\\nWell that was simple. Here\'s what our zlib-ng `package.yml` recipe looks like.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : zlib\\nversion : 2.1.5\\nrelease : 28\\nsource :\\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\\nhomepage : https://github.com/zlib-ng/zlib-ng\\nlicense : ZLIB\\ncomponent : system.base\\nsummary : zlib replacement with optimizations for next generation systems.\\ndescription:\\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\\ndevel : yes\\nemul32 : yes\\nsetup : |\\n %cmake_ninja \\\\\\n -DZLIB_COMPAT=ON \\\\\\n -DWITH_GTEST=OFF \\\\\\n -DBUILD_SHARED_LIBS=ON \\\\\\n -DINSTALL_LIB_DIR=%libdir%\\nbuild : |\\n %ninja_build\\ninstall : |\\n %ninja_install\\ncheck : |\\n %ninja_check\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAfter building it, all the files seem to be in the right place and the test suite is passing. Let\'s just install it overwriting our canonical `zlib` package and hope our system doesn\'t die... I think the word is YOLO.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\\n...\\n$ $ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\\n```\\n\\nWell, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time.\\n\\nWe need to find a more contained `libpng` benchmark here that removes the `libwebp` stuff to really confirm the findings here. After some sleuthing the `libpng` source repository has a [pngtopng.c](https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c) file we can compile to use the system libpng library.\\n\\nChanging the header from `#include \\"../../png.h\\"` to `#include` then running `gcc -Ofast pngtopng.c -lpng16 -o pngtopng` to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: `./pngtopng ~/PNG_Test.png /dev/null` for our benchmark.\\n\\n| Library | Time |\\n| ---------------- | -------- |\\n| zlib (canonical) | 1.464 s |\\n| zlib-ng (compat) | 896.6 ms |\\n\\nWell. This is pretty much inline with our flawed `dwebp` benchmark from earlier. Swapping out zlib almost halves `libpng` decoding time.\\n\\n## Squeezing more from zlib-ng\\n\\nHowever, we\'re not done yet. We still have our compiler optimizations available to us to squeeze more performance from `zlib-ng`.\\n\\n| Optimization | Decode | Size |\\n| ----------------------------- | -------- | --------- |\\n| Baseline | 896.6 ms | 141.00 KB |\\n| Speed | 883.6 ms | 182.00 KB |\\n| LTO | 892.7 ms | 133.00 KB |\\n| PGO | 894.6 ms | 141.00 KB |\\n| x86-64-v3 | 892.5 ms | 295.00 KB |\\n| Speed + LTO | 882.6 ms | 170.00 KB |\\n| Speed + LTO + PGO + x86-64-v3 | 882.5 ms | 250.00 KB |\\n\\nIt looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it\'s only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it\'s so performant right out of the gate.\\n\\n# Final Words\\n\\nWe\'ve shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it\'ll be good material for a future blog post.\\n\\nSome other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind.\\n\\nRegardless, I hope the story of how `libwebp` was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."},{"id":"don\'t-call-me-mate-pal","metadata":{"permalink":"/blog/don\'t-call-me-mate-pal","source":"@site/devlog/2024-01-29-dont-call-me-mate.md","title":"Don\'t call me MATE, pal!","description":"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.","date":"2024-01-29T00:00:00.000Z","tags":[{"inline":true,"label":"MATE","permalink":"/blog/tags/mate"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":2.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"Don\'t call me MATE, pal!","slug":"don\'t-call-me-mate-pal","authors":"david","tags":["MATE","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"},"nextItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Back in our [4.4 release post](https://getsol.us/2023/07/08/solus-4-4-released/) we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the _Solus MATE Transition Tool_ to move existing users off of MATE.\\n\\n\x3c!-- truncate --\x3e\\n\\n## The problem\\n\\nMATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of `eopkg` commands. We\'re pretty sure our resident `bash` script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know _you_ follow Solus news; after all, you\'re reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?\\n\\n## Introducing the Solus MATE Transition Tool\\n\\nWe\'re pleased to show off the _MATE Transition Tool_, which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here\'s how MATE users will encounter the tool:\\n\\n:::note\\n\\nThese screenshots are current as of the publishing of this post, we may change things as we continue testing.\\n\\n:::\\n\\n1. Users will get a notification on every start-up informing them that they need to transition away from MATE.\\n\\n![Notification: Solus Transition Service](img/2024-01-29-dont-call-me-mate/notification.png)\\n\\n2. Clicking on that notification will launch the Solus MATE Transition Tool.\\n\\n![MATE Transition Tool Launch](img/2024-01-29-dont-call-me-mate/MTT-launch.png)\\n\\n3. Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot\\n4. The tool removes itself after a successful transition.\\n\\nSimple. At least, that\'s what we want users to think.\\n\\n## How the Mate Transition Tool is actually part of our Python2 work\\n\\nThe story of the MATE Transition Tool is actually tied up in our fight to drag `eopkg` into the current decade. As I wrote previously, we\'re somewhat embarrassed by the amount of Solus tooling which _still_ relies on Python2. One such tool is the Solus Software Center `solus-sc`. A while back, the team decided the sane thing to do was to ditch `solus-sc` in favor of _KDE Discover_ and _GNOME Software_ . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is _Discover_ and _Software_ have no way to talk to our package manager `eopkg`. We need an API. Luckily, other projects have encountered the same issue, leading to [`packagekit`](https://www.freedesktop.org/software/PackageKit/pk-intro.html).\\n\\nJoey has been doing the dirty work of bolting `packagekit` support onto `eopkg`, and saw an opportunity: If `eopkg` could be upgraded to understand some of `packagekit`, then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We\'re rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking `solus-sc` off [the list.](https://github.com/getsolus/packages/issues/270)"},{"id":"eopkg-is-dead-long-live-eopkg","metadata":{"permalink":"/blog/eopkg-is-dead-long-live-eopkg","source":"@site/devlog/2024-01-19-eopkg-is-dead.md","title":"eopkg is dead, long live eopkg","description":"Close watchers of our packages repository may have noticed some strange looking items:","date":"2024-01-19T00:00:00.000Z","tags":[{"inline":true,"label":"eopkg","permalink":"/blog/tags/eopkg"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"moss","permalink":"/blog/tags/moss"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":1.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"eopkg is dead, long live eopkg","slug":"eopkg-is-dead-long-live-eopkg","authors":"david","tags":["eopkg","devlog","moss","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"},"nextItem":{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1"}},"content":"Close watchers of our [packages repository](https://github.com/getsolus/packages) may have noticed some strange looking items:\\n\\n- [Initial inclusion of eopkg4-bin](https://github.com/getsolus/packages/pull/1305)\\n- [Testing the eopkg4-bin package](https://github.com/getsolus/packages/issues/1316) Warning: Minions GIF\\n\\nIt\'s a long story.\\n\\n\x3c!-- truncate --\x3e\\n\\nOur package manager `eopkg` is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:\\n\\n- Do we really want to just port `eopkg` to python3? Surely we could build something newer and shinier.\\n- How exactly do we want to port `eopkg` to Python3? (We\'ll call this ported version `eopkg3` for short)\\n- How do we make sure `eopkg3` works even if something goes wrong with the Python3 libraries on someone\'s machine?\\n\\nHere\'s the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager [_moss_](https://github.com/serpent-os/moss) that we are excited about. And they\'re building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we\'re taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things.\\n\\nSheepman, Livingsilver, and others completed a [direct Python3 port](https://github.com/getsolus/eopkg/commits/python3), which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a _binary_ using [nuitka](https://nuitka.net/doc/download.html). We\'re calling this compiled `eopkg3` binary `eopkg4-bin` for now. Critically, this binary will have _no dependencies_ other than `libc`. If we can successfully swap `eopkg` with `eopkg4-bin` on user\'s machines, then we\'ve solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?\\n\\nBut what about Python2? Well, now that Evan and Joey have seen off a [successful ISO release](https://getsol.us/2024/01/08/solus-4-5-released/) with a `calamares` based installer, we can cross `os-installer` [off the list](https://github.com/getsolus/packages/issues/270). And `eopkg4-bin` will let us cross off a whole bunch more. The rest of that list is a story for another day."},{"id":"welcome-solus-devlog-v1","metadata":{"permalink":"/blog/welcome-solus-devlog-v1","source":"@site/devlog/2024-01-13-welcome-devlog.md","title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","date":"2024-01-13T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"firstpost","permalink":"/blog/tags/firstpost"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":0.9,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","slug":"welcome-solus-devlog-v1","authors":"joey","tags":["hello","devlog","firstpost","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Welcome to the Solus Development Log.\\n\\nThe Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space.\\n\\n\x3c!-- truncate --\x3e\\n\\nThe Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space.\\n\\nThe DevLog has been setup as a separate entity to the [Solus Blog](https://getsol.us/blog/) to encourage more short form development content that doesn\'t require the same level of polish as an official blog post.\\n\\nIt is hoped that this will be used to help communicate what\'s going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world.\\n\\nAdditionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the [getsolus](https://github.com/getsolus/) GitHub organization page and the [Solus](https://matrix.to/#/#solus:matrix.org) Matrix channels.\\n\\nHope to see you back at this space soon with more content!"}]}}')}}]); \ No newline at end of file diff --git a/assets/js/f82cd581.9acf415a.js b/assets/js/f82cd581.9acf415a.js new file mode 100644 index 000000000..5f9a035ed --- /dev/null +++ b/assets/js/f82cd581.9acf415a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1402"],{67553:function(e){e.exports=JSON.parse('{"tag":{"label":"hello","permalink":"/blog/tags/hello","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/hello","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f82cd581.a3280881.js b/assets/js/f82cd581.a3280881.js deleted file mode 100644 index 1b79e57d0..000000000 --- a/assets/js/f82cd581.a3280881.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8626],{56664:e=>{e.exports=JSON.parse('{"tag":{"label":"hello","permalink":"/blog/tags/hello","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/hello","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f8dd8223.22ff61c6.js b/assets/js/f8dd8223.22ff61c6.js deleted file mode 100644 index 3fec27e39..000000000 --- a/assets/js/f8dd8223.22ff61c6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7212],{4606:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=t(85893),r=t(11151);const a={title:"PostgreSQL",summary:"A quick guide to using Postgres on Solus"},o="PostgreSQL server",l={id:"user/software/development/postgresql",title:"PostgreSQL",description:"PostgreSQL is an open source object-relational database system. The postgresql package in Solus includes the PostgreSQL library, client and server.",source:"@site/docs/user/software/development/postgresql.md",sourceDirName:"user/software/development",slug:"/user/software/development/postgresql",permalink:"/docs/user/software/development/postgresql",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/postgresql.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"PostgreSQL",summary:"A quick guide to using Postgres on Solus"},sidebar:"userSidebar",previous:{title:"Java",permalink:"/docs/user/software/development/java"},next:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"}},d={},c=[{value:"Usage",id:"usage",level:2},{value:"Updating to 17",id:"updating-to-17",level:2}];function i(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"postgresql-server",children:"PostgreSQL server"})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"})," is an open source object-relational database system. The ",(0,n.jsx)(s.code,{children:"postgresql"})," package in Solus includes the PostgreSQL library, client and server."]}),"\n",(0,n.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(s.p,{children:"PostgreSQL can be installed either from the Software Center or via terminal:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg install postgresql\n"})}),"\n",(0,n.jsx)(s.p,{children:"Management of the server can be done using Systemd:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable postgresql # Start the server on boot\nsudo systemctl start postgresql # Start the server now\nsudo systemctl stop postgresql # Stop the server\n"})}),"\n",(0,n.jsx)(s.p,{children:"It is possible to connect to the database using the PostgreSQL user:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Note that all local connections are trusted and can access all databases by default. This can be changed in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data/pg_hba.conf"}),", see the ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/docs/current/auth-pg-hba-conf.html",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,n.jsx)(s.h2,{id:"updating-to-17",children:"Updating to 17"}),"\n",(0,n.jsxs)(s.p,{children:["Because PostgreSQL is included as a single package, the only way to perform a major upgrade of PostgreSQL is via a backup/restore. The procedure below describes the upgrade process as it applies to Solus. See the ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/docs/17/upgrading.html#UPGRADING-VIA-PGDUMPALL",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"If you have already updated PostgreSQL, downgrade PostgreSQL back to 16.4:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-16.4-51-1-x86_64.eopkg \\\n https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-libpq-16.4-51-1-x86_64.eopkg\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"2",children:["\n",(0,n.jsx)(s.li,{children:"(Re)start PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl restart postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"3",children:["\n",(0,n.jsx)(s.li,{children:"Create a backup of all current data:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres pg_dumpall -f /tmp/backup.sql\n"})}),"\n",(0,n.jsxs)(s.p,{children:["The location of the backup may be one of your choosing, but keep in mind that the ",(0,n.jsx)(s.code,{children:"postgres"})," user needs to have write permissions on the given location."]}),"\n",(0,n.jsxs)(s.ol,{start:"4",children:["\n",(0,n.jsx)(s.li,{children:"Stop PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl stop postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"5",children:["\n",(0,n.jsx)(s.li,{children:"Rename the old data directory. This directory contains the old configuration and the original database, but requires significant disk space."}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo mv /var/db/pgsql/data /var/db/pgsql/data.old\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"6",children:["\n",(0,n.jsx)(s.li,{children:"Create a new data directory:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo mkdir /var/db/pgsql/data\nsudo chown postgres: /var/db/pgsql/data\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"7",children:["\n",(0,n.jsx)(s.li,{children:"Upgrade PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"8",children:["\n",(0,n.jsx)(s.li,{children:"Start PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl start postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"9",children:["\n",(0,n.jsx)(s.li,{children:"Restore the data:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql < /tmp/backup.sql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"10",children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["(optional) Update the configuration files in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data"})," based on the configuration in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data.old"}),". Restart PostgreSQL afterwards."]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Verify that the migration was successful and your data is there."}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Remove the backup and data dump:"}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo rm -r /var/db/pgsql/data.old /tmp/backup.sql\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>o});var n=t(67294);const r={},a=n.createContext(r);function o(e){const s=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f8dd8223.50c5bc73.js b/assets/js/f8dd8223.50c5bc73.js new file mode 100644 index 000000000..1bfd15649 --- /dev/null +++ b/assets/js/f8dd8223.50c5bc73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["5466"],{2964:function(e,s,t){t.r(s),t.d(s,{metadata:()=>n,contentTitle:()=>l,default:()=>h,assets:()=>d,toc:()=>i,frontMatter:()=>o});var n=JSON.parse('{"id":"user/software/development/postgresql","title":"PostgreSQL","description":"PostgreSQL is an open source object-relational database system. The postgresql package in Solus includes the PostgreSQL library, client and server.","source":"@site/docs/user/software/development/postgresql.md","sourceDirName":"user/software/development","slug":"/user/software/development/postgresql","permalink":"/docs/user/software/development/postgresql","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/postgresql.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"PostgreSQL","summary":"A quick guide to using Postgres on Solus"},"sidebar":"userSidebar","previous":{"title":"Java","permalink":"/docs/user/software/development/java"},"next":{"title":"R and RStudio","permalink":"/docs/user/software/development/r-and-rstudio"}}'),r=t("85893"),a=t("50065");let o={title:"PostgreSQL",summary:"A quick guide to using Postgres on Solus"},l="PostgreSQL server",d={},i=[{value:"Usage",id:"usage",level:2},{value:"Updating to 17",id:"updating-to-17",level:2}];function c(e){let s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"postgresql-server",children:"PostgreSQL server"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"})," is an open source object-relational database system. The ",(0,r.jsx)(s.code,{children:"postgresql"})," package in Solus includes the PostgreSQL library, client and server."]}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(s.p,{children:"PostgreSQL can be installed either from the Software Center or via terminal:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg install postgresql\n"})}),"\n",(0,r.jsx)(s.p,{children:"Management of the server can be done using Systemd:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable postgresql # Start the server on boot\nsudo systemctl start postgresql # Start the server now\nsudo systemctl stop postgresql # Stop the server\n"})}),"\n",(0,r.jsx)(s.p,{children:"It is possible to connect to the database using the PostgreSQL user:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Note that all local connections are trusted and can access all databases by default. This can be changed in ",(0,r.jsx)(s.code,{children:"/var/db/pgsql/data/pg_hba.conf"}),", see the ",(0,r.jsx)(s.a,{href:"https://www.postgresql.org/docs/current/auth-pg-hba-conf.html",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,r.jsx)(s.h2,{id:"updating-to-17",children:"Updating to 17"}),"\n",(0,r.jsxs)(s.p,{children:["Because PostgreSQL is included as a single package, the only way to perform a major upgrade of PostgreSQL is via a backup/restore. The procedure below describes the upgrade process as it applies to Solus. See the ",(0,r.jsx)(s.a,{href:"https://www.postgresql.org/docs/17/upgrading.html#UPGRADING-VIA-PGDUMPALL",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsx)(s.li,{children:"If you have already updated PostgreSQL, downgrade PostgreSQL back to 16.4:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-16.4-51-1-x86_64.eopkg \\\n https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-libpq-16.4-51-1-x86_64.eopkg\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"2",children:["\n",(0,r.jsx)(s.li,{children:"(Re)start PostgreSQL:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl restart postgresql\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"3",children:["\n",(0,r.jsx)(s.li,{children:"Create a backup of all current data:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres pg_dumpall -f /tmp/backup.sql\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The location of the backup may be one of your choosing, but keep in mind that the ",(0,r.jsx)(s.code,{children:"postgres"})," user needs to have write permissions on the given location."]}),"\n",(0,r.jsxs)(s.ol,{start:"4",children:["\n",(0,r.jsx)(s.li,{children:"Stop PostgreSQL:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl stop postgresql\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"5",children:["\n",(0,r.jsx)(s.li,{children:"Rename the old data directory. This directory contains the old configuration and the original database, but requires significant disk space."}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo mv /var/db/pgsql/data /var/db/pgsql/data.old\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"6",children:["\n",(0,r.jsx)(s.li,{children:"Create a new data directory:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo mkdir /var/db/pgsql/data\nsudo chown postgres: /var/db/pgsql/data\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"7",children:["\n",(0,r.jsx)(s.li,{children:"Upgrade PostgreSQL:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"8",children:["\n",(0,r.jsx)(s.li,{children:"Start PostgreSQL:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl start postgresql\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"9",children:["\n",(0,r.jsx)(s.li,{children:"Restore the data:"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql < /tmp/backup.sql\n"})}),"\n",(0,r.jsxs)(s.ol,{start:"10",children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:["(optional) Update the configuration files in ",(0,r.jsx)(s.code,{children:"/var/db/pgsql/data"})," based on the configuration in ",(0,r.jsx)(s.code,{children:"/var/db/pgsql/data.old"}),". Restart PostgreSQL afterwards."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.p,{children:"Verify that the migration was successful and your data is there."}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsx)(s.p,{children:"Remove the backup and data dump:"}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo rm -r /var/db/pgsql/data.old /tmp/backup.sql\n"})})]})}function h(e={}){let{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},50065:function(e,s,t){t.d(s,{Z:function(){return l},a:function(){return o}});var n=t(67294);let r={},a=n.createContext(r);function o(e){let s=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb6dc457.58cf99c8.js b/assets/js/fb6dc457.58cf99c8.js deleted file mode 100644 index 36d1a1150..000000000 --- a/assets/js/fb6dc457.58cf99c8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5482],{77123:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>r});var t=i(85893),o=i(11151);const s={title:"Configuration",summary:"Help for configuring GNOME Shell on Solus"},a="Configuration",d={id:"user/editions/gnome/configuration",title:"Configuration",description:"System",source:"@site/docs/user/editions/gnome/configuration.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/configuration",permalink:"/docs/user/editions/gnome/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/configuration.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"Configuration",summary:"Help for configuring GNOME Shell on Solus"},sidebar:"userSidebar",previous:{title:"GNOME",permalink:"/docs/user/editions/gnome/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"}},c={},r=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(n.h2,{id:"system",children:"System"}),"\n",(0,t.jsx)(n.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(n.p,{children:["To change the date and time settings in GNOME, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Date & Time".']}),"\n",(0,t.jsx)(n.p,{children:'You will be presented with the following window. This window provides you with the ability to enable / disable automatic date & time, automatic time zone changing, and the time format. You will need to click on "Unlock" and input your user password before changes can be made.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Date and Time",src:i(56935).Z+"",width:"742",height:"384"})}),"\n",(0,t.jsx)(n.p,{children:'If you wish to change how the time is displayed in the top panel, go back to the Applications Overlay and then find and click on "Tweak Tool". You can now show the date and / or seconds by opening the Top Bar section.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Tweak Tool: Top Bar",src:i(94202).Z+"",width:"906",height:"656"})}),"\n",(0,t.jsx)(n.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, you will need to open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Details".']}),"\n",(0,t.jsx)(n.p,{children:'Upon entering the Details section, click on "Default Applications" and then use the drop down boxes to select a different default application for each category. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from GNOME MPV to VLC then you must first install VLC (available in the Software Center).'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Default Applications",src:i(53885).Z+"",width:"742",height:"517"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Note: In the image above, we've changed the Web browser and Photo viewer."})}),"\n",(0,t.jsx)(n.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open With Other Application".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Context Menu ",src:i(72964).Z+"",width:"324",height:"417"})}),"\n",(0,t.jsx)(n.p,{children:'Next, select the application you wish to use from the list. You may need to click "View All Applications" if you can\'t see the one you would like to use. Finish by clicking "Select". In the future, all files with the same file type will open with the same application.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Application Selection",src:i(72191).Z+"",width:"426",height:"405"})}),"\n",(0,t.jsx)(n.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(n.p,{children:'In GNOME, You can configure your display(s) simply by right clicking anywhere on the desktop and clicking "Display Settings".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Desktop Context Menu",src:i(51729).Z+"",width:"210",height:"152"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Displays".']}),"\n",(0,t.jsx)(n.p,{children:"You will then be shown the following window."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Displays Overview",src:i(20241).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsx)(n.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Individual Display Settings",src:i(94287).Z+"",width:"741",height:"365"})}),"\n",(0,t.jsx)(n.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Arrange Displays",src:i(59556).Z+"",width:"742",height:"381"})}),"\n",(0,t.jsx)(n.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep Changes" within 20 seconds.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Confirm Display Settings",src:i(24798).Z+"",width:"502",height:"142"})}),"\n",(0,t.jsx)(n.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,t.jsx)(n.p,{children:"You will now be shown the following dialog."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Region and Languages",src:i(92266).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsxs)(n.p,{children:["Click the ",(0,t.jsx)(n.code,{children:"+"})," button to add an input source (keyboard layout). You will be shown the following dialog."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add Input Source",src:i(88175).Z+"",width:"742",height:"410"})}),"\n",(0,t.jsxs)(n.p,{children:["Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the ",(0,t.jsx)(n.code,{children:"\u22ee"})," button (three vertical dots). This will enable you to search for the keyboard layout you wish to use."]}),"\n",(0,t.jsx)(n.p,{children:'After choosing the keyboard layout, click "Done". You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US), Finnish, and Swedish layout.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME New Input Source Added",src:i(39324).Z+"",width:"742",height:"363"})}),"\n",(0,t.jsxs)(n.p,{children:["You can remove a keyboard layout by clicking on one of the items, for instance Swedish, then clicking the ",(0,t.jsx)(n.code,{children:"-"})," button."]}),"\n",(0,t.jsxs)(n.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,t.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Keyboard Indicator",src:i(12837).Z+"",width:"206",height:"168"})}),"\n",(0,t.jsx)(n.h3,{id:"ibus",children:"IBus"}),"\n",(0,t.jsxs)(n.p,{children:["For ease of use, GNOME has IBus up and running by default. If you need an additional IBus IME see: ",(0,t.jsx)(n.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,t.jsxs)(n.p,{children:["You can now switch between your layouts by using the keyboard shortcut ",(0,t.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray."]}),"\n",(0,t.jsx)(n.h2,{id:"language",children:"Language"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,t.jsx)(n.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Region and Languages",src:i(92266).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsx)(n.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Selecting Language",src:i(45905).Z+"",width:"742",height:"489"})}),"\n",(0,t.jsx)(n.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Language Search",src:i(5623).Z+"",width:"742",height:"489"})}),"\n",(0,t.jsxs)(n.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,t.jsx)(n.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,t.jsx)(n.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Mouse and Touchpad". You will see either settings for your mouse or trackpad, depending on the device.']}),"\n",(0,t.jsx)(n.h3,{id:"mouse",children:"Mouse"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Mouse Settings",src:i(19580).Z+"",width:"742",height:"585"})}),"\n",(0,t.jsx)(n.p,{children:"For mice, you can set:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,t.jsx)(n.li,{children:"Mouse speed."}),"\n",(0,t.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Touchpad Settings",src:i(62903).Z+"",width:"742",height:"585"})}),"\n",(0,t.jsx)(n.p,{children:"For touchpads, you can set:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,t.jsx)(n.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,t.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,t.jsx)(n.li,{children:"Touchpad speed."}),"\n",(0,t.jsx)(n.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"testing",children:"Testing"}),"\n",(0,t.jsx)(n.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,t.jsx)(n.h2,{id:"networking",children:"Networking"}),"\n",(0,t.jsx)(n.p,{children:'Easily change network settings with GNOME by left or right clicking on the system tray in the top panel and then clicking on "WiFi Not Connected".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Indicator",src:i(41694).Z+"",width:"331",height:"500"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Network".']}),"\n",(0,t.jsx)(n.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,t.jsx)(n.p,{children:'Once you have opened the "WiFi Not Connected" menu, click on "Select Network". Click on the network you wish to join and then on "Connect".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Selection",src:i(19750).Z+"",width:"500",height:"479"})}),"\n",(0,t.jsx)(n.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Authentication",src:i(49755).Z+"",width:"550",height:"244"})}),"\n",(0,t.jsx)(n.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,t.jsx)(n.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,t.jsx)(n.p,{children:'To join a hidden network, open the "WiFi Not Connected" menu and click on "WiFi Settings".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Overview",src:i(13917).Z+"",width:"742",height:"491"})}),"\n",(0,t.jsx)(n.p,{children:"Next, click on \u201cConnect to Hidden Network...\u201d. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Hidden Network",src:i(36258).Z+"",width:"741",height:"490"})}),"\n",(0,t.jsx)(n.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,t.jsx)(n.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(n.p,{children:"With GNOME, the volume can be changed by left or right clicking the system tray in the top panel and then simply dragging the volume slider with your mouse."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Volume Control",src:i(44483).Z+"",width:"300",height:"370"})}),"\n",(0,t.jsx)(n.h3,{id:"settings",children:"Settings"}),"\n",(0,t.jsxs)(n.p,{children:["You can access sound settings, including individual application volume controls, and a simple speaker test by opening the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Sound".']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Sound Settings",src:i(31401).Z+"",width:"742",height:"495"})}),"\n",(0,t.jsx)(n.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(n.p,{children:'To add and remove users with GNOME, you can click on the icons in the far right of the top panel. Click on your name and then on "Account Setting".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User Indicator",src:i(27121).Z+"",width:"283",height:"323"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Users".']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User Settings",src:i(51215).Z+"",width:"742",height:"453"})}),"\n",(0,t.jsx)(n.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,t.jsx)(n.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,t.jsx)(n.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,t.jsx)(n.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add User Button",src:i(53854).Z+"",width:"225",height:"65"})}),"\n",(0,t.jsx)(n.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add User Dialog",src:i(72158).Z+"",width:"466",height:"546"})}),"\n",(0,t.jsx)(n.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,t.jsx)(n.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,t.jsx)(n.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User List",src:i(81379).Z+"",width:"742",height:"592"})}),"\n",(0,t.jsx)(n.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Keep Files Prompt",src:i(41361).Z+"",width:"508",height:"162"})}),"\n",(0,t.jsx)(n.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(n.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,t.jsx)(n.p,{children:'The GNOME desktop background can be changed by simply right clicking anywhere on the desktop and selecting "Change background".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Background Right Click Menu",src:i(36198).Z+"",width:"212",height:"150"})}),"\n",(0,t.jsx)(n.p,{children:'Alternatively, you can open the Applications Overlay by clicking the applications icon in the dock and then finding and clicking on "Background".'}),"\n",(0,t.jsx)(n.p,{children:'You will have two options, Background and Lock Screen. Click "Background".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Settings Background Section",src:i(77101).Z+"",width:"742",height:"515"})}),"\n",(0,t.jsx)(n.p,{children:'In this section, you can choose between Solus wallpapers, pictures in your Pictures folder, or solid colors. After choosing, click "Select".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Background Selection",src:i(71955).Z+"",width:"830",height:"468"})}),"\n",(0,t.jsx)(n.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,t.jsxs)(n.p,{children:["In GNOME, you can enable desktop items by opening the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the Applications icon in the dock and then search for and open "Tweak Tool". You can then toggle them on and off by clicking "Icons on Desktop" under the Desktop section.']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Tweak Tool",src:i(8338).Z+"",width:"904",height:"654"})}),"\n",(0,t.jsx)(n.p,{children:'You may now add things to your Desktop. This can be done by dragging an item onto the Desktop or by right clicking an icon and selecting Copy to / Move to Desktop. Alternatively, click on the "Files" icon in the dock and then move the files you want to the Desktop folder (as shown in the image below). Please note, the Desktop folder is not visible in "Files" until you\'ve enabled the Desktop icons.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Desktop Folder",src:i(62778).Z+"",width:"884",height:"415"})}),"\n",(0,t.jsx)(n.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,t.jsx)(n.p,{children:"GNOME enables the switching of workspaces via the Workspace Switcher on the right side of the Activities Overview screen. Application windows can be dragged from the Activities Overview to a workspace, whether it is empty / new, or one that already has windows in it."}),"\n",(0,t.jsx)(n.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,t.jsx)(n.p,{children:"GNOME provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,t.jsx)(n.p,{children:"To view these shortcuts open the Keyboard application and scroll to the Navigation section."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Workspaces Keyboard Shortcuts",src:i(36663).Z+"",width:"740",height:"395"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},88175:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-add-input-source-d437c5e7831ecdb1e489aa21ac60d526.png"},53854:(e,n,i)=>{i.d(n,{Z:()=>t});const t="data:image/jpeg;base64,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"},72158:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},59556:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},36198:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-right-click-296958d96e0cd78b4bd122538368baf6.jpg"},77101:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-section-ca69ba209a6e21b75235377cfe37096a.jpg"},71955:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-selection-2b69c07e0327d086c99d3925edefd0de.jpg"},53885:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-configuring-default-applications-c38e8846a0f5406e2a929ceed630e0ac.jpg"},56935:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-date-and-time-aa3c32f3601912751b47792bed13d861.jpg"},24798:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-display-confirm-73e76e471778f250fce7a77b06ebf4cc.jpg"},51729:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-display-right-click-0e3734d006161e208d66f1dbbfd5b284.jpg"},20241:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},94287:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},41361:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},19580:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},81379:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},62778:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-nautilus-desktop-folder-d8e82c2d25e2d637fc2f63e85241c255.jpg"},49755:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-authentication-306d93017ccbe74f3760db30ad3be13c.jpg"},36258:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},13917:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},19750:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-select-b153e6a0d6a6394708fd70d376d84dc9.jpg"},72964:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-open-with-right-click-f8c5019ecbc6f6cb589c6117c20c85b4.jpg"},72191:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-open-with-select-application-7c831e8489c82c5ac4df9f3bd5a85644.jpg"},39324:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-region-and-languages-newlang-4bb2078c2e13e3b57093c6b6c8b68695.jpg"},92266:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},5623:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},45905:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},51215:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},31401:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-sound-settings-83f0c82715b44956569594953085dad1.jpg"},12837:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-keyboard-layout-c727398da89fe9a7bbae669ab07699d7.jpg"},41694:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-network-click-23903f435151287556210b48a2731783.jpg"},27121:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-right-click-10a13ee21a2ed1ad21315bfdd76e4041.jpg"},62903:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},8338:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-tweak-tool-desktop-46f30603727af27af46f394d0df8f07e.jpg"},94202:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-tweak-tool-top-bar-212f1978bc9194fbe0d5a1f49da0ef38.jpg"},44483:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-volume-control-fc9ad5c29a7859a4532adde7ed56df46.jpg"},36663:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/workspace-shortcuts-gcc-f4f5e863caf0c2532f4d3cbc633b5f8a.jpg"},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>a});var t=i(67294);const o={},s=t.createContext(o);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb6dc457.e87ac9bb.js b/assets/js/fb6dc457.e87ac9bb.js new file mode 100644 index 000000000..98add234e --- /dev/null +++ b/assets/js/fb6dc457.e87ac9bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7127"],{65631:function(e,n,t){t.r(n),t.d(n,{metadata:()=>i,contentTitle:()=>r,default:()=>h,assets:()=>c,toc:()=>l,frontMatter:()=>a});var i=JSON.parse('{"id":"user/editions/gnome/configuration","title":"Configuration","description":"System","source":"@site/docs/user/editions/gnome/configuration.md","sourceDirName":"user/editions/gnome","slug":"/user/editions/gnome/configuration","permalink":"/docs/user/editions/gnome/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/configuration.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"Configuration","summary":"Help for configuring GNOME Shell on Solus"},"sidebar":"userSidebar","previous":{"title":"GNOME","permalink":"/docs/user/editions/gnome/"},"next":{"title":"Tips and Tricks","permalink":"/docs/user/editions/gnome/tips-and-tricks"}}'),o=t("85893"),s=t("50065");let a={title:"Configuration",summary:"Help for configuring GNOME Shell on Solus"},r="Configuration",c={},l=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3}];function d(e){let n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(n.h2,{id:"system",children:"System"}),"\n",(0,o.jsx)(n.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,o.jsxs)(n.p,{children:["To change the date and time settings in GNOME, you can open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Date & Time".']}),"\n",(0,o.jsx)(n.p,{children:'You will be presented with the following window. This window provides you with the ability to enable / disable automatic date & time, automatic time zone changing, and the time format. You will need to click on "Unlock" and input your user password before changes can be made.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Date and Time",src:t(46441).Z+"",width:"742",height:"384"})}),"\n",(0,o.jsx)(n.p,{children:'If you wish to change how the time is displayed in the top panel, go back to the Applications Overlay and then find and click on "Tweak Tool". You can now show the date and / or seconds by opening the Top Bar section.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Tweak Tool: Top Bar",src:t(79797).Z+"",width:"906",height:"656"})}),"\n",(0,o.jsx)(n.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,o.jsxs)(n.p,{children:["With GNOME, you will need to open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Details".']}),"\n",(0,o.jsx)(n.p,{children:'Upon entering the Details section, click on "Default Applications" and then use the drop down boxes to select a different default application for each category. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from GNOME MPV to VLC then you must first install VLC (available in the Software Center).'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Default Applications",src:t(89711).Z+"",width:"742",height:"517"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.em,{children:"Note: In the image above, we've changed the Web browser and Photo viewer."})}),"\n",(0,o.jsx)(n.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open With Other Application".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Context Menu ",src:t(16406).Z+"",width:"324",height:"417"})}),"\n",(0,o.jsx)(n.p,{children:'Next, select the application you wish to use from the list. You may need to click "View All Applications" if you can\'t see the one you would like to use. Finish by clicking "Select". In the future, all files with the same file type will open with the same application.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Application Selection",src:t(45332).Z+"",width:"426",height:"405"})}),"\n",(0,o.jsx)(n.h2,{id:"displays",children:"Displays"}),"\n",(0,o.jsx)(n.p,{children:'In GNOME, You can configure your display(s) simply by right clicking anywhere on the desktop and clicking "Display Settings".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Desktop Context Menu",src:t(47859).Z+"",width:"210",height:"152"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Displays".']}),"\n",(0,o.jsx)(n.p,{children:"You will then be shown the following window."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Displays Overview",src:t(98609).Z+"",width:"742",height:"345"})}),"\n",(0,o.jsx)(n.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Individual Display Settings",src:t(72880).Z+"",width:"741",height:"365"})}),"\n",(0,o.jsx)(n.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201CArrange Combined Displays\u201D button and then drag your displays so they are arranged to your liking."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Arrange Displays",src:t(37866).Z+"",width:"742",height:"381"})}),"\n",(0,o.jsx)(n.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep Changes" within 20 seconds.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Confirm Display Settings",src:t(50497).Z+"",width:"502",height:"142"})}),"\n",(0,o.jsx)(n.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,o.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,o.jsx)(n.p,{children:"You will now be shown the following dialog."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Region and Languages",src:t(23037).Z+"",width:"742",height:"345"})}),"\n",(0,o.jsxs)(n.p,{children:["Click the ",(0,o.jsx)(n.code,{children:"+"})," button to add an input source (keyboard layout). You will be shown the following dialog."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Add Input Source",src:t(2233).Z+"",width:"742",height:"410"})}),"\n",(0,o.jsxs)(n.p,{children:["Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the ",(0,o.jsx)(n.code,{children:"\u22EE"})," button (three vertical dots). This will enable you to search for the keyboard layout you wish to use."]}),"\n",(0,o.jsx)(n.p,{children:'After choosing the keyboard layout, click "Done". You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US), Finnish, and Swedish layout.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME New Input Source Added",src:t(63310).Z+"",width:"742",height:"363"})}),"\n",(0,o.jsxs)(n.p,{children:["You can remove a keyboard layout by clicking on one of the items, for instance Swedish, then clicking the ",(0,o.jsx)(n.code,{children:"-"})," button."]}),"\n",(0,o.jsxs)(n.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,o.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Keyboard Indicator",src:t(45186).Z+"",width:"206",height:"168"})}),"\n",(0,o.jsx)(n.h3,{id:"ibus",children:"IBus"}),"\n",(0,o.jsxs)(n.p,{children:["For ease of use, GNOME has IBus up and running by default. If you need an additional IBus IME see: ",(0,o.jsx)(n.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,o.jsxs)(n.p,{children:["You can now switch between your layouts by using the keyboard shortcut ",(0,o.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray."]}),"\n",(0,o.jsx)(n.h2,{id:"language",children:"Language"}),"\n",(0,o.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,o.jsx)(n.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Region and Languages",src:t(23037).Z+"",width:"742",height:"345"})}),"\n",(0,o.jsx)(n.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Selecting Language",src:t(17578).Z+"",width:"742",height:"489"})}),"\n",(0,o.jsx)(n.p,{children:"If your language does not appear in the list, click the \u22EE button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Language Search",src:t(17222).Z+"",width:"742",height:"489"})}),"\n",(0,o.jsxs)(n.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,o.jsx)(n.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,o.jsx)(n.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,o.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Mouse and Touchpad". You will see either settings for your mouse or trackpad, depending on the device.']}),"\n",(0,o.jsx)(n.h3,{id:"mouse",children:"Mouse"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Mouse Settings",src:t(16802).Z+"",width:"742",height:"585"})}),"\n",(0,o.jsx)(n.p,{children:"For mice, you can set:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,o.jsx)(n.li,{children:"Mouse speed."}),"\n",(0,o.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Touchpad Settings",src:t(48076).Z+"",width:"742",height:"585"})}),"\n",(0,o.jsx)(n.p,{children:"For touchpads, you can set:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,o.jsx)(n.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,o.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,o.jsx)(n.li,{children:"Touchpad speed."}),"\n",(0,o.jsx)(n.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"testing",children:"Testing"}),"\n",(0,o.jsx)(n.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,o.jsx)(n.h2,{id:"networking",children:"Networking"}),"\n",(0,o.jsx)(n.p,{children:'Easily change network settings with GNOME by left or right clicking on the system tray in the top panel and then clicking on "WiFi Not Connected".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Network Indicator",src:t(20047).Z+"",width:"331",height:"500"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Network".']}),"\n",(0,o.jsx)(n.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,o.jsx)(n.p,{children:'Once you have opened the "WiFi Not Connected" menu, click on "Select Network". Click on the network you wish to join and then on "Connect".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Network Selection",src:t(90827).Z+"",width:"500",height:"479"})}),"\n",(0,o.jsx)(n.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Network Authentication",src:t(39639).Z+"",width:"550",height:"244"})}),"\n",(0,o.jsx)(n.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,o.jsx)(n.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,o.jsx)(n.p,{children:'To join a hidden network, open the "WiFi Not Connected" menu and click on "WiFi Settings".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Network Overview",src:t(15866).Z+"",width:"742",height:"491"})}),"\n",(0,o.jsx)(n.p,{children:"Next, click on \u201CConnect to Hidden Network...\u201D. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Hidden Network",src:t(75421).Z+"",width:"741",height:"490"})}),"\n",(0,o.jsx)(n.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,o.jsx)(n.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,o.jsx)(n.p,{children:"With GNOME, the volume can be changed by left or right clicking the system tray in the top panel and then simply dragging the volume slider with your mouse."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Volume Control",src:t(75535).Z+"",width:"300",height:"370"})}),"\n",(0,o.jsx)(n.h3,{id:"settings",children:"Settings"}),"\n",(0,o.jsxs)(n.p,{children:["You can access sound settings, including individual application volume controls, and a simple speaker test by opening the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Sound".']}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Sound Settings",src:t(71917).Z+"",width:"742",height:"495"})}),"\n",(0,o.jsx)(n.h2,{id:"users",children:"Users"}),"\n",(0,o.jsx)(n.p,{children:'To add and remove users with GNOME, you can click on the icons in the far right of the top panel. Click on your name and then on "Account Setting".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME User Indicator",src:t(15025).Z+"",width:"283",height:"323"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Users".']}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME User Settings",src:t(70089).Z+"",width:"742",height:"453"})}),"\n",(0,o.jsx)(n.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,o.jsx)(n.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,o.jsx)(n.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,o.jsx)(n.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Add User Button",src:t(1661).Z+"",width:"225",height:"65"})}),"\n",(0,o.jsx)(n.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Add User Dialog",src:t(12442).Z+"",width:"466",height:"546"})}),"\n",(0,o.jsx)(n.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,o.jsx)(n.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,o.jsx)(n.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME User List",src:t(51048).Z+"",width:"742",height:"592"})}),"\n",(0,o.jsx)(n.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Keep Files Prompt",src:t(78562).Z+"",width:"508",height:"162"})}),"\n",(0,o.jsx)(n.h2,{id:"user-interface",children:"User interface"}),"\n",(0,o.jsx)(n.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,o.jsx)(n.p,{children:'The GNOME desktop background can be changed by simply right clicking anywhere on the desktop and selecting "Change background".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Background Right Click Menu",src:t(55164).Z+"",width:"212",height:"150"})}),"\n",(0,o.jsx)(n.p,{children:'Alternatively, you can open the Applications Overlay by clicking the applications icon in the dock and then finding and clicking on "Background".'}),"\n",(0,o.jsx)(n.p,{children:'You will have two options, Background and Lock Screen. Click "Background".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Settings Background Section",src:t(84645).Z+"",width:"742",height:"515"})}),"\n",(0,o.jsx)(n.p,{children:'In this section, you can choose between Solus wallpapers, pictures in your Pictures folder, or solid colors. After choosing, click "Select".'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Background Selection",src:t(22832).Z+"",width:"830",height:"468"})}),"\n",(0,o.jsx)(n.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,o.jsxs)(n.p,{children:["In GNOME, you can enable desktop items by opening the Overlay using the ",(0,o.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the Applications icon in the dock and then search for and open "Tweak Tool". You can then toggle them on and off by clicking "Icons on Desktop" under the Desktop section.']}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Tweak Tool",src:t(29542).Z+"",width:"904",height:"654"})}),"\n",(0,o.jsx)(n.p,{children:'You may now add things to your Desktop. This can be done by dragging an item onto the Desktop or by right clicking an icon and selecting Copy to / Move to Desktop. Alternatively, click on the "Files" icon in the dock and then move the files you want to the Desktop folder (as shown in the image below). Please note, the Desktop folder is not visible in "Files" until you\'ve enabled the Desktop icons.'}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Desktop Folder",src:t(80181).Z+"",width:"884",height:"415"})}),"\n",(0,o.jsx)(n.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,o.jsx)(n.p,{children:"GNOME enables the switching of workspaces via the Workspace Switcher on the right side of the Activities Overview screen. Application windows can be dragged from the Activities Overview to a workspace, whether it is empty / new, or one that already has windows in it."}),"\n",(0,o.jsx)(n.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,o.jsx)(n.p,{children:"GNOME provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,o.jsx)(n.p,{children:"To view these shortcuts open the Keyboard application and scroll to the Navigation section."}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"GNOME Workspaces Keyboard Shortcuts",src:t(36950).Z+"",width:"740",height:"395"})})]})}function h(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},2233:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-add-input-source-d437c5e7831ecdb1e489aa21ac60d526.png"},1661:function(e,n,t){t.d(n,{Z:function(){return i}});let i="data:image/jpeg;base64,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"},12442:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},37866:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},55164:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-background-right-click-296958d96e0cd78b4bd122538368baf6.jpg"},84645:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-background-section-ca69ba209a6e21b75235377cfe37096a.jpg"},22832:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-background-selection-2b69c07e0327d086c99d3925edefd0de.jpg"},89711:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-configuring-default-applications-c38e8846a0f5406e2a929ceed630e0ac.jpg"},46441:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-date-and-time-aa3c32f3601912751b47792bed13d861.jpg"},50497:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-display-confirm-73e76e471778f250fce7a77b06ebf4cc.jpg"},47859:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-display-right-click-0e3734d006161e208d66f1dbbfd5b284.jpg"},98609:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},72880:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},78562:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},16802:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},51048:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},80181:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-nautilus-desktop-folder-d8e82c2d25e2d637fc2f63e85241c255.jpg"},39639:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-network-authentication-306d93017ccbe74f3760db30ad3be13c.jpg"},75421:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},15866:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},90827:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-network-select-b153e6a0d6a6394708fd70d376d84dc9.jpg"},16406:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-open-with-right-click-f8c5019ecbc6f6cb589c6117c20c85b4.jpg"},45332:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-open-with-select-application-7c831e8489c82c5ac4df9f3bd5a85644.jpg"},63310:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-region-and-languages-newlang-4bb2078c2e13e3b57093c6b6c8b68695.jpg"},23037:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},17222:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},17578:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},70089:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},71917:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-sound-settings-83f0c82715b44956569594953085dad1.jpg"},45186:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-top-panel-keyboard-layout-c727398da89fe9a7bbae669ab07699d7.jpg"},20047:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-top-panel-network-click-23903f435151287556210b48a2731783.jpg"},15025:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-top-panel-right-click-10a13ee21a2ed1ad21315bfdd76e4041.jpg"},48076:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},29542:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-tweak-tool-desktop-46f30603727af27af46f394d0df8f07e.jpg"},79797:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-tweak-tool-top-bar-212f1978bc9194fbe0d5a1f49da0ef38.jpg"},75535:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/gnome-volume-control-fc9ad5c29a7859a4532adde7ed56df46.jpg"},36950:function(e,n,t){t.d(n,{Z:function(){return i}});let i=t.p+"assets/images/workspace-shortcuts-gcc-f4f5e863caf0c2532f4d3cbc633b5f8a.jpg"},50065:function(e,n,t){t.d(n,{Z:function(){return r},a:function(){return a}});var i=t(67294);let o={},s=i.createContext(o);function a(e){let n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb8d634e.09f44ff6.js b/assets/js/fb8d634e.09f44ff6.js new file mode 100644 index 000000000..3bab51e04 --- /dev/null +++ b/assets/js/fb8d634e.09f44ff6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["4983"],{21144:function(e,t,n){n.r(t),n.d(t,{metadata:()=>i,contentTitle:()=>l,default:()=>u,assets:()=>c,toc:()=>d,frontMatter:()=>r});var i=JSON.parse('{"id":"user/editions/gnome/index","title":"GNOME","description":"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:","source":"@site/docs/user/editions/gnome/index.md","sourceDirName":"user/editions/gnome","slug":"/user/editions/gnome/","permalink":"/docs/user/editions/gnome/","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/index.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"GNOME","summary":"A quick introduction to the GNOME Edition of Solus"},"sidebar":"userSidebar","previous":{"title":"Tips and Tricks","permalink":"/docs/user/editions/budgie/tips-and-tricks"},"next":{"title":"Configuration","permalink":"/docs/user/editions/gnome/configuration"}}'),o=n("85893"),s=n("50065");let r={title:"GNOME",summary:"A quick introduction to the GNOME Edition of Solus"},l="GNOME Shell",c={},d=[];function a(e){let t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"gnome-shell",children:"GNOME Shell"})}),"\n",(0,o.jsx)(t.p,{children:"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:"}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"Provides core interface functions like switching windows, launching applications or see your notifications. It takes advantage of the capabilities of modern graphics hardware and introduces innovative user interface concepts to provide a delightful and easy to use experience. GNOME Shell is the defining technology of the GNOME 3 user experience."}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://www.gnome.org/",children:"Homepage"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://thisweek.gnome.org/",children:"News"})}),"\n",(0,o.jsx)(t.li,{children:(0,o.jsx)(t.a,{href:"https://help.gnome.org/users/gnome-help/stable/",children:"Support"})}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.a,{href:"configuration",children:"Go to GNOME Configuration"})}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.a,{href:"tips-and-tricks",children:"Go to GNOME Tips and Tricks"})})]})}function u(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return l},a:function(){return r}});var i=n(67294);let o={},s=i.createContext(o);function r(e){let t=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb8d634e.bd00f4ee.js b/assets/js/fb8d634e.bd00f4ee.js deleted file mode 100644 index d85f9ce41..000000000 --- a/assets/js/fb8d634e.bd00f4ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[999],{86591:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var i=t(85893),o=t(11151);const s={title:"GNOME",summary:"A quick introduction to the GNOME Edition of Solus"},r="GNOME Shell",c={id:"user/editions/gnome/index",title:"GNOME",description:"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:",source:"@site/docs/user/editions/gnome/index.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/",permalink:"/docs/user/editions/gnome/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/index.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"GNOME",summary:"A quick introduction to the GNOME Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/gnome/configuration"}},d={},l=[];function a(e){const n={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gnome-shell",children:"GNOME Shell"})}),"\n",(0,i.jsx)(n.p,{children:"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Provides core interface functions like switching windows, launching applications or see your notifications. It takes advantage of the capabilities of modern graphics hardware and introduces innovative user interface concepts to provide a delightful and easy to use experience. GNOME Shell is the defining technology of the GNOME 3 user experience."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.gnome.org/",children:"Homepage"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://thisweek.gnome.org/",children:"News"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://help.gnome.org/users/gnome-help/stable/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"configuration",children:"Go to GNOME Configuration"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"tips-and-tricks",children:"Go to GNOME Tips and Tricks"})})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>r});var i=t(67294);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fc733b73.c3b7228b.js b/assets/js/fc733b73.c3b7228b.js new file mode 100644 index 000000000..6ef4dffdb --- /dev/null +++ b/assets/js/fc733b73.c3b7228b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["1848"],{75103:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,contentTitle:()=>l,default:()=>h,assets:()=>d,toc:()=>a,frontMatter:()=>r});var s=JSON.parse('{"id":"user/software/development/r-and-rstudio","title":"R and RStudio","description":"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries.","source":"@site/docs/user/software/development/r-and-rstudio.md","sourceDirName":"user/software/development","slug":"/user/software/development/r-and-rstudio","permalink":"/docs/user/software/development/r-and-rstudio","draft":false,"unlisted":false,"editUrl":"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/r-and-rstudio.md","tags":[],"version":"current","lastUpdatedAt":1733757592000,"frontMatter":{"title":"R and RStudio","summary":"Quick start guide for R and RStudio on Solus"},"sidebar":"userSidebar","previous":{"title":"PostgreSQL","permalink":"/docs/user/software/development/postgresql"},"next":{"title":"Rust","permalink":"/docs/user/software/development/rust"}}'),o=t("85893"),i=t("50065");let r={title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},l="R and RStudio",d={},a=[{value:"Downloading R",id:"downloading-r",level:2},{value:"Downloading RStudio",id:"downloading-rstudio",level:2},{value:"How to use install.packages()
on Solus",id:"how-to-use-installpackages-on-solus",level:3}];function c(e){let n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"r-and-rstudio",children:"R and RStudio"})}),"\n",(0,o.jsx)(n.p,{children:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries."}),"\n",(0,o.jsx)(n.h2,{id:"downloading-r",children:"Downloading R"}),"\n",(0,o.jsxs)(n.p,{children:["It is recommended to download R before downloading RStudio. This can be accomplished easily in any of three ways.\n",(0,o.jsx)(n.strong,{children:"NOTE:"})," Both R and RStudio are available natively on Solus thanks to their amazing maintainers, it is not necessary to go to either software's respective website."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['The easiest way to do this is to search for "R" within the ',(0,o.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,o.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,o.jsx)(n.strong,{children:"Software Center"}),", select ",(0,o.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,o.jsx)(n.strong,{children:"Programming"})," and scroll down until you see ",(0,o.jsx)(n.strong,{children:"r"}),". ",(0,o.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,o.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,o.jsx)(n.code,{children:"sudo eopkg it r"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"downloading-rstudio",children:"Downloading RStudio"}),"\n",(0,o.jsx)(n.p,{children:"The first step in setting up RStudio is to download and install it. This can be accomplished in the same ways as R in the prior step."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['The easiest way to do this is to search for "RStudio" within the ',(0,o.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,o.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,o.jsx)(n.strong,{children:"Software Center"}),", select ",(0,o.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,o.jsx)(n.strong,{children:"Integrated Development Environments"})," and scroll down until you see ",(0,o.jsx)(n.strong,{children:"RStudio"}),". ",(0,o.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,o.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,o.jsx)(n.code,{children:"sudo eopkg it rstudio"})]}),"\n"]}),"\n",(0,o.jsxs)(n.h3,{id:"how-to-use-installpackages-on-solus",children:["How to use ",(0,o.jsx)(n.code,{children:"install.packages()"})," on Solus"]}),"\n",(0,o.jsxs)(n.p,{children:["Unless you are only going to use base R functions, you will need to make use of ",(0,o.jsx)(n.code,{children:"install.packages()"})," within R to install additional libraries. To use this function you need to install certain development packages which vary depending on the library you are trying to enable within R."]}),"\n",(0,o.jsx)(n.p,{children:"On other Linux distros (like Debian, Ubuntu, and Fedora) this is accomplished through the installation of r-devel. However since Solus does not have an r-devel package these dependencies have to be installed through other means."}),"\n",(0,o.jsxs)(n.p,{children:["There are three main Solus packages that will include many of the dependencies required that allow you to install most CRAN packages. These are ",(0,o.jsx)(n.code,{children:"system.devel"}),", ",(0,o.jsx)(n.code,{children:"curl-devel"})," and ",(0,o.jsx)(n.code,{children:"fontconfig-devel"}),"."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"system.devel"})," is a component containing several packages and can ",(0,o.jsx)(n.strong,{children:"ONLY"})," be installed from within a terminal by running the command ",(0,o.jsx)(n.code,{children:"sudo eopkg it -c system.devel"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"curl-devel"})," and ",(0,o.jsx)(n.code,{children:"fontconfig-devel"})," can be found by searching in the ",(0,o.jsx)(n.strong,{children:"Software Center"})," or by running the command ",(0,o.jsx)(n.code,{children:"sudo eopkg it curl-devel fontconfig-devel"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Once these two Solus packages are installed ",(0,o.jsx)(n.code,{children:"install.packages()"})," will work as usual within R for most packages like ",(0,o.jsx)(n.code,{children:"tidyverse"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["If you try to install a CRAN library with ",(0,o.jsx)(n.code,{children:"install.packages()"})," from within R and you are presented with an error that says ",(0,o.jsx)(n.code,{children:"...exited with non zero exit status"})," this is most likely because one of the required dependencies, ",(0,o.jsx)(n.em,{children:"which will be listed within the R console detailing the error"}),", is contained within a Solus devel package you have not yet installed."]})]})}function h(e={}){let{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},50065:function(e,n,t){t.d(n,{Z:function(){return l},a:function(){return r}});var s=t(67294);let o={},i=s.createContext(o);function r(e){let n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fc733b73.f541a162.js b/assets/js/fc733b73.f541a162.js deleted file mode 100644 index 3ab1a8a48..000000000 --- a/assets/js/fc733b73.f541a162.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6042],{28537:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var s=t(85893),o=t(11151);const i={title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},r="R and RStudio",l={id:"user/software/development/r-and-rstudio",title:"R and RStudio",description:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries.",source:"@site/docs/user/software/development/r-and-rstudio.md",sourceDirName:"user/software/development",slug:"/user/software/development/r-and-rstudio",permalink:"/docs/user/software/development/r-and-rstudio",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/r-and-rstudio.md",tags:[],version:"current",lastUpdatedAt:1732716912e3,frontMatter:{title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},sidebar:"userSidebar",previous:{title:"PostgreSQL",permalink:"/docs/user/software/development/postgresql"},next:{title:"Rust",permalink:"/docs/user/software/development/rust"}},d={},a=[{value:"Downloading R",id:"downloading-r",level:2},{value:"Downloading RStudio",id:"downloading-rstudio",level:2},{value:"How to useinstall.packages()
on Solus",id:"how-to-use-installpackages-on-solus",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"r-and-rstudio",children:"R and RStudio"})}),"\n",(0,s.jsx)(n.p,{children:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries."}),"\n",(0,s.jsx)(n.h2,{id:"downloading-r",children:"Downloading R"}),"\n",(0,s.jsxs)(n.p,{children:["It is recommended to download R before downloading RStudio. This can be accomplished easily in any of three ways.\n",(0,s.jsx)(n.strong,{children:"NOTE:"})," Both R and RStudio are available natively on Solus thanks to their amazing maintainers, it is not necessary to go to either software's respective website."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "R" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Programming"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"r"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it r"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"downloading-rstudio",children:"Downloading RStudio"}),"\n",(0,s.jsx)(n.p,{children:"The first step in setting up RStudio is to download and install it. This can be accomplished in the same ways as R in the prior step."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "RStudio" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Integrated Development Environments"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"RStudio"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it rstudio"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"how-to-use-installpackages-on-solus",children:["How to use ",(0,s.jsx)(n.code,{children:"install.packages()"})," on Solus"]}),"\n",(0,s.jsxs)(n.p,{children:["Unless you are only going to use base R functions, you will need to make use of ",(0,s.jsx)(n.code,{children:"install.packages()"})," within R to install additional libraries. To use this function you need to install certain development packages which vary depending on the library you are trying to enable within R."]}),"\n",(0,s.jsx)(n.p,{children:"On other Linux distros (like Debian, Ubuntu, and Fedora) this is accomplished through the installation of r-devel. However since Solus does not have an r-devel package these dependencies have to be installed through other means."}),"\n",(0,s.jsxs)(n.p,{children:["There are three main Solus packages that will include many of the dependencies required that allow you to install most CRAN packages. These are ",(0,s.jsx)(n.code,{children:"system.devel"}),", ",(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"system.devel"})," is a component containing several packages and can ",(0,s.jsx)(n.strong,{children:"ONLY"})," be installed from within a terminal by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it -c system.devel"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"})," can be found by searching in the ",(0,s.jsx)(n.strong,{children:"Software Center"})," or by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it curl-devel fontconfig-devel"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Once these two Solus packages are installed ",(0,s.jsx)(n.code,{children:"install.packages()"})," will work as usual within R for most packages like ",(0,s.jsx)(n.code,{children:"tidyverse"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you try to install a CRAN library with ",(0,s.jsx)(n.code,{children:"install.packages()"})," from within R and you are presented with an error that says ",(0,s.jsx)(n.code,{children:"...exited with non zero exit status"})," this is most likely because one of the required dependencies, ",(0,s.jsx)(n.em,{children:"which will be listed within the R console detailing the error"}),", is contained within a Solus devel package you have not yet installed."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(67294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fe13418f.ea789d98.js b/assets/js/fe13418f.ea789d98.js deleted file mode 100644 index 950951398..000000000 --- a/assets/js/fe13418f.ea789d98.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1182],{43900:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>r});var a=n(85893),l=n(11151);const o={title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/blog/clean-clean-clean",source:"@site/devlog/2024-11-21-clean-cleanl-clean.md",title:"Clean, clean, clean!",description:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.",date:"2024-11-21T00:00:00.000Z",tags:[{inline:!0,label:"housekeeping",permalink:"/blog/tags/housekeeping"},{inline:!0,label:"cleanup",permalink:"/blog/tags/cleanup"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:5.585,hasTruncateMarker:!0,authors:[{name:"Muhammad Alfi Syahrin",title:"Solus Staff",page:{permalink:"/blog/authors/alfi"},socials:{github:"https://github.com/malfisya"},imageURL:"https://avatars.githubusercontent.com/u/101771435",key:"alfi"}],frontMatter:{title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"}},c={authorsImageUrls:[void 0]},r=[];function u(e){const t={p:"p",...(0,l.a)(),...e.components};return(0,a.jsx)(t.p,{children:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next."})}function p(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>s});var a=n(67294);const l={},o=a.createContext(l);function s(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fe13418f.ffa9f3e1.js b/assets/js/fe13418f.ffa9f3e1.js new file mode 100644 index 000000000..58b74be23 --- /dev/null +++ b/assets/js/fe13418f.ffa9f3e1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([["7993"],{37072:function(e,t,n){n.r(t),n.d(t,{assets:function(){return s},contentTitle:function(){return i},default:function(){return p},frontMatter:function(){return r},metadata:function(){return a},toc:function(){return u}});var a=n(71752),l=n(85893),o=n(50065);let r={title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},i=void 0,s={authorsImageUrls:[void 0]},u=[];function c(e){let t={p:"p",...(0,o.a)(),...e.components};return(0,l.jsx)(t.p,{children:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next."})}function p(e={}){let{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},50065:function(e,t,n){n.d(t,{Z:function(){return i},a:function(){return r}});var a=n(67294);let l={},o=a.createContext(l);function r(e){let t=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),a.createElement(o.Provider,{value:t},e.children)}},71752:function(e){e.exports=JSON.parse('{"permalink":"/blog/clean-clean-clean","source":"@site/devlog/2024-11-21-clean-cleanl-clean.md","title":"Clean, clean, clean!","description":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.","date":"2024-11-21T00:00:00.000Z","tags":[{"inline":true,"label":"housekeeping","permalink":"/blog/tags/housekeeping"},{"inline":true,"label":"cleanup","permalink":"/blog/tags/cleanup"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":5.585,"hasTruncateMarker":true,"authors":[{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi"}],"frontMatter":{"title":"Clean, clean, clean!","slug":"clean-clean-clean","authors":"alfi","tags":["housekeeping","cleanup","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"}}')}}]); \ No newline at end of file diff --git a/assets/js/main.7c0d0999.js b/assets/js/main.7c0d0999.js deleted file mode 100644 index 3e11630aa..000000000 --- a/assets/js/main.7c0d0999.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.7c0d0999.js.LICENSE.txt */ -(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[179],{78179:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(67294);var r=n(68356),o=n.n(r),a=n(16887);const i={"0058b4c6":[()=>n.e(4088).then(n.t.bind(n,66462,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",66462],"01a85c17":[()=>Promise.all([n.e(3312),n.e(4013)]).then(n.bind(n,53282)),"@theme/BlogTagsListPage",53282],"04b18502":[()=>n.e(1942).then(n.bind(n,37123)),"@site/docs/packaging/index.md",37123],"05767842":[()=>n.e(1606).then(n.t.bind(n,77755,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-joey-023.json",77755],"06758c2b":[()=>n.e(1073).then(n.t.bind(n,81885,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-optimization-150.json",81885],"080a8349":[()=>n.e(224).then(n.bind(n,92857)),"@site/docs/packaging/monitoring.yml.md",92857],"08bef15d":[()=>n.e(7228).then(n.bind(n,40846)),"@site/docs/user/privacy.md",40846],"09dbd43b":[()=>n.e(9397).then(n.bind(n,78118)),"@site/docs/user/troubleshooting/boot-rescue.md",78118],"0b254e3a":[()=>n.e(6726).then(n.bind(n,99528)),"@site/docs/packaging/updating-an-existing-package.md",99528],"0b85ec06":[()=>n.e(3398).then(n.t.bind(n,22844,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-pgo-777.json",22844],"0cfc9369":[()=>n.e(6025).then(n.t.bind(n,82504,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-lto-304.json",82504],"0e3c5e6b":[()=>n.e(4859).then(n.bind(n,5166)),"@site/docs/user/editions/plasma/index.md",5166],"0e862883":[()=>n.e(172).then(n.bind(n,24673)),"@site/docs/user/contributing/testing-an-iso.md",24673],"14488e92":[()=>n.e(4815).then(n.bind(n,93980)),"@site/docs/user/quick-start/default-applications.md",93980],"14eb3368":[()=>Promise.all([n.e(3312),n.e(9817)]).then(n.bind(n,31745)),"@theme/DocCategoryGeneratedIndexPage",31745],"156eae2c":[()=>n.e(8692).then(n.t.bind(n,92354,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-networking-814.json",92354],17896441:[()=>Promise.all([n.e(3312),n.e(6937),n.e(7918)]).then(n.bind(n,11095)),"@theme/DocItem",11095],"1a698c37":[()=>Promise.all([n.e(3323),n.e(8917),n.e(6126)]).then(n.bind(n,99870)),"@site/docs/user/editions/index.mdx",99870],"1ae709a2":[()=>n.e(355).then(n.bind(n,49332)),"@site/docs/user/package-management/history-and-rollback.md",49332],"1b835d51":[()=>n.e(532).then(n.t.bind(n,769,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-3-b1c.json",769],"1df93b7f":[()=>Promise.all([n.e(3323),n.e(3237)]).then(n.bind(n,20780)),"@site/src/pages/index.tsx",20780],21944812:[()=>n.e(9873).then(n.bind(n,43042)),"@site/docs/user/software/desktops/index.md",43042],"257b9082":[()=>n.e(3192).then(n.bind(n,31874)),"@site/docs/user/software/development/containers.md",31874],"2598a3a5":[()=>n.e(5951).then(n.bind(n,70197)),"@site/docs/user/editions/mate/configuration.md",70197],"2609550e":[()=>n.e(3206).then(n.bind(n,23394)),"@site/docs/user/software/networking/samba.md",23394],"26308ea3":[()=>Promise.all([n.e(3312),n.e(6937),n.e(6485)]).then(n.bind(n,85612)),"@site/docs/packaging/submitting-a-pull-request.mdx",85612],"27d71881":[()=>n.e(7577).then(n.t.bind(n,19511,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-package-management-681.json",19511],"2a0f90eb":[()=>n.e(2817).then(n.t.bind(n,98247,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-solus-558.json",98247],"2a34ce22":[()=>n.e(6074).then(n.bind(n,21974)),"@site/docs/user/quick-start/installation/system-requirements.md",21974],"2a37c7d8":[()=>n.e(9995).then(n.bind(n,81754)),"@site/docs/user/editions/plasma/tips-and-tricks.md",81754],"2a9c4f4d":[()=>n.e(9474).then(n.t.bind(n,75994,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-clang-1c6.json",75994],"2b4abe09":[()=>n.e(2413).then(n.bind(n,45427)),"@site/docs/user/troubleshooting/index.md",45427],"2b61a93c":[()=>n.e(9897).then(n.bind(n,23065)),"@site/docs/user/editions/mate/index.md",23065],"2c3e84bd":[()=>n.e(8157).then(n.bind(n,12359)),"@site/docs/user/quick-start/installation/disks.md",12359],"334da572":[()=>n.e(5900).then(n.t.bind(n,70542,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-mobile-306.json",70542],"33f669c7":[()=>n.e(5854).then(n.t.bind(n,50536,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-software-1ab.json",50536],"33fc5bb8":[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(8355)]).then(n.bind(n,37678)),"@theme/Blog/Pages/BlogAuthorsPostsPage",37678],"36994c47":[()=>n.e(9208).then(n.t.bind(n,94468,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",94468],"38920c38":[()=>n.e(5481).then(n.bind(n,50)),"@site/docs/user/hardware/peripherals/printers-and-scanners.md",50],"3a2db09e":[()=>n.e(9361).then(n.t.bind(n,57588,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",57588],"3a93f7ba":[()=>n.e(7422).then(n.t.bind(n,76972,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hwcaps-8b3.json",76972],"3bd0a7e9":[()=>n.e(247).then(n.t.bind(n,60032,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-advanced-configuration-b1b.json",60032],"3fdfc7ff":[()=>n.e(4608).then(n.bind(n,57884)),"@site/docs/user/package-management/basics.md",57884],"3ff05326":[()=>n.e(2775).then(n.bind(n,17430)),"@site/docs/packaging/package.yml.md",17430],"418a6276":[()=>n.e(6160).then(n.bind(n,71697)),"@site/devlog/2024-01-19-eopkg-is-dead.md?truncated=true",71697],"41a4de91":[()=>n.e(7682).then(n.bind(n,31593)),"@site/docs/user/software/third-party/index.md",31593],"424f562c":[()=>n.e(3122).then(n.bind(n,15054)),"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md?truncated=true",15054],"439d6d8d":[()=>n.e(4374).then(n.t.bind(n,4915,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-mate-495.json",4915],"43d43a8f":[()=>n.e(9156).then(n.t.bind(n,5410,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-localization-3b5.json",5410],"45e9d313":[()=>n.e(6114).then(n.bind(n,47124)),"@site/docs/packaging/testing-a-package.md",47124],"46a65d96":[()=>n.e(8092).then(n.bind(n,82758)),"@site/docs/user/package-management/repo-management.md",82758],"47b97f63":[()=>n.e(834).then(n.t.bind(n,54517,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-compatibility-048.json",54517],"4802fa93":[()=>n.e(1774).then(n.bind(n,48815)),"@site/devlog/2024-01-29-dont-call-me-mate.md",48815],"49b71c16":[()=>n.e(3783).then(n.bind(n,99937)),"@site/docs/packaging/packaging-practices.md",99937],"4e87380c":[()=>n.e(2585).then(n.t.bind(n,68801,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gnu-f4d.json",68801],"513b6405":[()=>n.e(4278).then(n.bind(n,38033)),"@site/docs/packaging/prepare-for-packaging.md",38033],"528b6a6b":[()=>n.e(7822).then(n.bind(n,61661)),"@site/docs/user/software/utilities/ksysguard.md",61661],"533eefa9":[()=>n.e(4002).then(n.bind(n,99023)),"@site/docs/user/quick-start/installation/index.md",99023],"5685b4d8":[()=>n.e(1540).then(n.bind(n,17599)),"@site/docs/user/editions/xfce/configuration.md",17599],"5b7f3753":[()=>n.e(6413).then(n.bind(n,47512)),"@site/docs/packaging/git-basics.md",47512],"5e95c892":[()=>n.e(9661).then(n.bind(n,14399)),"@theme/DocsRoot",14399],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"5efe994e":[()=>n.e(1598).then(n.t.bind(n,83532,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-llvm-8d1.json",83532],"5f194406":[()=>n.e(7607).then(n.bind(n,77882)),"@site/docs/user/contributing/community-guidelines.md",77882],"6146d358":[()=>n.e(7798).then(n.t.bind(n,90800,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-contributing-e4f.json",90800],"61c953b4":[()=>n.e(8032).then(n.bind(n,18421)),"@site/docs/packaging/procedures/maintainership.md",18421],"621db11d":[()=>Promise.all([n.e(3312),n.e(5966),n.e(3940)]).then(n.bind(n,44995)),"@theme/Blog/Pages/BlogAuthorsListPage",44995],"62d70de2":[()=>n.e(818).then(n.t.bind(n,5230,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-virtualization-413.json",5230],"633d53d7":[()=>n.e(425).then(n.t.bind(n,30080,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-procedures-1dc.json",30080],64699048:[()=>n.e(2151).then(n.bind(n,87063)),"@site/docs/user/software/development/index.md",87063],"6787574e":[()=>n.e(4500).then(n.bind(n,26240)),"@site/docs/user/intro.md",26240],"6873f895":[()=>n.e(8849).then(n.bind(n,83781)),"@site/docs/user/contributing/style.md",83781],"6875c492":[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(8610)]).then(n.bind(n,23966)),"@theme/BlogTagsPostsPage",23966],"6cfe09a0":[()=>n.e(1174).then(n.bind(n,67189)),"@site/docs/user/software/networking/tigervnc.md",67189],"7071adf5":[()=>n.e(4796).then(n.bind(n,31386)),"@site/docs/packaging/troubleshooting-packaging.md",31386],"72054e31":[()=>n.e(7135).then(n.bind(n,83888)),"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",83888],"72f2f84e":[()=>n.e(794).then(n.t.bind(n,23343,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-utilities-bb8.json",23343],"74470af4":[()=>n.e(1896).then(n.bind(n,5893)),"@site/docs/user/software/virtualization/virtualbox.md",5893],"75c41d11":[()=>n.e(3337).then(n.bind(n,75584)),"@site/docs/user/editions/xfce/tips-and-tricks.md",75584],"793c86b2":[()=>n.e(168).then(n.bind(n,41426)),"@site/docs/user/software/command-line/index.md",41426],"7a24477a":[()=>n.e(9135).then(n.bind(n,44308)),"@site/docs/user/contributing/getting-involved.md",44308],"7b0bdf40":[()=>n.e(29).then(n.t.bind(n,56548,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-eopkg-20b.json",56548],"7c1fb106":[()=>n.e(4605).then(n.bind(n,66334)),"@site/docs/packaging/appstream-metainfo.md",66334],"7c2abd66":[()=>n.e(586).then(n.t.bind(n,19739,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-moss-7c4.json",19739],"7e4100d6":[()=>n.e(6990).then(n.bind(n,18193)),"@site/docs/user/software/networking/wireshark.md",18193],"814f3328":[()=>n.e(2535).then(n.t.bind(n,45641,19)),"~blog/default/blog-post-list-prop-default.json",45641],"8490a22d":[()=>n.e(8575).then(n.bind(n,5734)),"@site/docs/packaging/advanced-config/local-repository.md",5734],"88a83a8c":[()=>n.e(1242).then(n.bind(n,65574)),"@site/docs/user/software/utilities/kwallet.md",65574],"8d193990":[()=>n.e(1539).then(n.bind(n,5436)),"@site/devlog/2024-01-19-eopkg-is-dead.md",5436],"8e3d5b32":[()=>n.e(8499).then(n.bind(n,15838)),"@site/docs/user/software/localization/ibus.md",15838],"8e861970":[()=>n.e(8026).then(n.bind(n,95751)),"@site/docs/packaging/procedures/request-a-package.md",95751],"8e886580":[()=>n.e(4978).then(n.bind(n,71137)),"@site/docs/user/software/development/rust.md",71137],"920ec10a":[()=>n.e(4725).then(n.t.bind(n,63438,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-glibc-23b.json",63438],"9284d474":[()=>n.e(7626).then(n.bind(n,8110)),"@site/docs/user/software/gaming/index.md",8110],"947d9ca4":[()=>n.e(1944).then(n.bind(n,10025)),"@site/docs/user/software/development/web.md",10025],"9485dea6":[()=>n.e(2358).then(n.bind(n,29421)),"@site/docs/user/hardware/compatibility/wifi.md",29421],"96af6484":[()=>n.e(6225).then(n.bind(n,53058)),"@site/docs/user/hardware/peripherals/mice-and-touchpads.md",53058],"97c623e4":[()=>n.e(6427).then(n.bind(n,42268)),"@site/docs/packaging/procedures/request-a-package-update.md",42268],"99bedda9":[()=>n.e(8639).then(n.bind(n,48345)),"@site/docs/user/hardware/index.md",48345],"9b400668":[()=>n.e(7670).then(n.t.bind(n,20767,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-x-86-64-v-3-dc8.json",20767],"9e4087bc":[()=>n.e(3608).then(n.bind(n,8635)),"@theme/BlogArchivePage",8635],a05bfad9:[()=>n.e(885).then(n.bind(n,12620)),"@site/docs/user/editions/budgie/tips-and-tricks.md",12620],a398ef57:[()=>n.e(2586).then(n.bind(n,45523)),"@site/docs/user/hardware/mobile/apple.md",45523],a52026b8:[()=>n.e(7862).then(n.bind(n,19253)),"@site/devlog/2024-01-13-welcome-devlog.md?truncated=true",19253],a6aa9e1f:[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(3089)]).then(n.bind(n,33587)),"@theme/BlogListPage",33587],a6c0fb2f:[()=>n.e(6335).then(n.bind(n,54501)),"@site/devlog/2024-11-21-clean-cleanl-clean.md",54501],a7456010:[()=>n.e(5980).then(n.t.bind(n,79365,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",79365],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,89615)),"@theme/DocVersionRoot",89615],a94703ab:[()=>Promise.all([n.e(3312),n.e(4368)]).then(n.bind(n,59779)),"@theme/DocRoot",59779],a9e19215:[()=>n.e(333).then(n.bind(n,71371)),"@site/docs/user/software/networking/xrdp.md",71371],ab89b7a6:[()=>n.e(5575).then(n.bind(n,83016)),"@site/docs/user/editions/xfce/index.md",83016],aba21aa0:[()=>n.e(3629).then(n.t.bind(n,41765,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",41765],acecf23e:[()=>n.e(7393).then(n.t.bind(n,81838,19)),"~blog/default/blogMetadata-default.json",81838],ad205e99:[()=>n.e(1617).then(n.bind(n,38491)),"@site/docs/packaging/stack-rebuilds.md",38491],b4302412:[()=>n.e(2081).then(n.bind(n,55892)),"@site/docs/user/editions/gnome/tips-and-tricks.md",55892],b6ca4f35:[()=>n.e(9214).then(n.t.bind(n,27983,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-packaging-55a.json",27983],baa66232:[()=>n.e(984).then(n.bind(n,17789)),"@site/docs/user/software/camera/droidcam.md",17789],baf1b6e8:[()=>n.e(9677).then(n.bind(n,14864)),"@site/docs/user/software/development/java.md",14864],be4ac66b:[()=>n.e(4869).then(n.bind(n,87190)),"@site/docs/user/hardware/compatibility/laptops.md",87190],be79d003:[()=>n.e(6012).then(n.bind(n,62262)),"@site/docs/packaging/update-dev-environment.md",62262],c15d9823:[()=>n.e(6642).then(n.t.bind(n,92506,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",92506],c55c138b:[()=>n.e(7465).then(n.bind(n,76323)),"@site/docs/packaging/packaging-changes.md",76323],c5de29d4:[()=>n.e(3851).then(n.bind(n,44158)),"@site/docs/packaging/creating-a-new-package.md",44158],c99ea947:[()=>n.e(7018).then(n.t.bind(n,7768,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-camera-f25.json",7768],c9c1a3f4:[()=>n.e(6121).then(n.bind(n,24080)),"@site/docs/user/editions/budgie/configuration.md",24080],cca891e2:[()=>n.e(9773).then(n.bind(n,7857)),"@site/docs/packaging/procedures/package-inclusion.md",7857],ccc49370:[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(6103)]).then(n.bind(n,88987)),"@theme/BlogPostPage",88987],ce4855c1:[()=>n.e(3440).then(n.bind(n,66855)),"@site/docs/packaging/translation-instructions.md",66855],cec10a63:[()=>n.e(8422).then(n.bind(n,96928)),"@site/docs/user/editions/plasma/configuration.md",96928],d00f7e62:[()=>n.e(255).then(n.bind(n,67868)),"@site/docs/packaging/your-first-package-update.md",67868],d0d2faf6:[()=>n.e(4507).then(n.bind(n,79267)),"@site/docs/packaging/procedures/release-processes.md",79267],d20919b7:[()=>n.e(2627).then(n.t.bind(n,20570,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-cleanup-4e8.json",20570],d2363c7a:[()=>n.e(2741).then(n.t.bind(n,1629,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-alfi-751.json",1629],d4762887:[()=>n.e(3624).then(n.bind(n,1108)),"@site/docs/user/troubleshooting/installation.md",1108],d5670106:[()=>n.e(1950).then(n.bind(n,60908)),"@site/docs/user/troubleshooting/plasma.md",60908],d9c798e8:[()=>n.e(807).then(n.t.bind(n,37275,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-peripherals-173.json",37275],da0423b8:[()=>n.e(3090).then(n.t.bind(n,5930,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-housekeeping-67a.json",5930],da62f019:[()=>n.e(1821).then(n.t.bind(n,98171,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-quick-start-1ee.json",98171],dabd6b33:[()=>n.e(1059).then(n.bind(n,37101)),"@site/docs/packaging/advanced-config/eopkg-configuration.md",37101],ddc41e4a:[()=>n.e(9451).then(n.bind(n,3619)),"@site/docs/user/software/sound/index.md",3619],e083e94b:[()=>n.e(3056).then(n.bind(n,83514)),"@site/docs/user/software/third-party/snap.md",83514],e4134e95:[()=>n.e(8621).then(n.t.bind(n,80700,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-devlog-dac.json",80700],e5595530:[()=>n.e(1648).then(n.bind(n,4183)),"@site/docs/user/quick-start/boot-management.md",4183],ea6d9109:[()=>n.e(812).then(n.t.bind(n,88930,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-web-23c.json",88930],eb074ba1:[()=>n.e(3705).then(n.bind(n,45247)),"@site/docs/user/software/configuration_files.md",45247],ec4e4367:[()=>n.e(4529).then(n.bind(n,76130)),"@site/docs/user/hardware/mobile/android.md",76130],ecdeb26c:[()=>n.e(1971).then(n.bind(n,35247)),"@site/devlog/2024-01-29-dont-call-me-mate.md?truncated=true",35247],ed2a5927:[()=>n.e(4560).then(n.bind(n,18653)),"@site/docs/user/quick-start/software-center/index.md",18653],ef8b811a:[()=>n.e(2644).then(n.t.bind(n,89441,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",89441],f0629c21:[()=>n.e(3375).then(n.bind(n,53126)),"@site/docs/user/software/web/obs.md",53126],f1d13e1b:[()=>n.e(5462).then(n.bind(n,16467)),"@site/docs/user/editions/mate/tips-and-tricks.md",16467],f32bcb79:[()=>n.e(6515).then(n.t.bind(n,15631,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-firstpost-ddd.json",15631],f35b91b6:[()=>n.e(9749).then(n.bind(n,78677)),"@site/devlog/2024-01-13-welcome-devlog.md",78677],f3d58343:[()=>n.e(8812).then(n.t.bind(n,11741,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-david-9d9.json",11741],f4aa4739:[()=>n.e(9170).then(n.bind(n,75340)),"@site/docs/user/editions/budgie/index.md",75340],f4c9601b:[()=>n.e(2595).then(n.bind(n,39910)),"@site/docs/user/quick-start/installation/secure-boot.md",39910],f6faa2b4:[()=>n.e(8143).then(n.bind(n,40396)),"@site/docs/user/hardware/peripherals/midi-keyboard.md",40396],f81c1134:[()=>n.e(4031).then(n.t.bind(n,4108,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",4108],f82cd581:[()=>n.e(8626).then(n.t.bind(n,56664,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hello-f96.json",56664],f8dd8223:[()=>n.e(7212).then(n.bind(n,4606)),"@site/docs/user/software/development/postgresql.md",4606],fb6dc457:[()=>n.e(5482).then(n.bind(n,77123)),"@site/docs/user/editions/gnome/configuration.md",77123],fb8d634e:[()=>n.e(999).then(n.bind(n,86591)),"@site/docs/user/editions/gnome/index.md",86591],fc733b73:[()=>n.e(6042).then(n.bind(n,28537)),"@site/docs/user/software/development/r-and-rstudio.md",28537],fe13418f:[()=>n.e(1182).then(n.bind(n,43900)),"@site/devlog/2024-11-21-clean-cleanl-clean.md?truncated=true",43900]};var s=n(85893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(44151),u=n(13736);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(7734).then(n.bind(n,57734)),modules:["@theme/NotFound"],webpack:()=>[57734],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],g=(0,c.Z)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","040"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/authors",component:d("/blog/authors","0b7"),exact:!0},{path:"/blog/authors/alfi",component:d("/blog/authors/alfi","625"),exact:!0},{path:"/blog/authors/david",component:d("/blog/authors/david","386"),exact:!0},{path:"/blog/authors/joey",component:d("/blog/authors/joey","979"),exact:!0},{path:"/blog/clean-clean-clean",component:d("/blog/clean-clean-clean","6e9"),exact:!0},{path:"/blog/don't-call-me-mate-pal",component:d("/blog/don't-call-me-mate-pal","4cd"),exact:!0},{path:"/blog/eopkg-is-dead-long-live-eopkg",component:d("/blog/eopkg-is-dead-long-live-eopkg","a0e"),exact:!0},{path:"/blog/solus-optimizing-packages",component:d("/blog/solus-optimizing-packages","3c8"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/3",component:d("/blog/tags/3","2ba"),exact:!0},{path:"/blog/tags/clang",component:d("/blog/tags/clang","7cb"),exact:!0},{path:"/blog/tags/cleanup",component:d("/blog/tags/cleanup","391"),exact:!0},{path:"/blog/tags/devlog",component:d("/blog/tags/devlog","9e2"),exact:!0},{path:"/blog/tags/eopkg",component:d("/blog/tags/eopkg","a41"),exact:!0},{path:"/blog/tags/firstpost",component:d("/blog/tags/firstpost","c48"),exact:!0},{path:"/blog/tags/glibc",component:d("/blog/tags/glibc","1b5"),exact:!0},{path:"/blog/tags/gnu",component:d("/blog/tags/gnu","94b"),exact:!0},{path:"/blog/tags/hello",component:d("/blog/tags/hello","d49"),exact:!0},{path:"/blog/tags/housekeeping",component:d("/blog/tags/housekeeping","339"),exact:!0},{path:"/blog/tags/hwcaps",component:d("/blog/tags/hwcaps","6d6"),exact:!0},{path:"/blog/tags/llvm",component:d("/blog/tags/llvm","aff"),exact:!0},{path:"/blog/tags/lto",component:d("/blog/tags/lto","24f"),exact:!0},{path:"/blog/tags/mate",component:d("/blog/tags/mate","e08"),exact:!0},{path:"/blog/tags/moss",component:d("/blog/tags/moss","e04"),exact:!0},{path:"/blog/tags/optimization",component:d("/blog/tags/optimization","535"),exact:!0},{path:"/blog/tags/packaging",component:d("/blog/tags/packaging","07c"),exact:!0},{path:"/blog/tags/pgo",component:d("/blog/tags/pgo","a42"),exact:!0},{path:"/blog/tags/solus",component:d("/blog/tags/solus","601"),exact:!0},{path:"/blog/tags/x-86-64-v-3",component:d("/blog/tags/x-86-64-v-3","716"),exact:!0},{path:"/blog/welcome-solus-devlog-v1",component:d("/blog/welcome-solus-devlog-v1","418"),exact:!0},{path:"/docs",component:d("/docs","cda"),routes:[{path:"/docs",component:d("/docs","d14"),routes:[{path:"/docs",component:d("/docs","f54"),routes:[{path:"/docs/category/advanced-configuration",component:d("/docs/category/advanced-configuration","21a"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/category/camera",component:d("/docs/category/camera","eec"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/compatibility",component:d("/docs/category/compatibility","41d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/contributing",component:d("/docs/category/contributing","524"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/localization",component:d("/docs/category/localization","976"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/mobile",component:d("/docs/category/mobile","8b8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/networking",component:d("/docs/category/networking","2c7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/package-management",component:d("/docs/category/package-management","540"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/peripherals",component:d("/docs/category/peripherals","b31"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/procedures",component:d("/docs/category/procedures","59d"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/category/quick-start",component:d("/docs/category/quick-start","16b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/software",component:d("/docs/category/software","5c6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/utilities",component:d("/docs/category/utilities","7bd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/virtualization",component:d("/docs/category/virtualization","cd2"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/web",component:d("/docs/category/web","f03"),exact:!0,sidebar:"userSidebar"},{path:"/docs/packaging/",component:d("/docs/packaging/","481"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/advanced-config/eopkg-configuration",component:d("/docs/packaging/advanced-config/eopkg-configuration","ebe"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/advanced-config/local-repository",component:d("/docs/packaging/advanced-config/local-repository","6db"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/appstream-metainfo",component:d("/docs/packaging/appstream-metainfo","a7b"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/creating-a-new-package",component:d("/docs/packaging/creating-a-new-package","751"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/git-basics",component:d("/docs/packaging/git-basics","d8b"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/monitoring.yml",component:d("/docs/packaging/monitoring.yml","94f"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/package.yml",component:d("/docs/packaging/package.yml","87d"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/packaging-changes",component:d("/docs/packaging/packaging-changes","c28"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/packaging-practices",component:d("/docs/packaging/packaging-practices","573"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/prepare-for-packaging",component:d("/docs/packaging/prepare-for-packaging","bb4"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/maintainership",component:d("/docs/packaging/procedures/maintainership","225"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/package-inclusion",component:d("/docs/packaging/procedures/package-inclusion","f02"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/release-processes",component:d("/docs/packaging/procedures/release-processes","e7c"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/request-a-package",component:d("/docs/packaging/procedures/request-a-package","c89"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/request-a-package-update",component:d("/docs/packaging/procedures/request-a-package-update","741"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/stack-rebuilds",component:d("/docs/packaging/stack-rebuilds","aa8"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/submitting-a-pull-request",component:d("/docs/packaging/submitting-a-pull-request","b03"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/testing-a-package",component:d("/docs/packaging/testing-a-package","438"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/translation-instructions",component:d("/docs/packaging/translation-instructions","12e"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/troubleshooting-packaging",component:d("/docs/packaging/troubleshooting-packaging","7b5"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/update-dev-environment",component:d("/docs/packaging/update-dev-environment","fb2"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/updating-an-existing-package",component:d("/docs/packaging/updating-an-existing-package","25c"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/your-first-package-update",component:d("/docs/packaging/your-first-package-update","29d"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/user/contributing/community-guidelines",component:d("/docs/user/contributing/community-guidelines","774"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/getting-involved",component:d("/docs/user/contributing/getting-involved","c1b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/style",component:d("/docs/user/contributing/style","215"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/testing-an-iso",component:d("/docs/user/contributing/testing-an-iso","9cf"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/",component:d("/docs/user/editions/","e45"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/",component:d("/docs/user/editions/budgie/","e65"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/configuration",component:d("/docs/user/editions/budgie/configuration","d93"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/tips-and-tricks",component:d("/docs/user/editions/budgie/tips-and-tricks","5aa"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/",component:d("/docs/user/editions/gnome/","9f3"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/configuration",component:d("/docs/user/editions/gnome/configuration","cbf"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/tips-and-tricks",component:d("/docs/user/editions/gnome/tips-and-tricks","825"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/",component:d("/docs/user/editions/mate/","619"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/configuration",component:d("/docs/user/editions/mate/configuration","d2f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/tips-and-tricks",component:d("/docs/user/editions/mate/tips-and-tricks","c1b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/",component:d("/docs/user/editions/plasma/","f25"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/configuration",component:d("/docs/user/editions/plasma/configuration","564"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/tips-and-tricks",component:d("/docs/user/editions/plasma/tips-and-tricks","a3f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/",component:d("/docs/user/editions/xfce/","bd1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/configuration",component:d("/docs/user/editions/xfce/configuration","b87"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/tips-and-tricks",component:d("/docs/user/editions/xfce/tips-and-tricks","e55"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/",component:d("/docs/user/hardware/","f51"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/compatibility/laptops",component:d("/docs/user/hardware/compatibility/laptops","4cb"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/compatibility/wifi",component:d("/docs/user/hardware/compatibility/wifi","1d7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/mobile/android",component:d("/docs/user/hardware/mobile/android","c18"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/mobile/apple",component:d("/docs/user/hardware/mobile/apple","c64"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/mice-and-touchpads",component:d("/docs/user/hardware/peripherals/mice-and-touchpads","7ef"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/midi-keyboard",component:d("/docs/user/hardware/peripherals/midi-keyboard","327"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/printers-and-scanners",component:d("/docs/user/hardware/peripherals/printers-and-scanners","1bd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/intro",component:d("/docs/user/intro","a7c"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/basics",component:d("/docs/user/package-management/basics","d4e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/history-and-rollback",component:d("/docs/user/package-management/history-and-rollback","57d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/repo-management",component:d("/docs/user/package-management/repo-management","7c4"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/privacy",component:d("/docs/user/privacy","1bd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/boot-management",component:d("/docs/user/quick-start/boot-management","3d5"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/default-applications",component:d("/docs/user/quick-start/default-applications","99f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/",component:d("/docs/user/quick-start/installation/","686"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/disks",component:d("/docs/user/quick-start/installation/disks","39e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/secure-boot",component:d("/docs/user/quick-start/installation/secure-boot","979"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/system-requirements",component:d("/docs/user/quick-start/installation/system-requirements","4dc"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/software-center/",component:d("/docs/user/quick-start/software-center/","f49"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/camera/droidcam",component:d("/docs/user/software/camera/droidcam","908"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/command-line/",component:d("/docs/user/software/command-line/","344"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/configuration_files",component:d("/docs/user/software/configuration_files","c79"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/desktops/",component:d("/docs/user/software/desktops/","206"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/",component:d("/docs/user/software/development/","a4c"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/containers",component:d("/docs/user/software/development/containers","55d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/java",component:d("/docs/user/software/development/java","fc7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/postgresql",component:d("/docs/user/software/development/postgresql","c0a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/r-and-rstudio",component:d("/docs/user/software/development/r-and-rstudio","405"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/rust",component:d("/docs/user/software/development/rust","4eb"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/web",component:d("/docs/user/software/development/web","ecd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/gaming/",component:d("/docs/user/software/gaming/","e54"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/localization/ibus",component:d("/docs/user/software/localization/ibus","21a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/samba",component:d("/docs/user/software/networking/samba","86e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/tigervnc",component:d("/docs/user/software/networking/tigervnc","032"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/wireshark",component:d("/docs/user/software/networking/wireshark","ed9"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/xrdp",component:d("/docs/user/software/networking/xrdp","44b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/sound/",component:d("/docs/user/software/sound/","420"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/third-party/",component:d("/docs/user/software/third-party/","6a1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/third-party/snap",component:d("/docs/user/software/third-party/snap","47a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/utilities/ksysguard",component:d("/docs/user/software/utilities/ksysguard","278"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/utilities/kwallet",component:d("/docs/user/software/utilities/kwallet","dbc"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/virtualization/virtualbox",component:d("/docs/user/software/virtualization/virtualbox","016"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/web/obs",component:d("/docs/user/software/web/obs","3fa"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/",component:d("/docs/user/troubleshooting/","9b5"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/boot-rescue",component:d("/docs/user/troubleshooting/boot-rescue","6fd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/installation",component:d("/docs/user/troubleshooting/installation","d91"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/plasma",component:d("/docs/user/troubleshooting/plasma","b13"),exact:!0,sidebar:"userSidebar"}]}]}]},{path:"/",component:d("/","e5f"),exact:!0},{path:"*",component:d("*")}]},72278:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,g,m,h,b,y,v,w,k,S,_,x,E,O,P,j,C,T,I,A,N,L,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=R.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new R.Token(n.slice(i,a),l))}i=a+1}}return o},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var n=R.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},R.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n 1&&(a e&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:a s?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t 0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new R.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new R.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new R.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new R.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,n=t,r=0,o=e.length;r =e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s 1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o =this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos 1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new R.QueryParseError(n,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new R.QueryParseError(n,t.start,t.end)}switch(r.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new R.QueryParseError(n,r.start,r.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new R.QueryParseError(r,t.start,t.end)}if(o.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new R.QueryParseError(r,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return R})?r.call(t,n,t,e):r)||(e.exports=o)}()},3681:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(67294),o=n(85893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},43205:(e,t,n)=>{"use strict";var r=n(67294),o=n(20745),a=n(70405),i=n(73727),s=n(36809),l=n(29629);const c=[n(73369),n(87213),n(98356),n(47257)];var u=n(78179),d=n(16550),p=n(18790),f=n(85893);function g(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(79722),h=n(75276),b=n(23466),y=n(39581),v=n(96984),w=n(76862),k=n(95099),S=n(90356),_=n(48820),x=n(62362);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,w.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function O(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,d.TH)();return e+(0,_.Do)((0,b.ZP)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function P(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.h})]}),n&&(0,f.jsx)(v.d,{image:n}),(0,f.jsx)(O,{}),(0,f.jsx)(E,{}),(0,f.jsx)(x.Z,{tag:S.H,locale:e}),(0,f.jsx)(m.Z,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const j=new Map;var C=n(3681),T=n(1124),I=n(1290);function A(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r {const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,I.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),A("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?A("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=A("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.AW,{location:t,render:()=>e})})}}const D=R,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n \n\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return j.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return j.set(e.pathname,t),{...e,pathname:t}}((0,d.TH)());return(0,f.jsx)(D,{location:e,children:Z})}function G(){return(0,f.jsx)(q.Z,{children:(0,f.jsx)(T.M,{children:(0,f.jsxs)(C.t,{children:[(0,f.jsxs)(g,{children:[(0,f.jsx)(H,{}),(0,f.jsx)(P,{}),(0,f.jsx)($,{}),(0,f.jsx)(W,{})]}),(0,f.jsx)(Q,{})]})})})}var Y=n(16887);const K=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(44151);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),L(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(i.UT,{children:t}):(0,f.jsx)(i.VK,{children:t})}const ae=Boolean(!0);if(l.Z.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.B6,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(G,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};L(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},1124:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(67294),o=n(36809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"user/intro","docs":[{"id":"packaging/advanced-config/eopkg-configuration","path":"/docs/packaging/advanced-config/eopkg-configuration","sidebar":"packagingSidebar"},{"id":"packaging/advanced-config/local-repository","path":"/docs/packaging/advanced-config/local-repository","sidebar":"packagingSidebar"},{"id":"packaging/appstream-metainfo","path":"/docs/packaging/appstream-metainfo","sidebar":"packagingSidebar"},{"id":"packaging/creating-a-new-package","path":"/docs/packaging/creating-a-new-package","sidebar":"packagingSidebar"},{"id":"packaging/git-basics","path":"/docs/packaging/git-basics","sidebar":"packagingSidebar"},{"id":"packaging/index","path":"/docs/packaging/","sidebar":"packagingSidebar"},{"id":"packaging/monitoring.yml","path":"/docs/packaging/monitoring.yml","sidebar":"packagingSidebar"},{"id":"packaging/package.yml","path":"/docs/packaging/package.yml","sidebar":"packagingSidebar"},{"id":"packaging/packaging-changes","path":"/docs/packaging/packaging-changes","sidebar":"packagingSidebar"},{"id":"packaging/packaging-practices","path":"/docs/packaging/packaging-practices","sidebar":"packagingSidebar"},{"id":"packaging/prepare-for-packaging","path":"/docs/packaging/prepare-for-packaging","sidebar":"packagingSidebar"},{"id":"packaging/procedures/maintainership","path":"/docs/packaging/procedures/maintainership","sidebar":"packagingSidebar"},{"id":"packaging/procedures/package-inclusion","path":"/docs/packaging/procedures/package-inclusion","sidebar":"packagingSidebar"},{"id":"packaging/procedures/release-processes","path":"/docs/packaging/procedures/release-processes","sidebar":"packagingSidebar"},{"id":"packaging/procedures/request-a-package","path":"/docs/packaging/procedures/request-a-package","sidebar":"packagingSidebar"},{"id":"packaging/procedures/request-a-package-update","path":"/docs/packaging/procedures/request-a-package-update","sidebar":"packagingSidebar"},{"id":"packaging/stack-rebuilds","path":"/docs/packaging/stack-rebuilds","sidebar":"packagingSidebar"},{"id":"packaging/submitting-a-pull-request","path":"/docs/packaging/submitting-a-pull-request","sidebar":"packagingSidebar"},{"id":"packaging/testing-a-package","path":"/docs/packaging/testing-a-package","sidebar":"packagingSidebar"},{"id":"packaging/translation-instructions","path":"/docs/packaging/translation-instructions","sidebar":"packagingSidebar"},{"id":"packaging/troubleshooting-packaging","path":"/docs/packaging/troubleshooting-packaging","sidebar":"packagingSidebar"},{"id":"packaging/update-dev-environment","path":"/docs/packaging/update-dev-environment","sidebar":"packagingSidebar"},{"id":"packaging/updating-an-existing-package","path":"/docs/packaging/updating-an-existing-package","sidebar":"packagingSidebar"},{"id":"packaging/your-first-package-update","path":"/docs/packaging/your-first-package-update","sidebar":"packagingSidebar"},{"id":"user/contributing/community-guidelines","path":"/docs/user/contributing/community-guidelines","sidebar":"userSidebar"},{"id":"user/contributing/getting-involved","path":"/docs/user/contributing/getting-involved","sidebar":"userSidebar"},{"id":"user/contributing/style","path":"/docs/user/contributing/style","sidebar":"userSidebar"},{"id":"user/contributing/testing-an-iso","path":"/docs/user/contributing/testing-an-iso","sidebar":"userSidebar"},{"id":"user/editions/budgie/configuration","path":"/docs/user/editions/budgie/configuration","sidebar":"userSidebar"},{"id":"user/editions/budgie/index","path":"/docs/user/editions/budgie/","sidebar":"userSidebar"},{"id":"user/editions/budgie/tips-and-tricks","path":"/docs/user/editions/budgie/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/gnome/configuration","path":"/docs/user/editions/gnome/configuration","sidebar":"userSidebar"},{"id":"user/editions/gnome/index","path":"/docs/user/editions/gnome/","sidebar":"userSidebar"},{"id":"user/editions/gnome/tips-and-tricks","path":"/docs/user/editions/gnome/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/index","path":"/docs/user/editions/","sidebar":"userSidebar"},{"id":"user/editions/mate/configuration","path":"/docs/user/editions/mate/configuration","sidebar":"userSidebar"},{"id":"user/editions/mate/index","path":"/docs/user/editions/mate/","sidebar":"userSidebar"},{"id":"user/editions/mate/tips-and-tricks","path":"/docs/user/editions/mate/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/plasma/configuration","path":"/docs/user/editions/plasma/configuration","sidebar":"userSidebar"},{"id":"user/editions/plasma/index","path":"/docs/user/editions/plasma/","sidebar":"userSidebar"},{"id":"user/editions/plasma/tips-and-tricks","path":"/docs/user/editions/plasma/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/xfce/configuration","path":"/docs/user/editions/xfce/configuration","sidebar":"userSidebar"},{"id":"user/editions/xfce/index","path":"/docs/user/editions/xfce/","sidebar":"userSidebar"},{"id":"user/editions/xfce/tips-and-tricks","path":"/docs/user/editions/xfce/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/hardware/compatibility/laptops","path":"/docs/user/hardware/compatibility/laptops","sidebar":"userSidebar"},{"id":"user/hardware/compatibility/wifi","path":"/docs/user/hardware/compatibility/wifi","sidebar":"userSidebar"},{"id":"user/hardware/index","path":"/docs/user/hardware/","sidebar":"userSidebar"},{"id":"user/hardware/mobile/android","path":"/docs/user/hardware/mobile/android","sidebar":"userSidebar"},{"id":"user/hardware/mobile/apple","path":"/docs/user/hardware/mobile/apple","sidebar":"userSidebar"},{"id":"user/hardware/peripherals/mice-and-touchpads","path":"/docs/user/hardware/peripherals/mice-and-touchpads","sidebar":"userSidebar"},{"id":"user/hardware/peripherals/midi-keyboard","path":"/docs/user/hardware/peripherals/midi-keyboard","sidebar":"userSidebar"},{"id":"user/hardware/peripherals/printers-and-scanners","path":"/docs/user/hardware/peripherals/printers-and-scanners","sidebar":"userSidebar"},{"id":"user/intro","path":"/docs/user/intro","sidebar":"userSidebar"},{"id":"user/package-management/basics","path":"/docs/user/package-management/basics","sidebar":"userSidebar"},{"id":"user/package-management/history-and-rollback","path":"/docs/user/package-management/history-and-rollback","sidebar":"userSidebar"},{"id":"user/package-management/repo-management","path":"/docs/user/package-management/repo-management","sidebar":"userSidebar"},{"id":"user/privacy","path":"/docs/user/privacy","sidebar":"userSidebar"},{"id":"user/quick-start/boot-management","path":"/docs/user/quick-start/boot-management","sidebar":"userSidebar"},{"id":"user/quick-start/default-applications","path":"/docs/user/quick-start/default-applications","sidebar":"userSidebar"},{"id":"user/quick-start/installation/disks","path":"/docs/user/quick-start/installation/disks","sidebar":"userSidebar"},{"id":"user/quick-start/installation/index","path":"/docs/user/quick-start/installation/","sidebar":"userSidebar"},{"id":"user/quick-start/installation/secure-boot","path":"/docs/user/quick-start/installation/secure-boot","sidebar":"userSidebar"},{"id":"user/quick-start/installation/system-requirements","path":"/docs/user/quick-start/installation/system-requirements","sidebar":"userSidebar"},{"id":"user/quick-start/software-center/index","path":"/docs/user/quick-start/software-center/","sidebar":"userSidebar"},{"id":"user/software/camera/droidcam","path":"/docs/user/software/camera/droidcam","sidebar":"userSidebar"},{"id":"user/software/command-line/index","path":"/docs/user/software/command-line/","sidebar":"userSidebar"},{"id":"user/software/configuration_files","path":"/docs/user/software/configuration_files","sidebar":"userSidebar"},{"id":"user/software/desktops/index","path":"/docs/user/software/desktops/","sidebar":"userSidebar"},{"id":"user/software/development/containers","path":"/docs/user/software/development/containers","sidebar":"userSidebar"},{"id":"user/software/development/index","path":"/docs/user/software/development/","sidebar":"userSidebar"},{"id":"user/software/development/java","path":"/docs/user/software/development/java","sidebar":"userSidebar"},{"id":"user/software/development/postgresql","path":"/docs/user/software/development/postgresql","sidebar":"userSidebar"},{"id":"user/software/development/r-and-rstudio","path":"/docs/user/software/development/r-and-rstudio","sidebar":"userSidebar"},{"id":"user/software/development/rust","path":"/docs/user/software/development/rust","sidebar":"userSidebar"},{"id":"user/software/development/web","path":"/docs/user/software/development/web","sidebar":"userSidebar"},{"id":"user/software/gaming/index","path":"/docs/user/software/gaming/","sidebar":"userSidebar"},{"id":"user/software/localization/ibus","path":"/docs/user/software/localization/ibus","sidebar":"userSidebar"},{"id":"user/software/networking/samba","path":"/docs/user/software/networking/samba","sidebar":"userSidebar"},{"id":"user/software/networking/tigervnc","path":"/docs/user/software/networking/tigervnc","sidebar":"userSidebar"},{"id":"user/software/networking/wireshark","path":"/docs/user/software/networking/wireshark","sidebar":"userSidebar"},{"id":"user/software/networking/xrdp","path":"/docs/user/software/networking/xrdp","sidebar":"userSidebar"},{"id":"user/software/sound/index","path":"/docs/user/software/sound/","sidebar":"userSidebar"},{"id":"user/software/third-party/index","path":"/docs/user/software/third-party/","sidebar":"userSidebar"},{"id":"user/software/third-party/snap","path":"/docs/user/software/third-party/snap","sidebar":"userSidebar"},{"id":"user/software/utilities/ksysguard","path":"/docs/user/software/utilities/ksysguard","sidebar":"userSidebar"},{"id":"user/software/utilities/kwallet","path":"/docs/user/software/utilities/kwallet","sidebar":"userSidebar"},{"id":"user/software/virtualization/virtualbox","path":"/docs/user/software/virtualization/virtualbox","sidebar":"userSidebar"},{"id":"user/software/web/obs","path":"/docs/user/software/web/obs","sidebar":"userSidebar"},{"id":"user/troubleshooting/boot-rescue","path":"/docs/user/troubleshooting/boot-rescue","sidebar":"userSidebar"},{"id":"user/troubleshooting/index","path":"/docs/user/troubleshooting/","sidebar":"userSidebar"},{"id":"user/troubleshooting/installation","path":"/docs/user/troubleshooting/installation","sidebar":"userSidebar"},{"id":"user/troubleshooting/plasma","path":"/docs/user/troubleshooting/plasma","sidebar":"userSidebar"},{"id":"/category/quick-start","path":"/docs/category/quick-start","sidebar":"userSidebar"},{"id":"/category/contributing","path":"/docs/category/contributing","sidebar":"userSidebar"},{"id":"/category/compatibility","path":"/docs/category/compatibility","sidebar":"userSidebar"},{"id":"/category/mobile","path":"/docs/category/mobile","sidebar":"userSidebar"},{"id":"/category/peripherals","path":"/docs/category/peripherals","sidebar":"userSidebar"},{"id":"/category/package-management","path":"/docs/category/package-management","sidebar":"userSidebar"},{"id":"/category/software","path":"/docs/category/software","sidebar":"userSidebar"},{"id":"/category/camera","path":"/docs/category/camera","sidebar":"userSidebar"},{"id":"/category/localization","path":"/docs/category/localization","sidebar":"userSidebar"},{"id":"/category/networking","path":"/docs/category/networking","sidebar":"userSidebar"},{"id":"/category/utilities","path":"/docs/category/utilities","sidebar":"userSidebar"},{"id":"/category/virtualization","path":"/docs/category/virtualization","sidebar":"userSidebar"},{"id":"/category/web","path":"/docs/category/web","sidebar":"userSidebar"},{"id":"/category/advanced-configuration","path":"/docs/category/advanced-configuration","sidebar":"packagingSidebar"},{"id":"/category/procedures","path":"/docs/category/procedures","sidebar":"packagingSidebar"}],"draftIds":[],"sidebars":{"userSidebar":{"link":{"path":"/docs/user/intro","label":"user/intro"}},"packagingSidebar":{"link":{"path":"/docs/packaging/","label":"packaging/index"}}}}],"breadcrumbs":true}},"@cmfcmf/docusaurus-search-local":{"default":{"titleBoost":5,"contentBoost":1,"tagsBoost":3,"parentCategoriesBoost":2,"indexDocSidebarParentCategories":0,"maxSearchResults":8}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(57529);const l=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"},"@cmfcmf/docusaurus-search-local":{"type":"package","name":"@cmfcmf/docusaurus-search-local","version":"1.2.0"},"docusaurus-plugin-ideal-image":{"type":"package","name":"@docusaurus/plugin-ideal-image","version":"3.5.2"}}}');var c=n(85893);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},40903:(e,t,n)=>{"use strict";n.d(t,{Z:()=>m});var r=n(67294),o=n(29629),a=n(79722),i=n(48820),s=n(48714),l=n(13736),c=n(85893);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.BN)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.z,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.Z,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.Z,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const g=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},29629:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},79722:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(67294);var r=n(70405),o=n(85893);function a(e){return(0,o.jsx)(r.ql,{...e})}},38208:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),o=n(73727),a=n(48820),i=n(75276),s=n(41117),l=n(29629),c=n(79202),u=n(23466),d=n(85893);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.Z)(),{trailingSlash:w,baseUrl:k}=v,S=v.future.experimental_router,{withBaseUrl:_}=(0,u.Cg)(),x=(0,c.Z)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const O=p||f;const P=(0,s.Z)(O),j=O?.replace("pathname://","");let C=void 0!==j?(T=j,b&&(e=>e.startsWith("/"))(T)?_(T):T):void 0;var T;"hash"===S&&C?.startsWith("./")&&(C=C?.slice(1)),C&&P&&(C=(0,a.Do)(C,{trailingSlash:w,baseUrl:k}));const I=(0,r.useRef)(!1),A=n?o.OL:o.rU,N=l.Z.canUseIntersectionObserver,L=(0,r.useRef)(),R=()=>{I.current||null==C||(window.docusaurus.preload(C),I.current=!0)};(0,r.useEffect)((()=>(!N&&P&&l.Z.canUseDOM&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&L.current&&L.current.disconnect()})),[L,C,N,P]);const D=C?.startsWith("#")??!1,F=!y.target||"_self"===y.target,M=!C||!P||!F||D&&"hash"!==S;h||!D&&M||x.collectLink(C),y.id&&x.collectAnchor(y.id);const B={};return M?(0,d.jsx)("a",{ref:E,href:C,...O&&!P&&{target:"_blank",rel:"noopener noreferrer"},...y,...B}):(0,d.jsx)(A,{...y,onMouseEnter:R,onTouchStart:R,innerRef:e=>{E.current=e,N&&e&&P&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),L.current.observe(e))},to:C,...n&&{isActive:m,activeClassName:g},...B})}const f=r.forwardRef(p)},55361:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(67294),o=n(85893);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(57529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("IllegalYour Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\nchildren",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},73070:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},41117:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},23466:(e,t,n)=>{"use strict";n.d(t,{Cg:()=>i,ZP:()=>s});var r=n(67294),o=n(75276),a=n(41117);function i(){const{siteConfig:e}=(0,o.Z)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.b)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},79202:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(67294);n(85893);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},75276:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(1124);function a(){return(0,r.useContext)(o._)}},2591:(e,t,n)=>{"use strict";n.d(t,{OD:()=>a,eZ:()=>i});var r=n(75276),o=n(73070);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=a(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},45025:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(3681);function a(){return(0,r.useContext)(o._)}},1290:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294);const o=n(29629).Z.canUseDOM?r.useLayoutEffect:r.useEffect},3675:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(13736);function a(){const e=r.useContext(o._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},44151:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},13736:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>i});var r=n(67294),o=n(85893);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},5055:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>h,Oh:()=>v});var r=n(67294),o=n(48878),a=n(73070),i=n(39581),s=n(1606),l=n(20585),c=n(85893);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.WA)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return(0,c.jsx)(f.Provider,{value:n,children:t})}function h(e){let{children:t}=e;return(0,c.jsx)(m,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},90447:(e,t,n)=>{"use strict";n.d(t,{J:()=>a,z:()=>i});var r=n(48878),o=n(5055);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r._r)(),t=(0,r.WS)(),n=(0,o.Oh)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},40217:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(67294),o=n(20585),a=n(85893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.i6("DocsSidebarProvider");return e}},68879:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,MN:()=>O,SN:()=>E,_F:()=>b,f:()=>v,jA:()=>g,lO:()=>S,oz:()=>_,s1:()=>k,vY:()=>x,xz:()=>p});var r=n(67294),o=n(16550),a=n(18790),i=n(48878),s=n(51997),l=n(79113),c=n(5055),u=n(72950),d=n(40217);function p(e){const t=(0,u.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}function g(){const{pathname:e}=(0,o.TH)(),t=(0,d.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,s.Mg)(e,t),h=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function y(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function k(){const e=(0,d.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,c.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,l.jj)([t,n,o].filter(Boolean))),[t,n,o])}function _(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function x(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.jj)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,o.TH)(),r=(0,u.E)(),i=t.routes,s=i.find((e=>(0,o.LX)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.H)(i),sidebarName:l,sidebarItems:c}}function O(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!f(e)))}},72950:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(67294),o=n(20585),a=n(85893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.i6("DocsVersionProvider");return e}},48878:(e,t,n)=>{"use strict";n.d(t,{MN:()=>l.MN,Iw:()=>y,gA:()=>g,WS:()=>m,_r:()=>p,jA:()=>l.jA,Jo:()=>v,z1:()=>u.z,zh:()=>f,J:()=>c.J,yW:()=>b,gB:()=>h});var r=n(16550),o=n(2591);const a=e=>e.versions.find((e=>e.isLast));function i(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=i(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}var l=n(68879),c=n(5055),u=n(90447);const d={},p=()=>(0,o.OD)("docusaurus-plugin-content-docs")??d,f=e=>{try{return(0,o.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function g(e){void 0===e&&(e={});const t=p(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=g(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:i(t.pluginData,n)}}function h(e){return f(e).versions}function b(e){const t=f(e);return a(t)}function y(e){const t=f(e),{pathname:n}=(0,r.TH)();return s(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},98356:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(74865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},87213:(e,t,n)=>{"use strict";n.r(t);var r=n(14965),o=n(36809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(96854),n(24249)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},42704:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(36905),o=n(55361),a=n(39581),i=n(38208),s=n(79202);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(85893);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.Z)(),{navbar:{hideOnScroll:p}}=(0,a.L)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.Z)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},99391:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(67294);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(85893);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},48714:(e,t,n)=>{"use strict";n.d(t,{Z:()=>di});var r=n(67294),o=n(36905),a=n(40903),i=n(96984),s=n(16550),l=n(55361),c=n(89062),u=n(85893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(50563),b=n(95099);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var w=n(39581),k=n(25461);function S(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const _={closeButton:"closeButton_CVFx"};function x(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.Z)("clean-btn close",_.closeButton,e.className),children:(0,u.jsx)(S,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function O(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const P={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.n)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:P.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:P.announcementBarPlaceholder}),(0,u.jsx)(O,{className:P.announcementBarContent}),a&&(0,u.jsx)(x,{onClick:n,className:P.announcementBarClose})]})}var C=n(44160),T=n(18119);var I=n(20585),A=n(5689);const N=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,C.e)(),t=(0,A.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,I.D9)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(N.Provider,{value:n,children:t})}function R(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new I.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,A.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:R(a)})),[o,a,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(61503),B=n(45025);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,B.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.Z)($.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})]})})}const q=r.memo(H),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Q(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,M.I)();return r?null:(0,u.jsx)(q,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var Z=n(82546);function W(){return(0,u.jsx)(Z.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,C.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(S,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(W,{}),(0,u.jsx)(Q,{className:"margin-right--md"}),(0,u.jsx)(G,{})]})}var K=n(38208),X=n(23466),J=n(41117);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(99391);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.ZP)(r),p=(0,X.ZP)(t),f=(0,X.ZP)(o,{forcePrependBaseUrl:!0}),g=a&&o&&!(0,J.Z)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,g&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(K.Z,{href:l?f:o,...c,...m}):(0,u.jsx)(K.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.Z)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(93841),se=n(51997),le=n(75276);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.Z)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(_a,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.Z)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(_a,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var ge=n(76862);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";var be=n(73935);function ye(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;a e.length)&&(t=e.length);for(var n=0,r=new Array(t);n e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Ie(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ae(e){for(var t=1;t =3||2===n&&r>=4||1===n&&r>=10}(e);function n(n,r,o){if(t&&void 0!==o){var a=o[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[n].concat(je(r),[{headers:i}]))}else e.apply(void 0,[n].concat(je(r)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("clickedObjectIDsAfterSearch",Le(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("clickedObjectIDs",Le(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r 0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("convertedObjectIDsAfterSearch",Le(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("convertedObjectIDs",Le(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r 0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&t.reduce((function(e,t){var n=t.items,r=Te(t,Oe);return[].concat(je(e),je(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r 0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function De(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function Fe(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function Me(e){return Me="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Me(e)}function Be(e){return function(e){if(Array.isArray(e))return ze(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return ze(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ze(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ze(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n 0&&Qe({onItemsChange:r,items:n,insights:s,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;i("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:s}}),n((function(e){var t=e.item,n=e.state,r=e.event;Fe(t)&&o({state:n,event:r,insights:s,item:t,insightsEvents:[$e({eventName:"Item Selected"},Se({item:t,items:l.current}))]})})),r((function(e){var t=e.item,n=e.state,r=e.event;Fe(t)&&a({state:n,event:r,insights:s,item:t,insightsEvents:[$e({eventName:"Item Active"},Se({item:t,items:l.current}))]})}))},onStateChange:function(e){var t=e.state;c({state:t})},__autocomplete_pluginOptions:e}}function We(e){return We="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},We(e)}function Ge(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ye(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==We(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==We(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===We(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Ke(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var i=function(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n 0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(ot++),plugins:o,initialState:ft({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(ut(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:ke,onResolve:ke};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=it(it({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return Xe(e)})).then((function(e){return e.map((function(e){return ft(ft({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:ft({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function ht(e){return ht="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ht(e)}function bt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function yt(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Vt,Qt,Zt,Wt=null,Gt=(Vt=-1,Qt=-1,Zt=void 0,function(e){var t=++Vt;return Promise.resolve(e).then((function(e){return Zt&&t =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var rn=/((gt|sm)-|galaxy nexus)|samsung[- ]/i;function on(e){return on="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},on(e)}var an=["props","refresh","store"],sn=["inputElement","formElement","panelElement"],ln=["inputElement"],cn=["inputElement","maxLength"],un=["sourceIndex"],dn=["sourceIndex"],pn=["item","source","sourceIndex"];function fn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function gn(e){for(var t=1;t =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function bn(e){var t=e.props,n=e.refresh,r=e.store,o=hn(e,an),a=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return gn({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},hn(e,sn))},getRootProps:function(e){return gn({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return gn({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(gn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(gn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},hn(e,ln))},getLabelProps:function(e){var n=e||{},r=n.sourceIndex,o=hn(n,un);return gn({htmlFor:"".concat(a(t.id,r),"-input"),id:"".concat(a(t.id,r),"-label")},o)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&Yt(gn({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=e||{},l=(s.inputElement,s.maxLength),c=void 0===l?512:l,u=hn(s,cn),d=Mt(r.getState()),p=function(e){return Boolean(e&&e.match(rn))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),f=null!=d&&d.itemUrl&&!p?"go":"search";return gn({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?"".concat(t.id,"-item-").concat(r.getState().activeItemId):void 0,"aria-controls":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:r.getState().completion||r.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:f,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){Yt(gn({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=nn(e,Xt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},s=function(){var e=Mt(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(en({event:t,item:n,itemInputValue:i,itemUrl:s,refresh:r,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?Yt(en({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(i,0)})):(o.dispatch(t.key,{}),s(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=Mt(o.getState()),c=l.item,u=l.itemInputValue,d=l.itemUrl,p=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});Yt(en({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a))}))}}}(gn({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:ke,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return gn({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.sourceIndex,o=hn(n,dn);return gn({role:"listbox","aria-labelledby":"".concat(a(t.id,r),"-label"),id:"".concat(a(t.id,r),"-list")},o)},getItemProps:function(e){var i=e.item,s=e.source,l=e.sourceIndex,c=hn(e,pn);return gn({id:"".concat(a(t.id,l),"-item-").concat(i.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===i.__autocomplete_id,onMouseMove:function(e){if(i.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",i.__autocomplete_id);var t=Mt(r.getState());if(null!==r.getState().activeItemId&&t){var a=t.item,s=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(gn({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=s.getItemInputValue({item:i,state:r.getState()}),l=s.getItemUrl({item:i,state:r.getState()});(l?Promise.resolve():Yt(gn({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){s.onSelect(gn({event:e,item:i,itemInputValue:a,itemUrl:l,refresh:n,source:s,state:r.getState()},o))}))}},c)}}}var yn=[{segment:"autocomplete-core",version:"1.9.2"}];function vn(e){return vn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},vn(e)}function wn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function kn(e){for(var t=1;t =n?null===r?null:0:o}function On(e){return On="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},On(e)}function Pn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function jn(e){for(var t=1;t =5&&((o||!e&&5===r)&&(i.push(r,0,o,n),r=6),e&&(i.push(r,e,0,n),r=6)),o=""},l=0;l "===t?(r=1,o=""):o=t+o[0]:a?t===a?a="":o+=t:'"'===t||"'"===t?a=t:">"===t?(s(),r=1):r&&("="===t?(r=5,n=o,o=""):"/"===t&&(r<5||">"===e[l][c+1])?(s(),3===r&&(i=i[0]),r=i,(i=i[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(s(),r=2):o+=t),3===r&&"!--"===o&&(r=4,i=i[0])}return s(),i}(e)),t),arguments,[])).length>1?t:t[0]}var $n=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-SubmitIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","20"),n.setAttribute("height","20"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M16.041 15.856c-0.034 0.026-0.067 0.055-0.099 0.087s-0.060 0.064-0.087 0.099c-1.258 1.213-2.969 1.958-4.855 1.958-1.933 0-3.682-0.782-4.95-2.050s-2.050-3.017-2.050-4.95 0.782-3.682 2.050-4.95 3.017-2.050 4.95-2.050 3.682 0.782 4.95 2.050 2.050 3.017 2.050 4.95c0 1.886-0.745 3.597-1.959 4.856zM21.707 20.293l-3.675-3.675c1.231-1.54 1.968-3.493 1.968-5.618 0-2.485-1.008-4.736-2.636-6.364s-3.879-2.636-6.364-2.636-4.736 1.008-6.364 2.636-2.636 3.879-2.636 6.364 1.008 4.736 2.636 6.364 3.879 2.636 6.364 2.636c2.125 0 4.078-0.737 5.618-1.968l3.675 3.675c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414z"),n.appendChild(r),n},Hn=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n},qn=function(e){var t=e.environment.document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("class","aa-LoadingIcon"),t.setAttribute("viewBox","0 0 100 100"),t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML=' \n ',t},Vn=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];function Qn(e,t,n){e[t]=null===n?"":"number"!=typeof n?n:n+"px"}function Zn(e){this._listeners[e.type](e)}function Wn(e,t,n){var r,o,a=e[t];if("style"===t)if("string"==typeof n)e.style=n;else if(null===n)e.style="";else for(t in n)a&&n[t]===a[t]||Qn(e.style,t,n[t]);else"o"===t[0]&&"n"===t[1]?(r=t!==(t=t.replace(/Capture$/,"")),((o=t.toLowerCase())in e||Vn.includes(o))&&(t=o),t=t.slice(2),e._listeners||(e._listeners={}),e._listeners[t]=n,n?a||e.addEventListener(t,Zn,r):e.removeEventListener(t,Zn,r)):"list"!==t&&"tagName"!==t&&"form"!==t&&"type"!==t&&"size"!==t&&"download"!==t&&"href"!==t&&t in e?e[t]=null==n?"":n:"function"!=typeof n&&"dangerouslySetInnerHTML"!==t&&(null==n||!1===n&&!/^ar/.test(t)?e.removeAttribute(t):e.setAttribute(t,n))}function Gn(e){return"onChange"===e?"onInput":e}function Yn(e,t){for(var n in t)Wn(e,Gn(n),t[n])}function Kn(e,t){for(var n in t)"o"===n[0]&&"n"===n[1]||Wn(e,Gn(n),t[n])}var Xn=["children"];function Jn(e){return function(e){if(Array.isArray(e))return er(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return er(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return er(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function er(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n\n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function nr(e){return function(t,n){var r=n.children,o=void 0===r?[]:r,a=tr(n,Xn),i=e.document.createElement(t);return Yn(i,a),i.append.apply(i,Jn(o)),i}}function rr(e){return rr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},rr(e)}var or=["autocompleteScopeApi","environment","classNames","getInputProps","getInputPropsCore","isDetached","state"];function ar(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ir(e){for(var t=1;t =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var cr=function(e){var t=e.autocompleteScopeApi,n=e.environment,r=(e.classNames,e.getInputProps),o=e.getInputPropsCore,a=e.isDetached,i=e.state,s=lr(e,or),l=nr(n)("input",s),c=r(ir({state:i,props:o({inputElement:l}),inputElement:l},t));return Yn(l,ir(ir({},c),{},{onKeyDown:function(e){a&&"Tab"===e.key||c.onKeyDown(e)}})),l};function ur(e){return ur="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ur(e)}function dr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function pr(e){for(var t=1;t 2&&(i.children=arguments.length>3?mr.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(a in e.defaultProps)void 0===i[a]&&(i[a]=e.defaultProps[a]);return Cr(e,i,r,o,null)}function Cr(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++br:o};return null==o&&null!=hr.vnode&&hr.vnode(a),a}function Tr(e){return e.children}function Ir(e,t){this.props=e,this.context=t}function Ar(e,t){if(null==t)return e.__?Ar(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t t&&yr.sort(kr));Rr.__r=0}function Dr(e,t,n,r,o,a,i,s,l,c){var u,d,p,f,g,m,h,b=r&&r.__k||_r,y=b.length;for(n.__k=[],u=0;u 0?Cr(f.type,f.props,f.key,f.ref?f.ref:null,f.__v):f)){if(f.__=n,f.__b=n.__b+1,null===(p=b[u])||p&&f.key==p.key&&f.type===p.type)b[u]=void 0;else for(d=0;d =0;t--)if((n=e.__k[t])&&(r=Br(n)))return r;return null}function zr(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||xr.test(t)?n:n+"px"}function Ur(e,t,n,r,o){var a;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||zr(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||zr(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])a=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+a]=n,n?r||e.addEventListener(t,a?Hr:$r,a):e.removeEventListener(t,a?Hr:$r,a);else if("dangerouslySetInnerHTML"!==t){if(o)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&"rowSpan"!==t&&"colSpan"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&"-"!==t[4]?e.removeAttribute(t):e.setAttribute(t,n))}}function $r(e){return this.l[e.type+!1](hr.event?hr.event(e):e)}function Hr(e){return this.l[e.type+!0](hr.event?hr.event(e):e)}function qr(e,t,n,r,o,a,i,s,l){var c,u,d,p,f,g,m,h,b,y,v,w,k,S,_,x=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(l=n.__h,s=t.__e=n.__e,t.__h=null,a=[s]),(c=hr.__b)&&c(t);try{e:if("function"==typeof x){if(h=t.props,b=(c=x.contextType)&&r[c.__c],y=c?b?b.props.value:c.__:r,n.__c?m=(u=t.__c=n.__c).__=u.__E:("prototype"in x&&x.prototype.render?t.__c=u=new x(h,y):(t.__c=u=new Ir(h,y),u.constructor=x,u.render=Gr),b&&b.sub(u),u.props=h,u.state||(u.state={}),u.context=y,u.__n=r,d=u.__d=!0,u.__h=[],u._sb=[]),null==u.__s&&(u.__s=u.state),null!=x.getDerivedStateFromProps&&(u.__s==u.state&&(u.__s=Or({},u.__s)),Or(u.__s,x.getDerivedStateFromProps(h,u.__s))),p=u.props,f=u.state,u.__v=t,d)null==x.getDerivedStateFromProps&&null!=u.componentWillMount&&u.componentWillMount(),null!=u.componentDidMount&&u.__h.push(u.componentDidMount);else{if(null==x.getDerivedStateFromProps&&h!==p&&null!=u.componentWillReceiveProps&&u.componentWillReceiveProps(h,y),!u.__e&&null!=u.shouldComponentUpdate&&!1===u.shouldComponentUpdate(h,u.__s,y)||t.__v===n.__v){for(t.__v!==n.__v&&(u.props=h,u.state=u.__s,u.__d=!1),u.__e=!1,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),v=0;v 0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split(Jr);r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function to(e){return function(e){if(Array.isArray(e))return no(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return no(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return no(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function no(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n ",""":'"',"'":"'"},io=new RegExp(/\w/i),so=/&(amp|quot|lt|gt|#39);/g,lo=RegExp(so.source);function co(e,t){var n,r,o,a=e[t],i=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,s=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return io.test((o=a.value)&&lo.test(o)?o.replace(so,(function(e){return ao[e]})):o)||s!==i?a.isHighlighted:s}function uo(e){return uo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},uo(e)}function po(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function fo(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var To={clearButton:"aa-ClearButton",detachedCancelButton:"aa-DetachedCancelButton",detachedContainer:"aa-DetachedContainer",detachedFormContainer:"aa-DetachedFormContainer",detachedOverlay:"aa-DetachedOverlay",detachedSearchButton:"aa-DetachedSearchButton",detachedSearchButtonIcon:"aa-DetachedSearchButtonIcon",detachedSearchButtonPlaceholder:"aa-DetachedSearchButtonPlaceholder",detachedSearchButtonQuery:"aa-DetachedSearchButtonQuery",form:"aa-Form",input:"aa-Input",inputWrapper:"aa-InputWrapper",inputWrapperPrefix:"aa-InputWrapperPrefix",inputWrapperSuffix:"aa-InputWrapperSuffix",item:"aa-Item",label:"aa-Label",list:"aa-List",loadingIndicator:"aa-LoadingIndicator",panel:"aa-Panel",panelLayout:"aa-PanelLayout aa-Panel--scrollable",root:"aa-Autocomplete",source:"aa-Source",sourceFooter:"aa-SourceFooter",sourceHeader:"aa-SourceHeader",sourceNoResults:"aa-SourceNoResults",submitButton:"aa-SubmitButton"},Io=function(e,t){var n=e.children;(0,e.render)(n,t)},Ao={createElement:jr,Fragment:Tr,render:Yr};function No(e){var t=e.panelPlacement,n=e.container,r=e.form,o=e.environment,a=n.getBoundingClientRect(),i=(o.pageYOffset||o.document.documentElement.scrollTop||o.document.body.scrollTop||0)+a.top+a.height;switch(t){case"start":return{top:i,left:a.left};case"end":return{top:i,right:o.document.documentElement.clientWidth-(a.left+a.width)};case"full-width":return{top:i,left:0,right:0,width:"unset",maxWidth:"unset"};case"input-wrapper-width":var s=r.getBoundingClientRect();return{top:i,left:s.left,right:o.document.documentElement.clientWidth-(s.left+s.width),width:"unset",maxWidth:"unset"};default:throw new Error("[Autocomplete] The `panelPlacement` value ".concat(JSON.stringify(t)," is not valid."))}}function Lo(e){return Lo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Lo(e)}function Ro(){return Ro=Object.assign?Object.assign.bind():function(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function ea(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ta(e){for(var t=1;t 0;if(!p.value.core.openOnFocus&&!t.query)return n;var r=Boolean(c.current||p.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:Bo,options:e}}))})),m=Dn(ta({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},p.value.core.initialState)),h={getEnvironmentProps:p.value.renderer.getEnvironmentProps,getFormProps:p.value.renderer.getFormProps,getInputProps:p.value.renderer.getInputProps,getItemProps:p.value.renderer.getItemProps,getLabelProps:p.value.renderer.getLabelProps,getListProps:p.value.renderer.getListProps,getPanelProps:p.value.renderer.getPanelProps,getRootProps:p.value.renderer.getRootProps},b={setActiveItemId:g.value.setActiveItemId,setQuery:g.value.setQuery,setCollections:g.value.setCollections,setIsOpen:g.value.setIsOpen,setStatus:g.value.setStatus,setContext:g.value.setContext,refresh:g.value.refresh,navigator:g.value.navigator},y=s((function(){return Un.bind(p.value.renderer.renderer.createElement)})),v=s((function(){return function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.classNames,o=e.environment,a=e.isDetached,i=e.placeholder,s=void 0===i?"Search":i,l=e.propGetters,c=e.setIsModalOpen,u=e.state,d=e.translations,p=nr(o),f=l.getRootProps(pr({state:u,props:t.getRootProps({})},n)),g=p("div",pr({class:r.root},f)),m=p("div",{class:r.detachedContainer,onMouseDown:function(e){e.stopPropagation()}}),h=p("div",{class:r.detachedOverlay,children:[m],onMouseDown:function(){c(!1),t.setIsOpen(!1)}}),b=l.getLabelProps(pr({state:u,props:t.getLabelProps({})},n)),y=p("button",{class:r.submitButton,type:"submit",title:d.submitButtonTitle,children:[$n({environment:o})]}),v=p("label",pr({class:r.label,children:[y]},b)),w=p("button",{class:r.clearButton,type:"reset",title:d.clearButtonTitle,children:[Hn({environment:o})]}),k=p("div",{class:r.loadingIndicator,children:[qn({environment:o})]}),S=cr({class:r.input,environment:o,state:u,getInputProps:l.getInputProps,getInputPropsCore:t.getInputProps,autocompleteScopeApi:n,isDetached:a}),_=p("div",{class:r.inputWrapperPrefix,children:[v,k]}),x=p("div",{class:r.inputWrapperSuffix,children:[w]}),E=p("div",{class:r.inputWrapper,children:[S]}),O=l.getFormProps(pr({state:u,props:t.getFormProps({inputElement:S})},n)),P=p("form",pr({class:r.form,children:[_,E,x]},O)),j=l.getPanelProps(pr({state:u,props:t.getPanelProps({})},n)),C=p("div",pr({class:r.panel},j)),T=p("div",{class:r.detachedSearchButtonQuery,textContent:u.query}),I=p("div",{class:r.detachedSearchButtonPlaceholder,hidden:Boolean(u.query),textContent:s});if(a){var A=p("div",{class:r.detachedSearchButtonIcon,children:[$n({environment:o})]}),N=p("button",{type:"button",class:r.detachedSearchButton,onClick:function(){c(!0)},children:[A,I,T]}),L=p("button",{type:"button",class:r.detachedCancelButton,textContent:d.detachedCancelButtonText,onTouchStart:function(e){e.stopPropagation()},onClick:function(){t.setIsOpen(!1),c(!1)}}),R=p("div",{class:r.detachedFormContainer,children:[P,L]});m.appendChild(R),g.appendChild(N)}else g.appendChild(P);return{detachedContainer:m,detachedOverlay:h,detachedSearchButtonQuery:T,detachedSearchButtonPlaceholder:I,inputWrapper:E,input:S,root:g,form:P,label:v,submitButton:y,clearButton:w,loadingIndicator:k,panel:C}}({autocomplete:g.value,autocompleteScopeApi:b,classNames:p.value.renderer.classNames,environment:p.value.core.environment,isDetached:f.value,placeholder:p.value.core.placeholder,propGetters:h,setIsModalOpen:_,state:m.current,translations:p.value.renderer.translations})}));function w(){Yn(v.value.panel,{style:f.value?{}:No({panelPlacement:p.value.renderer.panelPlacement,container:v.value.root,form:v.value.form,environment:p.value.core.environment})})}function k(e){m.current=e;var t={autocomplete:g.value,autocompleteScopeApi:b,classNames:p.value.renderer.classNames,components:p.value.renderer.components,container:p.value.renderer.container,html:y.value,dom:v.value,panelContainer:f.value?v.value.detachedContainer:p.value.renderer.panelContainer,propGetters:h,state:m.current,renderer:p.value.renderer.renderer},n=!Fn(e)&&!c.current&&p.value.renderer.renderNoResults||p.value.renderer.render;!function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.dom,o=e.propGetters,a=e.state;Kn(r.root,o.getRootProps(Fo({state:a,props:t.getRootProps({})},n))),Kn(r.input,o.getInputProps(Fo({state:a,props:t.getInputProps({inputElement:r.input}),inputElement:r.input},n))),Yn(r.label,{hidden:"stalled"===a.status}),Yn(r.loadingIndicator,{hidden:"stalled"!==a.status}),Yn(r.clearButton,{hidden:!a.query}),Yn(r.detachedSearchButtonQuery,{textContent:a.query}),Yn(r.detachedSearchButtonPlaceholder,{hidden:Boolean(a.query)})}(t),function(e,t){var n=t.autocomplete,r=t.autocompleteScopeApi,o=t.classNames,a=t.html,i=t.dom,s=t.panelContainer,l=t.propGetters,c=t.state,u=t.components,d=t.renderer;if(c.isOpen){s.contains(i.panel)||"loading"===c.status||s.appendChild(i.panel),i.panel.classList.toggle("aa-Panel--stalled","stalled"===c.status);var p=c.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var i=e.source,s=e.items;return d.createElement("section",{key:t,className:o.source,"data-autocomplete-source-id":i.sourceId},i.templates.header&&d.createElement("div",{className:o.sourceHeader},i.templates.header({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})),i.templates.noResults&&0===s.length?d.createElement("div",{className:o.sourceNoResults},i.templates.noResults({components:u,createElement:d.createElement,Fragment:d.Fragment,source:i,state:c,html:a})):d.createElement("ul",Ro({className:o.list},l.getListProps(Fo({state:c,props:n.getListProps({sourceIndex:t})},r))),s.map((function(e){var s=n.getItemProps({item:e,source:i,sourceIndex:t});return d.createElement("li",Ro({key:s.id,className:o.item},l.getItemProps(Fo({state:c,props:s},r))),i.templates.item({components:u,createElement:d.createElement,Fragment:d.Fragment,item:e,state:c,html:a}))}))),i.templates.footer&&d.createElement("div",{className:o.sourceFooter},i.templates.footer({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})))})),f=d.createElement(d.Fragment,null,d.createElement("div",{className:o.panelLayout},p),d.createElement("div",{className:"aa-GradientBottom"})),g=p.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(Fo(Fo({children:f,state:c,sections:p,elements:g},d),{},{components:u,html:a},r),i.panel)}else s.contains(i.panel)&&s.removeChild(i.panel)}(n,t)}function S(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o();var t,n,r=p.value.renderer,i=r.components,s=Jo(r,Ko);u.current=qo(s,p.value.core,{components:(t=i,n=function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")},Object.entries(t).reduce((function(e,t){var r=Go(t,2),o=r[0],a=r[1];return n({key:o,value:a})?Zo(Zo({},e),{},Wo({},o,a)):e}),{})),initialState:m.current},e),l(),a(),g.value.refresh().then((function(){k(m.current)}))}function _(e){requestAnimationFrame((function(){var t=p.value.core.environment.document.body.contains(v.value.detachedOverlay);e!==t&&(e?(p.value.core.environment.document.body.appendChild(v.value.detachedOverlay),p.value.core.environment.document.body.classList.add("aa-Detached"),v.value.input.focus()):(p.value.core.environment.document.body.removeChild(v.value.detachedOverlay),p.value.core.environment.document.body.classList.remove("aa-Detached")))}))}return r((function(){var e=g.value.getEnvironmentProps({formElement:v.value.form,panelElement:v.value.panel,inputElement:v.value.input});return Yn(p.value.core.environment,e),function(){Yn(p.value.core.environment,Object.keys(e).reduce((function(e,t){return ta(ta({},e),{},na({},t,void 0))}),{}))}})),r((function(){var e=f.value?p.value.core.environment.document.body:p.value.renderer.panelContainer,t=f.value?v.value.detachedOverlay:v.value.panel;return f.value&&m.current.isOpen&&_(!0),k(m.current),function(){e.contains(t)&&e.removeChild(t)}})),r((function(){var e=p.value.renderer.container;return e.appendChild(v.value.root),function(){e.removeChild(v.value.root)}})),r((function(){var e=Mn((function(e){k(e.state)}),0);return d.current=function(t){var n=t.state,r=t.prevState;(f.value&&r.isOpen!==n.isOpen&&_(n.isOpen),f.value||!n.isOpen||r.isOpen||w(),n.query!==r.query)&&p.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){d.current=void 0}})),r((function(){var e=Mn((function(){var e=f.value;f.value=p.value.core.environment.matchMedia(p.value.renderer.detachedMediaQuery).matches,e!==f.value?S({}):requestAnimationFrame(w)}),20);return p.value.core.environment.addEventListener("resize",e),function(){p.value.core.environment.removeEventListener("resize",e)}})),r((function(){if(!f.value)return function(){};function e(e){v.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=p.value.core.environment.matchMedia(getComputedStyle(p.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),r((function(){return requestAnimationFrame(w),function(){}})),ta(ta({},b),{},{update:S,destroy:function(){o()}})}var oa=n(79722);const aa=n(72278),ia=aa;var sa=n(813),la=n.n(sa);function ca(){const e=(0,s.TH)(),t=(0,s.k6)(),{siteConfig:{baseUrl:n}}=(0,le.Z)(),[o,a]=(0,r.useState)({terms:[],isDocsOrBlog:!1});return(0,r.useEffect)((()=>{if(!e.state?.cmfcmfhighlight||0===e.state.cmfcmfhighlight.terms.length)return;a(e.state.cmfcmfhighlight);const{cmfcmfhighlight:n,...r}=e.state;t.replace({...e,state:r})}),[e.state?.cmfcmfhighlight,t,e]),(0,r.useEffect)((()=>{if(0===o.terms.length)return;const e=o.isDocsOrBlog?document.getElementsByTagName("article")[0]:document.getElementsByTagName("main")[0];if(!e)return;const t=new(la())(e),n={ignoreJoiners:!0};return t.mark(o.terms,n),()=>t.unmark(n)}),[o,n]),null}var ua=n(2591),da=n(90356);function pa(e){let{document:t}=e;const[n,r]=t.sectionRoute.split("#");let o=n;return r&&(o+="#"+r),o}const fa={documents:[],index:ia((function(){this.ref("id"),this.field("title"),this.field("content")}))};const ga=()=>{const e=(0,B.Z)(),[t,o]=(0,r.useState)((()=>!!e&&"dark"===document.documentElement.getAttribute("data-theme")));(0,r.useEffect)((()=>{const e=new MutationObserver((()=>{o("dark"===document.documentElement.getAttribute("data-theme"))}));return e.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>e.disconnect()}),[]);const{siteConfig:{baseUrl:a}}=(0,le.Z)(),{titleBoost:i,contentBoost:c,tagsBoost:u,parentCategoriesBoost:d,indexDocSidebarParentCategories:p,maxSearchResults:f}=(0,ua.eZ)("@cmfcmf/docusaurus-search-local"),g=(0,s.k6)(),{tags:m}=function(){const{i18n:e}=(0,le.Z)(),t=n(48878).z1(),r=[da.H,...t];return{locale:e.currentLocale,tags:r}}(),h=(0,r.useRef)(m);(0,r.useEffect)((()=>{h.current=m}),[m]);const b=(0,r.useRef)({}),y=async e=>{const t=b.current[e];switch(t?.state){case"ready":return t;case void 0:{const t=[];b.current[e]={state:"loading",callbacks:t};const n=await async function(e,t){{let r;try{const n=await fetch(`${e}search-index-${t}.json`);if(!n.ok)return fa;r=await n.json()}catch(n){return fa}return{documents:r.documents,index:ia.Index.load(r.index)}}}(a,e);return t.forEach((e=>e(n))),b.current[e]={state:"ready",...n}}case"loading":return new Promise((e=>{t.callbacks.push(e)}))}},v=(0,l.I)({message:"cmfcmf/d-s-l.searchBar.placeholder",description:"Placeholder shown in the searchbar"}),w=(0,r.useRef)(null),k=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(w.current)return k.current=ra({container:w.current,placeholder:v,renderer:{createElement:r.createElement,Fragment:r.Fragment,render:be.render},navigator:{navigate(e){let{item:t,itemUrl:n}=e;g.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},detachedMediaQuery:"",defaultActiveItemId:0,translations:{clearButtonTitle:(0,l.I)({message:"cmfcmf/d-s-l.searchBar.clearButtonTitle",description:"Title of the button to clear the current search input"}),detachedCancelButtonText:(0,l.I)({message:"cmfcmf/d-s-l.searchBar.detachedCancelButtonText",description:"Text of the button to close the detached search window"}),submitButtonTitle:(0,l.I)({message:"cmfcmf/d-s-l.searchBar.submitButtonTitle",description:"Title of the button to submit a new search"})},getSources(e){let{query:t}=e;return[{sourceId:"search-results",templates:{item(e){let{item:t}=e;const n=pa(t);return r.createElement("a",{href:n,className:"aa-ItemLink",onClick:e=>{e.preventDefault(),g.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},r.createElement("div",{className:"aa-ItemContentTitle"},t.document.sectionTitle),t.document.pageTitle!==t.document.sectionTitle&&r.createElement("div",{className:"aa-ItemContentDescription"},t.document.pageTitle))),r.createElement("div",{className:"aa-ItemActions"},r.createElement("button",{className:"aa-ItemActionButton aa-DesktopOnly aa-ActiveOnly",type:"button",title:"Select"},r.createElement("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor"},r.createElement("path",{d:"M18.984 6.984h2.016v6h-15.188l3.609 3.609-1.406 1.406-6-6 6-6 1.406 1.406-3.609 3.609h13.172v-4.031z"})))))},noResults:()=>r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},(0,l.I)({message:"cmfcmf/d-s-l.searchBar.noResults",description:"message shown if no results are found"})))},getItemUrl(e){let{item:t}=e;return pa(t)},async getItems(){const e=h.current,n=await Promise.all(e.map((e=>y(e)))),r=(e=>aa.tokenizer(e).map((e=>e.str)))(t);return n.flatMap((e=>{let{index:t,documents:n}=e;return t.query((e=>{e.term(r,{fields:["title"],boost:i}),e.term(r,{fields:["title"],boost:i,wildcard:ia.Query.wildcard.TRAILING}),e.term(r,{fields:["content"],boost:c}),e.term(r,{fields:["content"],boost:c,wildcard:ia.Query.wildcard.TRAILING}),e.term(r,{fields:["tags"],boost:u}),e.term(r,{fields:["tags"],boost:u,wildcard:ia.Query.wildcard.TRAILING}),p&&(e.term(r,{fields:["sidebarParentCategories"],boost:d}),e.term(r,{fields:["sidebarParentCategories"],boost:d,wildcard:ia.Query.wildcard.TRAILING}))})).slice(0,f).map((e=>({document:n.find((t=>t.id.toString()===e.ref)),score:e.score,terms:r})))})).sort(((e,t)=>t.score-e.score)).slice(0,f)}}]}}),()=>k.current?.destroy()}),[f]),r.createElement(r.Fragment,null,r.createElement(oa.Z,null,r.createElement("body",{"data-theme":t?"dark":"light"})),r.createElement(ca,null),r.createElement("div",{className:"dsla-search-wrapper"},r.createElement("div",{className:"dsla-search-field",ref:w,"data-tags":m.join(",")})))},ma={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ha(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.Z)(n,ma.navbarSearchContainer),children:t})}var ba=n(48878),ya=n(68879);var va=n(5055);function wa(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const ka={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,ge.l)(),{search:f,hash:g}=(0,s.TH)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:he}),h]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ha,{className:n,children:(0,u.jsx)(ga,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.Z)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ba.Iw)(r),i=(0,ya.vY)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ba.Iw)(r),i=(0,ya.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ya.lO)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.TH)(),p=(0,ba.Iw)(n),f=(0,ba.gB)(n),{savePreferredVersionName:g}=(0,va.J)(n),m=[...o,...f.map((function(e){const t=wa(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...a],h=(0,ya.lO)(n)[0],b=t&&m.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&m.length>1?void 0:wa(h,p).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}},Sa=ka;function _a(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Sa[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function xa(){const e=(0,C.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(_a,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ea(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Oa(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ea,{onClick:()=>t.hide()}),t.content]})}function Pa(){const e=(0,C.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(F,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(xa,{}),secondaryMenu:(0,u.jsx)(Oa,{})}):null}const ja={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ca(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.Z)("navbar-sidebar__backdrop",e.className)})}function Ta(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),i=(0,C.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,T.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i =s?n(!1):i+c {if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[ja.navbarHideable,!d&&ja.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ca,{onClick:i.toggle}),(0,u.jsx)(Pa,{})]})}var Ia=n(48820);const Aa={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Na(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function La(e){let{error:t}=e;const n=(0,Ia.BN)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Aa.errorBoundaryError,children:n})}class Ra extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Da="right";function Fa(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Ma(){const{toggle:e,shown:t}=(0,C.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Fa,{})})}const Ba={colorModeToggle:"colorModeToggle_DEke"};function za(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Ra,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(_a,{...e})},t)))})}function Ua(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function $a(){const e=(0,C.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Da)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(Ua,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Ma,{}),(0,u.jsx)(W,{}),(0,u.jsx)(za,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(za,{items:r}),(0,u.jsx)(Q,{className:Ba.colorModeToggle}),!o&&(0,u.jsx)(ha,{children:(0,u.jsx)(ga,{})})]})})}function Ha(){return(0,u.jsx)(Ta,{children:(0,u.jsx)($a,{})})}function qa(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.ZP)(n),l=(0,X.ZP)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(K.Z,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function Va(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(qa,{item:t})},t.href??t.to)}function Qa(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(Va,{item:e},t)))})]})}function Za(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Qa,{column:e},t)))})}function Wa(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ga(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(qa,{item:t})}function Ya(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Ga,{item:e}),t.length!==n+1&&(0,u.jsx)(Wa,{})]},n)))})})}function Ka(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Za,{columns:t}):(0,u.jsx)(Ya,{links:t})}var Xa=n(64553);const Ja={footerLogoLink:"footerLogoLink_BH7S"};function ei(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.Cg)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(Xa.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function ti(e){let{logo:t}=e;return t.href?(0,u.jsx)(K.Z,{href:t.href,className:Ja.footerLogoLink,target:t.target,children:(0,u.jsx)(ei,{logo:t})}):(0,u.jsx)(ei,{logo:t})}function ni(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ri(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function oi(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(ri,{style:o,links:n&&n.length>0&&(0,u.jsx)(Ka,{links:n}),logo:r&&(0,u.jsx)(ti,{logo:r}),copyright:t&&(0,u.jsx)(ni,{copyright:t})})}const ai=r.memo(oi),ii=(0,I.Qc)([M.S,k.p,T.OC,va.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(A.n2,{children:(0,u.jsx)(C.M,{children:(0,u.jsx)(L,{children:t})})})}]);function si(e){let{children:t}=e;return(0,u.jsx)(ii,{children:t})}var li=n(42704);function ci(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(li.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Na,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(La,{error:t})})]})})})}const ui={mainWrapper:"mainWrapper_z2l0"};function di(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,u.jsxs)(si,{children:[(0,u.jsx)(i.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(j,{}),(0,u.jsx)(Ha,{}),(0,u.jsx)("div",{id:d,className:(0,o.Z)(h.k.wrapper.main,ui.mainWrapper,r),children:(0,u.jsx)(a.Z,{fallback:e=>(0,u.jsx)(ci,{...e}),children:t})}),!n&&(0,u.jsx)(ai,{})]})}},82546:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(38208),o=n(23466),a=n(75276),i=n(39581),s=n(64553),l=n(85893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.ZP)(t.src),dark:(0,o.ZP)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.ZP)(s?.href||"/"),g=n?"":t,m=s?.alt??g;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},62362:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(67294);var r=n(79722),o=n(85893);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.Z,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},64553:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(67294),o=n(788),a=n(45025),i=n(61503);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(85893);function c(e){let{className:t,children:n}=e;const c=(0,a.Z)(),{colorMode:u}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},93841:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>b});var r=n(67294),o=n(29629),a=n(1290),i=n(68048),s=n(85893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.Z.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.Z)((()=>{t||i(!0)}),[t]),(0,a.Z)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:m;return(0,s.jsx)(r,{...n})}},25461:(e,t,n)=>{"use strict";n.d(t,{n:()=>m,p:()=>g});var r=n(67294),o=n(45025),a=n(1606),i=n(20585),s=n(39581),l=n(85893);const c=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},61503:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>h});var r=n(67294),o=n(29629),a=n(20585),i=n(1606),s=n(39581),l=n(85893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>o.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,a]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},44160:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(67294),o=n(5689),a=n(62550),i=n(39222),s=n(39581),l=n(20585),c=n(85893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},5689:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(67294),o=n(20585),a=n(85893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},95099:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(67294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},62550:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(67294),o=n(29629);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},50563:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},68048:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},39222:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>l});var r=n(67294),o=n(16550),a=n(20585);function i(e){!function(e){const t=(0,o.k6)(),n=(0,a.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},79113:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}function a(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{jj:()=>o,lx:()=>r,vM:()=>a})},96984:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(67294),o=n(788),a=n(79722),i=n(3675),s=n(23466),l=n(75276);var c=n(85893);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.Cg)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.Z,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.Z)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.Z,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,i.Z)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.Z)(r,a),children:t})}},20585:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>i});var r=n(67294),o=n(1290),a=n(85893);function i(e){const t=(0,r.useRef)(e);return(0,o.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(? \w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},51997:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),o=n(78179),a=n(75276);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},18119:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>m,OC:()=>u,RF:()=>f,o5:()=>g});var r=n(67294),o=n(29629),a=n(45025),i=n(1290),s=n(20585),l=n(85893);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const p=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function g(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function m(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},90356:(e,t,n)=>{"use strict";n.d(t,{H:()=>r});const r="default"},1606:(e,t,n)=>{"use strict";n.d(t,{WA:()=>u,Nk:()=>d});var r=n(67294);const o=JSON.parse('{"d":"localStorage","u":""}'),a=o.d;function i(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.u}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},76862:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(75276),o=n(16550),a=n(48820);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),c=(0,a.Do)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},89062:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),o=n(16550),a=n(20585);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},39581:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(75276);function o(){return(0,r.Z)().siteConfig.themeConfig}},38761:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(67518);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},39007:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},48820:(e,t,n)=>{"use strict";t.BN=t.Do=t.uR=void 0;const r=n(97582);t.uR="__blog-post-container";var o=n(38761);Object.defineProperty(t,"Do",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(67518);var i=n(39007);Object.defineProperty(t,"BN",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},67518:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},99318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>O,ob:()=>f,PP:()=>j,Ep:()=>p});var r=n(83117);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r =0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(38776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t {"use strict";var r=n(21296),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),h=0;h {"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case h:case m:case l:return e;default:return t}}case o:return t}}}function S(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=h,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return S(e)||k(e)===u},t.isConcurrentMode=S,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===p},t.isFragment=function(e){return k(e)===a},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===o},t.isProfiler=function(e){return k(e)===s},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===f||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},21296:(e,t,n)=>{"use strict";e.exports=n(96103)},41143:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},813:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n 1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=o,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var o=e.contentWindow;if(r=o.document,!o||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,o=!1,a=null,i=function i(){if(!o){o=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),s=i.length,l=0;i=Array.prototype.slice.call(i);var c=function(){--s<=0&&a(l)};s||c(),i.forEach((function(t){e.matches(t,o.exclude)?c():o.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),c()}),c)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var o=!1,a=!1;return r.forEach((function(e,t){e.val===n&&(o=t,a=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==o||a?!1===o||a||(r[o].handled=!0):r.push({val:n,handled:!0}),!0):(!1===o&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var o=this;e.forEach((function(e){e.handled||o.getIframeContents(e.val,(function(e){o.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,o){for(var a=this,i=this.createIterator(t,e,r),s=[],l=[],c=void 0,u=void 0,d=function(){var e=a.getIteratorNode(i);return u=e.prevNode,c=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return a.checkIframeFilter(c,u,e,s)}),(function(t){a.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(c);l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),o()}},{key:"forEachNode",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),i=a.length;i||o(),a.forEach((function(a){var s=function(){r.iterateThroughNodes(e,a,t,n,(function(){--i<=0&&o()}))};r.iframes?r.waitForIframes(a,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var o=!1;return n.every((function(t){return!r.call(e,t)||(o=!0,!1)})),o}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==i&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(o){n.every((function(n){if(-1!==n.indexOf(o)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,o="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,i="";switch(a.forEach((function(e){i+="|"+t.escapeStr(e)})),o){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var o=t.callNoMatchOnInvalidRanges(e,r),a=o.start,i=o.end;o.valid&&(e.start=a,e.length=i-a,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,o=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?o=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:o}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,o=!0,a=n.length,i=t-a,s=parseInt(e.start,10)-i;return(r=(s=s>a?a:s)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),s<0||r-s<0||s>a||r>a?(o=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(o=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:o}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return o.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",o=e.splitText(t),a=o.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=o.textContent,o.parentNode.replaceChild(i,o),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,o){var a=this;e.nodes.every((function(i,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(i.node))return!1;var c=t-i.start,u=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),p=e.value.substr(u+i.start);if(i.node=a.wrapRangeInTextNode(i.node,c,u),e.value=d+p,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,o(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,o){var a=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var o=void 0;null!==(o=e.exec(t.textContent))&&""!==o[i];)if(n(o[i],t)){var s=o.index;if(0!==i)for(var l=1;l{"use strict";n.r(t)},47257:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:' '};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},57874:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i {!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(Prism)},29525:()=>{Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}},96854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l =a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(g+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(h),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},86862:()=>{!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},24249:(e,t,n)=>{var r={"./prism-bash":57874,"./prism-diff":40728,"./prism-ini":29525,"./prism-powershell":86862};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=24249},92703:(e,t,n)=>{"use strict";var r=n(50414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),o=n(63840);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(g,e)||!d.call(f,e)&&(p.test(e)?g[e]=!0:(f[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),h.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=Symbol.for("react.element"),S=Symbol.for("react.portal"),_=Symbol.for("react.fragment"),x=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),O=Symbol.for("react.provider"),P=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),C=Symbol.for("react.suspense"),T=Symbol.for("react.suspense_list"),I=Symbol.for("react.memo"),A=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var N=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var L=Symbol.iterator;function R(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=L&&e[L]||e["@@iterator"])?e:null}var D,F=Object.assign;function M(e){if(void 0===D)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);D=t&&t[1]||""}return"\n"+D+e}var B=!1;function z(e,t){if(!e||B)return"";B=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes(" ")&&(l=l.replace(" ",e.displayName)),l}}while(1<=i&&0<=s);break}}}finally{B=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?M(e):""}function U(e){switch(e.tag){case 5:return M(e.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return e=z(e.type,!1);case 11:return e=z(e.type.render,!1);case 1:return e=z(e.type,!0);default:return""}}function $(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case _:return"Fragment";case S:return"Portal";case E:return"Profiler";case x:return"StrictMode";case C:return"Suspense";case T:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case P:return(e.displayName||"Context")+".Consumer";case O:return(e._context.displayName||"Context")+".Provider";case j:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case I:return null!==(t=e.displayName||null)?t:$(e.type)||"Memo";case A:t=e._payload,e=e._init;try{return $(e(t))}catch(n){}}return null}function H(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return $(t);case 8:return t===x?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function q(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function V(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Q(e){e._valueTracker||(e._valueTracker=function(e){var t=V(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Z(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=V(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function W(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function G(e,t){var n=t.checked;return F({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=q(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function K(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function X(e,t){K(e,t);var n=q(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,q(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&W(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o "+t.valueOf().toString()+"",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var fe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ge=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||fe.hasOwnProperty(e)&&fe[e]?(""+t).trim():t+"px"}function he(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(fe).forEach((function(e){ge.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),fe[t]=fe[e]}))}));var be=F({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function ke(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Se=null,_e=null,xe=null;function Ee(e){if(e=wo(e)){if("function"!=typeof Se)throw Error(a(280));var t=e.stateNode;t&&(t=So(t),Se(e.stateNode,e.type,t))}}function Oe(e){_e?xe?xe.push(e):xe=[e]:_e=e}function Pe(){if(_e){var e=_e,t=xe;if(xe=_e=null,Ee(e),t)for(e=0;e >>=0,0===e?32:31-(st(e)/lt|0)|0},st=Math.log,lt=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var s=i&~o;0!==s?r=dt(s):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&0==(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&0!=(4194240&a)))return t;if(0!=(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0 n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1< =Rn),Mn=String.fromCharCode(32),Bn=!1;function zn(e,t){switch(e){case"keyup":return-1!==Nn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Un(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var $n=!1;var Hn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function qn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Hn[e.type]:"textarea"===t}function Vn(e,t,n,r){Oe(r),0<(t=Qr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Qn=null,Zn=null;function Wn(e){Mr(e,0)}function Gn(e){if(Z(ko(e)))return e}function Yn(e,t){if("change"===e)return t}var Kn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Kn=Xn&&(!document.documentMode||9 =t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function pr(){for(var e=window,t=W();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=W((e=t.contentWindow).document)}return t}function fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function gr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&fr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n =document.documentMode,hr=null,br=null,yr=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==hr||hr!==W(r)||("selectionStart"in(r=hr)&&fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},yr&&lr(yr,r)||(yr=r,0<(r=Qr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=hr)))}function kr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Sr={animationend:kr("Animation","AnimationEnd"),animationiteration:kr("Animation","AnimationIteration"),animationstart:kr("Animation","AnimationStart"),transitionend:kr("Transition","TransitionEnd")},_r={},xr={};function Er(e){if(_r[e])return _r[e];if(!Sr[e])return e;var t,n=Sr[e];for(t in n)if(n.hasOwnProperty(t)&&t in xr)return _r[e]=n[t];return e}u&&(xr=document.createElement("div").style,"AnimationEvent"in window||(delete Sr.animationend.animation,delete Sr.animationiteration.animation,delete Sr.animationstart.animation),"TransitionEvent"in window||delete Sr.transitionend.transition);var Or=Er("animationend"),Pr=Er("animationiteration"),jr=Er("animationstart"),Cr=Er("transitionend"),Tr=new Map,Ir="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Ar(e,t){Tr.set(e,t),l(t,[e])}for(var Nr=0;Nr xo||(e.current=_o[xo],_o[xo]=null,xo--)}function Po(e,t){xo++,_o[xo]=e.current,e.current=t}var jo={},Co=Eo(jo),To=Eo(!1),Io=jo;function Ao(e,t){var n=e.type.contextTypes;if(!n)return jo;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function No(e){return null!=(e=e.childContextTypes)}function Lo(){Oo(To),Oo(Co)}function Ro(e,t,n){if(Co.current!==jo)throw Error(a(168));Po(Co,t),Po(To,n)}function Do(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,H(e)||"Unknown",o));return F({},n,r)}function Fo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||jo,Io=Co.current,Po(Co,e),Po(To,To.current),!0}function Mo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Do(e,t,Io),r.__reactInternalMemoizedMergedChildContext=e,Oo(To),Oo(Co),Po(Co,e)):Oo(To),Po(To,n)}var Bo=null,zo=!1,Uo=!1;function $o(e){null===Bo?Bo=[e]:Bo.push(e)}function Ho(){if(!Uo&&null!==Bo){Uo=!0;var e=0,t=vt;try{var n=Bo;for(vt=1;e >=i,o-=i,Ko=1<<32-it(t)+o|n< m?(h=d,d=null):h=d.sibling;var b=f(o,d,s[m],l);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(o,d),a=i(b,a,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===s.length)return n(o,d),aa&&Jo(o,m),c;if(null===d){for(;m h?(b=m,m=null):b=m.sibling;var v=f(o,m,y.value,c);if(null===v){null===m&&(m=b);break}e&&m&&null===v.alternate&&t(o,m),s=i(v,s,h),null===d?u=v:d.sibling=v,d=v,m=b}if(y.done)return n(o,m),aa&&Jo(o,h),u;if(null===m){for(;!y.done;h++,y=l.next())null!==(y=p(o,y.value,c))&&(s=i(y,s,h),null===d?u=y:d.sibling=y,d=y);return aa&&Jo(o,h),u}for(m=r(o,m);!y.done;h++,y=l.next())null!==(y=g(m,o,h,y.value,c))&&(e&&null!==y.alternate&&m.delete(null===y.key?h:y.key),s=i(y,s,h),null===d?u=y:d.sibling=y,d=y);return e&&m.forEach((function(e){return t(o,e)})),aa&&Jo(o,h),u}return function e(r,a,i,l){if("object"==typeof i&&null!==i&&i.type===_&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case k:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===_){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===A&&Ga(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=Za(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===_?((a=Dc(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Rc(i.type,i.key,i.props,null,r.mode,l)).ref=Za(r,a,i),l.return=r,r=l)}return s(r);case S:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=Bc(i,r.mode,l)).return=r,r=a}return s(r);case A:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return m(r,a,i,l);if(R(i))return h(r,a,i,l);Wa(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Mc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var Ka=Ya(!0),Xa=Ya(!1),Ja={},ei=Eo(Ja),ti=Eo(Ja),ni=Eo(Ja);function ri(e){if(e===Ja)throw Error(a(174));return e}function oi(e,t){switch(Po(ni,t),Po(ti,e),Po(ei,Ja),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Oo(ei),Po(ei,t)}function ai(){Oo(ei),Oo(ti),Oo(ni)}function ii(e){ri(ni.current);var t=ri(ei.current),n=le(t,e.type);t!==n&&(Po(ti,e),Po(ei,n))}function si(e){ti.current===e&&(Oo(ei),Oo(ti))}var li=Eo(0);function ci(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ui=[];function di(){for(var e=0;e n?n:4,e(!0);var r=fi.transition;fi.transition={};try{e(!1),t()}finally{vt=n,fi.transition=r}}function es(){return Pi().memoizedState}function ts(e,t,n){var r=nc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rs(e))os(t,n);else if(null!==(n=Ca(e,t,n,r))){rc(n,e,r,tc()),as(n,t,r)}}function ns(e,t,n){var r=nc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rs(e))os(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,ja(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=Ca(e,t,o,r))&&(rc(n,e,r,o=tc()),as(n,t,r))}}function rs(e){var t=e.alternate;return e===mi||null!==t&&t===mi}function os(e,t){vi=yi=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function as(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var is={readContext:Oa,useCallback:Si,useContext:Si,useEffect:Si,useImperativeHandle:Si,useInsertionEffect:Si,useLayoutEffect:Si,useMemo:Si,useReducer:Si,useRef:Si,useState:Si,useDebugValue:Si,useDeferredValue:Si,useTransition:Si,useMutableSource:Si,useSyncExternalStore:Si,useId:Si,unstable_isNewReconciler:!1},ss={readContext:Oa,useCallback:function(e,t){return Oi().memoizedState=[e,void 0===t?null:t],e},useContext:Oa,useEffect:Hi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ui(4194308,4,Zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ui(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ui(4,2,e,t)},useMemo:function(e,t){var n=Oi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Oi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=ts.bind(null,mi,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Oi().memoizedState=e},useState:Mi,useDebugValue:Gi,useDeferredValue:function(e){return Oi().memoizedState=e},useTransition:function(){var e=Mi(!1),t=e[0];return e=Ji.bind(null,e[1]),Oi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=mi,o=Oi();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Tl)throw Error(a(349));0!=(30&gi)||Ni(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Hi(Ri.bind(null,r,i,e),[e]),r.flags|=2048,Bi(9,Li.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Oi(),t=Tl.identifierPrefix;if(aa){var n=Xo;t=":"+t+"R"+(n=(Ko&~(1<<32-it(Ko)-1)).toString(32)+n),0<(n=wi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=ki++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ls={readContext:Oa,useCallback:Yi,useContext:Oa,useEffect:qi,useImperativeHandle:Wi,useInsertionEffect:Vi,useLayoutEffect:Qi,useMemo:Ki,useReducer:Ci,useRef:zi,useState:function(){return Ci(ji)},useDebugValue:Gi,useDeferredValue:function(e){return Xi(Pi(),hi.memoizedState,e)},useTransition:function(){return[Ci(ji)[0],Pi().memoizedState]},useMutableSource:Ii,useSyncExternalStore:Ai,useId:es,unstable_isNewReconciler:!1},cs={readContext:Oa,useCallback:Yi,useContext:Oa,useEffect:qi,useImperativeHandle:Wi,useInsertionEffect:Vi,useLayoutEffect:Qi,useMemo:Ki,useReducer:Ti,useRef:zi,useState:function(){return Ti(ji)},useDebugValue:Gi,useDeferredValue:function(e){var t=Pi();return null===hi?t.memoizedState=e:Xi(t,hi.memoizedState,e)},useTransition:function(){return[Ti(ji)[0],Pi().memoizedState]},useMutableSource:Ii,useSyncExternalStore:Ai,useId:es,unstable_isNewReconciler:!1};function us(e,t){try{var n="",r=t;do{n+=U(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function ds(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function ps(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fs="function"==typeof WeakMap?WeakMap:Map;function gs(e,t,n){(n=La(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Vl||(Vl=!0,Ql=r),ps(0,t)},n}function ms(e,t,n){(n=La(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){ps(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){ps(0,t),"function"!=typeof r&&(null===Zl?Zl=new Set([this]):Zl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function hs(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fs;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Oc.bind(null,e,t,n),t.then(e,e))}function bs(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function ys(e,t,n,r,o){return 0==(1&e.mode)?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=La(-1,1)).tag=2,Ra(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var vs=w.ReactCurrentOwner,ws=!1;function ks(e,t,n,r){t.child=null===e?Xa(t,null,n,r):Ka(t,e.child,n,r)}function Ss(e,t,n,r,o){n=n.render;var a=t.ref;return Ea(t,o),r=xi(e,t,n,r,a,o),n=Ei(),null===e||ws?(aa&&n&&ta(t),t.flags|=1,ks(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Vs(e,t,o))}function _s(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Nc(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Rc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,xs(e,t,a,r,o))}if(a=e.child,0==(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Vs(e,t,o)}return t.flags|=1,(e=Lc(a,r)).ref=t.ref,e.return=t,t.child=e}function xs(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(ws=!1,t.pendingProps=r=a,0==(e.lanes&o))return t.lanes=e.lanes,Vs(e,t,o);0!=(131072&e.flags)&&(ws=!0)}}return Ps(e,t,n,r,o)}function Es(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Po(Ll,Nl),Nl|=n;else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Po(Ll,Nl),Nl|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,Po(Ll,Nl),Nl|=r}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,Po(Ll,Nl),Nl|=r;return ks(e,t,o,n),t.child}function Os(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Ps(e,t,n,r,o){var a=No(n)?Io:Co.current;return a=Ao(t,a),Ea(t,o),n=xi(e,t,n,r,a,o),r=Ei(),null===e||ws?(aa&&r&&ta(t),t.flags|=1,ks(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Vs(e,t,o))}function js(e,t,n,r,o){if(No(n)){var a=!0;Fo(t)}else a=!1;if(Ea(t,o),null===t.stateNode)qs(e,t),qa(t,n,r),Qa(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Oa(c):c=Ao(t,c=No(n)?Io:Co.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&Va(t,i,r,c),Ia=!1;var p=t.memoizedState;i.state=p,Ma(t,r,i,o),l=t.memoizedState,s!==r||p!==l||To.current||Ia?("function"==typeof u&&(Ua(t,n,u,r),l=t.memoizedState),(s=Ia||Ha(t,n,s,r,p,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Na(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ba(t.type,s),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=Oa(l):l=Ao(t,l=No(n)?Io:Co.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||p!==l)&&Va(t,i,r,l),Ia=!1,p=t.memoizedState,i.state=p,Ma(t,r,i,o);var g=t.memoizedState;s!==d||p!==g||To.current||Ia?("function"==typeof f&&(Ua(t,n,f,r),g=t.memoizedState),(c=Ia||Ha(t,n,c,r,p,g,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,g,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,g,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=g),i.props=r,i.state=g,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return Cs(e,t,n,r,a,o)}function Cs(e,t,n,r,o,a){Os(e,t);var i=0!=(128&t.flags);if(!r&&!i)return o&&Mo(t,n,!1),Vs(e,t,a);r=t.stateNode,vs.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Ka(t,e.child,null,a),t.child=Ka(t,null,s,a)):ks(e,t,s,a),t.memoizedState=r.state,o&&Mo(t,n,!0),t.child}function Ts(e){var t=e.stateNode;t.pendingContext?Ro(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Ro(0,t.context,!1),oi(e,t.containerInfo)}function Is(e,t,n,r,o){return ga(),ma(o),t.flags|=256,ks(e,t,n,r),t.child}var As,Ns,Ls,Rs,Ds={dehydrated:null,treeContext:null,retryLane:0};function Fs(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ms(e,t,n){var r,o=t.pendingProps,i=li.current,s=!1,l=0!=(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&0!=(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),Po(li,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(0==(1&t.mode)?t.lanes=1:"$!"===e.data?t.lanes=8:t.lanes=1073741824,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},0==(1&o)&&null!==s?(s.childLanes=0,s.pendingProps=l):s=Fc(l,o,0,null),e=Dc(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Fs(n),t.memoizedState=Ds,e):Bs(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,zs(e,t,s,r=ds(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Fc({mode:"visible",children:r.children},o,0,null),(i=Dc(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,0!=(1&t.mode)&&Ka(t,e.child,null,s),t.child.memoizedState=Fs(s),t.memoizedState=Ds,i);if(0==(1&t.mode))return zs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,zs(e,t,s,r=ds(i=Error(a(419)),r,void 0))}if(l=0!=(s&e.childLanes),ws||l){if(null!==(r=Tl)){switch(s&-s){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=0!=(o&(r.suspendedLanes|s))?0:o)&&o!==i.retryLane&&(i.retryLane=o,Ta(e,o),rc(r,e,o,-1))}return hc(),zs(e,t,s,r=ds(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=jc.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Wo[Go++]=Ko,Wo[Go++]=Xo,Wo[Go++]=Yo,Ko=e.id,Xo=e.overflow,Yo=t),t=Bs(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 0==(1&l)&&t.child!==i?((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null):(o=Lc(i,c)).subtreeFlags=14680064&i.subtreeFlags,null!==r?s=Lc(r,s):(s=Dc(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Fs(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Ds,o}return e=(s=e.child).sibling,o=Lc(s,{mode:"visible",children:o.children}),0==(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function Bs(e,t){return(t=Fc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zs(e,t,n,r){return null!==r&&ma(r),Ka(t,e.child,null,n),(e=Bs(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Us(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),xa(e.return,t,n)}function $s(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Hs(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(ks(e,t,r.children,n),0!=(2&(r=li.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Us(e,n,t);else if(19===e.tag)Us(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(Po(li,r),0==(1&t.mode))t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ci(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),$s(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ci(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}$s(t,!0,n,null,a);break;case"together":$s(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function qs(e,t){0==(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Vs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Fl|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Lc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Lc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Qs(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Zs(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ws(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Zs(t),null;case 1:case 17:return No(t.type)&&Lo(),Zs(t),null;case 3:return r=t.stateNode,ai(),Oo(To),Oo(Co),di(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(pa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==ia&&(sc(ia),ia=null))),Ns(e,t),Zs(t),null;case 5:si(t);var o=ri(ni.current);if(n=t.type,null!==e&&null!=t.stateNode)Ls(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Zs(t),null}if(e=ri(ei.current),pa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fo]=t,r[go]=i,e=0!=(1&t.mode),n){case"dialog":Br("cancel",r),Br("close",r);break;case"iframe":case"object":case"embed":Br("load",r);break;case"video":case"audio":for(o=0;o <\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[fo]=t,e[go]=r,As(e,t,!1,!1),t.stateNode=e;e:{switch(l=ve(n,r),n){case"dialog":Br("cancel",e),Br("close",e),o=r;break;case"iframe":case"object":case"embed":Br("load",e),o=r;break;case"video":case"audio":for(o=0;o Hl&&(t.flags|=128,r=!0,Qs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ci(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Qs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Zs(t),null}else 2*Ke()-i.renderingStartTime>Hl&&1073741824!==n&&(t.flags|=128,r=!0,Qs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ke(),t.sibling=null,n=li.current,Po(li,r?1&n|2:1&n),t):(Zs(t),null);case 22:case 23:return pc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Nl)&&(Zs(t),6&t.subtreeFlags&&(t.flags|=8192)):Zs(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Gs(e,t){switch(na(t),t.tag){case 1:return No(t.type)&&Lo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ai(),Oo(To),Oo(Co),di(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return si(t),null;case 13:if(Oo(li),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ga()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Oo(li),null;case 4:return ai(),null;case 10:return _a(t.type._context),null;case 22:case 23:return pc(),null;default:return null}}As=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ns=function(){},Ls=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ri(ei.current);var a,i=null;switch(n){case"input":o=G(e,o),r=G(e,r),i=[];break;case"select":o=F({},o,{value:void 0}),r=F({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ye(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&Br("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Rs=function(e,t,n,r){n!==r&&(t.flags|=4)};var Ys=!1,Ks=!1,Xs="function"==typeof WeakSet?WeakSet:Set,Js=null;function el(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Ec(e,t,r)}else n.current=null}function tl(e,t,n){try{n()}catch(r){Ec(e,t,r)}}var nl=!1;function rl(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&tl(t,n,a)}o=o.next}while(o!==r)}}function ol(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function al(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function il(e){var t=e.alternate;null!==t&&(e.alternate=null,il(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fo],delete t[go],delete t[ho],delete t[bo],delete t[yo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function sl(e){return 5===e.tag||3===e.tag||4===e.tag}function ll(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||sl(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function cl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}function ul(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(ul(e,t,n),e=e.sibling;null!==e;)ul(e,t,n),e=e.sibling}var dl=null,pl=!1;function fl(e,t,n){for(n=n.child;null!==n;)gl(e,t,n),n=n.sibling}function gl(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Ks||el(n,t);case 6:var r=dl,o=pl;dl=null,fl(e,t,n),pl=o,null!==(dl=r)&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):dl.removeChild(n.stateNode));break;case 18:null!==dl&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),$t(e)):lo(dl,n.stateNode));break;case 4:r=dl,o=pl,dl=n.stateNode.containerInfo,pl=!0,fl(e,t,n),dl=r,pl=o;break;case 0:case 11:case 14:case 15:if(!Ks&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(0!=(2&a)||0!=(4&a))&&tl(n,t,i),o=o.next}while(o!==r)}fl(e,t,n);break;case 1:if(!Ks&&(el(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Ec(n,t,s)}fl(e,t,n);break;case 21:fl(e,t,n);break;case 22:1&n.mode?(Ks=(r=Ks)||null!==n.memoizedState,fl(e,t,n),Ks=r):fl(e,t,n);break;default:fl(e,t,n)}}function ml(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Xs),t.forEach((function(t){var r=Cc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function hl(e,t){var n=t.deletions;if(null!==n)for(var r=0;r o&&(o=s),r&=~i}if(r=o,10<(r=(120>(r=Ke()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*El(r/1960))-r)){e.timeoutHandle=ro(Sc.bind(null,e,Ul,ql),r);break}Sc(e,Ul,ql);break;default:throw Error(a(329))}}}return oc(e,Ke()),e.callbackNode===n?ac.bind(null,e):null}function ic(e,t){var n=zl;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=bc(e,t))&&(t=Ul,Ul=n,null!==t&&sc(t)),e}function sc(e){null===Ul?Ul=e:Ul.push.apply(Ul,e)}function lc(e,t){for(t&=~Bl,t&=~Ml,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0 e?16:e,null===Gl)var r=!1;else{if(e=Gl,Gl=null,Yl=0,0!=(6&Cl))throw Error(a(331));var o=Cl;for(Cl|=4,Js=e.current;null!==Js;){var i=Js,s=i.child;if(0!=(16&Js.flags)){var l=i.deletions;if(null!==l){for(var c=0;c Ke()-$l?fc(e,0):Bl|=n),oc(e,t)}function Pc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=ut,0==(130023424&(ut<<=1))&&(ut=4194304)));var n=tc();null!==(e=Ta(e,t))&&(bt(e,t,n),oc(e,n))}function jc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Pc(e,n)}function Cc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),Pc(e,n)}function Tc(e,t){return Ze(e,t)}function Ic(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ac(e,t,n,r){return new Ic(e,t,n,r)}function Nc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Lc(e,t){var n=e.alternate;return null===n?((n=Ac(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Rc(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Nc(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case _:return Dc(n.children,o,i,t);case x:s=8,o|=8;break;case E:return(e=Ac(12,n,t,2|o)).elementType=E,e.lanes=i,e;case C:return(e=Ac(13,n,t,o)).elementType=C,e.lanes=i,e;case T:return(e=Ac(19,n,t,o)).elementType=T,e.lanes=i,e;case N:return Fc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case O:s=10;break e;case P:s=9;break e;case j:s=11;break e;case I:s=14;break e;case A:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Ac(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Dc(e,t,n,r){return(e=Ac(7,e,r,t)).lanes=n,e}function Fc(e,t,n,r){return(e=Ac(22,e,r,t)).elementType=N,e.lanes=n,e.stateNode={isHidden:!1},e}function Mc(e,t,n){return(e=Ac(6,e,null,t)).lanes=n,e}function Bc(e,t,n){return(t=Ac(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ht(0),this.expirationTimes=ht(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ht(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Uc(e,t,n,r,o,a,i,s,l){return e=new zc(e,t,n,s,l),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Ac(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Aa(a),e}function $c(e){if(!e)return jo;e:{if($e(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(No(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(No(n))return Do(e,n,t)}return t}function Hc(e,t,n,r,o,a,i,s,l){return(e=Uc(n,r,!0,e,0,a,0,s,l)).context=$c(null),n=e.current,(a=La(r=tc(),o=nc(n))).callback=null!=t?t:null,Ra(n,a,o),e.current.lanes=o,bt(e,o,r),oc(e,r),e}function qc(e,t,n,r){var o=t.current,a=tc(),i=nc(o);return n=$c(n),null===t.context?t.context=n:t.pendingContext=n,(t=La(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ra(o,t,i))&&(rc(e,o,i,a),Da(e,o,i)),i}function Vc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Qc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n {"use strict";var r=n(73935);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},73935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(64448)},69590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},70405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>V,ql:()=>J});var r=n(67294),o=n(45697),a=n.n(o),i=n(69590),s=n.n(i),l=n(41143),c=n.n(l),u=n(96774),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t =0||(o[n]=e[n]);return o}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(h).map((function(e){return h[e]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},S=Object.keys(k).reduce((function(e,t){return e[k[t]]=t,e}),{}),_=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},x=function(e){var t=_(e,h.TITLE),n=_(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=_(e,"defaultTitle");return t||r||void 0},E=function(e){return _(e,"onChangeClientState")||function(){}},O=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},P=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o /g,">").replace(/"/g,""").replace(/'/g,"'")},R=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},F=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},M=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=D(n,o),[r.createElement(h.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=R(n),a=T(t);return o?"<"+e+' data-rh="true" '+o+">"+L(a,r)+""+e+">":"<"+e+' data-rh="true">'+L(a,r)+""+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return R(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+L(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===N.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+""+e+">")}),"")}(e,t,n)}}}},B=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=I(e.metaTags,v),a=I(t,b),i=I(n,y);return{priorityMethods:{toComponent:function(){return[].concat(F(h.META,o.priority),F(h.LINK,a.priority),F(h.SCRIPT,i.priority))},toString:function(){return M(h.META,o.priority,r)+" "+M(h.LINK,a.priority,r)+" "+M(h.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=g.priorityMethods,u=g.linkTags,d=g.metaTags,p=g.scriptTags}return{priority:f,base:M(h.BASE,t,r),bodyAttributes:M("bodyAttributes",n,r),htmlAttributes:M("htmlAttributes",o,r),link:M(h.LINK,u,r),meta:M(h.META,d,r),noscript:M(h.NOSCRIPT,a,r),script:M(h.SCRIPT,p,r),style:M(h.STYLE,i,r),title:M(h.TITLE,{title:l,titleAttributes:c},r)}},z=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=B({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),H=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),q="undefined"!=typeof document,V=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);V.canUseDOM=q,V.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},V.defaultProps={context:{}},V.displayName="HelmetProvider";var Q=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},Z=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),s=0;s =0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},W=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;Z(h.BODY,e.bodyAttributes),Z(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=T(e)),Z(h.TITLE,t)}(u,d);var p={baseTag:Q(h.BASE,n),linkTags:Q(h.LINK,o),metaTags:Q(h.META,a),noscriptTags:Q(h.NOSCRIPT,i),scriptTags:Q(h.SCRIPT,l),styleTags:Q(h.STYLE,c)},f={},g={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(g[e]=p[e].oldTags)})),t&&t(),s(e,f,g)},G=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case h.BODY:return p({},o,{bodyAttributes:p({},a)});case h.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=m(r,K),s=Object.keys(i).reduce((function(e,t){return e[S[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case h.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof U||(a=new U(a.context,a.instances)),a?r.createElement(Y,p({},o,{context:a.value,helmetData:void 0})):r.createElement($.Consumer,null,(function(e){return r.createElement(Y,p({},o,{context:e}))}))},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},68356:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t {"use strict";n.d(t,{H:()=>s,f:()=>i});var r=n(16550),o=n(83117),a=n(67294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.LX)(t,e):n.length?n[n.length-1].match:r.F0.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.rs,n,e.map((function(e,n){return a.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.Z)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.Z)({},n,t,{route:e}))}})}))):null}},73727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>w,UT:()=>d,VK:()=>u,rU:()=>b});var r=n(16550),o=n(90144),a=n(67294),i=n(99318),s=n(83117),l=n(80102),c=n(38776),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o {"use strict";n.d(t,{AW:()=>x,F0:()=>v,LX:()=>_,TH:()=>N,k6:()=>A,rs:()=>T,s6:()=>y});var r=n(90144),o=n(67294),a=n(45697),i=n.n(a),s=n(99318),l=n(38776),c=n(83117),u=n(39658),d=n.n(u),p=(n(50663),n(80102)),f=(n(8679),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i {var r=n(5826);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],y=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var k=null!=m&&null!=g&&g!==m,S="+"===v||"*"===v,_="?"===v||"*"===v,x=n[2]||u,E=b||y;r.push({name:h||a++,prefix:m||"",delimiter:x,optional:_,repeat:S,partial:k,asterisk:!!w,pattern:E?c(E):w?".*":"[^"+l(x)+"]+?"})}}return i {"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case h:case m:case l:return e;default:return t}}case o:return t}}}function S(e){return k(e)===d}},50663:(e,t,n)=>{"use strict";n(30086)},75251:(e,t,n)=>{"use strict";var r=n(67294),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},72408:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,h={};function b(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var w=v.prototype=new y;w.constructor=v,m(w,b.prototype),w.isPureReactComponent=!0;var k=Array.isArray,S=Object.prototype.hasOwnProperty,_={current:null},x={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)S.call(t,o)&&!x.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1 {"use strict";e.exports=n(72408)},85893:(e,t,n)=>{"use strict";e.exports=n(75251)},60053:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0 >>1,o=e[r];if(!(0>>1;ra(l,n))c a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,p=null,f=3,g=!1,m=!1,h=!1,b="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(h=!1,w(e),!m)if(null!==r(c))m=!0,N(S);else{var t=r(u);null!==t&&L(k,t.startTime-e)}}function S(e,n){m=!1,h&&(h=!1,y(O),O=-1),g=!0;var a=f;try{for(w(n),p=r(c);null!==p&&(!(p.expirationTime>n)||e&&!C());){var i=p.callback;if("function"==typeof i){p.callback=null,f=p.priorityLevel;var s=i(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?p.callback=s:p===r(c)&&o(c),w(n)}else o(c);p=r(c)}if(null!==p)var l=!0;else{var d=r(u);null!==d&&L(k,d.startTime-n),l=!1}return l}finally{p=null,f=a,g=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var _,x=!1,E=null,O=-1,P=5,j=-1;function C(){return!(t.unstable_now()-j e||125
i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(h?(y(O),O=-1):h=!0,L(k,a-i))):(e.sortIndex=s,n(c,e),m||g||(m=!0,N(S))),e},t.unstable_shouldYield=C,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},63840:(e,t,n)=>{"use strict";e.exports=n(60053)},96774:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l {"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Solus Help Center",tagline:"Help center for the Solus operating system",favicon:"img/support-icon-2.svg",url:"https://help.getsol.us",baseUrl:"/",organizationName:"getsolus",projectName:"help-center-docs",onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{sidebarPath:"/home/runner/work/help-center-docs/help-center-docs/sidebars.js",editUrl:"https://github.com/getsolus/help-center-docs/tree/master/",showLastUpdateTime:!0},blog:{showReadingTime:!0,blogTitle:"Solus DevLog",blogDescription:"The Solus Development (b)log!",postsPerPage:"ALL",blogSidebarTitle:"All posts",blogSidebarCount:"ALL",path:"devlog"},theme:{customCss:"/home/runner/work/help-center-docs/help-center-docs/src/css/custom.css"}}]],plugins:[["/home/runner/work/help-center-docs/help-center-docs/node_modules/@cmfcmf/docusaurus-search-local/lib/server/index.js",{}],["@docusaurus/plugin-ideal-image",{quality:70,max:1030,min:640,steps:2,disableInDev:!1}]],themeConfig:{image:"img/logo.jpg",navbar:{title:"Solus Help Center",logo:{alt:"Solus Logo",src:"img/logo.svg"},items:[{type:"docSidebar",sidebarId:"userSidebar",position:"left",label:"Users"},{type:"docSidebar",sidebarId:"packagingSidebar",position:"left",label:"Packaging"},{to:"blog",label:"Dev Log",position:"left"},{label:"More",items:[{href:"https://getsol.us",label:"Solus Homepage"},{label:"Forums",href:"https://discuss.getsol.us/"},{href:"https://matrix.to/#/#solus:matrix.org",label:"Matrix"},{label:"Mastodon",href:"https://fosstodon.org/@Solus"},{label:"Github",href:"https://github.com/getsolus"},{label:"Packages",href:"https://dev.getsol.us/"},{label:"Issue Tracker",href:"https://issues.getsol.us/"},{label:"Security",href:"https://github.com/getsolus/packages/blob/main/SECURITY.md"}],type:"dropdown",position:"left"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Docs",items:[{label:"Users",to:"/docs/user/intro"},{label:"Packaging",to:"/docs/packaging"}]},{title:"News",items:[{label:"Solus Blog",to:"https://getsol.us/blog"},{label:"Solus Devlog",to:"blog"}]},{title:"Community",items:[{label:"Forums",href:"https://discuss.getsol.us"},{label:"Matrix",href:"https://matrix.to/#/#solus:matrix.org"},{label:"Mastodon",href:"https://fosstodon.org/@Solus",rel:"me"}]},{title:"More",items:[{label:"Solus Homepage",to:"https://getsol.us/"},{label:"GitHub",href:"https://github.com/getsolus",rel:"me"},{label:"Packages",href:"https://dev.getsol.us"},{label:"Issue Tracker",href:"https://issues.getsol.us"},{label:"Security",href:"https://github.com/getsolus/packages/blob/main/SECURITY.md"}]}],copyright:"Copyright \xa9 2024 Solus Project. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["bash","diff","ini","powershell"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},83117:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t r})},90144:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>o})},80102:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r =0||(o[n]=e[n]);return o}n.d(t,{Z:()=>r})},36905:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;to});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;to});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n{"use strict";n.d(t,{y$:()=>J,p1:()=>O});var r=n(67294);function o(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;tt in e?p(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,S=(e,t)=>{for(var n in t||(t={}))v.call(t,n)&&k(e,n,t[n]);if(b)for(var n of b(t))w.call(t,n)&&k(e,n,t[n]);return e},_=(e,t)=>f(e,m(t)),x=(e,t)=>{var n={};for(var r in e)v.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&b)for(var r of b(e))t.indexOf(r)<0&&w.call(e,r)&&(n[r]=e[r]);return n},E=(i={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);_+=S.value.length,S=S.next){var x=S.value;if(t.length>e.length)return;if(!(x instanceof o)){var E,O=1;if(y){if(!(E=a(k,_,e,b))||E.index>=e.length)break;var P=E.index,j=E.index+E[0].length,C=_;for(C+=S.value.length;P>=C;)C+=(S=S.next).value.length;if(_=C-=S.value.length,S.value instanceof o)continue;for(var T=S;T!==t.tail&&(C d.reach&&(d.reach=L);var R=S.prev;if(A&&(R=l(t,R,A),_+=A.length),c(t,R,O),S=l(t,R,new o(p,h?r.tokenize(I,h):I,v,I)),N&&l(t,S,N),O>1){var D={cause:p+","+g,reach:L};i(e,t,n,S.prev,_,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o "+a.content+""+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return s||(0,i[h(i)[0]])((s={exports:{}}).exports,s),s.exports}),O=((e,t,n)=>(n=null!=e?d(y(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of h(t))v.call(e,o)||o===n||p(e,o,{get:()=>t[o],enumerable:!(r=g(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:p(n,"default",{value:e,enumerable:!0}),e)))(E());O.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},O.languages.markup.tag.inside["attr-value"].inside.entity=O.languages.markup.entity,O.languages.markup.doctype.inside["internal-subset"].inside=O.languages.markup,O.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(O.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:O.languages[t]},n.cdata=/^$/i,{"included-cdata":{pattern://i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:O.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},O.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(O.languages.markup.tag,"addAttribute",{value:function(e,t){O.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:O.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),O.languages.html=O.languages.markup,O.languages.mathml=O.languages.markup,O.languages.svg=O.languages.markup,O.languages.xml=O.languages.extend("markup",{}),O.languages.ssml=O.languages.xml,O.languages.atom=O.languages.xml,O.languages.rss=O.languages.xml,function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(O),O.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},O.languages.javascript=O.languages.extend("clike",{"class-name":[O.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),O.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,O.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:O.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:O.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:O.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:O.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:O.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),O.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:O.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),O.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),O.languages.markup&&(O.languages.markup.tag.addInlined("script","javascript"),O.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),O.languages.js=O.languages.javascript,O.languages.actionscript=O.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<|>>?>?|[!=]=?)=?|[~?@]/}),O.languages.actionscript["class-name"].alias="function",delete O.languages.actionscript.parameter,delete O.languages.actionscript["literal-property"],O.languages.markup&&O.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:O.languages.markup}}),c=/#(?!\{).+/,u={pattern:/#\{[^}]+\}/,alias:"variable"},(l=O).languages.coffeescript=l.languages.extend("javascript",{comment:c,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:u}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),l.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:c,interpolation:u}}}),l.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:l.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:u}}]}),l.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete l.languages.coffeescript["template-string"],l.languages.coffee=l.languages.coffeescript,function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var s=0,l=i.length;s |\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(O),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-] )(?:[ \t]*(?:(?![#:]) |: ))*/.source.replace(/ /g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s< >[ \t]+)?)(?:< >)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/< >/g,(function(){return r})).replace(/< >/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s< >[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/< >/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:< >[ \t]+)?)< >(?=\s*:\s)/.source.replace(/< >/g,(function(){return r})).replace(/< >/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(O),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/ /g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_) |_(?:(?!_) )+_)+__\b|\*\*(?:(?!\*) |\*(?:(?!\*) )+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_) |__(?:(?!_) )+__)+_\b|\*(?:(?!\*) |\*\*(?:(?!\*) )+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~) )+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]) )+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]) )+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n ",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(O),O.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:O.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},O.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n ?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a =d.length)return;var i,l,p,f,g,m,h,b=n[a];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(h=(m="string"==typeof b?b:b.content).indexOf(i))&&(++c,l=m.substring(0,h),g=u[i],p=void 0,(f={})["interpolation-punctuation"]=o,3===(f=e.tokenize(g,f)).length&&((p=[1,1]).push.apply(p,s(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,g),f=m.substring(h+i.length),g=[],l&&g.push(l),g.push(p),f&&(t(m=[f]),g.push.apply(g,m)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(g)),a+=g.length-1):b.content=g)):(h=b.content,Array.isArray(h)?t(h):t([h]))}}(l),new e.Token(i,l,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r ]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(O),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?: \s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/ /g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(O),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(O),O.languages.n4js=O.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),O.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),O.languages.n4jsd=O.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/ /g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?: (?:\s*,\s*(?:\*\s*as\s+ |\{[^{}]*\}))?|\*\s*as\s+ |\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+ )?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?