From 6eae045f09f6eff1ffeab199c0f2999e8714665d Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 8 Sep 2023 22:02:25 +0200 Subject: [PATCH 01/70] Added 'Preview' to resource strings --- lazpaint/release/bin/i18n/lazpaint.ar.po | 6 ++++ lazpaint/release/bin/i18n/lazpaint.bg.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.cs.po | 8 +++++ lazpaint/release/bin/i18n/lazpaint.de.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.es.po | 8 +++++ lazpaint/release/bin/i18n/lazpaint.fi.po | 6 ++++ lazpaint/release/bin/i18n/lazpaint.fr.mo | Bin 0 -> 57604 bytes lazpaint/release/bin/i18n/lazpaint.fr.po | 11 ++++-- lazpaint/release/bin/i18n/lazpaint.it.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.ja.po | 6 ++++ lazpaint/release/bin/i18n/lazpaint.kab.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.lv.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.nl.po | 37 +++++++++----------- lazpaint/release/bin/i18n/lazpaint.pl.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.pot | 6 ++++ lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.ru.po | 8 +++++ lazpaint/release/bin/i18n/lazpaint.sv.po | 7 ++++ lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 7 ++++ lazpaint/uresourcestrings.pas | 2 ++ 20 files changed, 138 insertions(+), 23 deletions(-) create mode 100644 lazpaint/release/bin/i18n/lazpaint.fr.mo diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index 93713075..d4255ba3 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -2444,6 +2444,7 @@ msgid "Levels :" msgstr "المستوى :" #: tfpreviewdialog.caption +msgctxt "tfpreviewdialog.caption" msgid "Preview" msgstr "" @@ -3547,6 +3548,11 @@ msgstr "" msgid "Preset name" msgstr "الإسم مسبقا" +#: uresourcestrings.rspreview +msgctxt "uresourcestrings.rspreview" +msgid "Preview" +msgstr "" + #: uresourcestrings.rspx msgid "px" msgstr "px" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index c7f029ec..58f710e6 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -2431,6 +2431,7 @@ msgid "Levels :" msgstr "Равнища:" #: tfpreviewdialog.caption +msgctxt "tfpreviewdialog.caption" msgid "Preview" msgstr "Преглед" @@ -3529,6 +3530,12 @@ msgstr "" msgid "Preset name" msgstr "Предварително зададено име" +#: uresourcestrings.rspreview +#, fuzzy +msgctxt "uresourcestrings.rspreview" +msgid "Preview" +msgstr "Преглед" + #: uresourcestrings.rspx msgid "px" msgstr "точки" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index 3d57f1ee..36ea7570 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -2293,6 +2293,7 @@ msgid "Levels :" msgstr "Úrovně:" #: tfpreviewdialog.caption +msgctxt "tfpreviewdialog.caption" msgid "Preview" msgstr "Náhled" @@ -3379,6 +3380,12 @@ msgstr "Obarvit vrstvu použitím palety" msgid "Preset name" msgstr "Jméno předvolby" +#: uresourcestrings.rspreview +#, fuzzy +msgctxt "uresourcestrings.rspreview" +msgid "Preview" +msgstr "Náhled" + #: uresourcestrings.rspx msgid "px" msgstr "px" @@ -3632,3 +3639,4 @@ msgstr "Přiblížit sadu vrstev" #: uresourcestrings.rszoomlayerstackout msgid "Zoom layer stack out" msgstr "Oddálit sadu vrstev" + diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index 3df19687..8fee3408 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -2455,6 +2455,7 @@ msgid "Levels :" msgstr "Stufen:" #: tfpreviewdialog.caption +msgctxt "tfpreviewdialog.caption" msgid "Preview" msgstr "Vorschau" @@ -3558,6 +3559,12 @@ msgstr "Posterisierung der Ebene mit der Palette anwenden" msgid "Preset name" msgstr "Voreingestellter Name" +#: uresourcestrings.rspreview +#, fuzzy +msgctxt "uresourcestrings.rspreview" +msgid "Preview" +msgstr "Vorschau" + #: uresourcestrings.rspx msgid "px" msgstr "px" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index 583fa72e..77509778 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -2437,6 +2437,7 @@ msgid "Levels :" msgstr "Niveles:" #: tfpreviewdialog.caption +msgctxt "tfpreviewdialog.caption" msgid "Preview" msgstr "Vista previa" @@ -3553,6 +3554,12 @@ msgstr "Posterizar capa usando paleta" msgid "Preset name" msgstr "Nombre de preajuste" +#: uresourcestrings.rspreview +#, fuzzy +msgctxt "uresourcestrings.rspreview" +msgid "Preview" +msgstr "Vista previa" + #: uresourcestrings.rspx msgid "px" msgstr "px" @@ -3813,3 +3820,4 @@ msgstr "Hacer zoom en capas" msgctxt "uresourcestrings.rszoomlayerstackout" msgid "Zoom layer stack out" msgstr "Deshacer zoom en capas" + diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index 9e055478..2707e3cd 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -2436,6 +2436,7 @@ msgid "Levels :" msgstr "" #: tfpreviewdialog.caption +msgctxt "tfpreviewdialog.caption" msgid "Preview" msgstr "" @@ -3539,6 +3540,11 @@ msgstr "" msgid "Preset name" msgstr "" +#: uresourcestrings.rspreview +msgctxt "uresourcestrings.rspreview" +msgid "Preview" +msgstr "" + #: uresourcestrings.rspx msgid "px" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.mo b/lazpaint/release/bin/i18n/lazpaint.fr.mo new file mode 100644 index 0000000000000000000000000000000000000000..5e8e28b3045cd871c39c4fc5d1bd65f94506796b GIT binary patch literal 57604 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 Date: Fri, 8 Sep 2023 22:04:47 +0200 Subject: [PATCH 02/70] Added the Preview functionality --- lazpaint/dialog/filter/upixelate.lfm | 22 ++++++++++++++++------ lazpaint/dialog/filter/upixelate.pas | 22 ++++++++++++++++++++-- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/lazpaint/dialog/filter/upixelate.lfm b/lazpaint/dialog/filter/upixelate.lfm index c0233a56..bc6c4084 100644 --- a/lazpaint/dialog/filter/upixelate.lfm +++ b/lazpaint/dialog/filter/upixelate.lfm @@ -1,6 +1,6 @@ object FPixelate: TFPixelate Left = 607 - Height = 125 + Height = 144 Top = 313 Width = 179 AutoSize = True @@ -13,12 +13,12 @@ object FPixelate: TFPixelate ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 125 + ClientHeight = 144 ClientWidth = 179 OnCreate = FormCreate OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Panel1: TPanel Left = 8 Height = 23 @@ -35,13 +35,13 @@ object FPixelate: TFPixelate Left = 0 Height = 23 Top = 0 - Width = 52 + Width = 53 Caption = 'Pixel size :' Layout = tlCenter ParentColor = False end object SpinEdit_PixelSize: TSpinEdit - Left = 60 + Left = 61 Height = 23 Top = 0 Width = 65 @@ -85,10 +85,20 @@ object FPixelate: TFPixelate TabOrder = 0 end end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 70 + Width = 152 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 3 + end object Panel3: TPanel Left = 8 Height = 25 - Top = 70 + Top = 97 Width = 152 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 diff --git a/lazpaint/dialog/filter/upixelate.pas b/lazpaint/dialog/filter/upixelate.pas index 1e6df6fd..fef51e82 100644 --- a/lazpaint/dialog/filter/upixelate.pas +++ b/lazpaint/dialog/filter/upixelate.pas @@ -17,6 +17,7 @@ interface TFPixelate = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; ComboBox_Quality: TComboBox; Label_Quality: TLabel; Label_PixelSize: TLabel; @@ -25,6 +26,7 @@ TFPixelate = class(TForm) Panel3: TPanel; SpinEdit_PixelSize: TSpinEdit; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure ComboBox_QualityChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); @@ -97,6 +99,8 @@ procedure TFPixelate.Button_OKClick(Sender: TObject); var qualityStr: TCaption; begin + if not CheckBox_Preview.Checked then PreviewNeeded; + FFilterConnector.ValidateAction; FFilterConnector.LazPaintInstance.Config.SetDefaultPixelateSize(SpinEdit_PixelSize.Value); qualityStr := ComboBox_Quality.Text; @@ -109,9 +113,19 @@ procedure TFPixelate.Button_OKClick(Sender: TObject); ModalResult := mrOK; end; +procedure TFPixelate.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + PreviewNeeded + else + FFilterConnector.RestoreBackup; +end; + procedure TFPixelate.ComboBox_QualityChange(Sender: TObject); begin - if not FInitializing then PreviewNeeded; + if not FInitializing and + CheckBox_Preview.Checked then PreviewNeeded; end; procedure TFPixelate.FormShow(Sender: TObject); @@ -123,7 +137,8 @@ procedure TFPixelate.FormShow(Sender: TObject); procedure TFPixelate.SpinEdit_PixelSizeChange(Sender: TObject); begin - if not FInitializing then PreviewNeeded; + if not FInitializing and + CheckBox_Preview.Checked then PreviewNeeded; end; function TFPixelate.ComputeFilteredLayer: TBGRABitmap; @@ -155,6 +170,9 @@ procedure TFPixelate.InitParams; qualityStr := ''; ComboBox_Quality.ItemIndex := ComboBox_Quality.Items.IndexOf(qualityStr); + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; FInitializing := false; end; From abff9c9127585215692f0f45591a80248d628f69 Mon Sep 17 00:00:00 2001 From: Lulu Date: Sat, 9 Sep 2023 21:46:06 +0200 Subject: [PATCH 03/70] Delete lazpaint.fr.mo --- lazpaint/release/bin/i18n/lazpaint.fr.mo | Bin 57604 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lazpaint/release/bin/i18n/lazpaint.fr.mo diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.mo b/lazpaint/release/bin/i18n/lazpaint.fr.mo deleted file mode 100644 index 5e8e28b3045cd871c39c4fc5d1bd65f94506796b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57604 zcmbWA2Vk95`Ts8vR@r-$aa$;Dfu@69W}49kk|rc+%e34iH_4?p_l7&Vekh7;6$AxY zDuRrHD9FYI1XK_OM24UUf`|hUCpiC~?{m&O?#&H_f8g!sJ?A{1jQ71SZC!V1 zg1_eV5{X@4)6R*+$#scDc7NF>5-&F=66?TMAR>uZ;l}W{a3lB*+zkE`ZU{GONhBt~ zE#bOwB9#4ZQ2zGv_OqbE+Yc(7gW%TiD7XXchFig9a9j9MxEH(xO71?W=ROWMg)cxo z_qT8p_-D`m!YwgRnD4@y2zSCf18xuJL&fVOP|qEL>%)&j#p@iX@GpYOpR2w3KF{yN z&9Q$PD!#vl^Wb0M;qagZiNsu3h6ljgpyK&DtcUNw$uQaK^0^Vpy&2+^=!8n=6;SEA z5pDqQfCs_*q2l{zxCML{?hQ9OI+55H?guH(#3`O>xFP0Kp~5S`3GicZM|eI|dai|f z?(IDi>+$tU49m}fxcV*^w?TcPSx7nHvYRKAp<(z_ZeUFSoZ zSmG-0ez&*(7Tg2-AA9$A;HH>2UFhP!6I6ch0XKtFp~61^>iKh_($@%;zJ=a>5mY{% z02QxOq0+e=sy?6V&0mG`cNbJTz73V`r{Q$?2HYHO-QnUt2`XO?gOgwj+#L?VIq*EF zaJ~g4_fx3&{Q@dozlDnTU%mN1Q0bb`>EgK~+ye8SQ1bgjJ--1eA3LGK>xBw`7;Xty zz=Pp=a5j7pD!=~%70%|zI{y=46XqFEaeO4SS=9)e2uMNsko98~^%2}!V= zT>3VHlHVRGU#39i>w!@5IRYvlnxUS*5K8WNsQf(@>bYk@<=@3n;e7=veYZh{_Yjo- z$DqP{#@oN-?O%tIe+R0*u6LZvzbR1hI2bCNBcakgAMOC#pz@<1N-hT#P8lkl=R%d= zXT19rQ2wrg@^>#(ydHu(!XLx!;p8#7=bZ$Ve*;kISmDj5L*>h7y!~ZR@wy7C9^C-CQ- zJyd*mgL>{9&qLv^n46%&>xFuL9xA`ifC~2s@(2@`@<*TL9p&5(h3iQD({t0 z{yzrwytARwb0M4pzvAtG0F|yMz4-;Ge(F_k{*8Bk3#y#ng;pP+;=BIIF1}ksJ$Evc z`!uNZ&Vp*UO>kSd!1H9N=N6#K?{sf}nK$18lh{83w}Y?4iSXZ0>EH1q?zyv|!a2(G zXsCAA1C?)mQ1Qq^^#h-T%9o3w;(s|*eqRse?=C2R4@1d636-vwpz7gkQ0?k%DF5p$ zb^bSpYA?G%^}x~ftN$Io4ep-_$J&3ZrSgi za~PC;FHFL-;coB-DF2VZY4F$HeUr3v-xtc?F>pVag9pHCq2!;3O5ZvIE*+ELzL<}M z%C{_(|8t?9cQaJ_9)*(oCse*n9dz+M7Am}tLZ$DEa1y)+?g4)er@;Ss?lI)dt)6+P zcwGt=?suWeEC;@t(ZQ$u~jCXW`!P(@^irN@d(1(#pEIDw&5NMYa}(SU z{uI{17og;S1(l9JLCJ5Ecm2)2a3jnIL&-Nlm1hf7zi^7@3Yf%vp?CiV+!*ttQ2w5V zl7Aj<0N;k{XZ{ZL{EbJP|DB=Q(VK7M|Nf#dBA0o($K+JRL59Gob40*>F#I3sm_%3Dv$|gp&UU zR6qDHX!%%h`L!=p{(e-rAt+m;;)()?|@3@Z=i+ye?DBO z{OI$%%=1ytf5U@tpLx3THwfoqz7#6lC*ef6?nhmF-3?0qPcBG?|PPNhpkZZIVksQp`JJD%`bcNI%m81?FRS6 z{cxys_dx$h5m#r_ni@IMBXzgKzp$35SL3TMxAU48fnOk%zQ z9tQ9C_W$slbDk@=VK^1{%b~)30ID9n0~OCb&ZiHC?NH&L164i`K>2&uGkJmYzW}N| ztn$18PQv^&oC5y_Tj9h{x%^1O2Fw>gmG9&5K=>~>4bJ(rtG6e@!!chBkAP3WL*eG1 zarOOZxG&}bxCi_kRCxEmz2WOn>DuZ-m##)A_hG1Vxf)t~fJb3|2Tq1_E^^^5f=SG) zU_HDNPKS>|rSC6L<+I&qeZ1jbm`{Xy{+UqW-3pa&Pr}{dyHM%b@nR>x1j_wmQ0cz` zDxFV2J$I8!TzGS#>VF#QIafl3{~(+RUxRw?wx4tMN5UlLUMTxd!a4BkP~p4+mG9es z-sNXIR5%$Z`75B}^Ds=pH=*j~=9jv3>=W9^$T<0ssPr~N)uTbE@Xmz_|5m8{ z`6)aUz6X^L2Yk`RqX$Z^3}t^Ml>B|({bldI&X-(!-3u!G5txLR!4`NATmb(Im9O)^ z?Bahal=)nkgf~N_^G9$Y{0H0_wp`=NH3fIUd;vTP-Uv^IZ@?sM`HJ&D2xa~poDJ`U z>%rII)A09j9r)dAo&5uF6U-083Ghj{EqoDf2>%2(hVR04;kws3`}N^Qm^Xv6-yW_9 zcY>S3UEvmRZ@34X3wMVf@#c>~YaB2tN+>+$+5O8mRO=2$h~6!!6-6a1wkSD%~4h@1DC2R6U;z72d&c9y}Hv4nGeY z;ZNZaaQhov{w#t`n3ux2@T*Yy{41#VyaMI#9jNpjaHESy6WjpvBB*+J60C!lL&<#+ zs$P5zsy}+(yKi!nliL!mkNtK~@)M!byEmK&4}_b+E~s)n1xl_A_1v?d%I{NfJ$ND1 z^DlwQmoLDb;I*FLhKk3ta5uQ|8W-*~xFP1lVG=e&xevhY;n`5nyBbb|*Flx{<8Tl7 zGL&51&8}Wdgew1|;B?ppRZmWb8^epd`xQ{(-U27UZ^BQ&??8ojS7 zO3x>t;(0z)dai@Y{|DeE@OR$)Hz@htzV7<-y`bX17#;vmhcn@# zn5RMcKO8FD4$qHx4nxKNbhte{A1d5y;J)x~sQA7LmHzebNhFSgJ3>A0G^li~hU%x! zf=c)IpxWgqRC)XaDqo(3yTTWt%IiI-a5ui!aTm{-Q1xgY)N{I_o^ujZdIq5C=}K>Z ziRaZ&>AnG~e7^-H|0q&ud|`@ zH9pK4%a}{@28>U{|Ob(b-v}wdt<2Q?Fdyad%$hrR4DmFp~ky;Q1Myd?T>}>cN~;_ zAJn+E!kbrn_Y0xIxdN&juYo(jJK#a^M^No^y>C1F=}`Sg15|nRL#6vXsQP({H-7~x zA8vt)*L|K3L8bRcQ1$fBQ01`EcO3VI%C9!4a{35VJS>AzD)S8E4S^S!r2!pe-DNS!^5ETvodUfmwNkOz(X)^_dWN# z4ruud6;2;ieaOSZ;5puX)Vu!#DxNREb>OSs{WsqIPf+FgZz#ESA8`4w2~@q=1u7qA zL#6u=sPbxr@^>Osxul@v&xQ);N~m(X4o-yMhr7dH!+N;xgRWiAhC5^KfO0<-s$N_G z75*2Y^8Y%h@Na`EuScNdpMxs5e?UEVqla9**b3_TNoetfD%TUC>gO`3{6E8+KM57y z7vOI29?xf?`q{sE^Uk9#euqGX+XnUgeyDm-hANLwLDkP|;UsuFRQ^2;m7ZTh`TIRo zJO3A)2Df|I)z>57-k8&HGW;x5{k{XL{X7Vj-XB7x=P7Uh8>oExBUF0VdBoM1t)Tqx z0`>g8Jr9D)?+*?cp@2cz)E|e;F!&ZiIF4 zTW}rt0NemRofUQ;}0K>0fWs(u^_H-Ozx z{!V}je;HJ}C_~9z3{?--K&5LG%HK;+;r#}x-v0rreE$QLuC0IQ%5N_y^C3`j?ND+{ zp`KfU8n4cVs+V7a8^K$lo^v* z-n^$b@9WJoz4;(-p6ku?pyJUC)xWiQ_a)waDb%>x3zd#bpyY0Wjqq+b75)>dy-a@0 z&F7loahN{=CHDeUx$X8NH-A40%KRm`5qtnDe;$QuKhMKm;Tv!++~9E+&jzUUFMuk) zPN@EO2&#Qt4>y4i!3ppuQ1$2MQ2G3l=ej?3?R_t}5BBX)@mU2ohF3v7=X!5{E8Gn8 z6Hw**OK9~Gs$X62C(i#ID1SXr_39+3_$-H#KhwK^&YQ1-3ioT?{(h))L-i9E!Y$y%Q2F!~&s$(U=DVQs{WZ8Hd>cwG@sw*X6QJ^ESE%r&c=I&R zS>FC&sCXO-*MY}DrSAmKQ{YyZ2cY`Vm2gw|DX9Fu9LnEUq2hZ3R6gDfw}OvB#p4%H z@q5klEpPuWR5*#By7X)cRZn+-l25`U+}qn91FhWQ*4Urq?ekFKtb}qu3o6~8hDmr4 zR6K9<{HEufo_BlR>v_NDx1q}UyHMdi1QqUM-u=g(Pk27%`83=Uxo4o-&p+Wbxb@Sn zUpy2lyd_Zeaw$|j8HQ8gXQ1-oE~x(CyHN7a!L8x1pwjzisC@b_l>d!>=JJ0U)OdXu z+zNKV&0#;>78aq(>pZCXb2(JFYoMO{ZMY451Ztf6Ih6dLpwg3g#)ZEll)ri?e+}OL zXejwppyD+GRsTN=m5xh2zX(+>*L(AgQ0?s--h4MyJ^wCLJAV{Tg0Dj5)B4Z4b~6Ji zzDqopL8bc)DEW(_;&+GVx1pZ%2vocthpP8adHd&}^7kdEaDET<{C`8qZU3B$*Dg@c zoeCA+p-|;94{i(Fpz=Kh70w7$|9B=;x!wR(zrF{Pa1=^Edkt#*T<>`o&hAj! zn1shewXfAs;e5jLe9wzLuYd~wD^UKw>h14`suvGI#qVcO{lQC6a=(SDSO0+uf9sc= z+|E$`_Jm5`fl%(PQ1Lky9srMnD)$Sa^5ZJ+elwK6+r9n6Q2G8eR6JgV%7-`Mbod@r zxO@D{J!fyIc+P>UH-|#W9|h&V&ATs#lQA!adj6SE@w^yLgjc{_;ayPSJq=Y4egP%- z5>$AvL#6jma28zmW!FFL2UVU2K|OySoBWZZxP|;;rV95KVe?z?-5Ph>F*EsY4{`NkKyo+ zkB6LF;0I)x%r4 z9`XK?yur{0P`YwR#i~Pq_Av**%Hu$=DUS^q0r{4R@P3z?V@Y z@+-MIaJz=xbI-Ps{&BX7eTn8ch3jDLPPHc(H zmoZ<1`77Q|_y}_Pd&MC!fXtm-3%NRR`vyD~&Vc$moU4WF1(hwFUPF;r1@9hg-s@kl)vQLCpI59$XF&hwb=VZMMXl z`yBVv@%tCt?&f|6@8{RJ>F-mRALDw0>wC`1#>}U2Z{zwr*Rj~|0n^AV=Gu;H3&QM$ zZ(*N<`g@oApK$5#&v1QzzZcvJ`B$<31osoTUj{o(GWzE->`vwSlD9gO`_s8*A^$u0 z5Z64OwYh&@6XuW0j!S=E^Y(jkKMA`&n1z3lBY$UcY25f4c6V^?$5oG?AH&%^V`J{O zgLfe_%B8>AxCMXzhx^f7`yq1__V;+V+u?;=6S2Pv&VX+qw>P{M{*CKL1oAp=U*P&V zSMYb1zkd^pk0G~>H~-1=D8jf2`~A4uxYot2zjL_%0Wwd)&%r0KTc7*mxIZ860J~s` z>rw7cgd1?_ZxeV6{3bll+pRJe&V(R42fKo|Kf*sx&a=GCZ;*-q{R7z%>{49+tf9oa^~Z+&+PQ0`qS0KCU0h%wG>z3-;}pf6H|f_d8;D zDc9AQZ}wqq2QS3DKlVp@J8l!(V;BFs9>eFcJJMTjfb1@Df!O`S-2W%$e^>7JLHFi#A#4}|Bm^S`C)JWkhgDum&9bQ<^F80VdVab{Fk|wbH5wc?bzRk zxrh6`VF7N$brSYRU|z!&{QaAo-*Y|ZEt-(oocrA=gGcbw!TpU~CvdIAd@dY8CjK`8 z!(!a@w*a^Ka1ir>T&po3#r18j2FxqC{(<{6UsryJ`FO72Zztr|!EGD(s<*!i$2!cH z!#`kmBG(1n?+?ETcjNjf_urLYF8wtT#%=JUm@mTZS?&*mt=@eG_rKu&r`Ug$`yAJ2 zxG!=2g8OH=^f%0PH22@)`W5n@gmgAF+E8dHsEXd;ML@mF7AE^8~K1d-u86b#cEQ>AaVF{awb@&9yUj zOK`i?+*9I?vwccySF<MPaXpFolW>SwA>4l* zw@&Og!~Hb4srM_~i`~^+`db6ffqzEkQMioj4le!8!R=egJ4w;U30 zV|OujQ@Nh!egfCuxf;3h*zL`=DREkWxr6&1xPKUKk9j`)Bh+7p>m!(hzpZ2UGqBtd zxtXzaPRA~T-4DEnow+{*KX3T(f^hc4PaW5TSiI;h@A5LQV_xd-_l<>pHg<=4^B&&M z6zq1v?p@5?-jAFXa{pbf)4bdoAMa0N-Wd7Kym>F~x8~Xd^N)~!j_W04=3w`l_glp7 zXI%O_T<*wj1!r-kxh7*?fm@j?iN8%G$lsl~?aK8t?vH>!gda!t3U~(Gnd|%9{|w#) zlgK3DnOs|PuZ4mnZoS+-3H!0Tj(h#R#{E3p^|w3s{q8pLZSM8=bL4}+1F*Xp^WWfc z@P04zd-yHPKjHc{*ZG+5hc9^d%edFyce(!0?#O@a{=jt&S2J>o!a}b9d3S^Nr~6a6 z|0nz;+ymi>`1v*FZ^Cu4`zZInhhO1p=K471A9KBj`&=&lJ%|0CT)*R5&)Y46f5WYn z>piY*y*;;yTaeRV*3+5%zq1mvXK@{v?8|5Kg<@h(cr&Az=}-432U2}$toKj$W=imY zP;$RHiT&m{+x?o7`QB60eWk0&X_ z(BGd-CHpf4!V%DkN7a%T{c-PkBsCCCFMEkE3F!_SdI*(kSk?M<$guN z-6V%o_|7HMEBn$TmcuJj#bi3ymoMi^=|Z|6M^dk_=C`(BC}mRFOiJ04Xc!sEu1XG+ zbC&&8Mk}*II=L!eCO-aVMT#OJ+Wl#wl~$$~)5$5bEtz&d$Vamz_pN4;Za40Ql(^y zOiL|KWwI&U)nt}u3Z-%?OKI_sujh(^+UdMZtOa2zQ92`~q2yfMt9Cdfho~35>2xkR zobS&JWYYch$)>y&Zy{|#2ZdWmXY;B4BNOwo#Fl?6Vpwf1Ci4Tyw$$oQ%A1Ij7`v-q z*xWN#w07c-DP&41gv;r~ynMEwf7B9*etsqSQ!c0`&a-xvQ?C)-CTAuascDqA^)NV4 zFq9|tFjqn@zk=H7nto#5D%X{`AXb%VQH@QB#&)iruC_#DYB*mW$kKmso9jzweJ=I6 zV)2$)O1yVfvRq6TWRuI2*M-!Iq-)OfZrzLLC$p(lk+aI(YLDcXQv$`z>a-Hnm{#-j z@Bs|v3z^kwIuvxJ%kp%gl86r>E=sO>q)W+O zYSLhV=G5=Sf$Ko1rzS{o-G( zgy)(UCCB=qW$9JD`Bb5w5>wT1uDR4OLk1x?c6TQ!LMvek#62xDFhH+K4e%E9GX+Z2 znS!#*507Ni!(>s4%(GAx+uT5AkdD$a4Fj<&>8UB}T}^-vg-r8RRyQg|U-+cM#v`or zh5k&AE?a&^^yraQ$s#?j>!urNuJpaBWG=nJ7n!pepz+W@k+MEjBK5zC#sY(j{!u=~ z!>F>clH&O!oiW$d;J7JCcd6=L9LZ)%iAL|VI?srSfl<^_U6vC+6vs-$^CQ_1UN)M#U*-|*JW6l>Cvgi-x7ThNX3z>c_Y~*o|pgCIIW4xmp zA6e<>yf4pCluf2${sM879^U~ z%UQEuPP)xNbIT3VUo@$5(E;}7S0tLsR1dmL-|Hrt8KO{7ipx|x%n&A|$`}cliq$;a zn=e|OYF0`4Qa0VKIj1t4*&mc0!|p()WG&5g_38l)EuNkyrTK5~#DbTE^XleO&vgA4}g1+L)LyUg`Ay0?I>rH*Z#$!V@%>T2#* zt8MG*MvW__b49A|bPJ@ANf#5%Jfz_Mr8n$j^d=fA14}O%EB7R$k1CU;Me5Y#DYGYg zrxio8P(jL-L538dY!BsEr0IZs#QRd{z-huQk{CL=ega-OLZ3r+bgn855kA6-niRfX zvSi8}5=WPAf~c#>l$BVEMiKqPSU|_rzlubmhZjS2BdEIST30akQ(H<$Iv+$r&4YNj z7HYxB#vU}u2?Y(P-x-Umi1D!9E5mh@jSVmW=4F)Qa9{}SF?3R zSuq@&J(?5Y%U@WJ$;H^9UFB90Za&{XK-Bm^hPr8wir%_9!z7c-gjFukzy`o!{Z3m0xhbQ(Q_u*ECr|4W|VE3 zM!H+Z4?0KYx`W=r`XuKj)y~-#ty`T-^f7BDmkj5{>gZY-4OhAw_1tcxYek2nE!u3; z-TO|pmEMIep|r~RpmnP8T7@8_<;>eG z#Be^B?;Bz*fQsFRRe=g2FzV<*#bx%7^Hwokz+PidibmMZ>=xCrJw2?Bq>w(Xj0)FJ z#zDex$-)fQ~!J$j$G|&^vG$=JpA;sQ)WUiB&~!WBdRs+d@SJRzP^TM9yE(zFhp-GpsH@)*X>#b2HRCZQ4TKu5w z+(betjRISqA!BLK)+75>E2m<~cM*lr)|Px_L0QzACJ*~?{^;--=9uRW;g^La_wOVJ zmp$03izgl|3}qXnb_Fs!Np^5&os>bfx>K*P%9qA}_ms zuHm$`aT_1q2pCzi4pU_HB(GU3lKJHtP2HWZ3a;M_>Ws-)soBiksb=0Xhc+h7ThXwl zPz(YJ8?Li{6l(&wYp-0EBC|XqLU*!Bh~|Svv!6y7^+&`8WX8a-CB`KHntys zjK9@P!dXhY>eix-YEjCj>KIF9*1;7qs|MZ74wj{v;bSi3ml2y4%m$=usB2;QnZ^~Y zuXeMrh&oFq4`*^2zpM~h=4=$FGqmM~o|eXjg^L@yyIW6auAjH4r>A4#QfwNV+v*z| zI(u3>7S^#O%t~{jmSo2zu^-q5VKSxvjaer+xuBSJ%V< zsx?${Gn8muxVX8i$4OBlPLMf~Ez5?hm@yBX4c$G>PR#U*cwk-4O&!jOem)<%w9jj9 zYHDs8uk0-@Ev;?M9i7cS0;XJ9*R6_cosW-#Qi)VnXVw_(%rDQIjlD7z^Wa? zgf?_n$iO#lp>F8*4IS_Vi>IQ;n zv^C6YZVP0aT3cGeNU-xfrKZ#g9UbkV)L4;NdK0i#)c7mv| z5mpF9R3|!H8+#T}w^|$8I_A%=?`iF6Yp$!TB5wHfPgN}l3)=beo@`8WjX*<3MNzBh ztdrq!$251jQf#z65oS`$n7jDkCD`27*4o+a+d*@d1u@of;_h7y-9Z@5tSDCcZtsXi z&^^fJS7FTJL5)*Libdywj)n7mbz}XRF5C9u;=a4W){i2}L+ z)lx@yv@V?2yqM9>q~>YCBzY=FIx3zgsrFX-7$?=vOuSHAYD~1ogr$VHbS(7A^IMYx z?1V|piDmXu33e>%v1|-8Dv1hUv$kr$|$=j9f+ zHZQSO7WKc@#)?5e5*WAJlA}7rmS6xl!KqbJ34>jaQ2VfPCGf$3Xel)hQ5gizs21~E z7dAwi3G;BbM__B3vB>N31=T>hXJF^Aa0X)}{qi%T* zaL8N0sf?bMco-%yClu&Lp>~H?kn35}+SRtUa;p%kii)PYbW5~awY6v#&-6Vk02c0STS=9quTy3FFr*wc)`5I|9w7L*9bZUV6Ar9L%y3J#6ftJm;BYrE;8i@~0<43%7t73D}r#3z}{f2Ei<2 zRbRx$!0_vvb>?UB<#2r-AiasS$)XbbU^~Eg6_0vwmn~I1Ov1Utv zQqy+JVl*P2OG&xHUhEnc_HF~$s&-^r!Jcbku?k%aI7@g)!8Lyn&r8v*W#+(xjD|5nB0hfz`8WEJJ+hlWjNd-%!?HoWcxsavSVCPUZA+T3s zLYKG$nA)Ed|LS2&BGSxw~n6#Oz#Z-4(eut7Bs*KJqIcXoL*T<~$9i#lGdeRF#yZ%q zk>wZ<#pQz)5poBaIr%C{J9Fzs(R!D4bn~pZhCy4V#ie2uLwiJ=6v&|dxvF7{&vteI zE48bN@T+`sY@1D=V$7$vahpUgnS?==<{++gpfFNY>)>o|rGQHUZGgTalx{F1y?#Yl zPISmluY{uRFiUOG6&gW8NgGd`pdG4pYxY4$V3R~WPYW{Ae%*nPz_~TB87tzV<@a!- z%HQrbbytn&p*WNoD20*hmMIjCXPm`{HT)oIa+BVQUbS?v*qaK2Xmlru=sky6QkNMTUeI|;Yb5o3f2FBH>k1pyn~?dW)rLyd00mmLCZ!0C8l;OI^pM)oce z;i>vi&K)Dw(wWNMscymB6Km_TYD-u5Tvby4KUrB7giDKUnsbPPqZMIl)Dmk7Yt!R{ z%JL!)n#l(Yn3DRSqG9FupdQ$<`Jkf3aK^fJAEi`paVVWGEiDZ8hB>EwrP9D)a3Ib$ zUDsCrwWX`e-+E4M#MbN7T5eEBo@dw79LmGF;)%0Pu4l)ZnO0D7XAq6|_cHs#dztg$ zz3lh?UP`^vLD-Bgxz5?t4;lT;bQ&)+&9LoUsUcB zChbW&!d2@*lC5}9rDq;y>M{dbU!>`@*?Ahdx#P8A+30u{C8&u*X+ZPedaEa#uaw>q z)EyU9f22RO^@n-l{uI34ucF0zy-5#nf^ME|F45D1Iua~61hKHb)w*|g7e?4Rc|RqJ z#agc!x!1kIxkKp19mWqrmZXzm(h$mYyH#(^BYb)kQKk+YiwuQ0X)I$Dd&#)>kV2U* zdo3v*2uiUPtJ4ai0a_DMSKi(w<_UdDg8&CxnLdPJGdf|^cCT&QM-dIgZTN`9qtT=? z&R$$cNJ8Nz4C9A9z|1=oZP7G*+(-=PHSY<9+s!z>IJLKrqi3Ofr!$Z5K_@j*QNhhm zmC=%ztJaK=77$X5$b+oGEsq}3X4ag(a`u%OAJ~RbT3A!eR@g%s&MIhYhZosmS#71e zw8&Pyuf#T!@LTa_6+GD_X}BoTQPyei1GB3n6_U|u?g4hS!bmJY>vC^qap*8J@_t?{ zCUy?oRlz7kPQv+$WiB5s2hGb`Gti`%7}#m{iWGz^Bo*=J;N$zus;$@3^5chYXin?U zQIs$X_3C4ge($VvaWl&9a)oH>kCPhb-Xasrc;Th?q{@2}UOwSemuW5OgL)gQc1 z;{>DEYg{)=vl#2Aa**)H&rPi6Fkvos(AXw*R(tJ?tzT2}(@dYO#7PGXU36^Ic5DO+ zb_UTOopO@?R9OvKJG|wE+(E9fLKXEnYF;L&rS;&|4WDybX096A8Z}MP{Lzvj0gY8* z5jA6oJ2Lptk%!JL?(A;Nx7L9|=LHzzzO4<0uB|!^7kB0q>0mj&9K_Levxp11uGl)> zU>xtV-q||i3Q0R=sNpiw?7Q62L$j=uRpHqiW41Wm7tIHK3B}zieO9a}xU+n50aqcz zRJ%dHLV$y1{vcc=rNd^yNyb?AYGNM>^Q#(>ja)YO^V?Ynnw@RcDD-ZH)LB-e@k#&iGknpK;FX3Y5#J=GuyP5O#4y z`%;cU`($`L0g6Z8Qb1 zJNfwQv`_d7)R;%83RxR=iM4kmD;jW^K1o&#SLUNfQzUOaPAcTl9Wkg;nC^jjcW9|P zIg!sXCAoHg;o_}DQTZ1nUTt@2UzQimEx%ko@j^E$xmi@o>CBeSnzK5eccS`?g8Kji zi$uJg5Y`0?Sg(9pFn%buY_c}xEGj~`N@FV@E@*pwCF2^m6Ylk0<>{05&zD8E#1RwgU$b`se@Gg4AGyMl?=-c&5k-erFjxfAdU|*}z zu6XEL`S3_06maQVt6#Tti+MrS zc7gksgJPwleu@FQBHrqCbPmK@22qh_V2K=OiN>_QN+Gu;6{S!bi3_53pkCgRX}c4g zfEeOUEw3%xgGsQR0QZT|1FJQkPWM(*{28k`%f&gaFeA5&bE(~A1Dh-5=E>`1jj#LTOn2uS* zO&OvemX5QQnAZ@kj=Iwn_v>FjA-Y>)%|q;u(YxGnu@FBww&QyD7-Lu zmq|8t32TAPTrBOi#8?{ko8jZiji2XL0osZ?J%f9TA(~9I=`|bdIg+H86m<$?Oq_#s zM!wp8%4>>y)h&#?f19yZ$kMsB^-haIT@6y(jcq;Wd9bVHX}s!Fm14EHFi17Gc)~Q9 z@LkXQ%?)fg{9rY*hG=z7ii?D44cEVjUR)roZ8d64m8hnZ`K9!h;kHVcZYy5Du@(WH`gNEE8p?`T9b9h z*i;+Cu$;Vhqx8Cb5c09kY&9i1d$5-NV~pUKvIZf`vWUDNvv4o)uIDYOF&Vbb+RJ?H#2api=XUQZ;qw1Mn5=ljXJP*@ukRgO_6 z%8~c)?L|rNnQulE;|m!QQ4L6CD~77BiiL}qfGaIo#Lfpun(Z1DE3eG5Y2wa|jCT$t zE>m4XydG=cGzb$IykDrWL$_eJdhHn(`f(8-zh|uye82iwB|2WurL%wT73Z~O$XLnh zY>7z(^|G7b$rL6VdOdKhkEj$I6TWwLxs>9&YE-x2NeyPS;$7PwltqYh2iCnYvIGV7 zA&wPDjb=O!pWfrwl1g?aGl-L&(Bx^()<;`&&(L3ky(h0a8J8Kq=B^+=QNhCVglo&u z@#HJBmX6b%*>Zcs#ri_Amj>ypSKU0FH1>u>4O!QOf|m|!3;2UE5(*E*)RNSEULR%P zk#%lz?@cuyY^$$zrlJ&U3)oj?()}C|=<8d7WT8->!`L40*L=S7!MBj?2Yn z?wLEAp;oxsC#=){U`r>&K+=*v>U;p%bO+~d~nYD6K!=lOD| z1$C|drdDLaqg6;*cJh_D8euJCSas9$BF9ke;BN3yD>>O&cHV(MvX)<)UDnymdtB$D zbFbN0f)lccxUbaI3`I(No#}StI!ozuBBuV;NT%DNL`GY^wZa+J`_PNlW{p^L;+>c9>l|tZ!|_X=Tgvxx zW=Lyq>3-UY-n?+HCCJgAyAIsf5==oK#^MdPal;7(Y6aw{L%h>zUuvo)!V-)7DeT0<=nca);eAEBs`X>LoyX7Whs`wV_dqo%A&Z7|E_pnIyi83YOT1J|qPa(1Y|c?raCsULw3u-mQ$?ppx`i7A-Kvx{WB0uh^^x{fm2m zihO|&vifuKxVSCN89nLLut_@eT(+Pmw70f5M*+{SpEaRTuY2VPi#KHE+8l8vs#7L+ zsPc`Ejg<~x)YCHK;7HEDnlq!B&s^(})!gL4l*feQX3Xa>B8t2s)0x*$oZPQ|zxp{7 z_%)&M&h=5Z z;49~&AGc4;Hf`fdS(VOUM!qcUExtDiSYRZh{ z`7(F8!hQ6bhpx${f=yHQ4)|IOFOOJ?f-qz`kl|~U6dvEpC>MAQg|83UcS^$tNywVJ z;>U3&;-^<^6l0W1J}=HU(Xk^Dy?pK@Fpgf698B>^H~$fI1hDBZq>HTE&}J}fChZSw1L>KPO` zeNmH#$G)mQ##Tp}nt3&F#&SirIQlJp=QxQWo6qpZ8J~YIWH^+ORK2v%tNYUIFDo@P z79yWK@&g7DREA`g@6ij!jR9W=L^B=p_@MUX%e+#9PI+YFgM<-2f2{W=@|UhA&9{L^ z*Yxq#IMS@WKo%60XZpmlE6Sicr$!2+Hx(%s+P3x! z9V%Oc#&Bo~Gbl6wBxI9wDy0=SRy=^9@SguL>$2 zAK=XNW%Mn{*tglKB>ECN;=D*?D^|>c-KW_TZBwl&@;;=iZ)}M&DpA|&lZzFr)vlf_ zrx{z8u*XKnI7nt4sZYxB4Lp6XOA)uI){1(dEh@(lj6TvnCYj7zE0U-8C4GXD!Kd2O zWqrnz^rf^^)57<rZRM5JU~52OJsfus;Nu94 zc+ilJmU^108*+lS*jRG!vQId+g!N4!wytEeV^V5EjNrJa`L+cEvK zPd4u)a@K~TUF}9nS57um2NI?iD2~|_>a`7tz6SZuDVNvRBM}ImM{D2-%)_l00USblVk1`?}jUN(rMy8Lv3s;Cjh7D_nvV@Hu2gFtx$cO*NyM(sbvw=k7F|G{~a zb4rJP`9qD2L!Nw!osohTWwh6mb!Rn)Jokfipr!Qcv7BdQs3Zyse1x=mNSc^MAD~CX zT18I%XQ~|457iomGBqivULhE*5*#N;^{WkZ@diDPelUoIJD!7T1P^gdkWa4$jgeQw zQI3+isap8r>tu=}Eu4PB_D(G)q<@ix(rK)wvO#Cb5~`CGeXCxdHyRqf$v)+l>(fYI ztEpM@e7K9<-uR)cf+3G2NU#Zy3`~f;MEm@G#X#O;0MR6{2EGog|-Z5KT#; zq1~X}OAV2u>j25rSmlqJqXez#=}lnO!UCU3XPpwyJa9}eNqx^)uOA=Y+~B3UQBmK> zlDHJQtoz`-kC#=jvf5v@uZ9wDYDlBNLGRS4;h_y$LWrW%EPO*m#m(_*hUv3`jv81z zbWNb)IvaxP&5wSa@KlG^!U(Q+^|{;=GLld5oFS&`b>wi0J}*96xx!Kvl$Z8z7uET-DT^T$1y%!q1{ zO%6=!U`W$GR9r#xBLtmEIyZW=MssZ-^<^|e4FZ`-6Nsv%wFqf?s$ely&&nnou<&v! zvjwM~@nv%RvLdP$_RQm{sVo>vO+o)Ep?-|sL^-Ppu*9ct?-%IKsk3y<#Q!cS$otg($=-9Fl1)<^rN(@^wK3ei5+uhEWg@=HaRP9ep% zU#V3U^@<+H*aDFn%BUoR&-W`7b$(W{Trrs98hoH9W&WcEI+7-Td{JnNHADYWpIGeX z@tR8zw*Q>Jy#vvYR>Qd%rWtdXCX(T#BKV*`Rf7!&>o{AS051ta^gRw3aNqz0#rafjG_9*nm-F)%idS}w&V^c&A zrm#aZoqmN1;b!+$U7~&mfN@EKWX{bs0=+7qp$qlFRj=!RgRulwM^leuA7!X}Aiw)mpXQrg%mYjW;&fZb( z<&!u{9$g};*-8c#js2{Hl=;~u&FD?3(RS`2EB9mN$I9g;*icZX#^x=j2eT;4)O?$Q z({6Y&A5JD&Omq6^#`%qTZS^n#RD&ASFAng?YKFiZ%Lu8vx$;duL#)xh60m6KTG9>LJiZ=ilMidn^=g-s(Q^wytQti-XK^g zjcka46uDpll`)qY87s~xohv4~$p9^yNsL7@PNA!-;A7sbhmWq&#EF?Bi+)s} zn2lddA(@d5ssi&1?W&-SUZz49i!5u(R;p-$aD{CYw8nPp)YQ!=3;4#g7MJLz)PcC4 zXPB3wi)DYAA$!p3Mt3+Z^Lle{wM2^&ZHm56jf#?vD^Pqfj+7by1EsTzS5WW}{}BgO z!ghYffy@J%TDO}z>Jfwxo5bT{jh{kIv}>`Br4Zc=TX#)K=odOIVyqt7nibKf@c3O5 zbX{_Qp~L^K1D(28B!U=fGH;Pohab36(6;t~vS{JbB|9M!W~#aAPSMy*9K0kcwbk!& z#oA3kWmBY<(iu5@(W&HtQ3bh>LhD4a3EN6iv#|kw8nTbt5UTP#uxzhQEYkA&Y3Pm> zOlzvcQcr>hMZJg%#@da|SN$YG8j92?8*S`YB;4Xl@S76kSwoq@K^|N6TM`<0)u%-Z zPqvs#>-6n}JXSNb;*8m%SZa|`>I7pX2X10BXqQdnNknTHjc!rLN}6BXP+Qk;P{gX4Z@s*yV&ni zXsp)AW|?9WCX!fluJ3zmR|Mf8q?+T`s@OrK&9m^qfeTgY3Z1H}nUAk_B^$cBTKTH9 z)1T7ON+9#moC@CkdPQ6r-V0&C{EkIAd7KN3sS@u^SVC9@woIk?+$7vd zSWZ_yCS4f4kwpZ)u2!*6$hO53-Z0+@ z?5vKOyR7i6z0@Dx5dIaL+5DD}ql3XR-UYd=~A3X(d%;I}Ur z`odqo@b?Vl8gRnjzfdi56|igO;+gZPTjdPZN&i}@higGz5$(*Zq>rtvKKu}dTd(re zI2@_$7GXMQ_Cv7Gmr+H!c|$Bu8O+WfMZw@|71_3hYCZ}70B{rJW-Cd=#^na4t! z@9`Ci{8UKbqe6tPi@Hs1)(fZntYVtq9b{0kE%WFHI@%kKCSxLfI#`&9+tIFr@q)ff zEuQt5n4g&YTD;eCcEdw3BKp-LWl_Z=!r>!aI*IL$6#Wt|i*nX4Ic?MC-%JVk4UFnq z5^l{`tOU~uL<46s)WZFK8pDijn#2Z~aE8ERSwGb;ODp0HeQJTMI7W9B)-#zfN-t^P zJ5g>Sl`3vO4q{6MY5Kp=g*8#ik5sWGX8SRHwu3OU&xXtK1znHqi*0-{mL=To9zQO^ zSAo$)-{;Y!QVW&*?ybgFP6X=rM*LJTm=Vr(n*^G0^5u4E*GYbM#3z{5Y)v8pg&@aA z-87o|sR@-sUo~yENtc>T0xeui5KIf(k6sv=dh|;qfm7GwdGVD>hDW^cE7d;Nr1P=~ zYAwMmwThu*8%%S;0ZqzTP7@`T$Y@&(40L;C>6{w5sq;2^>BmWC1Pij&j)6UkYEnNn z)wW&J1fOjDFt>C9!`zvdLtLD!=WzG&G=Fap62#V~eC5y-f+?$}!Yw)pn9zYJ{l;fL zRG-6{`v-_cXJ$mxvqZE1HGuijs^im?%Di#9pFLQ5w5GH4@MKo-=B=B{jAWMQZHiLi zo0{c!T1v+yiCwP(2v;?yOo}L6Kdp# zX&<#^d$guY5rto%i-*~U-lnN070}0xug{TN7@3F_!);C}Nqj7e7DuHZv)n|-r(N?O zl_FFQ5@wY~>-G%M&9t~g0c!$NoJyPFTido|87Oz5s!AAY@D_Rz#>~^^eq%O_G$IcZFKMjbviFv&FbXjSnn5T5|fFxTdJW@ zSxt}j+Gr^R7*-H^RX48*jMdZ@}Kt4C<@x8kf& zFvT(vw@+0iQ?dSADW*{;JglRI_Sl@l)|`nqYPTsDk!(z;Vq${YsFtE74nMqls(*{x z8yx}b?e0ueVj%@cJK`mAZD};R&%3(?al)|lb_9EjS`f!F;cKT`BcP8?Hg$Eh_PAQ? z+qf$yryzym)bL<)73CDkVY+<{xr=Q@pLK0V%Y}F>D?k433zuWM`UX4`w#BXk3A$|c ziux6A=B^xN3cn2HJ^+txGY@xb)V|qjan+XVX>-BM3jZ2a=>D~1qP&k=SeMFpQ?|`r zlc6fNX;GAgcYU88J(6R6JU?-CN{fCS<&2i?*^^_zQ~OF%knPNv7RWF~Dv-J^9n4^( zE?*u}`TKK!)^6!}C`~&Hfj1_q3X1Qe7xc*uw~rJygrLdUgDYkE$aszR6bz8mQqrsL zLPuz7jF`dBLV|I*lyE!9!FS>P<_oRB+mke{+fmVitr;~V@7SN#Mpo#ey`~TMb$F*6 z@eGz_R4(BeY%TQJ!sFaT_~rIghH9tB)%bEdy}ETHMSh8pzJ5u%S4GH*LWUPbMsHHD zs6uvMTj#D(vp0RLonM3XA5Rb39ZIxc9SfTxR(xrkDZA>d2A<0CI8mQ)hboD5G<3(7 znEYVQa2O8A!K#xgbAls@I+toIfAv}`rrxq}VOxVmRbY)>cHD(;6=|_5XfDwSMdC^? zK+62FXr(r+(q5G^ZNqQaCH&W;nXLF0VqFLu?pgvu{g9Gl2W+B~pr|$l`V(trp?1bW zJyxn&veyC9ipH1-PN{HkF4!PuZ`OBjeg`Sa%}zFL+1Hb!0Z8MeDSBl0O#4jydN>BCSO;I`>i5U^U5)cd}TxEoL0D7OqokG=o~?-?P=MoN^Zi>7ZP;Z zB{+5zEm6l8Yg1Z4^J=91Mza=PqltCJvQ)T{B;7bzER)_7&&J?HMbMpS{-+Y_B4cbZ zH>`n8!2v>5aJQ$f>?Qj+m!VGzQb1MPMoIgWpvH5QpP=K9DsM2)9B?P-0)e1TRy#*4 zUX-AeVkxBhIMD!Gcbq`51p|$ZspOz7eE0(u8fn~8M=-1)B+W(X48|Pi&t@I2zmUaL zn`#A>+79zoFA2DwO*&hYE)BDR-^e{kR@^m;q0PG!Eqvfqwag!nmMW2-(XVoFhm-Ya?QGzEo%{wf!;tGZ zIl)8;+af7rKUyD}f_7vYqxl%B_J}f(sjy#{rI4Zlry@HeYZRfN?nI5u`hj3ePaB_n z^*}niTm4a`a?cH#TrlieWMY;K9DU&l;Ss$gui|z68Yk6gV_M4#*WmrCvJFx^i!WKY zQ3(|#{J2(3$FOq(T4!=wFF`$z>sB%8*ll=rB9=Xx-1+XzG*I`dQe0!}WG$%P&Bgrq zraYM&JBfiIY^8J2=laoTlSMiizNHk8l~n(rH_~cI&?Cj7SUrvgaSIOD#85_)iTI5t?2+A$$>sTGqn@O&>v(Y9TDt&CEt=H4jl``}=tdTgC z-q~VfJ23V=4Ysnw;W|2nPU~5vQCH|r8buw7 z#tN1qqlHDCda)&LKY*m!lnK^MLpM!Q%Cvc{`UJf}VoGq3L4%4rI#5IZh-XAB7!8(u z8$aHelRCZ0qDfb5sXN|6V)y=xg^%ELc$-ZGP(Irxgsr= Date: Mon, 11 Sep 2023 14:13:47 +0200 Subject: [PATCH 04/70] Added some Pixelate controls captions in i18n exclusion list --- lazpaint/dialog/filter/upixelate.lfm | 11 ++++++----- lazpaint/dialog/filter/upixelate.lrj | 5 +++-- lazpaint/dialog/filter/upixelate.pas | 2 ++ lazpaint/lazpaint.lpi | 7 ++++++- lazpaint/release/bin/i18n/lazpaint.ar.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.bg.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.cs.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.de.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.es.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.fi.po | 15 +++++---------- lazpaint/release/bin/i18n/lazpaint.fr.po | 17 +++++++---------- lazpaint/release/bin/i18n/lazpaint.it.po | 15 +++++---------- lazpaint/release/bin/i18n/lazpaint.ja.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.kab.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.lv.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.nl.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.pl.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.pot | 15 +++++---------- lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 17 ++++++----------- lazpaint/release/bin/i18n/lazpaint.ru.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.sv.po | 16 ++++++---------- lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 16 ++++++---------- lazpaint/uresourcestrings.pas | 1 + 23 files changed, 124 insertions(+), 189 deletions(-) diff --git a/lazpaint/dialog/filter/upixelate.lfm b/lazpaint/dialog/filter/upixelate.lfm index bc6c4084..4ebacbbe 100644 --- a/lazpaint/dialog/filter/upixelate.lfm +++ b/lazpaint/dialog/filter/upixelate.lfm @@ -90,6 +90,7 @@ object FPixelate: TFPixelate Height = 19 Top = 70 Width = 152 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked @@ -111,21 +112,21 @@ object FPixelate: TFPixelate Left = 0 Height = 25 Top = 0 - Width = 42 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 50 + Left = 59 Height = 25 Top = 0 - Width = 62 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end diff --git a/lazpaint/dialog/filter/upixelate.lrj b/lazpaint/dialog/filter/upixelate.lrj index 470223e7..232202b9 100644 --- a/lazpaint/dialog/filter/upixelate.lrj +++ b/lazpaint/dialog/filter/upixelate.lrj @@ -2,6 +2,7 @@ {"hash":15478229,"name":"tfpixelate.caption","sourcebytes":[80,105,120,101,108,97,116,101],"value":"Pixelate"}, {"hash":49409242,"name":"tfpixelate.label_pixelsize.caption","sourcebytes":[80,105,120,101,108,32,115,105,122,101,32,58],"value":"Pixel size :"}, {"hash":137421706,"name":"tfpixelate.label_quality.caption","sourcebytes":[81,117,97,108,105,116,121,32,58],"value":"Quality :"}, -{"hash":1339,"name":"tfpixelate.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfpixelate.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":126662215,"name":"tfpixelate.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, +{"hash":497723,"name":"tfpixelate.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfpixelate.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/upixelate.pas b/lazpaint/dialog/filter/upixelate.pas index fef51e82..f65cbd72 100644 --- a/lazpaint/dialog/filter/upixelate.pas +++ b/lazpaint/dialog/filter/upixelate.pas @@ -173,6 +173,8 @@ procedure TFPixelate.InitParams; CheckBox_Preview.Checked := True; CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOK; + Button_Cancel.Caption := rsCancel; FInitializing := false; end; diff --git a/lazpaint/lazpaint.lpi b/lazpaint/lazpaint.lpi index dcf118a8..13d11f48 100644 --- a/lazpaint/lazpaint.lpi +++ b/lazpaint/lazpaint.lpi @@ -21,14 +21,19 @@ + + + + + + - diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index d4255ba3..07011e73 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -2395,16 +2395,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "النسيج الحالي" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3481,6 +3471,12 @@ msgstr "من غير المعقول حفظ الصورة الكبيرة في تن msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "موافق" + #: uresourcestrings.rsokay msgid "Okay" msgstr "حسنا" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index 58f710e6..0fa99c7e 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -2382,16 +2382,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION" msgid "Current texture" msgstr "" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfpixelate.caption msgctxt "TFPIXELATE.CAPTION" msgid "Pixelate" @@ -3463,6 +3453,12 @@ msgstr "" msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "Добре" + #: uresourcestrings.rsokay msgid "Okay" msgstr "Добре" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index 36ea7570..2b5349fb 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -2246,16 +2246,6 @@ msgstr "Barva pera" msgid "Current texture" msgstr "Aktuální textura" -#: tfpixelate.button_cancel.caption -msgctxt "tfpixelate.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfpixelate.button_ok.caption -msgctxt "tfpixelate.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgid "Pixelate" msgstr "Pixelizace" @@ -3314,6 +3304,12 @@ msgstr "Není rozumně ukládat tak velký obrázek v tomto formátu." msgid "№" msgstr "Č." +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "Ok" diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index 8fee3408..030ebb59 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -2406,16 +2406,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Aktuelle Textur" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3492,6 +3482,12 @@ msgstr "Es wird nicht empfohlen, ein so großes Bild in diesem Dateiformat zu sp msgid "№" msgstr "Nr." +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "OK" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index 77509778..fdae6c38 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -2388,16 +2388,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Textura actual" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3487,6 +3477,12 @@ msgstr "No es razonable guardar una imagen tan grande con este formato." msgid "№" msgstr "Nº" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "Aceptar" + #: uresourcestrings.rsokay msgid "Okay" msgstr "OK" diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index 2707e3cd..357642d7 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -2387,16 +2387,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION" msgid "Current texture" msgstr "" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfpixelate.caption msgctxt "TFPIXELATE.CAPTION" msgid "Pixelate" @@ -3473,6 +3463,11 @@ msgstr "" msgid "№" msgstr "" +#: uresourcestrings.rsok +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "" + #: uresourcestrings.rsokay msgid "Okay" msgstr "Ok" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index 3ba701e1..c1949bad 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -2399,16 +2399,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Texture en cours" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3502,6 +3492,12 @@ msgstr "Il n'est pas raisonnable d'enregistrer une image aussi grande avec ce fo msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "Ok" @@ -3840,3 +3836,4 @@ msgstr "Zoomer la pile des calques" msgctxt "uresourcestrings.rszoomlayerstackout" msgid "Zoom layer stack out" msgstr "Dézoomer la pile des calques" + diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po index 66d5064a..4676fcdf 100644 --- a/lazpaint/release/bin/i18n/lazpaint.it.po +++ b/lazpaint/release/bin/i18n/lazpaint.it.po @@ -2384,16 +2384,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Testo corrente" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3488,6 +3478,11 @@ msgstr "" msgid "№" msgstr "" +#: uresourcestrings.rsok +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "" + #: uresourcestrings.rsokay msgid "Okay" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po index 0cb98321..35e3036a 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ja.po +++ b/lazpaint/release/bin/i18n/lazpaint.ja.po @@ -2393,16 +2393,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "現在のテクスチャ" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3478,6 +3468,12 @@ msgstr "" msgid "№" msgstr "" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po index 4882e885..d36839bd 100644 --- a/lazpaint/release/bin/i18n/lazpaint.kab.po +++ b/lazpaint/release/bin/i18n/lazpaint.kab.po @@ -2397,16 +2397,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Tizḍi tamirant" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3500,6 +3490,12 @@ msgstr "Ur iwulem ara ad teskelseḍ tugna s umasal-agi n ufaylu." msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "Ih" + #: uresourcestrings.rsokay msgid "Okay" msgstr "Ih" diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po index 86170e87..867df7b6 100644 --- a/lazpaint/release/bin/i18n/lazpaint.lv.po +++ b/lazpaint/release/bin/i18n/lazpaint.lv.po @@ -2401,16 +2401,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Virsmas raksts" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3504,6 +3494,12 @@ msgstr "Nav prātīgi saglabāt tik lielu attēlu šajā datnes formātā." msgid "№" msgstr "Nr. " +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "Labi" + #: uresourcestrings.rsokay msgid "Okay" msgstr "Labi" diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po index c1f0a199..8a97036c 100644 --- a/lazpaint/release/bin/i18n/lazpaint.nl.po +++ b/lazpaint/release/bin/i18n/lazpaint.nl.po @@ -2394,16 +2394,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Huidige textuur" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3476,6 +3466,12 @@ msgstr "Het is onredelijk om zo'n grote afbeelding in dit bestandsformaat op te msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "OK" diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po index bc32f664..afd3fea2 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pl.po +++ b/lazpaint/release/bin/i18n/lazpaint.pl.po @@ -2406,16 +2406,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Bieżąca tekstura" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3496,6 +3486,12 @@ msgstr "Nie zaleca się zapisywania tak dużego obrazu w tym formacie pliku." msgid "№" msgstr "Nr." +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "OK" diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot index 19144d9d..7bf274dd 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pot +++ b/lazpaint/release/bin/i18n/lazpaint.pot @@ -2235,16 +2235,6 @@ msgstr "" msgid "Current texture" msgstr "" -#: tfpixelate.button_cancel.caption -msgctxt "tfpixelate.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfpixelate.button_ok.caption -msgctxt "tfpixelate.button_ok.caption" -msgid "OK" -msgstr "" - #: tfpixelate.caption msgid "Pixelate" msgstr "" @@ -3303,6 +3293,11 @@ msgstr "" msgid "№" msgstr "" +#: uresourcestrings.rsok +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "" + #: uresourcestrings.rsokay msgid "Okay" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po index 765dde88..82092d34 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po +++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po @@ -2398,17 +2398,6 @@ msgctxt "TFPHONGFILTER.RADIO_USETEXTURE.CAPTION" msgid "Current texture" msgstr "Textura atual" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfpixelate.button_ok.caption -#, fuzzy -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgctxt "TFPIXELATE.CAPTION" msgid "Pixelate" @@ -3492,6 +3481,12 @@ msgstr "Não é razoável salvar uma imagem grande neste formato de arquivo." msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "OK" diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po index 70ede522..02394267 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ru.po +++ b/lazpaint/release/bin/i18n/lazpaint.ru.po @@ -2381,16 +2381,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Текущ. текстура" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3464,6 +3454,12 @@ msgstr "Не стоит сохранять такое большое изобр msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "ОК" + #: uresourcestrings.rsokay msgid "Okay" msgstr "ОК" diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po index b0e86890..16d7e4af 100644 --- a/lazpaint/release/bin/i18n/lazpaint.sv.po +++ b/lazpaint/release/bin/i18n/lazpaint.sv.po @@ -2394,16 +2394,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "Vald textur" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3484,6 +3474,12 @@ msgstr "Det är inte rimligt att spara en så stor bild i det här filformatet." msgid "№" msgstr "" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "OK" + #: uresourcestrings.rsokay msgid "Okay" msgstr "Okej" diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po index 3ccd2b23..adc5a0e8 100644 --- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po +++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po @@ -2394,16 +2394,6 @@ msgctxt "tfphongfilter.radio_usetexture.caption" msgid "Current texture" msgstr "当前纹理" -#: tfpixelate.button_cancel.caption -msgctxt "TFPIXELATE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tfpixelate.button_ok.caption -msgctxt "TFPIXELATE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfpixelate.caption msgctxt "tfpixelate.caption" msgid "Pixelate" @@ -3497,6 +3487,12 @@ msgstr "此文件格式不适合保存如此大的图像。" msgid "№" msgstr "№" +#: uresourcestrings.rsok +#, fuzzy +msgctxt "uresourcestrings.rsok" +msgid "OK" +msgstr "确定" + #: uresourcestrings.rsokay msgid "Okay" msgstr "好" diff --git a/lazpaint/uresourcestrings.pas b/lazpaint/uresourcestrings.pas index ac0e6e9f..741f81b2 100644 --- a/lazpaint/uresourcestrings.pas +++ b/lazpaint/uresourcestrings.pas @@ -280,6 +280,7 @@ function CaptionToResampleFilter(AText: string): TResampleFilter; rsPaletteOptions = 'Palette options'; rsPreview = 'Preview'; + rsOK = 'OK'; function RemoveTrail(ACaption: string): string; From 9b96a0e00a91825a6d255a7db6f35a87ff6e232e Mon Sep 17 00:00:00 2001 From: Lulu Date: Tue, 12 Sep 2023 16:16:41 +0200 Subject: [PATCH 05/70] Added Preview functionality to other filters --- lazpaint/dialog/filter/ucustomblur.lfm | 36 ++- lazpaint/dialog/filter/ucustomblur.lrj | 4 +- lazpaint/dialog/filter/ucustomblur.pas | 39 ++- lazpaint/dialog/filter/uemboss.lfm | 54 ++-- lazpaint/dialog/filter/uemboss.lrj | 4 +- lazpaint/dialog/filter/uemboss.pas | 26 +- lazpaint/dialog/filter/ufilterfunction.lfm | 255 ++++++++++--------- lazpaint/dialog/filter/ufilterfunction.lrj | 4 +- lazpaint/dialog/filter/ufilterfunction.pas | 39 ++- lazpaint/dialog/filter/umotionblur.lfm | 46 ++-- lazpaint/dialog/filter/umotionblur.lrj | 4 +- lazpaint/dialog/filter/umotionblur.pas | 49 +++- lazpaint/dialog/filter/unoisefilter.lfm | 76 +++--- lazpaint/dialog/filter/unoisefilter.lrj | 4 +- lazpaint/dialog/filter/unoisefilter.pas | 40 ++- lazpaint/dialog/filter/uphongfilter.lfm | 34 ++- lazpaint/dialog/filter/uphongfilter.lrj | 4 +- lazpaint/dialog/filter/uphongfilter.pas | 31 ++- lazpaint/dialog/filter/uposterize.lfm | 38 ++- lazpaint/dialog/filter/uposterize.lrj | 4 +- lazpaint/dialog/filter/uposterize.pas | 26 +- lazpaint/dialog/filter/uradialblur.lfm | 61 +++-- lazpaint/dialog/filter/uradialblur.lrj | 4 +- lazpaint/dialog/filter/uradialblur.pas | 43 +++- lazpaint/dialog/filter/usharpen.lfm | 36 ++- lazpaint/dialog/filter/usharpen.lrj | 4 +- lazpaint/dialog/filter/usharpen.pas | 24 +- lazpaint/dialog/filter/utwirl.lfm | 111 ++++---- lazpaint/dialog/filter/utwirl.lrj | 4 +- lazpaint/dialog/filter/utwirl.pas | 29 ++- lazpaint/dialog/filter/uwavedisplacement.lfm | 134 +++++----- lazpaint/dialog/filter/uwavedisplacement.lrj | 4 +- lazpaint/dialog/filter/uwavedisplacement.pas | 34 ++- lazpaint/release/bin/i18n/lazpaint.ar.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.bg.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.cs.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.de.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.es.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.fi.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.fr.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.it.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.ja.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.kab.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.lv.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.nl.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.pl.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.pot | 110 -------- lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 115 --------- lazpaint/release/bin/i18n/lazpaint.ru.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.sv.po | 110 -------- lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 110 -------- 51 files changed, 861 insertions(+), 2429 deletions(-) diff --git a/lazpaint/dialog/filter/ucustomblur.lfm b/lazpaint/dialog/filter/ucustomblur.lfm index 3a219395..24ade2e7 100644 --- a/lazpaint/dialog/filter/ucustomblur.lfm +++ b/lazpaint/dialog/filter/ucustomblur.lfm @@ -1,12 +1,12 @@ object FCustomBlur: TFCustomBlur - Left = 672 - Height = 300 - Top = 158 + Left = 646 + Height = 319 + Top = 261 Width = 400 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Custom blur' - ClientHeight = 300 + ClientHeight = 319 ClientWidth = 400 Font.Height = -12 OnCloseQuery = FormCloseQuery @@ -14,7 +14,7 @@ object FCustomBlur: TFCustomBlur OnDestroy = FormDestroy OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Image1: TImage Left = 8 Height = 216 @@ -27,9 +27,9 @@ object FCustomBlur: TFCustomBlur object Button_OK: TButton Left = 128 Height = 22 - Top = 272 + Top = 288 Width = 59 - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 @@ -37,10 +37,10 @@ object FCustomBlur: TFCustomBlur object Button_Cancel: TButton Left = 194 Height = 22 - Top = 272 + Top = 288 Width = 81 Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end @@ -62,18 +62,28 @@ object FCustomBlur: TFCustomBlur OnClick = Button_EditMaskClick TabOrder = 3 end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 264 + Width = 20 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 4 + end object OpenPictureDialog1: TOpenPictureDialog Title = 'Open grayscale file' Filter = 'Mask images (*.bmp, *.jpeg, *.lzp, *.pcx, *.png, *.tga)|*.bmp;*.jpg;*.jpeg;*.lzp;*.pcx;*.png;*.tga;*.BMP;*.JPG;*.JPEG;*.LZP;*.PCX;*.PNG;*.TGA;*.Bmp;*.Jpg;*.Jpeg;*.Lzp;*.Pcx;*.Png;*.Tga|Bitmaps (*.bmp)|*.bmp;*.BMP;*.Bmp|JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg;*.JPG;*.JPEG;*.Jpg;*.Jpeg|LazPaint (*.lzp)|*.lzp;*.LZP;*.Lzp|PCX (*.pcx)|*.pcx;*.PCX;*.Pcx|Portable Network Graphic (*.png)|*.png;*.PNG;*.Png|Targa (*.tga)|*.tga;*.TGA;*.Tga' Options = [ofNoDereferenceLinks, ofEnableSizing, ofViewDetail] - left = 48 - top = 248 + Left = 232 + Top = 232 end object Timer1: TTimer Enabled = False Interval = 200 OnTimer = Timer1Timer - left = 308 - top = 230 + Left = 328 + Top = 232 end end diff --git a/lazpaint/dialog/filter/ucustomblur.lrj b/lazpaint/dialog/filter/ucustomblur.lrj index 7274598b..076065f0 100644 --- a/lazpaint/dialog/filter/ucustomblur.lrj +++ b/lazpaint/dialog/filter/ucustomblur.lrj @@ -1,7 +1,7 @@ {"version":1,"strings":[ {"hash":96229746,"name":"tfcustomblur.caption","sourcebytes":[67,117,115,116,111,109,32,98,108,117,114],"value":"Custom blur"}, -{"hash":1339,"name":"tfcustomblur.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfcustomblur.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, +{"hash":497723,"name":"tfcustomblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfcustomblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, {"hash":113031038,"name":"tfcustomblur.button_loadmask.caption","sourcebytes":[76,111,97,100,32,109,97,115,107,46,46,46],"value":"Load mask..."}, {"hash":120776574,"name":"tfcustomblur.button_editmask.caption","sourcebytes":[69,100,105,116,32,109,97,115,107,46,46,46],"value":"Edit mask..."}, {"hash":210391541,"name":"tfcustomblur.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,103,114,97,121,115,99,97,108,101,32,102,105,108,101],"value":"Open grayscale file"} diff --git a/lazpaint/dialog/filter/ucustomblur.pas b/lazpaint/dialog/filter/ucustomblur.pas index 6f1172b2..ab0b9c5a 100644 --- a/lazpaint/dialog/filter/ucustomblur.pas +++ b/lazpaint/dialog/filter/ucustomblur.pas @@ -21,12 +21,14 @@ TFCustomBlur = class(TForm) Button_OK: TButton; Button_Cancel: TButton; btnLoadMask: TButton; + CheckBox_Preview: TCheckBox; Image1: TImage; OpenPictureDialog1: TOpenPictureDialog; Timer1: TTimer; procedure Button_EditMaskClick(Sender: TObject); procedure Button_LoadMaskClick(Sender: TObject); procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); @@ -40,6 +42,8 @@ TFCustomBlur = class(TForm) FLazPaintInstance: TLazPaintCustomInstance; FFilterConnector: TFilterConnector; FThreadManager: TFilterThreadManager; + FInitializing: boolean; + FComputedImage: TBGRABitmap; procedure GenerateDefaultMask; procedure SetLazPaintInstance(const AValue: TLazPaintCustomInstance); procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent); @@ -69,10 +73,17 @@ procedure TFCustomBlur.FormDestroy(Sender: TObject); begin subConfig.Free; FreeAndNil(FBrowseImages); + if FComputedImage <> nil then FreeAndNil(FComputedImage); end; procedure TFCustomBlur.FormShow(Sender: TObject); begin + FInitializing := true; + CheckBox_Preview.Checked := true; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; + FInitializing := false; PreviewNeeded; end; @@ -162,7 +173,16 @@ procedure TFCustomBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent if FThreadManager.ReadyToClose then Close else - if AEvent = tmeCompletedTask then Button_OK.Enabled := true; + if AEvent = tmeCompletedTask then begin + Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; + end; + + if FComputedImage <> nil then FComputedImage.Free; + case AEvent of + tmeAbortedTask: FComputedImage := FFilterConnector.BackupLayer.Duplicate; + tmeCompletedTask: FComputedImage := FFilterConnector.ActiveLayer.Duplicate; + end; end; tmeStartingNewTask: begin @@ -170,6 +190,11 @@ procedure TFCustomBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent Timer1.Interval := 100; Timer1.Enabled := true; Button_OK.Enabled := false; + + FInitializing := True; + CheckBox_Preview.Enabled := false; + CheckBox_Preview.Checked := True; + FInitializing := False; end; end; end; @@ -258,10 +283,22 @@ procedure TFCustomBlur.Button_EditMaskClick(Sender: TObject); procedure TFCustomBlur.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked and + (FComputedImage <> nil) then FFilterConnector.PutImage(FComputedImage,false,false); + if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction; ModalResult := mrOK; end; +procedure TFCustomBlur.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + FFilterConnector.PutImage(FComputedImage, false, false) + else + FFilterConnector.RestoreBackup; +end; + procedure TFCustomBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin FThreadManager.Quit; diff --git a/lazpaint/dialog/filter/uemboss.lfm b/lazpaint/dialog/filter/uemboss.lfm index fbde6735..11446562 100644 --- a/lazpaint/dialog/filter/uemboss.lfm +++ b/lazpaint/dialog/filter/uemboss.lfm @@ -1,6 +1,6 @@ object FEmboss: TFEmboss Left = 491 - Height = 277 + Height = 296 Top = 168 Width = 148 AutoSize = True @@ -13,18 +13,18 @@ object FEmboss: TFEmboss ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 277 + ClientHeight = 296 ClientWidth = 148 Font.Height = -12 OnCreate = FormCreate OnShow = FormShow Position = poMainFormCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Label_Direction: TLabel Left = 8 Height = 15 Top = 8 - Width = 112 + Width = 130 Caption = 'Direction :' ParentColor = False end @@ -32,7 +32,7 @@ object FEmboss: TFEmboss Left = 8 Height = 105 Top = 31 - Width = 112 + Width = 130 OnMouseDown = PaintBox1MouseDown OnMouseMove = PaintBox1MouseMove OnMouseUp = PaintBox1MouseUp @@ -40,18 +40,18 @@ object FEmboss: TFEmboss end object CheckBox_Transparent: TCheckBox Left = 8 - Height = 23 + Height = 19 Top = 144 - Width = 112 + Width = 130 Caption = 'Transparent' OnChange = CheckBox_Change TabOrder = 0 end object CheckBox_PreserveColors: TCheckBox Left = 8 - Height = 23 - Top = 175 - Width = 112 + Height = 19 + Top = 171 + Width = 130 Caption = 'Preserve colors' Checked = True OnChange = CheckBox_Change @@ -61,17 +61,17 @@ object FEmboss: TFEmboss object Panel1: TPanel Left = 8 Height = 25 - Top = 206 - Width = 112 + Top = 198 + Width = 130 BevelOuter = bvNone ClientHeight = 25 - ClientWidth = 112 + ClientWidth = 130 TabOrder = 2 object TrackBar_Strength: TTrackBar Left = 0 Height = 25 Top = 0 - Width = 112 + Width = 130 Frequency = 64 Max = 256 OnChange = TrackBar_StrengthChange @@ -80,37 +80,47 @@ object FEmboss: TFEmboss TabOrder = 0 end end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 231 + Width = 130 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 4 + end object Panel2: TPanel Left = 8 Height = 25 - Top = 239 - Width = 112 + Top = 258 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 25 - ClientWidth = 112 + ClientWidth = 130 TabOrder = 3 object Button_OK: TButton Left = 0 Height = 25 Top = 0 - Width = 42 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 50 + Left = 59 Height = 25 Top = 0 - Width = 62 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end diff --git a/lazpaint/dialog/filter/uemboss.lrj b/lazpaint/dialog/filter/uemboss.lrj index 704be890..98d3069a 100644 --- a/lazpaint/dialog/filter/uemboss.lrj +++ b/lazpaint/dialog/filter/uemboss.lrj @@ -3,6 +3,6 @@ {"hash":182806666,"name":"tfemboss.label_direction.caption","sourcebytes":[68,105,114,101,99,116,105,111,110,32,58],"value":"Direction :"}, {"hash":171115524,"name":"tfemboss.checkbox_transparent.caption","sourcebytes":[84,114,97,110,115,112,97,114,101,110,116],"value":"Transparent"}, {"hash":169540963,"name":"tfemboss.checkbox_preservecolors.caption","sourcebytes":[80,114,101,115,101,114,118,101,32,99,111,108,111,114,115],"value":"Preserve colors"}, -{"hash":1339,"name":"tfemboss.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfemboss.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfemboss.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfemboss.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/uemboss.pas b/lazpaint/dialog/filter/uemboss.pas index 8543b3d9..25d40af5 100644 --- a/lazpaint/dialog/filter/uemboss.pas +++ b/lazpaint/dialog/filter/uemboss.pas @@ -17,6 +17,7 @@ interface TFEmboss = class(TForm) Button_OK: TButton; Button_Cancel: TButton; + CheckBox_Preview: TCheckBox; CheckBox_Transparent: TCheckBox; CheckBox_PreserveColors: TCheckBox; Label_Direction: TLabel; @@ -26,6 +27,7 @@ TFEmboss = class(TForm) TrackBar_Strength: TTrackBar; procedure Button_OKClick(Sender: TObject); procedure CheckBox_Change(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; @@ -56,7 +58,7 @@ function ShowEmbossDlg(AFilterConnector: TObject): TScriptResult; implementation -uses BGRABitmapTypes, math, ugraph, umac; +uses BGRABitmapTypes, math, ugraph, umac, UResourceStrings; { TFEmboss } @@ -107,6 +109,8 @@ procedure TFEmboss.FormShow(Sender: TObject); procedure TFEmboss.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then PreviewNeeded; + FilterConnector.ValidateAction; FilterConnector.LazPaintInstance.Config.SetDefaultEmbossAngle(angle); ModalResult := mrOK; @@ -114,7 +118,16 @@ procedure TFEmboss.Button_OKClick(Sender: TObject); procedure TFEmboss.CheckBox_Change(Sender: TObject); begin - PreviewNeeded; + if CheckBox_Preview.Checked then PreviewNeeded; +end; + +procedure TFEmboss.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + PreviewNeeded + else + FilterConnector.RestoreBackup; end; procedure TFEmboss.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; @@ -171,7 +184,7 @@ procedure TFEmboss.PaintBox1Paint(Sender: TObject); procedure TFEmboss.TrackBar_StrengthChange(Sender: TObject); begin - PreviewNeeded; + if CheckBox_Preview.Checked then PreviewNeeded; PaintBox1.Repaint; end; @@ -180,7 +193,7 @@ procedure TFEmboss.ComputeAngle(X, Y: integer); if selectingAngle then begin angle := ugraph.ComputeAngle(X-PaintBox1.Width/2,Y-PaintBox1.Height/2); - PreviewNeeded; + if CheckBox_Preview.Checked then PreviewNeeded; PaintBox1.Repaint; end; end; @@ -211,6 +224,11 @@ procedure TFEmboss.InitParams; if FVars.IsDefined('PreserveColors') then CheckBox_PreserveColors.Checked := FVars.Booleans['PreserveColors']; end; + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing:= false; end; diff --git a/lazpaint/dialog/filter/ufilterfunction.lfm b/lazpaint/dialog/filter/ufilterfunction.lfm index 5118a48c..a7110aed 100644 --- a/lazpaint/dialog/filter/ufilterfunction.lfm +++ b/lazpaint/dialog/filter/ufilterfunction.lfm @@ -1,26 +1,25 @@ object FFilterFunction: TFFilterFunction Left = 437 - Height = 365 + Height = 262 Top = 135 - Width = 645 + Width = 430 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Apply function' - ClientHeight = 365 - ClientWidth = 645 - DesignTimePPI = 144 + ClientHeight = 262 + ClientWidth = 430 OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.2.4.0' object Button_OK: TButton - Left = 218 - Height = 33 - Top = 318 - Width = 88 + Left = 145 + Height = 22 + Top = 231 + Width = 59 Anchors = [akLeft, akBottom] - Caption = 'OK' + Caption = 'rsOK' Default = True Enabled = False OnClick = Button_OKClick @@ -28,13 +27,13 @@ object FFilterFunction: TFFilterFunction TabOrder = 0 end object Button_Cancel: TButton - Left = 314 - Height = 33 - Top = 318 - Width = 110 + Left = 209 + Height = 22 + Top = 231 + Width = 73 Anchors = [akLeft, akBottom] Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 OnClick = Button_CancelClick ParentFont = False @@ -43,10 +42,10 @@ object FFilterFunction: TFFilterFunction object Label_AlphaEquals: TLabel AnchorSideTop.Control = Edit_Alpha AnchorSideTop.Side = asrCenter - Left = 24 - Height = 24 - Top = 275 - Width = 6 + Left = 16 + Height = 15 + Top = 180 + Width = 3 Caption = '.' ParentColor = False ParentFont = False @@ -54,20 +53,20 @@ object FFilterFunction: TFFilterFunction object Edit_Alpha: TEdit AnchorSideLeft.Control = Label_AlphaEquals AnchorSideLeft.Side = asrBottom - Left = 30 - Height = 36 - Top = 269 - Width = 594 + Left = 19 + Height = 23 + Top = 176 + Width = 445 Anchors = [akLeft, akRight, akBottom] OnChange = Edit_AlphaChange ParentFont = False TabOrder = 2 end object PageControl_Color: TPageControl - Left = 12 - Height = 204 - Top = 46 - Width = 624 + Left = 8 + Height = 136 + Top = 31 + Width = 416 ActivePage = TabSheet_RGB ParentFont = False TabIndex = 0 @@ -80,14 +79,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.VerticalSpacing = 6 ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.ControlsPerLine = 1 - ClientHeight = 166 - ClientWidth = 614 + ClientHeight = 108 + ClientWidth = 408 ParentFont = False object PanelRGB: TPanel - Left = 12 - Height = 120 + Left = 9 + Height = 71 Top = 6 - Width = 596 + Width = 393 Align = alClient BevelOuter = bvNone ChildSizing.HorizontalSpacing = 6 @@ -95,14 +94,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 120 - ClientWidth = 596 + ClientHeight = 71 + ClientWidth = 393 TabOrder = 0 object Edit_Red: TEdit Left = 0 - Height = 36 + Height = 23 Top = 0 - Width = 596 + Width = 393 AutoSize = False OnChange = Edit_RedChange ParentFont = False @@ -110,9 +109,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Green: TEdit Left = 0 - Height = 36 - Top = 42 - Width = 596 + Height = 23 + Top = 29 + Width = 393 AutoSize = False OnChange = Edit_GreenChange ParentFont = False @@ -120,9 +119,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Blue: TEdit Left = 0 - Height = 36 - Top = 84 - Width = 596 + Height = 23 + Top = 58 + Width = 393 AutoSize = False OnChange = Edit_BlueChange ParentFont = False @@ -131,9 +130,9 @@ object FFilterFunction: TFFilterFunction end object CheckBox_Gamma: TCheckBox Left = 6 - Height = 28 - Top = 132 - Width = 602 + Height = 19 + Top = 83 + Width = 396 Align = alBottom Caption = 'Gamma correction' OnChange = CheckBox_GammaChange @@ -142,41 +141,41 @@ object FFilterFunction: TFFilterFunction end object PanelLabelRGB: TPanel Left = 6 - Height = 120 + Height = 71 Top = 6 - Width = 6 + Width = 3 Align = alLeft AutoSize = True BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 120 - ClientWidth = 6 + ClientHeight = 71 + ClientWidth = 3 TabOrder = 2 object Label_RedEquals: TLabel Left = 0 - Height = 24 + Height = 15 Top = 0 - Width = 6 + Width = 3 Caption = '.' ParentColor = False ParentFont = False end object Label_GreenEquals: TLabel Left = 0 - Height = 24 - Top = 30 - Width = 6 + Height = 15 + Top = 21 + Width = 3 Caption = '.' ParentColor = False ParentFont = False end object Label_BlueEquals: TLabel Left = 0 - Height = 24 - Top = 60 - Width = 6 + Height = 15 + Top = 42 + Width = 3 Caption = '.' ParentColor = False ParentFont = False @@ -188,14 +187,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.VerticalSpacing = 6 - ClientHeight = 166 - ClientWidth = 614 + ClientHeight = 108 + ClientWidth = 408 ParentFont = False object PanelHSL: TPanel - Left = 12 - Height = 120 + Left = 9 + Height = 71 Top = 6 - Width = 596 + Width = 393 Align = alClient BevelOuter = bvNone ChildSizing.HorizontalSpacing = 6 @@ -203,14 +202,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 120 - ClientWidth = 596 + ClientHeight = 71 + ClientWidth = 393 TabOrder = 0 object Edit_Hue: TEdit Left = 0 - Height = 36 + Height = 23 Top = 0 - Width = 596 + Width = 393 AutoSize = False OnChange = Edit_HueChange ParentFont = False @@ -218,9 +217,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Saturation: TEdit Left = 0 - Height = 36 - Top = 42 - Width = 596 + Height = 23 + Top = 29 + Width = 393 AutoSize = False OnChange = Edit_SaturationChange ParentFont = False @@ -228,9 +227,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Lightness: TEdit Left = 0 - Height = 36 - Top = 84 - Width = 596 + Height = 23 + Top = 58 + Width = 393 AutoSize = False OnChange = Edit_LightnessChange ParentFont = False @@ -239,9 +238,9 @@ object FFilterFunction: TFFilterFunction end object CheckBox_GSBA: TCheckBox Left = 6 - Height = 28 - Top = 132 - Width = 602 + Height = 19 + Top = 83 + Width = 396 Align = alBottom Caption = 'Corrected hue and lightness' OnChange = CheckBox_GSBAChange @@ -250,41 +249,41 @@ object FFilterFunction: TFFilterFunction end object PanelLabelHSL: TPanel Left = 6 - Height = 120 + Height = 71 Top = 6 - Width = 6 + Width = 3 Align = alLeft AutoSize = True BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 120 - ClientWidth = 6 + ClientHeight = 71 + ClientWidth = 3 TabOrder = 2 object Label_HueEquals: TLabel Left = 0 - Height = 24 + Height = 15 Top = 0 - Width = 6 + Width = 3 Caption = '.' ParentColor = False ParentFont = False end object Label_SaturationEquals: TLabel Left = 0 - Height = 24 - Top = 30 - Width = 6 + Height = 15 + Top = 21 + Width = 3 Caption = '.' ParentColor = False ParentFont = False end object Label_LightnessEquals: TLabel Left = 0 - Height = 24 - Top = 60 - Width = 6 + Height = 15 + Top = 42 + Width = 3 Caption = '.' ParentColor = False ParentFont = False @@ -296,13 +295,13 @@ object FFilterFunction: TFFilterFunction ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.VerticalSpacing = 6 - ClientHeight = 166 - ClientWidth = 614 + ClientHeight = 108 + ClientWidth = 408 object PanelLab: TPanel - Left = 12 - Height = 154 + Left = 9 + Height = 96 Top = 6 - Width = 596 + Width = 393 Align = alClient BevelOuter = bvNone ChildSizing.HorizontalSpacing = 6 @@ -310,14 +309,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 154 - ClientWidth = 596 + ClientHeight = 96 + ClientWidth = 393 TabOrder = 0 object Edit_L: TEdit Left = 0 - Height = 36 + Height = 23 Top = 0 - Width = 596 + Width = 393 AutoSize = False OnChange = Edit_LChange ParentFont = False @@ -325,9 +324,9 @@ object FFilterFunction: TFFilterFunction end object Edit_a: TEdit Left = 0 - Height = 36 - Top = 42 - Width = 596 + Height = 23 + Top = 29 + Width = 393 AutoSize = False OnChange = Edit_aChange ParentFont = False @@ -335,9 +334,9 @@ object FFilterFunction: TFFilterFunction end object Edit_b: TEdit Left = 0 - Height = 36 - Top = 84 - Width = 596 + Height = 23 + Top = 58 + Width = 393 AutoSize = False OnChange = Edit_bChange ParentFont = False @@ -346,41 +345,41 @@ object FFilterFunction: TFFilterFunction end object PanelLabelLab: TPanel Left = 6 - Height = 154 + Height = 96 Top = 6 - Width = 6 + Width = 3 Align = alLeft AutoSize = True BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 154 - ClientWidth = 6 + ClientHeight = 96 + ClientWidth = 3 TabOrder = 1 object Label_LEquals: TLabel Left = 0 - Height = 24 + Height = 15 Top = 0 - Width = 6 + Width = 3 Caption = '.' ParentColor = False ParentFont = False end object Label_aEquals: TLabel Left = 0 - Height = 24 - Top = 30 - Width = 6 + Height = 15 + Top = 21 + Width = 3 Caption = '.' ParentColor = False ParentFont = False end object Label_bEquals: TLabel Left = 0 - Height = 24 - Top = 60 - Width = 6 + Height = 15 + Top = 42 + Width = 3 Caption = '.' ParentColor = False ParentFont = False @@ -389,25 +388,35 @@ object FFilterFunction: TFFilterFunction end end object Label_Variables: TLabel - Left = 14 - Height = 24 - Top = 12 - Width = 104 + Left = 9 + Height = 15 + Top = 8 + Width = 52 Caption = 'Variables :' ParentColor = False ParentFont = False end + object CheckBox_Preview: TCheckBox + Left = 21 + Height = 19 + Top = 208 + Width = 20 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 4 + end object Timer1: TTimer Enabled = False Interval = 30 OnTimer = Timer1Timer - left = 300 - top = 60 + Left = 200 + Top = 40 end object Timer_AdjustVerticalSize: TTimer Interval = 20 OnTimer = Timer_AdjustVerticalSizeTimer - left = 452 - top = 25 + Left = 301 + Top = 17 end end diff --git a/lazpaint/dialog/filter/ufilterfunction.lrj b/lazpaint/dialog/filter/ufilterfunction.lrj index b830f887..4ec7f2f5 100644 --- a/lazpaint/dialog/filter/ufilterfunction.lrj +++ b/lazpaint/dialog/filter/ufilterfunction.lrj @@ -1,7 +1,7 @@ {"version":1,"strings":[ {"hash":221847054,"name":"tffilterfunction.caption","sourcebytes":[65,112,112,108,121,32,102,117,110,99,116,105,111,110],"value":"Apply function"}, -{"hash":1339,"name":"tffilterfunction.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tffilterfunction.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, +{"hash":497723,"name":"tffilterfunction.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tffilterfunction.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, {"hash":46,"name":"tffilterfunction.label_alphaequals.caption","sourcebytes":[46],"value":"."}, {"hash":22194,"name":"tffilterfunction.tabsheet_rgb.caption","sourcebytes":[82,71,66],"value":"RGB"}, {"hash":193524366,"name":"tffilterfunction.checkbox_gamma.caption","sourcebytes":[71,97,109,109,97,32,99,111,114,114,101,99,116,105,111,110],"value":"Gamma correction"}, diff --git a/lazpaint/dialog/filter/ufilterfunction.pas b/lazpaint/dialog/filter/ufilterfunction.pas index 4de570e5..14c954b5 100644 --- a/lazpaint/dialog/filter/ufilterfunction.pas +++ b/lazpaint/dialog/filter/ufilterfunction.pas @@ -22,6 +22,7 @@ interface TFFilterFunction = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; CheckBox_Gamma: TCheckBox; CheckBox_GSBA: TCheckBox; Edit_Alpha: TEdit; @@ -61,6 +62,7 @@ TFFilterFunction = class(TForm) procedure Button_OKClick(Sender: TObject); procedure CheckBox_GammaChange(Sender: TObject); procedure CheckBox_GSBAChange(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure Edit_aChange(Sender: TObject); procedure Edit_AlphaChange(Sender: TObject); procedure Edit_bChange(Sender: TObject); @@ -85,7 +87,8 @@ TFFilterFunction = class(TForm) FRedError, FGreenError, FBlueError, FAlphaError, FHueError, FSaturationError, FLightnessError, FLError, FaError, FbError: boolean; - FComputing: boolean; + FComputing, + FComputationRestarted: boolean; FSourceAsLab: TLabABitmap; FComputedImage: TBGRABitmap; FComputedLines: integer; @@ -115,7 +118,7 @@ function ShowFilterFunctionDlg(AFilterConnector: TObject): TScriptResult; implementation -uses UMac, LazPaintType, math; +uses UMac, LazPaintType, UResourceStrings, math; function ShowFilterFunctionDlg(AFilterConnector: TObject): TScriptResult; var @@ -502,9 +505,11 @@ TExprVariables = record Timer1.Enabled:= false; if FComputing then begin - if FComputedImage = nil then - begin + if (FComputedImage = nil) then FComputedImage := TBGRABitmap.Create(FFilterConnector.BackupLayer.Width,FFilterConnector.BackupLayer.Height); + if FComputationRestarted then + begin + FComputationRestarted := false; FComputedLines := FFilterConnector.WorkArea.Top; FFilterConnector.RestoreBackup; end; @@ -699,12 +704,13 @@ TExprVariables = record end; end; - FFilterConnector.PutImage(FComputedImage, rect(0,prevComputedLines,FComputedImage.Width,FComputedLines), True,False); + if CheckBox_Preview.Checked then + FFilterConnector.PutImage(FComputedImage, rect(0,prevComputedLines,FComputedImage.Width,FComputedLines), True,False); if FComputedLines = FFilterConnector.WorkArea.Bottom then begin - FreeAndNil(FComputedImage); FComputing := false; Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; end; Timer1.Interval := 15; Timer1.Enabled := True; @@ -754,15 +760,17 @@ procedure TFFilterFunction.UpdateExpr(AExpr: TFPExpressionParser; AEdit: TEdit; procedure TFFilterFunction.PreviewNeeded; begin Timer1.Enabled := False; - FreeAndNil(FComputedImage); FComputing := false; Button_OK.Enabled := false; + CheckBox_Preview.Enabled := false; + FComputationRestarted := false; if not FAlphaError and not FGreenError and not FBlueError and not FRedError and not FHueError and not FSaturationError and not FLightnessError then begin FComputing := True; FComputedLines := 0; + FComputationRestarted := true; Timer1.Interval := 200; Timer1.Enabled := True; end; @@ -814,6 +822,11 @@ procedure TFFilterFunction.InitParams; Edit_LChange(nil); Edit_aChange(nil); Edit_bChange(nil); + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing:= false; end; @@ -1043,6 +1056,9 @@ function TFFilterFunction.ReplaceStats(AExpr: string): string; procedure TFFilterFunction.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then + FFilterConnector.PutImage(FComputedImage,True,False); + FFilterConnector.ValidateAction; ModalResult := mrOK; end; @@ -1066,6 +1082,15 @@ procedure TFFilterFunction.CheckBox_GSBAChange(Sender: TObject); end; end; +procedure TFFilterFunction.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + FFilterConnector.PutImage(FComputedImage,True,False) + else + FFilterConnector.RestoreBackup; +end; + procedure TFFilterFunction.Edit_aChange(Sender: TObject); begin UpdateExpr(FaExpr,Edit_a,FaError); diff --git a/lazpaint/dialog/filter/umotionblur.lfm b/lazpaint/dialog/filter/umotionblur.lfm index accf3702..1ca10d75 100644 --- a/lazpaint/dialog/filter/umotionblur.lfm +++ b/lazpaint/dialog/filter/umotionblur.lfm @@ -1,6 +1,6 @@ object FMotionBlur: TFMotionBlur Left = 438 - Height = 217 + Height = 236 Top = 173 Width = 148 AutoSize = True @@ -13,25 +13,26 @@ object FMotionBlur: TFMotionBlur ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 217 + ClientHeight = 236 ClientWidth = 148 Font.Height = -12 OnCloseQuery = FormCloseQuery OnCreate = FormCreate + OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Panel1: TPanel Left = 8 Height = 23 Top = 8 - Width = 124 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 23 - ClientWidth = 124 + ClientWidth = 130 TabOrder = 1 object Label_Distance: TLabel Left = 0 @@ -51,7 +52,6 @@ object FMotionBlur: TFMotionBlur DecimalPlaces = 1 Increment = 3 MaxValue = 1000 - MinValue = 0 OnChange = SpinEdit_DistanceChange TabOrder = 0 Value = 5 @@ -61,7 +61,7 @@ object FMotionBlur: TFMotionBlur Left = 8 Height = 19 Top = 39 - Width = 124 + Width = 130 Caption = 'Oriented' Checked = True OnChange = Checkbox_OrientedChange @@ -72,43 +72,53 @@ object FMotionBlur: TFMotionBlur Left = 8 Height = 105 Top = 66 - Width = 124 + Width = 130 OnMouseDown = PaintBox1MouseDown OnMouseMove = PaintBox1MouseMove OnMouseUp = PaintBox1MouseUp OnPaint = PaintBox1Paint end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 179 + Width = 130 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 3 + end object Panel2: TPanel Left = 8 Height = 25 - Top = 179 - Width = 124 + Top = 206 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 25 - ClientWidth = 124 + ClientWidth = 130 TabOrder = 2 object Button_OK: TButton Left = 0 Height = 25 Top = 0 - Width = 42 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 50 + Left = 59 Height = 25 Top = 0 - Width = 62 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end @@ -117,7 +127,7 @@ object FMotionBlur: TFMotionBlur Enabled = False Interval = 200 OnTimer = Timer1Timer - left = 112 - top = 96 + Left = 112 + Top = 96 end end diff --git a/lazpaint/dialog/filter/umotionblur.lrj b/lazpaint/dialog/filter/umotionblur.lrj index 52d633ea..64b76afa 100644 --- a/lazpaint/dialog/filter/umotionblur.lrj +++ b/lazpaint/dialog/filter/umotionblur.lrj @@ -2,6 +2,6 @@ {"hash":106100930,"name":"tfmotionblur.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114],"value":"Motion blur"}, {"hash":176170906,"name":"tfmotionblur.label_distance.caption","sourcebytes":[68,105,115,116,97,110,99,101,32,58],"value":"Distance :"}, {"hash":150757332,"name":"tfmotionblur.checkbox_oriented.caption","sourcebytes":[79,114,105,101,110,116,101,100],"value":"Oriented"}, -{"hash":1339,"name":"tfmotionblur.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfmotionblur.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfmotionblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfmotionblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/umotionblur.pas b/lazpaint/dialog/filter/umotionblur.pas index 50d49716..42c3071a 100644 --- a/lazpaint/dialog/filter/umotionblur.pas +++ b/lazpaint/dialog/filter/umotionblur.pas @@ -17,6 +17,7 @@ interface TFMotionBlur = class(TForm) Button_OK: TButton; Button_Cancel: TButton; + CheckBox_Preview: TCheckBox; Checkbox_Oriented: TCheckBox; Panel1: TPanel; Panel2: TPanel; @@ -26,8 +27,10 @@ TFMotionBlur = class(TForm) Timer1: TTimer; procedure Button_OKClick(Sender: TObject); procedure Checkbox_OrientedChange(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer); @@ -47,7 +50,9 @@ TFMotionBlur = class(TForm) selectingAngle: boolean; InPaintBoxMouseMove: boolean; PaintBoxMouseMovePos: TPoint; - FQuitQuery: boolean; + FQuitQuery, + FInitializing: boolean; + FComputedImage: TBGRABitmap; procedure UpdateStep; procedure ComputeAngle(X,Y: integer); procedure InitParams; @@ -59,7 +64,7 @@ function ShowMotionBlurDlg(AFilterConnector: TObject): TScriptResult; implementation -uses BGRABitmapTypes, math, ugraph, umac, BGRAFilters; +uses BGRABitmapTypes, math, ugraph, umac, UResourceStrings, BGRAFilters; function ShowMotionBlurDlg(AFilterConnector: TObject): TScriptResult; var @@ -186,6 +191,13 @@ procedure TFMotionBlur.InitParams; angle := FVars.Floats['Angle'] else angle := FFilterConnector.LazPaintInstance.Config.DefaultBlurMotionAngle; + + FInitializing := true; + CheckBox_Preview.Checked := true; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; + FInitializing := false; end; procedure TFMotionBlur.PreviewNeeded; @@ -205,7 +217,16 @@ procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent if FThreadManager.ReadyToClose then Close else - if AEvent = tmeCompletedTask then Button_OK.Enabled := true; + if AEvent = tmeCompletedTask then begin + Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; + end; + + if FComputedImage <> nil then FComputedImage.Free; + case AEvent of + tmeAbortedTask: FComputedImage := FFilterConnector.BackupLayer.Duplicate; + tmeCompletedTask: FComputedImage := FFilterConnector.ActiveLayer.Duplicate; + end; end; tmeStartingNewTask: begin @@ -213,6 +234,11 @@ procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent Timer1.Interval := 100; Timer1.Enabled := true; Button_OK.Enabled := false; + + FInitializing := True; + CheckBox_Preview.Enabled := false; + CheckBox_Preview.Checked := True; + FInitializing := False; end; end; end; @@ -227,6 +253,11 @@ procedure TFMotionBlur.FormCreate(Sender: TObject); SpinEdit_Distance.Constraints.MinWidth := DoScaleX(70, OriginalDPI); end; +procedure TFMotionBlur.FormDestroy(Sender: TObject); +begin + if FComputedImage <> nil then FreeAndNil(FComputedImage); +end; + procedure TFMotionBlur.FormShow(Sender: TObject); begin FQuitQuery := false; @@ -262,6 +293,9 @@ procedure TFMotionBlur.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; procedure TFMotionBlur.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked and + (FComputedImage <> nil) then FFilterConnector.PutImage(FComputedImage,false,false); + if not FFilterConnector.ActionDone then begin FFilterConnector.ValidateAction; @@ -278,6 +312,15 @@ procedure TFMotionBlur.Checkbox_OrientedChange(Sender: TObject); PreviewNeeded; end; +procedure TFMotionBlur.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + FFilterConnector.PutImage(FComputedImage, false, false) + else + FFilterConnector.RestoreBackup; +end; + procedure TFMotionBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin FThreadManager.Quit; diff --git a/lazpaint/dialog/filter/unoisefilter.lfm b/lazpaint/dialog/filter/unoisefilter.lfm index 782912e0..cf0ad5f9 100644 --- a/lazpaint/dialog/filter/unoisefilter.lfm +++ b/lazpaint/dialog/filter/unoisefilter.lfm @@ -1,6 +1,6 @@ object FNoiseFilter: TFNoiseFilter Left = 367 - Height = 125 + Height = 144 Top = 354 Width = 154 AutoSize = True @@ -13,7 +13,7 @@ object FNoiseFilter: TFNoiseFilter ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 125 + ClientHeight = 144 ClientWidth = 154 OnCloseQuery = FormCloseQuery OnCreate = FormCreate @@ -21,31 +21,31 @@ object FNoiseFilter: TFNoiseFilter OnHide = FormHide OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Panel3: TPanel Left = 8 - Height = 48 + Height = 38 Top = 8 - Width = 127 + Width = 130 BevelOuter = bvNone ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 48 - ClientWidth = 127 + ClientHeight = 38 + ClientWidth = 130 TabOrder = 2 object Radio_GrayscaleNoise: TRadioButton Left = 0 - Height = 24 + Height = 19 Top = 0 - Width = 126 + Width = 101 Caption = 'Grayscale noise' TabOrder = 0 end object Radio_RGBNoise: TRadioButton Left = 0 - Height = 24 - Top = 24 - Width = 126 + Height = 19 + Top = 19 + Width = 101 Caption = 'RGB noise' Checked = True OnChange = Radio_NoiseChange @@ -55,29 +55,29 @@ object FNoiseFilter: TFNoiseFilter end object Panel1: TPanel Left = 8 - Height = 28 - Top = 64 - Width = 127 + Height = 23 + Top = 54 + Width = 130 AutoSize = True BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 28 - ClientWidth = 127 + ClientHeight = 23 + ClientWidth = 130 TabOrder = 0 object Label_Opacity: TLabel Left = 0 - Height = 28 + Height = 23 Top = 0 - Width = 54 + Width = 44 Caption = 'Opacity:' Layout = tlCenter ParentColor = False end object SpinEdit_Alpha: TSpinEdit - Left = 62 - Height = 28 + Left = 52 + Height = 23 Top = 0 Width = 65 Constraints.MinWidth = 65 @@ -89,38 +89,48 @@ object FNoiseFilter: TFNoiseFilter Value = 255 end end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 85 + Width = 130 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 3 + end object Panel2: TPanel Left = 8 - Height = 30 - Top = 100 - Width = 127 + Height = 25 + Top = 112 + Width = 130 AutoSize = True BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 30 - ClientWidth = 127 + ClientHeight = 25 + ClientWidth = 130 TabOrder = 1 object Button_OK: TButton Left = 0 - Height = 30 + Height = 25 Top = 0 - Width = 46 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 54 - Height = 30 + Left = 59 + Height = 25 Top = 0 - Width = 70 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end diff --git a/lazpaint/dialog/filter/unoisefilter.lrj b/lazpaint/dialog/filter/unoisefilter.lrj index e1a989e6..4b39c326 100644 --- a/lazpaint/dialog/filter/unoisefilter.lrj +++ b/lazpaint/dialog/filter/unoisefilter.lrj @@ -3,6 +3,6 @@ {"hash":243178037,"name":"tfnoisefilter.radio_grayscalenoise.caption","sourcebytes":[71,114,97,121,115,99,97,108,101,32,110,111,105,115,101],"value":"Grayscale noise"}, {"hash":74782245,"name":"tfnoisefilter.radio_rgbnoise.caption","sourcebytes":[82,71,66,32,110,111,105,115,101],"value":"RGB noise"}, {"hash":108662442,"name":"tfnoisefilter.label_opacity.caption","sourcebytes":[79,112,97,99,105,116,121,58],"value":"Opacity:"}, -{"hash":1339,"name":"tfnoisefilter.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfnoisefilter.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfnoisefilter.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfnoisefilter.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/unoisefilter.pas b/lazpaint/dialog/filter/unoisefilter.pas index 577fc1c4..ffbbdc35 100644 --- a/lazpaint/dialog/filter/unoisefilter.pas +++ b/lazpaint/dialog/filter/unoisefilter.pas @@ -16,6 +16,7 @@ interface TFNoiseFilter = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; Label_Opacity: TLabel; Panel1: TPanel; Panel2: TPanel; @@ -24,6 +25,7 @@ TFNoiseFilter = class(TForm) Radio_RGBNoise: TRadioButton; SpinEdit_Alpha: TSpinEdit; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var {%H-}CanClose: boolean); procedure FormDestroy(Sender: TObject); procedure FormHide(Sender: TObject); @@ -36,6 +38,7 @@ TFNoiseFilter = class(TForm) FComputedLayer: TBGRABitmap; FClosing: boolean; procedure InitParams; + procedure PutComputedLayerToFilterConnector; public FInitializing: boolean; FFilterConnector: TFilterConnector; @@ -47,7 +50,7 @@ function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult; implementation -uses BGRAGradientScanner, umac, LCScaleDPI, LazPaintType; +uses BGRAGradientScanner, umac, LCScaleDPI, LazPaintType, UResourceStrings; function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult; var @@ -84,10 +87,22 @@ function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult; procedure TFNoiseFilter.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then + PutComputedLayerToFilterConnector; + FFilterConnector.ValidateAction; ModalResult := mrOK; end; +procedure TFNoiseFilter.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + PutComputedLayerToFilterConnector + else + FFilterConnector.RestoreBackup; +end; + procedure TFNoiseFilter.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin FClosing := true; @@ -153,9 +168,24 @@ procedure TFNoiseFilter.InitParams; if Booleans['Grayscale'] then Radio_GrayscaleNoise.Checked:= true; if IsDefined('Opacity') then SpinEdit_Alpha.Value := Integers['Opacity']; end; + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing:= false; end; +procedure TFNoiseFilter.PutComputedLayerToFilterConnector; +begin + if SpinEdit_Alpha.Value <> 255 then + begin + FFilterConnector.RestoreBackup; + FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmDrawWithTransparency); + end else + FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmSet); +end; + procedure TFNoiseFilter.ComputeFilteredLayer; var scan: TBGRARandomScanner; begin @@ -169,12 +199,8 @@ procedure TFNoiseFilter.ComputeFilteredLayer; procedure TFNoiseFilter.PreviewNeeded(ARecomputeRandom: boolean); begin if ARecomputeRandom or (FComputedLayer = nil) then ComputeFilteredLayer; - if SpinEdit_Alpha.Value <> 255 then - begin - FFilterConnector.RestoreBackup; - FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmDrawWithTransparency); - end else - FFilterConnector.PutImage(FComputedLayer,Radio_RGBNoise.Checked,False,dmSet); + if not CheckBox_Preview.Checked then exit; + PutComputedLayerToFilterConnector; end; end. diff --git a/lazpaint/dialog/filter/uphongfilter.lfm b/lazpaint/dialog/filter/uphongfilter.lfm index 54c7063c..26179d8d 100644 --- a/lazpaint/dialog/filter/uphongfilter.lfm +++ b/lazpaint/dialog/filter/uphongfilter.lfm @@ -1,25 +1,25 @@ object FPhongFilter: TFPhongFilter Left = 402 - Height = 191 + Height = 210 Top = 127 Width = 509 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Shaded map' - ClientHeight = 191 + ClientHeight = 210 ClientWidth = 509 OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '1.1' + LCLVersion = '2.2.4.0' object Button_OK: TButton Left = 175 Height = 22 - Top = 162 + Top = 181 Width = 59 Anchors = [akLeft, akBottom] - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 @@ -27,11 +27,11 @@ object FPhongFilter: TFPhongFilter object Button_Cancel: TButton Left = 241 Height = 22 - Top = 162 + Top = 181 Width = 73 Anchors = [akLeft, akBottom] Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end @@ -71,7 +71,7 @@ object FPhongFilter: TFPhongFilter Top = 4 Width = 128 Caption = 'Color' - ClientHeight = 88 + ClientHeight = 86 ClientWidth = 124 TabOrder = 3 object Radio_UsePenColor: TRadioButton @@ -96,7 +96,7 @@ object FPhongFilter: TFPhongFilter Left = 6 Height = 19 Top = 63 - Width = 99 + Width = 100 Caption = 'Current texture' OnChange = Radio_UseChange TabOrder = 2 @@ -124,7 +124,7 @@ object FPhongFilter: TFPhongFilter Top = 4 Width = 152 Caption = 'Altitude map' - ClientHeight = 100 + ClientHeight = 98 ClientWidth = 148 TabOrder = 4 object Radio_MapAlpha: TRadioButton @@ -193,11 +193,21 @@ object FPhongFilter: TFPhongFilter TabOrder = 4 end end + object CheckBox_Preview: TCheckBox + Left = 14 + Height = 19 + Top = 160 + Width = 20 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 5 + end object Timer1: TTimer Enabled = False Interval = 200 OnTimer = Timer1Timer - left = 312 - top = 176 + Left = 312 + Top = 176 end end diff --git a/lazpaint/dialog/filter/uphongfilter.lrj b/lazpaint/dialog/filter/uphongfilter.lrj index d9c8a199..11574239 100644 --- a/lazpaint/dialog/filter/uphongfilter.lrj +++ b/lazpaint/dialog/filter/uphongfilter.lrj @@ -1,7 +1,7 @@ {"version":1,"strings":[ {"hash":179572208,"name":"tfphongfilter.caption","sourcebytes":[83,104,97,100,101,100,32,109,97,112],"value":"Shaded map"}, -{"hash":1339,"name":"tfphongfilter.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfphongfilter.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, +{"hash":497723,"name":"tfphongfilter.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfphongfilter.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, {"hash":118747402,"name":"tfphongfilter.label_altitude.caption","sourcebytes":[71,108,111,98,97,108,32,97,108,116,105,116,117,100,101,32,58],"value":"Global altitude :"}, {"hash":4875106,"name":"tfphongfilter.groupbox_color.caption","sourcebytes":[67,111,108,111,114],"value":"Color"}, {"hash":6952354,"name":"tfphongfilter.radio_usepencolor.caption","sourcebytes":[80,101,110,32,99,111,108,111,114],"value":"Pen color"}, diff --git a/lazpaint/dialog/filter/uphongfilter.pas b/lazpaint/dialog/filter/uphongfilter.pas index acc6e3fe..90305708 100644 --- a/lazpaint/dialog/filter/uphongfilter.pas +++ b/lazpaint/dialog/filter/uphongfilter.pas @@ -17,6 +17,7 @@ interface TFPhongFilter = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; GroupBox_Color: TGroupBox; GroupBox_Color1: TGroupBox; Label_LightPosition: TLabel; @@ -36,6 +37,7 @@ TFPhongFilter = class(TForm) SpinEdit_Altitude: TSpinEdit; Timer1: TTimer; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); @@ -52,7 +54,8 @@ TFPhongFilter = class(TForm) { private declarations } FInitializing: boolean; FCenter: TPointF; - FHeightMap: TBGRABitmap; + FHeightMap, + FComputedImage: TBGRABitmap; FWorkspaceColor: TColor; FTexture: TBGRACustomBitmap; function GetCurrentLightPos: TPointF; @@ -68,7 +71,7 @@ function ShowPhongFilterDlg(AFilterConnector: TObject): TScriptResult; implementation -uses LCScaleDPI, UMac, BGRAGradients, LazPaintType; +uses LCScaleDPI, UMac, BGRAGradients, LazPaintType, UResourceStrings; function ShowPhongFilterDlg(AFilterConnector: TObject): TScriptResult; var @@ -105,12 +108,24 @@ function ShowPhongFilterDlg(AFilterConnector: TObject): TScriptResult; procedure TFPhongFilter.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then + FilterConnector.PutImage(FComputedImage, True, false); + FilterConnector.ValidateAction; FilterConnector.LazPaintInstance.Config.SetDefaultPhongFilterAltitude(SpinEdit_Altitude.Value); FilterConnector.LazPaintInstance.ToolManager.LightPosition := CurrentLightPos; ModalResult := mrOK; end; +procedure TFPhongFilter.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + FilterConnector.PutImage(FComputedImage, true, false) + else + FilterConnector.RestoreBackup; +end; + procedure TFPhongFilter.FormCreate(Sender: TObject); begin ScaleControl(Self,OriginalDPI); @@ -123,6 +138,7 @@ procedure TFPhongFilter.FormDestroy(Sender: TObject); begin FreeAndNil(FHeightMap); if Assigned(FTexture) then FTexture.Free; + if Assigned(FComputedImage) then FComputedImage.Free; end; @@ -198,8 +214,11 @@ procedure TFPhongFilter.SpinEdit_AltitudeChange(Sender: TObject); procedure TFPhongFilter.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; - FilterConnector.PutImage(ComputeFilteredLayer,True,true); + if FComputedImage <> nil then FComputedImage.Free; + FComputedImage := ComputeFilteredLayer; + if CheckBox_Preview.Checked then FilterConnector.PutImage(FComputedImage,True,false); Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; end; procedure TFPhongFilter.PreviewNeeded; @@ -207,6 +226,7 @@ procedure TFPhongFilter.PreviewNeeded; Timer1.Enabled := false; Timer1.Enabled := True; Button_OK.Enabled := false; + CheckBox_Preview.Enabled := false; end; function TFPhongFilter.GetCurrentLightPos: TPointF; @@ -271,6 +291,11 @@ procedure TFPhongFilter.InitParams; end; end; SpinEdit_AltitudeChange(nil); + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing := false; end; diff --git a/lazpaint/dialog/filter/uposterize.lfm b/lazpaint/dialog/filter/uposterize.lfm index 239f0bd2..ac058523 100644 --- a/lazpaint/dialog/filter/uposterize.lfm +++ b/lazpaint/dialog/filter/uposterize.lfm @@ -1,6 +1,6 @@ object FPosterize: TFPosterize Left = 345 - Height = 114 + Height = 133 Top = 163 Width = 148 AutoSize = True @@ -13,23 +13,23 @@ object FPosterize: TFPosterize ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 114 + ClientHeight = 133 ClientWidth = 148 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Panel1: TPanel Left = 8 Height = 23 Top = 8 - Width = 112 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 23 - ClientWidth = 112 + ClientWidth = 130 TabOrder = 1 object Label_Levels: TLabel Left = 0 @@ -57,40 +57,50 @@ object FPosterize: TFPosterize Left = 8 Height = 19 Top = 39 - Width = 112 + Width = 130 Caption = 'By lightness' OnChange = CheckBox_ByLightnessChange TabOrder = 0 end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 66 + Width = 130 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 3 + end object Panel2: TPanel Left = 8 Height = 25 - Top = 66 - Width = 112 + Top = 93 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 25 - ClientWidth = 112 + ClientWidth = 130 TabOrder = 2 object Button_OK: TButton Left = 0 Height = 25 Top = 0 - Width = 42 - Caption = 'OK' + Width = 51 + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 50 + Left = 59 Height = 25 Top = 0 - Width = 62 + Width = 71 Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end diff --git a/lazpaint/dialog/filter/uposterize.lrj b/lazpaint/dialog/filter/uposterize.lrj index a8e6e499..d9947c08 100644 --- a/lazpaint/dialog/filter/uposterize.lrj +++ b/lazpaint/dialog/filter/uposterize.lrj @@ -2,6 +2,6 @@ {"hash":179103845,"name":"tfposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101],"value":"Posterize"}, {"hash":214708250,"name":"tfposterize.label_levels.caption","sourcebytes":[76,101,118,101,108,115,32,58],"value":"Levels :"}, {"hash":157433427,"name":"tfposterize.checkbox_bylightness.caption","sourcebytes":[66,121,32,108,105,103,104,116,110,101,115,115],"value":"By lightness"}, -{"hash":1339,"name":"tfposterize.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfposterize.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfposterize.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfposterize.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/uposterize.pas b/lazpaint/dialog/filter/uposterize.pas index c7a34260..fe0b7fa0 100644 --- a/lazpaint/dialog/filter/uposterize.pas +++ b/lazpaint/dialog/filter/uposterize.pas @@ -16,6 +16,7 @@ interface TFPosterize = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; CheckBox_ByLightness: TCheckBox; Label_Levels: TLabel; Panel1: TPanel; @@ -23,6 +24,7 @@ TFPosterize = class(TForm) SpinEdit_Levels: TSpinEdit; procedure Button_OKClick(Sender: TObject); procedure CheckBox_ByLightnessChange(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure SpinEdit_LevelsChange(Sender: TObject); @@ -41,7 +43,7 @@ function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVari implementation -uses BGRABitmapTypes, LCScaleDPI, UMac, UColorFilters, math; +uses BGRABitmapTypes, LCScaleDPI, UMac, UColorFilters, UResourceStrings, math; function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; var FPosterize: TFPosterize; @@ -95,6 +97,8 @@ procedure TFPosterize.FormCreate(Sender: TObject); procedure TFPosterize.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then PreviewNeeded; + FFilterConnector.ValidateAction; FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeLevels(SpinEdit_Levels.Value); FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeByLightness(CheckBox_ByLightness.Checked); @@ -103,7 +107,17 @@ procedure TFPosterize.Button_OKClick(Sender: TObject); procedure TFPosterize.CheckBox_ByLightnessChange(Sender: TObject); begin - if not FInitializing then PreviewNeeded; + if not FInitializing and + CheckBox_Preview.Checked then PreviewNeeded; +end; + +procedure TFPosterize.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + PreviewNeeded + else + FFilterConnector.RestoreBackup; end; procedure TFPosterize.FormShow(Sender: TObject); @@ -115,7 +129,8 @@ procedure TFPosterize.FormShow(Sender: TObject); procedure TFPosterize.SpinEdit_LevelsChange(Sender: TObject); begin - if not FInitializing then PreviewNeeded; + if not FInitializing and + CheckBox_Preview.Checked then PreviewNeeded; end; procedure TFPosterize.OnTryStopAction(sender: TFilterConnector); @@ -136,6 +151,11 @@ procedure TFPosterize.InitParams; CheckBox_ByLightness.Checked := FFilterConnector.Parameters.Booleans['ByLightness'] else CheckBox_ByLightness.Checked := FFilterConnector.LazPaintInstance.Config.DefaultPosterizeByLightness; + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing := false; end; diff --git a/lazpaint/dialog/filter/uradialblur.lfm b/lazpaint/dialog/filter/uradialblur.lfm index 3fc32cc6..da9309fb 100644 --- a/lazpaint/dialog/filter/uradialblur.lfm +++ b/lazpaint/dialog/filter/uradialblur.lfm @@ -1,6 +1,6 @@ object FRadialBlur: TFRadialBlur Left = 403 - Height = 82 + Height = 101 Top = 328 Width = 175 AutoSize = True @@ -13,38 +13,39 @@ object FRadialBlur: TFRadialBlur ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 82 + ClientHeight = 101 ClientWidth = 175 Font.Height = -12 OnCloseQuery = FormCloseQuery OnCreate = FormCreate + OnDestroy = FormDestroy OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.2.4.0' object Panel1: TPanel Left = 8 - Height = 27 + Height = 23 Top = 8 - Width = 126 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 27 - ClientWidth = 126 + ClientHeight = 23 + ClientWidth = 130 TabOrder = 0 object Label_Radius: TLabel Left = 0 - Height = 27 + Height = 23 Top = 0 - Width = 48 + Width = 41 Caption = 'Radius :' Layout = tlCenter ParentColor = False end object SpinEdit_Radius: TFloatSpinEdit - Left = 56 - Height = 27 + Left = 49 + Height = 23 Top = 0 Width = 70 Constraints.MinWidth = 70 @@ -56,37 +57,47 @@ object FRadialBlur: TFRadialBlur Value = 5 end end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 39 + Width = 130 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 2 + end object Panel2: TPanel Left = 8 - Height = 29 - Top = 43 - Width = 126 + Height = 25 + Top = 66 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 29 - ClientWidth = 126 + ClientHeight = 25 + ClientWidth = 130 TabOrder = 1 object Button_OK: TButton Left = 0 - Height = 29 + Height = 25 Top = 0 - Width = 31 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 39 - Height = 29 + Left = 59 + Height = 25 Top = 0 - Width = 54 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end @@ -95,7 +106,7 @@ object FRadialBlur: TFRadialBlur Enabled = False Interval = 200 OnTimer = Timer1Timer - left = 128 - top = 8 + Left = 128 + Top = 8 end end diff --git a/lazpaint/dialog/filter/uradialblur.lrj b/lazpaint/dialog/filter/uradialblur.lrj index 68787952..8477de89 100644 --- a/lazpaint/dialog/filter/uradialblur.lrj +++ b/lazpaint/dialog/filter/uradialblur.lrj @@ -1,6 +1,6 @@ {"version":1,"strings":[ {"hash":129960242,"name":"tfradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"}, {"hash":129024186,"name":"tfradialblur.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"}, -{"hash":1339,"name":"tfradialblur.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfradialblur.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfradialblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfradialblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/uradialblur.pas b/lazpaint/dialog/filter/uradialblur.pas index 7edcfdd4..8b0f0dfc 100644 --- a/lazpaint/dialog/filter/uradialblur.pas +++ b/lazpaint/dialog/filter/uradialblur.pas @@ -18,6 +18,7 @@ TFRadialBlur = class(TForm) Button_OK: TButton; Button_Cancel: TButton; Button3: TButton; + CheckBox_Preview: TCheckBox; Panel1: TPanel; Panel2: TPanel; SpinEdit_Radius: TFloatSpinEdit; @@ -25,8 +26,10 @@ TFRadialBlur = class(TForm) Label_Radius: TLabel; Timer1: TTimer; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); procedure SpinEdit_RadiusChange(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -36,6 +39,7 @@ TFRadialBlur = class(TForm) FThreadManager: TFilterThreadManager; FLastRadius: single; FVars: TVariableSet; + FComputedImage: TBGRABitmap; procedure PreviewNeeded; procedure UpdateStep; procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent); @@ -48,7 +52,7 @@ function ShowRadialBlurDlg(AFilterConnector: TObject; ABlurType:TRadialBlurType; implementation -uses UMac, BGRAFilters; +uses UMac, UResourceStrings, BGRAFilters; function ShowRadialBlurDlg(AFilterConnector: TObject; ABlurType: TRadialBlurType; ACaption: string): TScriptResult; @@ -75,6 +79,9 @@ function ShowRadialBlurDlg(AFilterConnector: TObject; procedure TFRadialBlur.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked and + (FComputedImage <> nil) then FFilterConnector.PutImage(FComputedImage,false,false); + if not FFilterConnector.ActionDone then begin FFilterConnector.ValidateAction; @@ -83,6 +90,15 @@ procedure TFRadialBlur.Button_OKClick(Sender: TObject); ModalResult := mrOK; end; +procedure TFRadialBlur.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + FFilterConnector.PutImage(FComputedImage, false, false) + else + FFilterConnector.RestoreBackup; +end; + procedure TFRadialBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin FThreadManager.Quit; @@ -99,6 +115,11 @@ procedure TFRadialBlur.FormCreate(Sender: TObject); SpinEdit_Radius.Constraints.MinWidth := DoScaleX(70, OriginalDPI); end; +procedure TFRadialBlur.FormDestroy(Sender: TObject); +begin + if FComputedImage <> nil then FreeAndNil(FComputedImage); +end; + procedure TFRadialBlur.FormShow(Sender: TObject); begin FInitializing := True; @@ -109,6 +130,10 @@ procedure TFRadialBlur.FormShow(Sender: TObject); else SpinEdit_Radius.Value := FFilterConnector.LazPaintInstance.Config.DefaultBlurRadius; UpdateStep; + CheckBox_Preview.Checked := true; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing := False; PreviewNeeded; Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top; @@ -158,7 +183,16 @@ procedure TFRadialBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent if FThreadManager.ReadyToClose then Close else - if AEvent = tmeCompletedTask then Button_OK.Enabled := true; + if AEvent = tmeCompletedTask then begin + Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; + end; + + if FComputedImage <> nil then FComputedImage.Free; + case AEvent of + tmeAbortedTask: FComputedImage := FFilterConnector.BackupLayer.Duplicate; + tmeCompletedTask: FComputedImage := FFilterConnector.ActiveLayer.Duplicate; + end; end; tmeStartingNewTask: begin @@ -166,6 +200,11 @@ procedure TFRadialBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent Timer1.Interval := 100; Timer1.Enabled := true; Button_OK.Enabled := false; + + FInitializing := True; + CheckBox_Preview.Enabled := false; + CheckBox_Preview.Checked := True; + FInitializing := False; end; end; end; diff --git a/lazpaint/dialog/filter/usharpen.lfm b/lazpaint/dialog/filter/usharpen.lfm index 978cb7c7..a9cb6b74 100644 --- a/lazpaint/dialog/filter/usharpen.lfm +++ b/lazpaint/dialog/filter/usharpen.lfm @@ -1,6 +1,6 @@ object FSharpen: TFSharpen Left = 734 - Height = 94 + Height = 113 Top = 206 Width = 173 AutoSize = True @@ -13,23 +13,23 @@ object FSharpen: TFSharpen ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 94 + ClientHeight = 113 ClientWidth = 173 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Panel1: TPanel Left = 8 Height = 23 Top = 8 - Width = 123 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 23 - ClientWidth = 123 + ClientWidth = 130 TabOrder = 0 object Label_Amount: TLabel Left = 0 @@ -54,37 +54,47 @@ object FSharpen: TFSharpen Value = 100 end end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 39 + Width = 130 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 2 + end object Panel2: TPanel Left = 8 Height = 25 - Top = 39 - Width = 123 + Top = 66 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 25 - ClientWidth = 123 + ClientWidth = 130 TabOrder = 1 object Button_OK: TButton Left = 0 Height = 25 Top = 0 - Width = 42 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 50 + Left = 59 Height = 25 Top = 0 - Width = 62 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end diff --git a/lazpaint/dialog/filter/usharpen.lrj b/lazpaint/dialog/filter/usharpen.lrj index 41fbd2b4..f8358d7e 100644 --- a/lazpaint/dialog/filter/usharpen.lrj +++ b/lazpaint/dialog/filter/usharpen.lrj @@ -1,6 +1,6 @@ {"version":1,"strings":[ {"hash":170608904,"name":"tfsharpen.caption","sourcebytes":[83,104,97,114,112,101,110,47,83,109,111,111,116,104],"value":"Sharpen/Smooth"}, {"hash":74207930,"name":"tfsharpen.label_amount.caption","sourcebytes":[65,109,111,117,110,116,32,58],"value":"Amount :"}, -{"hash":1339,"name":"tfsharpen.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfsharpen.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfsharpen.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfsharpen.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/usharpen.pas b/lazpaint/dialog/filter/usharpen.pas index 2e9ba1f7..be025fd9 100644 --- a/lazpaint/dialog/filter/usharpen.pas +++ b/lazpaint/dialog/filter/usharpen.pas @@ -17,11 +17,13 @@ interface TFSharpen = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; Label_Amount: TLabel; Panel1: TPanel; Panel2: TPanel; SpinEdit_Amount: TSpinEdit; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure SpinEdit_AmountChange(Sender: TObject); @@ -40,7 +42,8 @@ function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScrip implementation -uses LCScaleDPI, UMac, LazPaintType, BGRABitmap, BGRABitmapTypes; +uses LCScaleDPI, UMac, LazPaintType, UResourceStrings, BGRABitmap, + BGRABitmapTypes; function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult; var FSharpen: TFSharpen; @@ -104,16 +107,28 @@ procedure TFSharpen.FormShow(Sender: TObject); procedure TFSharpen.SpinEdit_AmountChange(Sender: TObject); begin - if not FInitializing then PreviewNeeded; + if not FInitializing and + CheckBox_Preview.Checked then PreviewNeeded; end; procedure TFSharpen.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then PreviewNeeded; + FFilterConnector.ValidateAction; FFilterConnector.LazPaintInstance.Config.SetDefaultSharpenAmount(SpinEdit_Amount.Value/100); ModalResult := mrOK; end; +procedure TFSharpen.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + PreviewNeeded + else + FFilterConnector.RestoreBackup; +end; + procedure TFSharpen.OnTryStopAction(sender: TFilterConnector); begin if self.visible then Close; @@ -126,6 +141,11 @@ procedure TFSharpen.InitParams; SpinEdit_Amount.Value := round(FFilterConnector.Parameters.Floats['Amount']*100) else SpinEdit_Amount.Value := round(FFilterConnector.LazPaintInstance.Config.DefaultSharpenAmount*100); + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing := false; end; diff --git a/lazpaint/dialog/filter/utwirl.lfm b/lazpaint/dialog/filter/utwirl.lfm index 3a6bdc08..4b07b922 100644 --- a/lazpaint/dialog/filter/utwirl.lfm +++ b/lazpaint/dialog/filter/utwirl.lfm @@ -1,8 +1,8 @@ object FTwirl: TFTwirl Left = 631 - Height = 288 + Height = 249 Top = 173 - Width = 173 + Width = 142 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog @@ -13,48 +13,47 @@ object FTwirl: TFTwirl ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 288 - ClientWidth = 173 - DesignTimePPI = 120 - Font.Height = -15 + ClientHeight = 249 + ClientWidth = 142 + Font.Height = -12 OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.2.4.0' object Panel1: TPanel Left = 8 - Height = 76 + Height = 54 Top = 8 - Width = 143 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 76 - ClientWidth = 143 - Font.Height = -15 + ClientHeight = 54 + ClientWidth = 130 + Font.Height = -12 ParentFont = False TabOrder = 0 object Label_Radius: TLabel Left = 0 - Height = 34 + Height = 23 Top = 0 - Width = 54 + Width = 41 Caption = 'Radius :' - Font.Height = -15 + Font.Height = -12 Layout = tlCenter ParentColor = False ParentFont = False end object SpinEdit_Radius: TSpinEdit - Left = 62 - Height = 34 + Left = 49 + Height = 23 Top = 0 - Width = 81 - Constraints.MinWidth = 81 - Font.Height = -15 + Width = 65 + Constraints.MinWidth = 65 + Font.Height = -12 Increment = 10 MaxValue = 10000 MinValue = 1 @@ -65,22 +64,22 @@ object FTwirl: TFTwirl end object Label_Angle: TLabel Left = 0 - Height = 34 - Top = 42 - Width = 54 + Height = 23 + Top = 31 + Width = 41 Caption = 'Angle :' - Font.Height = -15 + Font.Height = -12 Layout = tlCenter ParentColor = False ParentFont = False end object SpinEdit_Angle: TSpinEdit - Left = 62 - Height = 34 - Top = 42 - Width = 81 - Constraints.MinWidth = 81 - Font.Height = -15 + Left = 49 + Height = 23 + Top = 31 + Width = 65 + Constraints.MinWidth = 65 + Font.Height = -12 Increment = 30 MaxValue = 10000 MinValue = -10000 @@ -92,51 +91,61 @@ object FTwirl: TFTwirl end object PaintBox1: TPaintBox Left = 8 - Height = 131 - Top = 92 - Width = 143 - Font.Height = -15 + Height = 105 + Top = 70 + Width = 130 + Font.Height = -12 ParentFont = False OnMouseDown = PaintBox1MouseDown OnMouseMove = PaintBox1MouseMove OnPaint = PaintBox1Paint end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 183 + Width = 130 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 2 + end object Panel2: TPanel Left = 8 - Height = 36 - Top = 231 - Width = 143 + Height = 25 + Top = 210 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 36 - ClientWidth = 143 - Font.Height = -15 + ClientHeight = 25 + ClientWidth = 130 + Font.Height = -12 ParentFont = False TabOrder = 1 object Button_OK: TButton Left = 0 - Height = 36 + Height = 25 Top = 0 - Width = 35 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True - Font.Height = -15 + Font.Height = -12 OnClick = Button_OKClick ParentFont = False TabOrder = 0 end object Button_Cancel: TButton - Left = 43 - Height = 36 + Left = 59 + Height = 25 Top = 0 - Width = 59 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' - Font.Height = -15 + Caption = 'rsCancel' + Font.Height = -12 ModalResult = 2 ParentFont = False TabOrder = 1 @@ -146,7 +155,7 @@ object FTwirl: TFTwirl Enabled = False Interval = 200 OnTimer = Timer1Timer - left = 64 - top = 120 + Left = 51 + Top = 96 end end diff --git a/lazpaint/dialog/filter/utwirl.lrj b/lazpaint/dialog/filter/utwirl.lrj index 8be2927f..b89c5ce0 100644 --- a/lazpaint/dialog/filter/utwirl.lrj +++ b/lazpaint/dialog/filter/utwirl.lrj @@ -2,6 +2,6 @@ {"hash":6021260,"name":"tftwirl.caption","sourcebytes":[84,119,105,114,108],"value":"Twirl"}, {"hash":129024186,"name":"tftwirl.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"}, {"hash":139339642,"name":"tftwirl.label_angle.caption","sourcebytes":[65,110,103,108,101,32,58],"value":"Angle :"}, -{"hash":1339,"name":"tftwirl.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tftwirl.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tftwirl.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tftwirl.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/utwirl.pas b/lazpaint/dialog/filter/utwirl.pas index 2cdd4116..65f48bf9 100644 --- a/lazpaint/dialog/filter/utwirl.pas +++ b/lazpaint/dialog/filter/utwirl.pas @@ -17,6 +17,7 @@ interface TFTwirl = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; Label_Radius: TLabel; Label_Angle: TLabel; PaintBox1: TPaintBox; @@ -26,6 +27,7 @@ TFTwirl = class(TForm) SpinEdit_Radius: TSpinEdit; Timer1: TTimer; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); @@ -41,6 +43,7 @@ TFTwirl = class(TForm) { private declarations } FInitializing: boolean; FCenter: TPointF; + FComputedImage: TBGRABitmap; procedure InitParams; procedure PreviewNeeded; function ComputeFilteredLayer: TBGRABitmap; @@ -52,7 +55,7 @@ function ShowTwirlDlg(AFilterConnector: TObject): TScriptResult; implementation -uses umac; +uses umac, UResourceStrings; function ShowTwirlDlg(AFilterConnector: TObject): TScriptResult; var @@ -96,6 +99,7 @@ procedure TFTwirl.FormCreate(Sender: TObject); procedure TFTwirl.FormDestroy(Sender: TObject); begin + if FComputedImage <> nil then FreeAndNil(FComputedImage); end; procedure TFTwirl.FormShow(Sender: TObject); @@ -152,8 +156,12 @@ procedure TFTwirl.SpinEdit_RadiusChange(Sender: TObject); procedure TFTwirl.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; - FilterConnector.PutImage(ComputeFilteredLayer,False,true); + if FComputedImage <> nil then FComputedImage.Free; + FComputedImage := ComputeFilteredLayer; + if CheckBox_Preview.Checked then + FilterConnector.PutImage(FComputedImage,False,False); Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; end; procedure TFTwirl.InitParams; @@ -171,6 +179,11 @@ procedure TFTwirl.InitParams; if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100; if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100; end; + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing := false; end; @@ -179,6 +192,7 @@ procedure TFTwirl.PreviewNeeded; Timer1.Enabled := false; Timer1.Enabled := True; Button_OK.Enabled := false; + CheckBox_Preview.Enabled := false; end; function TFTwirl.ComputeFilteredLayer: TBGRABitmap; @@ -189,12 +203,23 @@ function TFTwirl.ComputeFilteredLayer: TBGRABitmap; procedure TFTwirl.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then FilterConnector.PutImage(FComputedImage,false,false); + FilterConnector.ValidateAction; FilterConnector.LazPaintInstance.Config.SetDefaultTwirlRadius(SpinEdit_Radius.Value); FilterConnector.LazPaintInstance.Config.SetDefaultTwirlTurn(SpinEdit_Angle.Value/360); ModalResult := mrOK; end; +procedure TFTwirl.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + FilterConnector.PutImage(FComputedImage,False,False) + else + FilterConnector.RestoreBackup; +end; + {$R *.lfm} end. diff --git a/lazpaint/dialog/filter/uwavedisplacement.lfm b/lazpaint/dialog/filter/uwavedisplacement.lfm index 42394e51..fc172c66 100644 --- a/lazpaint/dialog/filter/uwavedisplacement.lfm +++ b/lazpaint/dialog/filter/uwavedisplacement.lfm @@ -1,8 +1,8 @@ object FWaveDisplacement: TFWaveDisplacement Left = 306 - Height = 356 + Height = 285 Top = 172 - Width = 222 + Width = 168 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog @@ -13,47 +13,47 @@ object FWaveDisplacement: TFWaveDisplacement ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 356 - ClientWidth = 222 - DesignTimePPI = 120 + ClientHeight = 285 + ClientWidth = 168 OnCreate = FormCreate + OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.2.4.0' object Panel1: TPanel Left = 8 - Height = 118 + Height = 85 Top = 8 - Width = 191 + Width = 151 AutoSize = True BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.VerticalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 118 - ClientWidth = 191 - Font.Height = -15 + ClientHeight = 85 + ClientWidth = 151 + Font.Height = -12 ParentFont = False TabOrder = 0 object Label_Wavelength: TLabel Left = 0 - Height = 34 + Height = 23 Top = 0 - Width = 102 + Width = 78 Caption = 'Wavelength :' - Font.Height = -15 + Font.Height = -12 Layout = tlCenter ParentColor = False ParentFont = False end object SpinEdit_Wavelength: TSpinEdit - Left = 110 - Height = 34 + Left = 86 + Height = 23 Top = 0 - Width = 81 - Constraints.MinWidth = 81 - Font.Height = -15 + Width = 65 + Constraints.MinWidth = 65 + Font.Height = -12 Increment = 10 MaxValue = 10000 MinValue = 1 @@ -64,22 +64,22 @@ object FWaveDisplacement: TFWaveDisplacement end object Label_Displacement: TLabel Left = 0 - Height = 34 - Top = 42 - Width = 102 + Height = 23 + Top = 31 + Width = 78 Caption = 'Displacement :' - Font.Height = -15 + Font.Height = -12 Layout = tlCenter ParentColor = False ParentFont = False end object SpinEdit_Displacement: TSpinEdit - Left = 110 - Height = 34 - Top = 42 - Width = 81 - Constraints.MinWidth = 81 - Font.Height = -15 + Left = 86 + Height = 23 + Top = 31 + Width = 65 + Constraints.MinWidth = 65 + Font.Height = -12 Increment = 5 MaxValue = 1000 OnChange = SpinEdit_DisplacementChange @@ -89,22 +89,22 @@ object FWaveDisplacement: TFWaveDisplacement end object Label_Phase: TLabel Left = 0 - Height = 34 - Top = 84 - Width = 102 + Height = 23 + Top = 62 + Width = 78 Caption = 'Phase :' - Font.Height = -15 + Font.Height = -12 Layout = tlCenter ParentColor = False ParentFont = False end object SpinEdit_Phase: TSpinEdit - Left = 110 - Height = 34 - Top = 84 - Width = 81 - Constraints.MinWidth = 81 - Font.Height = -15 + Left = 86 + Height = 23 + Top = 62 + Width = 65 + Constraints.MinWidth = 65 + Font.Height = -12 Increment = 30 MaxValue = 360 OnChange = SpinEdit_PhaseChange @@ -113,52 +113,62 @@ object FWaveDisplacement: TFWaveDisplacement end end object PaintBox1: TPaintBox - Left = 9 - Height = 160 - Top = 136 - Width = 189 - Font.Height = -15 + Left = 8 + Height = 105 + Top = 101 + Width = 151 + Font.Height = -12 ParentFont = False OnMouseDown = PaintBox1MouseDown OnMouseMove = PaintBox1MouseMove OnPaint = PaintBox1Paint end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 214 + Width = 151 + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 2 + end object Panel2: TPanel - Left = 9 - Height = 36 - Top = 304 - Width = 188 + Left = 8 + Height = 25 + Top = 241 + Width = 151 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 36 - ClientWidth = 188 - Font.Height = -15 + ClientHeight = 25 + ClientWidth = 151 + Font.Height = -12 ParentFont = False TabOrder = 1 object Button_OK: TButton Left = 0 - Height = 36 + Height = 25 Top = 0 - Width = 35 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True - Font.Height = -15 + Font.Height = -12 OnClick = Button_OKClick ParentFont = False TabOrder = 0 end object Button_Cancel: TButton - Left = 43 - Height = 36 + Left = 59 + Height = 25 Top = 0 - Width = 59 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' - Font.Height = -15 + Caption = 'rsCancel' + Font.Height = -12 ModalResult = 2 ParentFont = False TabOrder = 1 @@ -168,7 +178,7 @@ object FWaveDisplacement: TFWaveDisplacement Enabled = False Interval = 200 OnTimer = Timer1Timer - left = 48 - top = 184 + Left = 38 + Top = 147 end end diff --git a/lazpaint/dialog/filter/uwavedisplacement.lrj b/lazpaint/dialog/filter/uwavedisplacement.lrj index 2e7585c0..cefd95b7 100644 --- a/lazpaint/dialog/filter/uwavedisplacement.lrj +++ b/lazpaint/dialog/filter/uwavedisplacement.lrj @@ -3,6 +3,6 @@ {"hash":261514778,"name":"tfwavedisplacement.label_wavelength.caption","sourcebytes":[87,97,118,101,108,101,110,103,116,104,32,58],"value":"Wavelength :"}, {"hash":211645722,"name":"tfwavedisplacement.label_displacement.caption","sourcebytes":[68,105,115,112,108,97,99,101,109,101,110,116,32,58],"value":"Displacement :"}, {"hash":115906410,"name":"tfwavedisplacement.label_phase.caption","sourcebytes":[80,104,97,115,101,32,58],"value":"Phase :"}, -{"hash":1339,"name":"tfwavedisplacement.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfwavedisplacement.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfwavedisplacement.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfwavedisplacement.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/uwavedisplacement.pas b/lazpaint/dialog/filter/uwavedisplacement.pas index ae11b127..60bdd92e 100644 --- a/lazpaint/dialog/filter/uwavedisplacement.pas +++ b/lazpaint/dialog/filter/uwavedisplacement.pas @@ -17,6 +17,7 @@ interface TFWaveDisplacement = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; Label_Displacement: TLabel; Label_Phase: TLabel; Label_Wavelength: TLabel; @@ -28,7 +29,9 @@ TFWaveDisplacement = class(TForm) SpinEdit_Wavelength: TSpinEdit; Timer1: TTimer; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); procedure PaintBox1MouseDown(Sender: TObject; {%H-}Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer); @@ -43,6 +46,7 @@ TFWaveDisplacement = class(TForm) { private declarations } FInitializing: boolean; FCenter: TPointF; + FComputedImage: TBGRABitmap; procedure InitParams; procedure PreviewNeeded; function ComputeFilteredLayer: TBGRABitmap; @@ -57,7 +61,7 @@ function ShowWaveDisplacementDlg(AFilterConnector: TObject): TScriptResult; implementation -uses umac, ugraph, LCScaleDPI; +uses umac, ugraph, UResourceStrings, LCScaleDPI; function ShowWaveDisplacementDlg(AFilterConnector: TObject): TScriptResult; var @@ -100,6 +104,11 @@ procedure TFWaveDisplacement.FormCreate(Sender: TObject); CheckOKCancelBtns(Button_OK{,Button_Cancel}); end; +procedure TFWaveDisplacement.FormDestroy(Sender: TObject); +begin + if FComputedImage <> nil then FreeAndNil(FComputedImage); +end; + procedure TFWaveDisplacement.FormShow(Sender: TObject); begin InitParams; @@ -159,8 +168,12 @@ procedure TFWaveDisplacement.SpinEdit_PhaseChange(Sender: TObject); procedure TFWaveDisplacement.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; - FilterConnector.PutImage(ComputeFilteredLayer,False,true); + if FComputedImage <> nil then FComputedImage.Free; + FComputedImage := ComputeFilteredLayer; + if CheckBox_Preview.Checked then + FilterConnector.PutImage(FComputedImage,False,False); Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; end; procedure TFWaveDisplacement.InitParams; @@ -180,6 +193,11 @@ procedure TFWaveDisplacement.InitParams; if IsDefined('CenterXPercent') then FCenter.X := Floats['CenterXPercent']/100; if IsDefined('CenterYPercent') then FCenter.Y := Floats['CenterYPercent']/100; end; + + CheckBox_Preview.Checked := True; + CheckBox_Preview.Caption := rsPreview; + Button_OK.Caption := rsOk; + Button_Cancel.Caption := rsCancel; FInitializing := false; end; @@ -188,6 +206,7 @@ procedure TFWaveDisplacement.PreviewNeeded; Timer1.Enabled := false; Timer1.Enabled := True; Button_OK.Enabled := false; + CheckBox_Preview.Enabled := false; end; function TFWaveDisplacement.ComputeFilteredLayer: TBGRABitmap; @@ -199,6 +218,8 @@ function TFWaveDisplacement.ComputeFilteredLayer: TBGRABitmap; procedure TFWaveDisplacement.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then FilterConnector.PutImage(FComputedImage,false,false); + FilterConnector.ValidateAction; FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementWavelength(SpinEdit_Wavelength.Value); FilterConnector.LazPaintInstance.Config.SetDefaultWaveDisplacementAmount(SpinEdit_Displacement.Value); @@ -206,6 +227,15 @@ procedure TFWaveDisplacement.Button_OKClick(Sender: TObject); ModalResult := mrOK; end; +procedure TFWaveDisplacement.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializing then exit; + if CheckBox_Preview.Checked then + FilterConnector.PutImage(FComputedImage,False,False) + else + FilterConnector.RestoreBackup; +end; + {$R *.lfm} end. diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index 07011e73..4b05acba 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -304,11 +304,6 @@ msgstr "تدرج" msgid "Preset" msgstr "مسبقا" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "تحرير القناع" @@ -317,11 +312,6 @@ msgstr "تحرير القناع" msgid "Load mask..." msgstr "تحميل قناع" -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -331,16 +321,6 @@ msgstr "ضبابية مخصصة" msgid "Open grayscale file" msgstr "فتح ملف تدرج الرمادي" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -359,16 +339,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "إشراف" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tffilterfunction.caption msgid "Apply function" msgstr "تطبيق الوضيفة" @@ -2090,16 +2060,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "زووم للخارج" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2169,16 +2129,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "العرض :" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "مرشح الضجيج" @@ -2316,16 +2266,6 @@ msgstr "" msgid "Remove selected light" msgstr "" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2410,16 +2350,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "الجودة :" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2528,16 +2458,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2676,16 +2596,6 @@ msgstr "" msgid "MioMap" msgstr "" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "" @@ -2730,16 +2640,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr " الأدوات " -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2755,16 +2655,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "نصف القطر :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index 0fa99c7e..8baf429f 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -304,11 +304,6 @@ msgstr "Отенък" msgid "Preset" msgstr "Предварително зададени" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Обработка на маска..." @@ -317,11 +312,6 @@ msgstr "Обработка на маска..." msgid "Load mask..." msgstr "Зареждане на маска..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfcustomblur.caption msgctxt "TFCUSTOMBLUR.CAPTION" msgid "Custom blur" @@ -331,16 +321,6 @@ msgstr "Нагласено размиване" msgid "Open grayscale file" msgstr "Отваряне на сивобял файл" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfemboss.caption msgctxt "TFEMBOSS.CAPTION" msgid "Emboss" @@ -359,16 +339,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION" msgid "Direction :" msgstr "Посока:" -#: tffilterfunction.button_cancel.caption -msgctxt "TFFILTERFUNCTION.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tffilterfunction.button_ok.caption -msgctxt "TFFILTERFUNCTION.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tffilterfunction.caption msgid "Apply function" msgstr "Прилагане на функцията" @@ -2077,16 +2047,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Намаляване" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfmotionblur.caption msgctxt "TFMOTIONBLUR.CAPTION" msgid "Motion blur" @@ -2156,16 +2116,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION" msgid "Width :" msgstr "Ширина:" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Отказ" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "Добре" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Шумов филтър" @@ -2303,16 +2253,6 @@ msgstr "" msgid "Remove selected light" msgstr "" -#: tfphongfilter.button_cancel.caption -msgctxt "TFPHONGFILTER.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfphongfilter.button_ok.caption -msgctxt "TFPHONGFILTER.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfphongfilter.caption msgctxt "TFPHONGFILTER.CAPTION" msgid "Shaded map" @@ -2397,16 +2337,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION" msgid "Quality :" msgstr "Качество:" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Отказ" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "Добре" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2516,16 +2446,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfradialblur.caption msgctxt "TFRADIALBLUR.CAPTION" msgid "Radial blur" @@ -2664,16 +2584,6 @@ msgstr "32 разряда" msgid "MioMap" msgstr "" -#: tfsharpen.button_cancel.caption -msgctxt "TFSHARPEN.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfsharpen.button_ok.caption -msgctxt "TFSHARPEN.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Изостряне/ Изглаждане" @@ -2718,16 +2628,6 @@ msgctxt "TFTOOLBOX.CAPTION" msgid "Tools" msgstr "Пособия" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tftwirl.caption msgctxt "TFTWIRL.CAPTION" msgid "Twirl" @@ -2743,16 +2643,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION" msgid "Radius :" msgstr "Радиус:" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Отказ" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "Добре" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index 2b5349fb..6bb05a68 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -286,11 +286,6 @@ msgstr "Odstín" msgid "Preset" msgstr "Předvolba" -#: tfcustomblur.button_cancel.caption -msgctxt "tfcustomblur.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Upravit masku..." @@ -299,11 +294,6 @@ msgstr "Upravit masku..." msgid "Load mask..." msgstr "Načíst masku..." -#: tfcustomblur.button_ok.caption -msgctxt "tfcustomblur.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgid "Custom blur" msgstr "Vlastní rozmazání" @@ -312,16 +302,6 @@ msgstr "Vlastní rozmazání" msgid "Open grayscale file" msgstr "Otevřít černobílý obrázek" -#: tfemboss.button_cancel.caption -msgctxt "tfemboss.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfemboss.button_ok.caption -msgctxt "tfemboss.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgid "Emboss" msgstr "Vytlačit" @@ -338,16 +318,6 @@ msgstr "Průhledné" msgid "Direction :" msgstr "Směr :" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "Použít funkci" @@ -1951,16 +1921,6 @@ msgstr "Zvětšit na původní bodovou velikost" msgid "Zoom out" msgstr "Oddálit" -#: tfmotionblur.button_cancel.caption -msgctxt "tfmotionblur.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfmotionblur.button_ok.caption -msgctxt "tfmotionblur.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgid "Motion blur" msgstr "Pohybové rozmazání" @@ -2028,16 +1988,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Šířka :" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Šumový filtr" @@ -2169,16 +2119,6 @@ msgstr "Přidat bodové světlo" msgid "Remove selected light" msgstr "Odebrat vybrané světlo" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgid "Shaded map" msgstr "Stínová mapa" @@ -2259,16 +2199,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Kvalita :" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2377,16 +2307,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "tfradialblur.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfradialblur.button_ok.caption -msgctxt "tfradialblur.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2524,16 +2444,6 @@ msgstr "32 bitů" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Ostření/Vyhlazení" @@ -2576,16 +2486,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Nástroje" -#: tftwirl.button_cancel.caption -msgctxt "tftwirl.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tftwirl.button_ok.caption -msgctxt "tftwirl.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgid "Twirl" msgstr "Víření" @@ -2599,16 +2499,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Poloměr :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Posunutí vlny" diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index 030ebb59..d5347d01 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -314,11 +314,6 @@ msgstr "Farbton" msgid "Preset" msgstr "Voreingestellt" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Maske bearbeiten..." @@ -327,11 +322,6 @@ msgstr "Maske bearbeiten..." msgid "Load mask..." msgstr "Maske laden..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -341,16 +331,6 @@ msgstr "Benutzerdefinierter Weichzeichner" msgid "Open grayscale file" msgstr "Graustufen-Datei öffnen" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -369,16 +349,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Richtung:" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "Funktion anwenden" @@ -2101,16 +2071,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Auszoomen" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2180,16 +2140,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Breite:" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Rauschfilter" @@ -2327,16 +2277,6 @@ msgstr "Lichtpunkt hinzufügen" msgid "Remove selected light" msgstr "Gewählte Lichtquelle entfernen" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2421,16 +2361,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Qualität" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2539,16 +2469,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2687,16 +2607,6 @@ msgstr "32 bits" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Scharfzeichnen/Weichzeichnen" @@ -2741,16 +2651,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Werkzeuge" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2766,16 +2666,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Radius:" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Wellen-Wandel" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index fdae6c38..85bfcf8c 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -306,11 +306,6 @@ msgstr "Matiz" msgid "Preset" msgstr "Preajuste" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Editar máscara.." @@ -319,11 +314,6 @@ msgstr "Editar máscara.." msgid "Load mask..." msgstr "Abrir máscara.." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -333,16 +323,6 @@ msgstr "Desenfoque personalizado" msgid "Open grayscale file" msgstr "Abrir archivo de escala de grises" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -361,16 +341,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Dirección:" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "Aceptar" - #: tffilterfunction.caption msgid "Apply function" msgstr "Aplicar función" @@ -2083,16 +2053,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Zoom fuera" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2162,16 +2122,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Ancho:" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "Aceptar" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Ruido" @@ -2309,16 +2259,6 @@ msgstr "Agregar una luz puntual" msgid "Remove selected light" msgstr "Quitar luz seleccionada" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "Aceptar" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2403,16 +2343,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Calidad:" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "Aceptar" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2521,16 +2451,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2669,16 +2589,6 @@ msgstr "32 bits" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "Aceptar" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Nítido/Suave" @@ -2723,16 +2633,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Herramientas" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2748,16 +2648,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Rádio:" -#: tfwavedisplacement.button_cancel.caption -msgctxt "TFWAVEDISPLACEMENT.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfwavedisplacement.button_ok.caption -msgctxt "TFWAVEDISPLACEMENT.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Desplazamiento de onda" diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index 357642d7..4372d221 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -296,11 +296,6 @@ msgstr "Värisävy" msgid "Preset" msgstr "Esiasetus" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Muokkaa maskia" @@ -309,11 +304,6 @@ msgstr "Muokkaa maskia" msgid "Load mask..." msgstr "Lataa maski" -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfcustomblur.caption msgctxt "TFCUSTOMBLUR.CAPTION" msgid "Custom blur" @@ -323,16 +313,6 @@ msgstr "Maskin mukainen sumennus" msgid "Open grayscale file" msgstr "Avaa harmaasävytiedosto" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfemboss.caption msgctxt "TFEMBOSS.CAPTION" msgid "Emboss" @@ -351,16 +331,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION" msgid "Direction :" msgstr "Suunta :" -#: tffilterfunction.button_cancel.caption -msgctxt "TFFILTERFUNCTION.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tffilterfunction.button_ok.caption -msgctxt "TFFILTERFUNCTION.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tffilterfunction.caption msgid "Apply function" msgstr "" @@ -2081,16 +2051,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Loitonna" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfmotionblur.caption msgctxt "TFMOTIONBLUR.CAPTION" msgid "Motion blur" @@ -2160,16 +2120,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION" msgid "Width :" msgstr "Leveys :" -#: tfnoisefilter.button_cancel.caption -msgctxt "TFNOISEFILTER.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfnoisefilter.button_ok.caption -msgctxt "TFNOISEFILTER.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Kohinasuodatin" @@ -2307,16 +2257,6 @@ msgstr "" msgid "Remove selected light" msgstr "" -#: tfphongfilter.button_cancel.caption -msgctxt "TFPHONGFILTER.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfphongfilter.button_ok.caption -msgctxt "TFPHONGFILTER.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfphongfilter.caption msgctxt "TFPHONGFILTER.CAPTION" msgid "Shaded map" @@ -2402,16 +2342,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION" msgid "Quality :" msgstr "" -#: tfposterize.button_cancel.caption -msgctxt "TFPOSTERIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfposterize.button_ok.caption -msgctxt "TFPOSTERIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfposterize.caption msgctxt "TFPOSTERIZE.CAPTION" msgid "Posterize" @@ -2520,16 +2450,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "" -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfradialblur.caption msgctxt "TFRADIALBLUR.CAPTION" msgid "Radial blur" @@ -2669,16 +2589,6 @@ msgstr "" msgid "MioMap" msgstr "" -#: tfsharpen.button_cancel.caption -msgctxt "TFSHARPEN.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfsharpen.button_ok.caption -msgctxt "TFSHARPEN.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Terävöitä/Pehmennä" @@ -2723,16 +2633,6 @@ msgctxt "TFTOOLBOX.CAPTION" msgid "Tools" msgstr "Työkalut" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tftwirl.caption msgctxt "TFTWIRL.CAPTION" msgid "Twirl" @@ -2748,16 +2648,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION" msgid "Radius :" msgstr "Säde :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Peru" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index c1949bad..b9160302 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -306,11 +306,6 @@ msgstr "Nuances" msgid "Preset" msgstr "Prédéfini" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Éditer un masque..." @@ -319,11 +314,6 @@ msgstr "Éditer un masque..." msgid "Load mask..." msgstr "Charger un masque..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -333,16 +323,6 @@ msgstr "Flou personnalisé" msgid "Open grayscale file" msgstr "Ouvrir un fichier en échelle de gris" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -361,16 +341,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Direction :" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "Appliquer la fonction" @@ -2094,16 +2064,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Dézoomer" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2173,16 +2133,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Largeur :" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Bruit" @@ -2320,16 +2270,6 @@ msgstr "Ajouter une lumière ponctuelle" msgid "Remove selected light" msgstr "Supprimer la source lumineuse" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2414,16 +2354,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Qualité :" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2532,16 +2462,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2680,16 +2600,6 @@ msgstr "32 bits" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Accentuer/Lisser" @@ -2734,16 +2644,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Outils" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2759,16 +2659,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Rayon :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Décalage d'onde" diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po index 4676fcdf..8346ea5e 100644 --- a/lazpaint/release/bin/i18n/lazpaint.it.po +++ b/lazpaint/release/bin/i18n/lazpaint.it.po @@ -296,11 +296,6 @@ msgstr "Tonalità" msgid "Preset" msgstr "Predefinisci" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Edita maschera" @@ -309,11 +304,6 @@ msgstr "Edita maschera" msgid "Load mask..." msgstr "Carica maschera" -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -323,16 +313,6 @@ msgstr "Sfocatura ottimale" msgid "Open grayscale file" msgstr "" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -351,16 +331,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Direzione" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "" - #: tffilterfunction.caption msgid "Apply function" msgstr "Applica funzione" @@ -2079,16 +2049,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2158,16 +2118,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Larghezza" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Filtro di rumore" @@ -2305,16 +2255,6 @@ msgstr "Aggiungi punto luce" msgid "Remove selected light" msgstr "Rimuovi luce selezionata" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2399,16 +2339,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Qualità" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2517,16 +2447,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "" -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2665,16 +2585,6 @@ msgstr "" msgid "MioMap" msgstr "" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "" @@ -2720,16 +2630,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Strumenti" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2745,16 +2645,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Raggio :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po index 35e3036a..b5389b29 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ja.po +++ b/lazpaint/release/bin/i18n/lazpaint.ja.po @@ -304,11 +304,6 @@ msgstr "色相" msgid "Preset" msgstr "" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "マスク編集" @@ -317,11 +312,6 @@ msgstr "マスク編集" msgid "Load mask..." msgstr "マスク読み込み" -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -331,16 +321,6 @@ msgstr "カスタムブラー" msgid "Open grayscale file" msgstr "注意:ブラー用に作成されたグレースケール画像を開く" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -359,16 +339,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "方向:" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "" @@ -2088,16 +2058,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "ズームアウト" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2167,16 +2127,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "幅:" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "" @@ -2314,16 +2264,6 @@ msgstr "" msgid "Remove selected light" msgstr "" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2408,16 +2348,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "精度:" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2526,16 +2456,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "" -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2674,16 +2594,6 @@ msgstr "" msgid "MioMap" msgstr "" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "" @@ -2728,16 +2638,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "ツール" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2753,16 +2653,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "半径:" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po index d36839bd..8b09984a 100644 --- a/lazpaint/release/bin/i18n/lazpaint.kab.po +++ b/lazpaint/release/bin/i18n/lazpaint.kab.po @@ -307,11 +307,6 @@ msgstr "Tiɣmi" msgid "Preset" msgstr "Azwir-ɣewwar" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Ẓreg tagelmust..." @@ -320,11 +315,6 @@ msgstr "Ẓreg tagelmust..." msgid "Load mask..." msgstr "Sali-d tagelmust..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -334,16 +324,6 @@ msgstr "Aluɣu yugnen" msgid "Open grayscale file" msgstr "Ldi afaylu s tfesna n umelliɣdi" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -362,16 +342,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Tanila :" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tffilterfunction.caption msgid "Apply function" msgstr "Snes tawuri" @@ -2092,16 +2062,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Simecṭuḥ" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2171,16 +2131,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Tehri :" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Tastayt n usxerxec" @@ -2318,16 +2268,6 @@ msgstr "Rnu tafat tunqiḍt" msgid "Remove selected light" msgstr "Kkes tafat yettwafernen" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2412,16 +2352,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Taɣara :" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2530,16 +2460,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2678,16 +2598,6 @@ msgstr "32 n ibiten" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Semsed/Mzi" @@ -2732,16 +2642,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Ifecka" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2757,16 +2657,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Aqqar :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Asekḥer n tayyugt" diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po index 867df7b6..ddb84248 100644 --- a/lazpaint/release/bin/i18n/lazpaint.lv.po +++ b/lazpaint/release/bin/i18n/lazpaint.lv.po @@ -312,11 +312,6 @@ msgstr "Nokrāsa" msgid "Preset" msgstr "Iestatījumi" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Labot masku ..." @@ -325,11 +320,6 @@ msgstr "Labot masku ..." msgid "Load mask..." msgstr "Ielasīt masku ..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -339,16 +329,6 @@ msgstr "Pielāgota izpludināšana" msgid "Open grayscale file" msgstr "Atvērt pelēktoņu attēlu" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -367,16 +347,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Virziens:" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tffilterfunction.caption msgid "Apply function" msgstr "Pielietot funkciju" @@ -2095,16 +2065,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Tālināt" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2174,16 +2134,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Platums:" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Trokšņu filtrs" @@ -2322,16 +2272,6 @@ msgstr "Pievienot punktveida gaismas avotu" msgid "Remove selected light" msgstr "Izmest doto gaismu" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2416,16 +2356,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Kvalitāte:" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2534,16 +2464,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2682,16 +2602,6 @@ msgstr "32 biti" msgid "MioMap" msgstr "" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Asināt/Nogludināt" @@ -2736,16 +2646,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Rīki" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2761,16 +2661,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Rādiuss:" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Viļņu nobīde" diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po index 8a97036c..2c839022 100644 --- a/lazpaint/release/bin/i18n/lazpaint.nl.po +++ b/lazpaint/release/bin/i18n/lazpaint.nl.po @@ -310,11 +310,6 @@ msgstr "Kleurtint" msgid "Preset" msgstr "Voorinstelling" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Masker bewerken..." @@ -323,11 +318,6 @@ msgstr "Masker bewerken..." msgid "Load mask..." msgstr "Masker laden..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -337,16 +327,6 @@ msgstr "Aangepaste vervaging" msgid "Open grayscale file" msgstr "Zwart-witte afbeelding laden..." -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -365,16 +345,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Richting :" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "Functie toepassen" @@ -2089,16 +2059,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Uitzoomen" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2168,16 +2128,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Breedte :" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Ruisfilter" @@ -2315,16 +2265,6 @@ msgstr "Voeg een puntlicht toe" msgid "Remove selected light" msgstr "Verwijder geselecteerd licht" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2409,16 +2349,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Kwaliteit :" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2527,16 +2457,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2675,16 +2595,6 @@ msgstr "32 bits" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Verscherpen/Gladstrijken" @@ -2729,16 +2639,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Gereedschappen" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2754,16 +2654,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Straal :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Golf verplaatsing" diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po index afd3fea2..7d34ce67 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pl.po +++ b/lazpaint/release/bin/i18n/lazpaint.pl.po @@ -314,11 +314,6 @@ msgstr "Odcień" msgid "Preset" msgstr "Zalecany" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Edytuj maskę..." @@ -327,11 +322,6 @@ msgstr "Edytuj maskę..." msgid "Load mask..." msgstr "Ładuj maskę..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -341,16 +331,6 @@ msgstr "Rozmycie niestandardowe" msgid "Open grayscale file" msgstr "Otwórz plik w skali szarości" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -369,16 +349,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Kierunek:" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "Zastosuj funkcję" @@ -2101,16 +2071,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Zmniejsz" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2180,16 +2140,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Szerokość:" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Filtr szumu" @@ -2327,16 +2277,6 @@ msgstr "Dodaj światło punktowe" msgid "Remove selected light" msgstr "Usuń wybrane światło" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2421,16 +2361,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Metoda:" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2539,16 +2469,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2687,16 +2607,6 @@ msgstr "32 bity" msgid "MioMap" msgstr "Nawigacja" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Wyostrz / Wygładź" @@ -2741,16 +2651,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Narzędzia" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2766,16 +2666,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Promień:" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Przesunięcie fali" diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot index 7bf274dd..816ef649 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pot +++ b/lazpaint/release/bin/i18n/lazpaint.pot @@ -275,11 +275,6 @@ msgstr "" msgid "Preset" msgstr "" -#: tfcustomblur.button_cancel.caption -msgctxt "tfcustomblur.button_cancel.caption" -msgid "Cancel" -msgstr "" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "" @@ -288,11 +283,6 @@ msgstr "" msgid "Load mask..." msgstr "" -#: tfcustomblur.button_ok.caption -msgctxt "tfcustomblur.button_ok.caption" -msgid "OK" -msgstr "" - #: tfcustomblur.caption msgid "Custom blur" msgstr "" @@ -301,16 +291,6 @@ msgstr "" msgid "Open grayscale file" msgstr "" -#: tfemboss.button_cancel.caption -msgctxt "tfemboss.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfemboss.button_ok.caption -msgctxt "tfemboss.button_ok.caption" -msgid "OK" -msgstr "" - #: tfemboss.caption msgid "Emboss" msgstr "" @@ -327,16 +307,6 @@ msgstr "" msgid "Direction :" msgstr "" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "" - #: tffilterfunction.caption msgid "Apply function" msgstr "" @@ -1940,16 +1910,6 @@ msgstr "" msgid "Zoom out" msgstr "" -#: tfmotionblur.button_cancel.caption -msgctxt "tfmotionblur.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfmotionblur.button_ok.caption -msgctxt "tfmotionblur.button_ok.caption" -msgid "OK" -msgstr "" - #: tfmotionblur.caption msgid "Motion blur" msgstr "" @@ -2017,16 +1977,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "" @@ -2158,16 +2108,6 @@ msgstr "" msgid "Remove selected light" msgstr "" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "" - #: tfphongfilter.caption msgid "Shaded map" msgstr "" @@ -2248,16 +2188,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2366,16 +2296,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "" -#: tfradialblur.button_cancel.caption -msgctxt "tfradialblur.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfradialblur.button_ok.caption -msgctxt "tfradialblur.button_ok.caption" -msgid "OK" -msgstr "" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2513,16 +2433,6 @@ msgstr "" msgid "MioMap" msgstr "" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "" @@ -2565,16 +2475,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "" -#: tftwirl.button_cancel.caption -msgctxt "tftwirl.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tftwirl.button_ok.caption -msgctxt "tftwirl.button_ok.caption" -msgid "OK" -msgstr "" - #: tftwirl.caption msgid "Twirl" msgstr "" @@ -2588,16 +2488,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po index 82092d34..24b1626c 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po +++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po @@ -306,11 +306,6 @@ msgstr "Tonalidade" msgid "Preset" msgstr "Predefinida" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Editar máscara..." @@ -319,11 +314,6 @@ msgstr "Editar máscara..." msgid "Load mask..." msgstr "Abrir máscara..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgctxt "TFCUSTOMBLUR.CAPTION" msgid "Custom blur" @@ -333,16 +323,6 @@ msgstr "Desfoque personalizado" msgid "Open grayscale file" msgstr "Abrir arquivo em tons de cinza" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgctxt "TFEMBOSS.CAPTION" msgid "Emboss" @@ -361,16 +341,6 @@ msgctxt "TFEMBOSS.LABEL_DIRECTION.CAPTION" msgid "Direction :" msgstr "Direção :" -#: tffilterfunction.button_cancel.caption -msgctxt "TFFILTERFUNCTION.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tffilterfunction.button_ok.caption -msgctxt "TFFILTERFUNCTION.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "Aplicar função" @@ -2088,17 +2058,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Zoom -" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfmotionblur.button_ok.caption -#, fuzzy -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgctxt "TFMOTIONBLUR.CAPTION" msgid "Motion blur" @@ -2170,17 +2129,6 @@ msgctxt "TFNEWIMAGE.LABEL_WIDTH.CAPTION" msgid "Width :" msgstr "Largura :" -#: tfnoisefilter.button_cancel.caption -msgctxt "TFNOISEFILTER.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfnoisefilter.button_ok.caption -#, fuzzy -msgctxt "TFNOISEFILTER.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Filtro de ruído" @@ -2319,16 +2267,6 @@ msgstr "Adicione uma luz pontual" msgid "Remove selected light" msgstr "Remover luz selecionada" -#: tfphongfilter.button_cancel.caption -msgctxt "TFPHONGFILTER.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfphongfilter.button_ok.caption -msgctxt "TFPHONGFILTER.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgctxt "TFPHONGFILTER.CAPTION" msgid "Shaded map" @@ -2413,17 +2351,6 @@ msgctxt "TFPIXELATE.LABEL_QUALITY.CAPTION" msgid "Quality :" msgstr "Qualidade :" -#: tfposterize.button_cancel.caption -msgctxt "TFPOSTERIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfposterize.button_ok.caption -#, fuzzy -msgctxt "TFPOSTERIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "TFPOSTERIZE.CAPTION" msgid "Posterize" @@ -2532,16 +2459,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "TFRADIALBLUR.CAPTION" msgid "Radial blur" @@ -2683,16 +2600,6 @@ msgstr "32 bits" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "TFSHARPEN.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfsharpen.button_ok.caption -msgctxt "TFSHARPEN.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Nitidez/Suave" @@ -2738,17 +2645,6 @@ msgctxt "TFTOOLBOX.CAPTION" msgid "Tools" msgstr "Ferramentas" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tftwirl.button_ok.caption -#, fuzzy -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgctxt "TFTWIRL.CAPTION" msgid "Twirl" @@ -2764,17 +2660,6 @@ msgctxt "TFTWIRL.LABEL_RADIUS.CAPTION" msgid "Radius :" msgstr "Raio :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfwavedisplacement.button_ok.caption -#, fuzzy -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Deslocamento de onda" diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po index 02394267..d5d2a850 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ru.po +++ b/lazpaint/release/bin/i18n/lazpaint.ru.po @@ -301,11 +301,6 @@ msgstr "Оттенок" msgid "Preset" msgstr "Предустановка" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Редактировать маску..." @@ -314,11 +309,6 @@ msgstr "Редактировать маску..." msgid "Load mask..." msgstr "Загрузить маску..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -328,16 +318,6 @@ msgstr "Пользовательское размытие" msgid "Open grayscale file" msgstr "Открыть файл в оттенках серого" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -356,16 +336,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Направление:" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tffilterfunction.caption msgid "Apply function" msgstr "Применить функцию" @@ -2076,16 +2046,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Уменьшить" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2155,16 +2115,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Ширина:" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Фильтр шума" @@ -2302,16 +2252,6 @@ msgstr "Добавить точечный свет" msgid "Remove selected light" msgstr "Удалить источник света" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2396,16 +2336,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Качество:" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2514,16 +2444,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2662,16 +2582,6 @@ msgstr "32-битный" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Резкость/Сглаженность" @@ -2716,16 +2626,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Инструменты" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2741,16 +2641,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Радиус:" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Смещение волны" diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po index 16d7e4af..c800f058 100644 --- a/lazpaint/release/bin/i18n/lazpaint.sv.po +++ b/lazpaint/release/bin/i18n/lazpaint.sv.po @@ -296,11 +296,6 @@ msgstr "Ton" msgid "Preset" msgstr "Förinställda val" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "Redigera mask..." @@ -309,11 +304,6 @@ msgstr "Redigera mask..." msgid "Load mask..." msgstr "Ladda mask..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -323,16 +313,6 @@ msgstr "Egen oskärpa" msgid "Open grayscale file" msgstr "Öppna gråskalefil" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -351,16 +331,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "Riktning :" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tffilterfunction.caption msgid "Apply function" msgstr "Tillämpa funktion" @@ -2089,16 +2059,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "Zoom in" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2168,16 +2128,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "Bredd :" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "Brusfilter:" @@ -2315,16 +2265,6 @@ msgstr "Lägg till en punktljuskälla" msgid "Remove selected light" msgstr "Ta bort vald ljuskälla" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2409,16 +2349,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "Kvalitet :" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2531,16 +2461,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2679,16 +2599,6 @@ msgstr "32 bit" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "Gör skarpare/Gör mjukare" @@ -2733,16 +2643,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "Verktyg" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2758,16 +2658,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "Radie :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "Vågförskjutning" diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po index adc5a0e8..acf5aa52 100644 --- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po +++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po @@ -306,11 +306,6 @@ msgstr "色调" msgid "Preset" msgstr "预设" -#: tfcustomblur.button_cancel.caption -msgctxt "TFCUSTOMBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - #: tfcustomblur.button_editmask.caption msgid "Edit mask..." msgstr "编辑蒙版..." @@ -319,11 +314,6 @@ msgstr "编辑蒙版..." msgid "Load mask..." msgstr "加载蒙版..." -#: tfcustomblur.button_ok.caption -msgctxt "TFCUSTOMBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfcustomblur.caption msgctxt "tfcustomblur.caption" msgid "Custom blur" @@ -333,16 +323,6 @@ msgstr "自定义模糊" msgid "Open grayscale file" msgstr "打开灰度文件" -#: tfemboss.button_cancel.caption -msgctxt "TFEMBOSS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tfemboss.button_ok.caption -msgctxt "TFEMBOSS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfemboss.caption msgctxt "tfemboss.caption" msgid "Emboss" @@ -361,16 +341,6 @@ msgctxt "tfemboss.label_direction.caption" msgid "Direction :" msgstr "方向 :" -#: tffilterfunction.button_cancel.caption -msgctxt "tffilterfunction.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tffilterfunction.button_ok.caption -msgctxt "tffilterfunction.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tffilterfunction.caption msgid "Apply function" msgstr "应用函数" @@ -2089,16 +2059,6 @@ msgctxt "TFMAIN.VIEWZOOMOUT.HINT" msgid "Zoom out" msgstr "缩小" -#: tfmotionblur.button_cancel.caption -msgctxt "TFMOTIONBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tfmotionblur.button_ok.caption -msgctxt "TFMOTIONBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfmotionblur.caption msgctxt "tfmotionblur.caption" msgid "Motion blur" @@ -2168,16 +2128,6 @@ msgctxt "tfnewimage.label_width.caption" msgid "Width :" msgstr "宽度 :" -#: tfnoisefilter.button_cancel.caption -msgctxt "tfnoisefilter.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tfnoisefilter.button_ok.caption -msgctxt "tfnoisefilter.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tfnoisefilter.caption msgid "Noise filter" msgstr "噪声滤镜" @@ -2315,16 +2265,6 @@ msgstr "添加点光源" msgid "Remove selected light" msgstr "删除所选光源" -#: tfphongfilter.button_cancel.caption -msgctxt "tfphongfilter.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tfphongfilter.button_ok.caption -msgctxt "tfphongfilter.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tfphongfilter.caption msgctxt "tfphongfilter.caption" msgid "Shaded map" @@ -2409,16 +2349,6 @@ msgctxt "tfpixelate.label_quality.caption" msgid "Quality :" msgstr "品质 :" -#: tfposterize.button_cancel.caption -msgctxt "tfposterize.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tfposterize.button_ok.caption -msgctxt "tfposterize.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tfposterize.caption msgctxt "tfposterize.caption" msgid "Posterize" @@ -2527,16 +2457,6 @@ msgctxt "tfquestion.label_message.caption" msgid "." msgstr "." -#: tfradialblur.button_cancel.caption -msgctxt "TFRADIALBLUR.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tfradialblur.button_ok.caption -msgctxt "TFRADIALBLUR.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfradialblur.caption msgctxt "tfradialblur.caption" msgid "Radial blur" @@ -2675,16 +2595,6 @@ msgstr "32 位色" msgid "MioMap" msgstr "MioMap" -#: tfsharpen.button_cancel.caption -msgctxt "tfsharpen.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tfsharpen.button_ok.caption -msgctxt "tfsharpen.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tfsharpen.caption msgid "Sharpen/Smooth" msgstr "锐化/平滑" @@ -2729,16 +2639,6 @@ msgctxt "tftoolbox.caption" msgid "Tools" msgstr "工具" -#: tftwirl.button_cancel.caption -msgctxt "TFTWIRL.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tftwirl.button_ok.caption -msgctxt "TFTWIRL.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tftwirl.caption msgctxt "tftwirl.caption" msgid "Twirl" @@ -2754,16 +2654,6 @@ msgctxt "tftwirl.label_radius.caption" msgid "Radius :" msgstr "半径 :" -#: tfwavedisplacement.button_cancel.caption -msgctxt "tfwavedisplacement.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tfwavedisplacement.button_ok.caption -msgctxt "tfwavedisplacement.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tfwavedisplacement.caption msgid "Wave displacement" msgstr "波形移位" From 2fdd4f8b630659dc186b5f9d6372fc2fb24a29ba Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Thu, 14 Sep 2023 09:27:03 +0200 Subject: [PATCH 06/70] refactor, store computed image only when preview is unchecked --- lazpaint/dialog/filter/uradialblur.pas | 39 ++++++++++++++++++-------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/lazpaint/dialog/filter/uradialblur.pas b/lazpaint/dialog/filter/uradialblur.pas index 8b0f0dfc..be936c4a 100644 --- a/lazpaint/dialog/filter/uradialblur.pas +++ b/lazpaint/dialog/filter/uradialblur.pas @@ -34,13 +34,15 @@ TFRadialBlur = class(TForm) procedure SpinEdit_RadiusChange(Sender: TObject); procedure Timer1Timer(Sender: TObject); private - FInitializing: boolean; + FInitializing, FComputed: boolean; FFilterConnector: TFilterConnector; FThreadManager: TFilterThreadManager; FLastRadius: single; FVars: TVariableSet; FComputedImage: TBGRABitmap; + procedure DisplayComputedImage; procedure PreviewNeeded; + procedure StoreComputedImage; procedure UpdateStep; procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent); public @@ -77,10 +79,15 @@ function ShowRadialBlurDlg(AFilterConnector: TObject; { TFRadialBlur } +procedure TFRadialBlur.DisplayComputedImage; +begin + if FComputedImage <> nil then + FFilterConnector.PutImage(FComputedImage, false, false); +end; + procedure TFRadialBlur.Button_OKClick(Sender: TObject); begin - if not CheckBox_Preview.Checked and - (FComputedImage <> nil) then FFilterConnector.PutImage(FComputedImage,false,false); + if not CheckBox_Preview.Checked then DisplayComputedImage; if not FFilterConnector.ActionDone then begin @@ -94,9 +101,18 @@ procedure TFRadialBlur.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - FFilterConnector.PutImage(FComputedImage, false, false) + DisplayComputedImage else - FFilterConnector.RestoreBackup; + begin + StoreComputedImage; + FFilterConnector.RestoreBackup; + end; +end; + +procedure TFRadialBlur.StoreComputedImage; +begin + if FComputed and (FComputedImage = nil) then + FComputedImage := FFilterConnector.ActiveLayer.Duplicate; end; procedure TFRadialBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean); @@ -113,11 +129,14 @@ procedure TFRadialBlur.FormCreate(Sender: TObject); CheckOKCancelBtns(Button_OK{,Button_Cancel}); CheckFloatSpinEdit(SpinEdit_Radius); SpinEdit_Radius.Constraints.MinWidth := DoScaleX(70, OriginalDPI); + + FComputed := false; + FComputedImage := nil; end; procedure TFRadialBlur.FormDestroy(Sender: TObject); begin - if FComputedImage <> nil then FreeAndNil(FComputedImage); + FreeAndNil(FComputedImage); end; procedure TFRadialBlur.FormShow(Sender: TObject); @@ -186,13 +205,8 @@ procedure TFRadialBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent if AEvent = tmeCompletedTask then begin Button_OK.Enabled := true; CheckBox_Preview.Enabled := true; + FComputed := true; end; - - if FComputedImage <> nil then FComputedImage.Free; - case AEvent of - tmeAbortedTask: FComputedImage := FFilterConnector.BackupLayer.Duplicate; - tmeCompletedTask: FComputedImage := FFilterConnector.ActiveLayer.Duplicate; - end; end; tmeStartingNewTask: begin @@ -204,6 +218,7 @@ procedure TFRadialBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent FInitializing := True; CheckBox_Preview.Enabled := false; CheckBox_Preview.Checked := True; + FreeAndNil(FComputedImage); FInitializing := False; end; end; From fda98ff01f31880f0086b2d6484aa362a35bf343 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Thu, 14 Sep 2023 09:34:06 +0200 Subject: [PATCH 07/70] rename function to express that result is immediate --- lazpaint/dialog/filter/uemboss.pas | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lazpaint/dialog/filter/uemboss.pas b/lazpaint/dialog/filter/uemboss.pas index 25d40af5..0f9076df 100644 --- a/lazpaint/dialog/filter/uemboss.pas +++ b/lazpaint/dialog/filter/uemboss.pas @@ -47,7 +47,7 @@ TFEmboss = class(TForm) FInitializing: boolean; procedure ComputeAngle(X,Y: integer); function ComputeFilteredLayer: TBGRABitmap; - procedure PreviewNeeded; + procedure DisplayPreview; procedure InitParams; public FilterConnector: TFilterConnector; @@ -76,7 +76,7 @@ function ShowEmbossDlg(AFilterConnector: TObject): TScriptResult; FEmboss.FilterConnector.Parameters.Booleans['Validate'] then begin FEmboss.InitParams; - FEmboss.PreviewNeeded; + FEmboss.DisplayPreview; FEmboss.FilterConnector.ValidateAction; result := srOk; end else @@ -103,13 +103,13 @@ procedure TFEmboss.FormCreate(Sender: TObject); procedure TFEmboss.FormShow(Sender: TObject); begin InitParams; - PreviewNeeded; + DisplayPreview; Left := FilterConnector.LazPaintInstance.MainFormBounds.Left end; procedure TFEmboss.Button_OKClick(Sender: TObject); begin - if not CheckBox_Preview.Checked then PreviewNeeded; + if not CheckBox_Preview.Checked then DisplayPreview; FilterConnector.ValidateAction; FilterConnector.LazPaintInstance.Config.SetDefaultEmbossAngle(angle); @@ -118,16 +118,16 @@ procedure TFEmboss.Button_OKClick(Sender: TObject); procedure TFEmboss.CheckBox_Change(Sender: TObject); begin - if CheckBox_Preview.Checked then PreviewNeeded; + if CheckBox_Preview.Checked then DisplayPreview; end; procedure TFEmboss.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - PreviewNeeded + DisplayPreview else - FilterConnector.RestoreBackup; + FilterConnector.RestoreBackup; end; procedure TFEmboss.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; @@ -184,7 +184,7 @@ procedure TFEmboss.PaintBox1Paint(Sender: TObject); procedure TFEmboss.TrackBar_StrengthChange(Sender: TObject); begin - if CheckBox_Preview.Checked then PreviewNeeded; + if CheckBox_Preview.Checked then DisplayPreview; PaintBox1.Repaint; end; @@ -193,7 +193,7 @@ procedure TFEmboss.ComputeAngle(X, Y: integer); if selectingAngle then begin angle := ugraph.ComputeAngle(X-PaintBox1.Width/2,Y-PaintBox1.Height/2); - if CheckBox_Preview.Checked then PreviewNeeded; + if CheckBox_Preview.Checked then DisplayPreview; PaintBox1.Repaint; end; end; @@ -207,7 +207,7 @@ function TFEmboss.ComputeFilteredLayer: TBGRABitmap; result := FilterConnector.BackupLayer.FilterEmboss(angle,FilterConnector.WorkArea,TrackBar_Strength.Position,options) as TBGRABitmap; end; -procedure TFEmboss.PreviewNeeded; +procedure TFEmboss.DisplayPreview; begin FilterConnector.PutImage(ComputeFilteredLayer,False,True); end; From 60b9d25313b2f665c49ac6aa8768e21f3f0ba53c Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Thu, 14 Sep 2023 10:02:27 +0200 Subject: [PATCH 08/70] window size and anchors, show rsPreview --- lazpaint/dialog/filter/ufilterfunction.lfm | 236 +++++++++++---------- lazpaint/dialog/filter/ufilterfunction.lrj | 3 +- 2 files changed, 122 insertions(+), 117 deletions(-) diff --git a/lazpaint/dialog/filter/ufilterfunction.lfm b/lazpaint/dialog/filter/ufilterfunction.lfm index a7110aed..d43bb53c 100644 --- a/lazpaint/dialog/filter/ufilterfunction.lfm +++ b/lazpaint/dialog/filter/ufilterfunction.lfm @@ -1,22 +1,22 @@ object FFilterFunction: TFFilterFunction Left = 437 - Height = 262 + Height = 271 Top = 135 - Width = 430 + Width = 640 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Apply function' - ClientHeight = 262 - ClientWidth = 430 + ClientHeight = 271 + ClientWidth = 640 OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.2.4.0' + LCLVersion = '2.2.6.0' object Button_OK: TButton - Left = 145 + Left = 251 Height = 22 - Top = 231 + Top = 240 Width = 59 Anchors = [akLeft, akBottom] Caption = 'rsOK' @@ -27,9 +27,9 @@ object FFilterFunction: TFFilterFunction TabOrder = 0 end object Button_Cancel: TButton - Left = 209 + Left = 315 Height = 22 - Top = 231 + Top = 240 Width = 73 Anchors = [akLeft, akBottom] Cancel = True @@ -43,9 +43,10 @@ object FFilterFunction: TFFilterFunction AnchorSideTop.Control = Edit_Alpha AnchorSideTop.Side = asrCenter Left = 16 - Height = 15 - Top = 180 - Width = 3 + Height = 16 + Top = 189 + Width = 4 + Anchors = [akLeft, akBottom] Caption = '.' ParentColor = False ParentFont = False @@ -53,10 +54,10 @@ object FFilterFunction: TFFilterFunction object Edit_Alpha: TEdit AnchorSideLeft.Control = Label_AlphaEquals AnchorSideLeft.Side = asrBottom - Left = 19 - Height = 23 - Top = 176 - Width = 445 + Left = 20 + Height = 22 + Top = 186 + Width = 606 Anchors = [akLeft, akRight, akBottom] OnChange = Edit_AlphaChange ParentFont = False @@ -64,12 +65,13 @@ object FFilterFunction: TFFilterFunction end object PageControl_Color: TPageControl Left = 8 - Height = 136 + Height = 145 Top = 31 - Width = 416 - ActivePage = TabSheet_RGB + Width = 626 + ActivePage = TabSheet_HSL + Anchors = [akTop, akLeft, akRight] ParentFont = False - TabIndex = 0 + TabIndex = 1 TabOrder = 3 OnChange = PageControl_ColorChange object TabSheet_RGB: TTabSheet @@ -79,14 +81,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.VerticalSpacing = 6 ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.ControlsPerLine = 1 - ClientHeight = 108 - ClientWidth = 408 + ClientHeight = 115 + ClientWidth = 620 ParentFont = False object PanelRGB: TPanel - Left = 9 - Height = 71 + Left = 10 + Height = 79 Top = 6 - Width = 393 + Width = 604 Align = alClient BevelOuter = bvNone ChildSizing.HorizontalSpacing = 6 @@ -94,14 +96,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 71 - ClientWidth = 393 + ClientHeight = 79 + ClientWidth = 604 TabOrder = 0 object Edit_Red: TEdit Left = 0 - Height = 23 + Height = 22 Top = 0 - Width = 393 + Width = 604 AutoSize = False OnChange = Edit_RedChange ParentFont = False @@ -109,9 +111,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Green: TEdit Left = 0 - Height = 23 - Top = 29 - Width = 393 + Height = 22 + Top = 28 + Width = 604 AutoSize = False OnChange = Edit_GreenChange ParentFont = False @@ -119,9 +121,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Blue: TEdit Left = 0 - Height = 23 - Top = 58 - Width = 393 + Height = 22 + Top = 56 + Width = 604 AutoSize = False OnChange = Edit_BlueChange ParentFont = False @@ -130,9 +132,9 @@ object FFilterFunction: TFFilterFunction end object CheckBox_Gamma: TCheckBox Left = 6 - Height = 19 - Top = 83 - Width = 396 + Height = 18 + Top = 91 + Width = 608 Align = alBottom Caption = 'Gamma correction' OnChange = CheckBox_GammaChange @@ -141,41 +143,41 @@ object FFilterFunction: TFFilterFunction end object PanelLabelRGB: TPanel Left = 6 - Height = 71 + Height = 79 Top = 6 - Width = 3 + Width = 4 Align = alLeft AutoSize = True BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 71 - ClientWidth = 3 + ClientHeight = 79 + ClientWidth = 4 TabOrder = 2 object Label_RedEquals: TLabel Left = 0 - Height = 15 + Height = 16 Top = 0 - Width = 3 + Width = 4 Caption = '.' ParentColor = False ParentFont = False end object Label_GreenEquals: TLabel Left = 0 - Height = 15 - Top = 21 - Width = 3 + Height = 16 + Top = 22 + Width = 4 Caption = '.' ParentColor = False ParentFont = False end object Label_BlueEquals: TLabel Left = 0 - Height = 15 - Top = 42 - Width = 3 + Height = 16 + Top = 44 + Width = 4 Caption = '.' ParentColor = False ParentFont = False @@ -187,14 +189,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.VerticalSpacing = 6 - ClientHeight = 108 - ClientWidth = 408 + ClientHeight = 115 + ClientWidth = 620 ParentFont = False object PanelHSL: TPanel - Left = 9 - Height = 71 + Left = 10 + Height = 79 Top = 6 - Width = 393 + Width = 604 Align = alClient BevelOuter = bvNone ChildSizing.HorizontalSpacing = 6 @@ -202,14 +204,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 71 - ClientWidth = 393 + ClientHeight = 79 + ClientWidth = 604 TabOrder = 0 object Edit_Hue: TEdit Left = 0 - Height = 23 + Height = 22 Top = 0 - Width = 393 + Width = 604 AutoSize = False OnChange = Edit_HueChange ParentFont = False @@ -217,9 +219,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Saturation: TEdit Left = 0 - Height = 23 - Top = 29 - Width = 393 + Height = 22 + Top = 28 + Width = 604 AutoSize = False OnChange = Edit_SaturationChange ParentFont = False @@ -227,9 +229,9 @@ object FFilterFunction: TFFilterFunction end object Edit_Lightness: TEdit Left = 0 - Height = 23 - Top = 58 - Width = 393 + Height = 22 + Top = 56 + Width = 604 AutoSize = False OnChange = Edit_LightnessChange ParentFont = False @@ -238,9 +240,9 @@ object FFilterFunction: TFFilterFunction end object CheckBox_GSBA: TCheckBox Left = 6 - Height = 19 - Top = 83 - Width = 396 + Height = 18 + Top = 91 + Width = 608 Align = alBottom Caption = 'Corrected hue and lightness' OnChange = CheckBox_GSBAChange @@ -249,41 +251,41 @@ object FFilterFunction: TFFilterFunction end object PanelLabelHSL: TPanel Left = 6 - Height = 71 + Height = 79 Top = 6 - Width = 3 + Width = 4 Align = alLeft AutoSize = True BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 71 - ClientWidth = 3 + ClientHeight = 79 + ClientWidth = 4 TabOrder = 2 object Label_HueEquals: TLabel Left = 0 - Height = 15 + Height = 16 Top = 0 - Width = 3 + Width = 4 Caption = '.' ParentColor = False ParentFont = False end object Label_SaturationEquals: TLabel Left = 0 - Height = 15 - Top = 21 - Width = 3 + Height = 16 + Top = 22 + Width = 4 Caption = '.' ParentColor = False ParentFont = False end object Label_LightnessEquals: TLabel Left = 0 - Height = 15 - Top = 42 - Width = 3 + Height = 16 + Top = 44 + Width = 4 Caption = '.' ParentColor = False ParentFont = False @@ -295,13 +297,13 @@ object FFilterFunction: TFFilterFunction ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.VerticalSpacing = 6 - ClientHeight = 108 - ClientWidth = 408 + ClientHeight = 115 + ClientWidth = 620 object PanelLab: TPanel - Left = 9 - Height = 96 + Left = 10 + Height = 103 Top = 6 - Width = 393 + Width = 604 Align = alClient BevelOuter = bvNone ChildSizing.HorizontalSpacing = 6 @@ -309,14 +311,14 @@ object FFilterFunction: TFFilterFunction ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 96 - ClientWidth = 393 + ClientHeight = 103 + ClientWidth = 604 TabOrder = 0 object Edit_L: TEdit Left = 0 - Height = 23 + Height = 22 Top = 0 - Width = 393 + Width = 604 AutoSize = False OnChange = Edit_LChange ParentFont = False @@ -324,9 +326,9 @@ object FFilterFunction: TFFilterFunction end object Edit_a: TEdit Left = 0 - Height = 23 - Top = 29 - Width = 393 + Height = 22 + Top = 28 + Width = 604 AutoSize = False OnChange = Edit_aChange ParentFont = False @@ -334,9 +336,9 @@ object FFilterFunction: TFFilterFunction end object Edit_b: TEdit Left = 0 - Height = 23 - Top = 58 - Width = 393 + Height = 22 + Top = 56 + Width = 604 AutoSize = False OnChange = Edit_bChange ParentFont = False @@ -345,41 +347,41 @@ object FFilterFunction: TFFilterFunction end object PanelLabelLab: TPanel Left = 6 - Height = 96 + Height = 103 Top = 6 - Width = 3 + Width = 4 Align = alLeft AutoSize = True BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 - ClientHeight = 96 - ClientWidth = 3 + ClientHeight = 103 + ClientWidth = 4 TabOrder = 1 object Label_LEquals: TLabel Left = 0 - Height = 15 + Height = 16 Top = 0 - Width = 3 + Width = 4 Caption = '.' ParentColor = False ParentFont = False end object Label_aEquals: TLabel Left = 0 - Height = 15 - Top = 21 - Width = 3 + Height = 16 + Top = 22 + Width = 4 Caption = '.' ParentColor = False ParentFont = False end object Label_bEquals: TLabel Left = 0 - Height = 15 - Top = 42 - Width = 3 + Height = 16 + Top = 44 + Width = 4 Caption = '.' ParentColor = False ParentFont = False @@ -389,18 +391,20 @@ object FFilterFunction: TFFilterFunction end object Label_Variables: TLabel Left = 9 - Height = 15 + Height = 16 Top = 8 - Width = 52 + Width = 63 Caption = 'Variables :' ParentColor = False ParentFont = False end object CheckBox_Preview: TCheckBox Left = 21 - Height = 19 - Top = 208 - Width = 20 + Height = 18 + Top = 217 + Width = 82 + Anchors = [akLeft, akBottom] + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked @@ -410,13 +414,13 @@ object FFilterFunction: TFFilterFunction Enabled = False Interval = 30 OnTimer = Timer1Timer - Left = 200 - Top = 40 + Left = 144 + Top = 8 end object Timer_AdjustVerticalSize: TTimer Interval = 20 OnTimer = Timer_AdjustVerticalSizeTimer - Left = 301 - Top = 17 + Left = 488 + Top = 8 end end diff --git a/lazpaint/dialog/filter/ufilterfunction.lrj b/lazpaint/dialog/filter/ufilterfunction.lrj index 4ec7f2f5..64c4ca31 100644 --- a/lazpaint/dialog/filter/ufilterfunction.lrj +++ b/lazpaint/dialog/filter/ufilterfunction.lrj @@ -17,5 +17,6 @@ {"hash":46,"name":"tffilterfunction.label_lequals.caption","sourcebytes":[46],"value":"."}, {"hash":46,"name":"tffilterfunction.label_aequals.caption","sourcebytes":[46],"value":"."}, {"hash":46,"name":"tffilterfunction.label_bequals.caption","sourcebytes":[46],"value":"."}, -{"hash":133057994,"name":"tffilterfunction.label_variables.caption","sourcebytes":[86,97,114,105,97,98,108,101,115,32,58],"value":"Variables :"} +{"hash":133057994,"name":"tffilterfunction.label_variables.caption","sourcebytes":[86,97,114,105,97,98,108,101,115,32,58],"value":"Variables :"}, +{"hash":126662215,"name":"tffilterfunction.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"} ]} From 7443df57df0b4078098546cd5dcc180be7c02cfb Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Thu, 14 Sep 2023 10:02:50 +0200 Subject: [PATCH 09/70] refactor in method, ensure initialization --- lazpaint/dialog/filter/ufilterfunction.pas | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lazpaint/dialog/filter/ufilterfunction.pas b/lazpaint/dialog/filter/ufilterfunction.pas index 14c954b5..b0de4cdd 100644 --- a/lazpaint/dialog/filter/ufilterfunction.pas +++ b/lazpaint/dialog/filter/ufilterfunction.pas @@ -99,6 +99,7 @@ TFFilterFunction = class(TForm) count: integer; computed: boolean; end; + procedure DisplayComputedImage; procedure UpdateExpr(AExpr: TFPExpressionParser; AEdit: TEdit; var AError: boolean); procedure InitParams; @@ -236,6 +237,7 @@ procedure TFFilterFunction.FormCreate(Sender: TObject); Label_bEquals.Caption := 'b (-1..1) = '; Label_Variables.Caption := Label_Variables.Caption+' x,y,width,height,random,min,max,avg'; + FComputedImage := nil; StatsNotComputed(low(FStats), high(FStats)); end; @@ -505,7 +507,7 @@ TExprVariables = record Timer1.Enabled:= false; if FComputing then begin - if (FComputedImage = nil) then + if FComputedImage = nil then FComputedImage := TBGRABitmap.Create(FFilterConnector.BackupLayer.Width,FFilterConnector.BackupLayer.Height); if FComputationRestarted then begin @@ -1057,7 +1059,7 @@ function TFFilterFunction.ReplaceStats(AExpr: string): string; procedure TFFilterFunction.Button_OKClick(Sender: TObject); begin if not CheckBox_Preview.Checked then - FFilterConnector.PutImage(FComputedImage,True,False); + DisplayComputedImage; FFilterConnector.ValidateAction; ModalResult := mrOK; @@ -1082,11 +1084,17 @@ procedure TFFilterFunction.CheckBox_GSBAChange(Sender: TObject); end; end; +procedure TFFilterFunction.DisplayComputedImage; +begin + if FComputedImage <> nil then + FFilterConnector.PutImage(FComputedImage,True,False); +end; + procedure TFFilterFunction.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - FFilterConnector.PutImage(FComputedImage,True,False) + DisplayComputedImage else FFilterConnector.RestoreBackup; end; From 002a33ba9810de5a0e5c34546e2a2318ca1997ee Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 15 Sep 2023 11:04:34 +0200 Subject: [PATCH 10/70] rename function to better express what it does --- lazpaint/dialog/filter/unoisefilter.pas | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lazpaint/dialog/filter/unoisefilter.pas b/lazpaint/dialog/filter/unoisefilter.pas index ffbbdc35..3a0728fe 100644 --- a/lazpaint/dialog/filter/unoisefilter.pas +++ b/lazpaint/dialog/filter/unoisefilter.pas @@ -38,12 +38,12 @@ TFNoiseFilter = class(TForm) FComputedLayer: TBGRABitmap; FClosing: boolean; procedure InitParams; - procedure PutComputedLayerToFilterConnector; + procedure DisplayComputedImage; public FInitializing: boolean; FFilterConnector: TFilterConnector; procedure ComputeFilteredLayer; - procedure PreviewNeeded(ARecomputeRandom: boolean); + procedure DisplayPreview(ARecomputeRandom: boolean); end; function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult; @@ -65,7 +65,7 @@ function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult; FNoiseFilter.FFilterConnector.Parameters.Booleans['Validate'] then begin FNoiseFilter.InitParams; - FNoiseFilter.PreviewNeeded(true); + FNoiseFilter.DisplayPreview(true); FNoiseFilter.FFilterConnector.ValidateAction; result := srOk; end else @@ -88,7 +88,7 @@ function ShowNoiseFilterDlg(AFilterConnector: TObject): TScriptResult; procedure TFNoiseFilter.Button_OKClick(Sender: TObject); begin if not CheckBox_Preview.Checked then - PutComputedLayerToFilterConnector; + DisplayComputedImage; FFilterConnector.ValidateAction; ModalResult := mrOK; @@ -98,7 +98,7 @@ procedure TFNoiseFilter.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - PutComputedLayerToFilterConnector + DisplayComputedImage else FFilterConnector.RestoreBackup; end; @@ -121,7 +121,7 @@ procedure TFNoiseFilter.FormHide(Sender: TObject); procedure TFNoiseFilter.Radio_NoiseChange(Sender: TObject); begin if FInitializing then exit; - PreviewNeeded(true); + DisplayPreview(true); end; procedure TFNoiseFilter.FormCreate(Sender: TObject); @@ -139,7 +139,7 @@ procedure TFNoiseFilter.FormShow(Sender: TObject); Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top; FInitializing := false; InitParams; - PreviewNeeded(True); + DisplayPreview(True); end; procedure TFNoiseFilter.SpinEdit_AlphaChange(Sender: TObject); @@ -147,7 +147,7 @@ procedure TFNoiseFilter.SpinEdit_AlphaChange(Sender: TObject); if FInitializing or FClosing then exit; if FComputedLayer = nil then ComputeFilteredLayer; FComputedLayer.AlphaFill(SpinEdit_Alpha.Value); - PreviewNeeded(False); + DisplayPreview(False); end; procedure TFNoiseFilter.InitParams; @@ -176,7 +176,7 @@ procedure TFNoiseFilter.InitParams; FInitializing:= false; end; -procedure TFNoiseFilter.PutComputedLayerToFilterConnector; +procedure TFNoiseFilter.DisplayComputedImage; begin if SpinEdit_Alpha.Value <> 255 then begin @@ -196,11 +196,10 @@ procedure TFNoiseFilter.ComputeFilteredLayer; scan.Free; end; -procedure TFNoiseFilter.PreviewNeeded(ARecomputeRandom: boolean); +procedure TFNoiseFilter.DisplayPreview(ARecomputeRandom: boolean); begin if ARecomputeRandom or (FComputedLayer = nil) then ComputeFilteredLayer; - if not CheckBox_Preview.Checked then exit; - PutComputedLayerToFilterConnector; + if CheckBox_Preview.Checked then DisplayComputedImage; end; end. From b89c2beacf9bcd0b9532f8f8fe5155b248990bbc Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 15 Sep 2023 11:08:09 +0200 Subject: [PATCH 11/70] rename function to express that result is immediate --- lazpaint/dialog/filter/uposterize.pas | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lazpaint/dialog/filter/uposterize.pas b/lazpaint/dialog/filter/uposterize.pas index fe0b7fa0..163346cb 100644 --- a/lazpaint/dialog/filter/uposterize.pas +++ b/lazpaint/dialog/filter/uposterize.pas @@ -33,7 +33,7 @@ TFPosterize = class(TForm) FFilterConnector: TFilterConnector; procedure OnTryStopAction({%H-}sender: TFilterConnector); procedure InitParams; - procedure PreviewNeeded; + procedure DisplayPreview; { private declarations } public { public declarations } @@ -67,7 +67,7 @@ function ShowPosterizeDlg(AInstance: TLazPaintCustomInstance; AParameters: TVari FPosterize.FFilterConnector.Parameters.Booleans['Validate'] then begin FPosterize.InitParams; - FPosterize.PreviewNeeded; + FPosterize.DisplayPreview; FPosterize.FFilterConnector.ValidateAction; result := srOk; end else @@ -97,7 +97,7 @@ procedure TFPosterize.FormCreate(Sender: TObject); procedure TFPosterize.Button_OKClick(Sender: TObject); begin - if not CheckBox_Preview.Checked then PreviewNeeded; + if not CheckBox_Preview.Checked then DisplayPreview; FFilterConnector.ValidateAction; FFilterConnector.LazPaintInstance.Config.SetDefaultPosterizeLevels(SpinEdit_Levels.Value); @@ -108,14 +108,14 @@ procedure TFPosterize.Button_OKClick(Sender: TObject); procedure TFPosterize.CheckBox_ByLightnessChange(Sender: TObject); begin if not FInitializing and - CheckBox_Preview.Checked then PreviewNeeded; + CheckBox_Preview.Checked then DisplayPreview; end; procedure TFPosterize.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - PreviewNeeded + DisplayPreview else FFilterConnector.RestoreBackup; end; @@ -123,14 +123,14 @@ procedure TFPosterize.CheckBox_PreviewChange(Sender: TObject); procedure TFPosterize.FormShow(Sender: TObject); begin InitParams; - PreviewNeeded; + DisplayPreview; Top := FFilterConnector.LazPaintInstance.MainFormBounds.Top; end; procedure TFPosterize.SpinEdit_LevelsChange(Sender: TObject); begin if not FInitializing and - CheckBox_Preview.Checked then PreviewNeeded; + CheckBox_Preview.Checked then DisplayPreview; end; procedure TFPosterize.OnTryStopAction(sender: TFilterConnector); @@ -159,7 +159,7 @@ procedure TFPosterize.InitParams; FInitializing := false; end; -procedure TFPosterize.PreviewNeeded; +procedure TFPosterize.DisplayPreview; var params:TVariableSet; levels: integer; From 9a1ff065fe4c8c84306f324a61fe78cef080c8dc Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 15 Sep 2023 11:08:29 +0200 Subject: [PATCH 12/70] rename function to express that result is immediate --- lazpaint/dialog/filter/usharpen.pas | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lazpaint/dialog/filter/usharpen.pas b/lazpaint/dialog/filter/usharpen.pas index be025fd9..5351f562 100644 --- a/lazpaint/dialog/filter/usharpen.pas +++ b/lazpaint/dialog/filter/usharpen.pas @@ -35,7 +35,7 @@ TFSharpen = class(TForm) FInitializing: boolean; FFilterConnector: TFilterConnector; procedure InitParams; - procedure PreviewNeeded; + procedure DisplayPreview; end; function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScriptResult; @@ -66,7 +66,7 @@ function ShowSharpenDlg(AFilterConnector: TObject; AMode : TSharpenMode): TScrip FSharpen.FFilterConnector.Parameters.Booleans['Validate'] then begin FSharpen.InitParams; - FSharpen.PreviewNeeded; + FSharpen.DisplayPreview; FSharpen.FFilterConnector.ValidateAction; result := srOk; end else @@ -95,7 +95,7 @@ procedure TFSharpen.FormShow(Sender: TObject); var idxSlash: integer; begin InitParams; - PreviewNeeded; + DisplayPreview; idxSlash:= Pos('/',Caption); if idxSlash <> 0 then begin @@ -108,12 +108,12 @@ procedure TFSharpen.FormShow(Sender: TObject); procedure TFSharpen.SpinEdit_AmountChange(Sender: TObject); begin if not FInitializing and - CheckBox_Preview.Checked then PreviewNeeded; + CheckBox_Preview.Checked then DisplayPreview; end; procedure TFSharpen.Button_OKClick(Sender: TObject); begin - if not CheckBox_Preview.Checked then PreviewNeeded; + if not CheckBox_Preview.Checked then DisplayPreview; FFilterConnector.ValidateAction; FFilterConnector.LazPaintInstance.Config.SetDefaultSharpenAmount(SpinEdit_Amount.Value/100); @@ -124,7 +124,7 @@ procedure TFSharpen.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - PreviewNeeded + DisplayPreview else FFilterConnector.RestoreBackup; end; @@ -149,7 +149,7 @@ procedure TFSharpen.InitParams; FInitializing := false; end; -procedure TFSharpen.PreviewNeeded; +procedure TFSharpen.DisplayPreview; var filtered: TBGRABitmap; begin if FMode = smSharpen then From c0f21cdaba1e42403946541fd68f038211e3eceb Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 15 Sep 2023 11:11:22 +0200 Subject: [PATCH 13/70] refactor, store computed image only when preview is unchecked --- lazpaint/dialog/filter/ucustomblur.pas | 29 +++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/lazpaint/dialog/filter/ucustomblur.pas b/lazpaint/dialog/filter/ucustomblur.pas index ab0b9c5a..a50549c8 100644 --- a/lazpaint/dialog/filter/ucustomblur.pas +++ b/lazpaint/dialog/filter/ucustomblur.pas @@ -42,8 +42,10 @@ TFCustomBlur = class(TForm) FLazPaintInstance: TLazPaintCustomInstance; FFilterConnector: TFilterConnector; FThreadManager: TFilterThreadManager; - FInitializing: boolean; + FInitializing, FComputed: boolean; FComputedImage: TBGRABitmap; + procedure DisplayComputedImage; + procedure StoreComputedImage; procedure GenerateDefaultMask; procedure SetLazPaintInstance(const AValue: TLazPaintCustomInstance); procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent); @@ -67,13 +69,16 @@ procedure TFCustomBlur.FormCreate(Sender: TObject); 'ForeColor=FFFFFFFF'+LineEnding+ 'BackColor=000000FF'+LineEnding+ 'PenWidth=1'); + + FComputed := false; + FComputedImage := nil; end; procedure TFCustomBlur.FormDestroy(Sender: TObject); begin subConfig.Free; FreeAndNil(FBrowseImages); - if FComputedImage <> nil then FreeAndNil(FComputedImage); + FreeAndNil(FComputedImage); end; procedure TFCustomBlur.FormShow(Sender: TObject); @@ -130,6 +135,18 @@ procedure TFCustomBlur.Timer1Timer(Sender: TObject); Timer1.Enabled:= true; end; +procedure TFCustomBlur.DisplayComputedImage; +begin + if FComputedImage <> nil then + FFilterConnector.PutImage(FComputedImage, false, false); +end; + +procedure TFCustomBlur.StoreComputedImage; +begin + if FComputed and (FComputedImage = nil) then + FComputedImage := FFilterConnector.ActiveLayer.Duplicate; +end; + procedure TFCustomBlur.GenerateDefaultMask; var bmp: TBitmap; defaultMask: TBGRABitmap; @@ -283,8 +300,7 @@ procedure TFCustomBlur.Button_EditMaskClick(Sender: TObject); procedure TFCustomBlur.Button_OKClick(Sender: TObject); begin - if not CheckBox_Preview.Checked and - (FComputedImage <> nil) then FFilterConnector.PutImage(FComputedImage,false,false); + if not CheckBox_Preview.Checked then DisplayComputedImage; if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction; ModalResult := mrOK; @@ -294,9 +310,12 @@ procedure TFCustomBlur.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - FFilterConnector.PutImage(FComputedImage, false, false) + DisplayComputedImage else + begin + StoreComputedImage; FFilterConnector.RestoreBackup; + end; end; procedure TFCustomBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean); From c278e3eb10604cf5fec73208c963d975b5d69776 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 15 Sep 2023 11:11:39 +0200 Subject: [PATCH 14/70] refactor, store computed image only when preview is unchecked --- lazpaint/dialog/filter/umotionblur.pas | 39 ++++++++++++++++++-------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/lazpaint/dialog/filter/umotionblur.pas b/lazpaint/dialog/filter/umotionblur.pas index 42c3071a..8ac07bd9 100644 --- a/lazpaint/dialog/filter/umotionblur.pas +++ b/lazpaint/dialog/filter/umotionblur.pas @@ -51,12 +51,14 @@ TFMotionBlur = class(TForm) InPaintBoxMouseMove: boolean; PaintBoxMouseMovePos: TPoint; FQuitQuery, - FInitializing: boolean; + FInitializing, FComputed: boolean; FComputedImage: TBGRABitmap; procedure UpdateStep; procedure ComputeAngle(X,Y: integer); procedure InitParams; + procedure DisplayComputedImage; procedure PreviewNeeded; + procedure StoreComputedImage; procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent); end; @@ -200,6 +202,12 @@ procedure TFMotionBlur.InitParams; FInitializing := false; end; +procedure TFMotionBlur.DisplayComputedImage; +begin + if FComputedImage <> nil then + FFilterConnector.PutImage(FComputedImage, false, false); +end; + procedure TFMotionBlur.PreviewNeeded; begin FThreadManager.WantPreview(CreateMotionBlurTask(FFilterConnector.BackupLayer, @@ -207,6 +215,12 @@ procedure TFMotionBlur.PreviewNeeded; Checkbox_Oriented.Checked)); end; +procedure TFMotionBlur.StoreComputedImage; +begin + if FComputed and (FComputedImage = nil) then + FComputedImage := FFilterConnector.ActiveLayer.Duplicate; +end; + procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent ); begin @@ -220,13 +234,8 @@ procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent if AEvent = tmeCompletedTask then begin Button_OK.Enabled := true; CheckBox_Preview.Enabled := true; + FComputed := true; end; - - if FComputedImage <> nil then FComputedImage.Free; - case AEvent of - tmeAbortedTask: FComputedImage := FFilterConnector.BackupLayer.Duplicate; - tmeCompletedTask: FComputedImage := FFilterConnector.ActiveLayer.Duplicate; - end; end; tmeStartingNewTask: begin @@ -238,6 +247,7 @@ procedure TFMotionBlur.OnTaskEvent(ASender: TObject; AEvent: TThreadManagerEvent FInitializing := True; CheckBox_Preview.Enabled := false; CheckBox_Preview.Checked := True; + FreeAndNil(FComputedImage); FInitializing := False; end; end; @@ -251,11 +261,14 @@ procedure TFMotionBlur.FormCreate(Sender: TObject); CheckOKCancelBtns(Button_OK{,Button_Cancel}); CheckFloatSpinEdit(SpinEdit_Distance); SpinEdit_Distance.Constraints.MinWidth := DoScaleX(70, OriginalDPI); + + FComputed := false; + FComputedImage := nil; end; procedure TFMotionBlur.FormDestroy(Sender: TObject); begin - if FComputedImage <> nil then FreeAndNil(FComputedImage); + FreeAndNil(FComputedImage); end; procedure TFMotionBlur.FormShow(Sender: TObject); @@ -293,8 +306,7 @@ procedure TFMotionBlur.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; procedure TFMotionBlur.Button_OKClick(Sender: TObject); begin - if not CheckBox_Preview.Checked and - (FComputedImage <> nil) then FFilterConnector.PutImage(FComputedImage,false,false); + if not CheckBox_Preview.Checked then DisplayComputedImage; if not FFilterConnector.ActionDone then begin @@ -316,9 +328,12 @@ procedure TFMotionBlur.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - FFilterConnector.PutImage(FComputedImage, false, false) + DisplayComputedImage else - FFilterConnector.RestoreBackup; + begin + StoreComputedImage; + FFilterConnector.RestoreBackup; + end; end; procedure TFMotionBlur.FormCloseQuery(Sender: TObject; var CanClose: boolean); From 9578fd13bfd377b3d4dd234c0951240c02e883b8 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 15 Sep 2023 11:12:08 +0200 Subject: [PATCH 15/70] refactor: avoid duplicate code --- lazpaint/dialog/filter/utwirl.pas | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lazpaint/dialog/filter/utwirl.pas b/lazpaint/dialog/filter/utwirl.pas index 65f48bf9..7ffd1881 100644 --- a/lazpaint/dialog/filter/utwirl.pas +++ b/lazpaint/dialog/filter/utwirl.pas @@ -46,6 +46,7 @@ TFTwirl = class(TForm) FComputedImage: TBGRABitmap; procedure InitParams; procedure PreviewNeeded; + procedure DisplayComputedImage; function ComputeFilteredLayer: TBGRABitmap; public FilterConnector: TFilterConnector; @@ -158,8 +159,7 @@ procedure TFTwirl.Timer1Timer(Sender: TObject); Timer1.Enabled := false; if FComputedImage <> nil then FComputedImage.Free; FComputedImage := ComputeFilteredLayer; - if CheckBox_Preview.Checked then - FilterConnector.PutImage(FComputedImage,False,False); + if CheckBox_Preview.Checked then DisplayComputedImage; Button_OK.Enabled := true; CheckBox_Preview.Enabled := true; end; @@ -195,6 +195,11 @@ procedure TFTwirl.PreviewNeeded; CheckBox_Preview.Enabled := false; end; +procedure TFTwirl.DisplayComputedImage; +begin + FilterConnector.PutImage(FComputedImage,False,False); +end; + function TFTwirl.ComputeFilteredLayer: TBGRABitmap; begin result := FilterConnector.BackupLayer.FilterTwirl(FilterConnector.WorkArea, Point(round(FCenter.X*FilterConnector.ActiveLayer.Width),round(FCenter.Y*FilterConnector.ActiveLayer.Height)), @@ -203,7 +208,7 @@ function TFTwirl.ComputeFilteredLayer: TBGRABitmap; procedure TFTwirl.Button_OKClick(Sender: TObject); begin - if not CheckBox_Preview.Checked then FilterConnector.PutImage(FComputedImage,false,false); + if not CheckBox_Preview.Checked then DisplayComputedImage; FilterConnector.ValidateAction; FilterConnector.LazPaintInstance.Config.SetDefaultTwirlRadius(SpinEdit_Radius.Value); @@ -215,9 +220,9 @@ procedure TFTwirl.CheckBox_PreviewChange(Sender: TObject); begin if FInitializing then exit; if CheckBox_Preview.Checked then - FilterConnector.PutImage(FComputedImage,False,False) + DisplayComputedImage else - FilterConnector.RestoreBackup; + FilterConnector.RestoreBackup; end; {$R *.lfm} From e3b42826c593a2779ae12476e01b6450b74b617d Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:36:19 +0200 Subject: [PATCH 16/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/ucustomblur.lfm | 3 ++- lazpaint/dialog/filter/ucustomblur.lrj | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lazpaint/dialog/filter/ucustomblur.lfm b/lazpaint/dialog/filter/ucustomblur.lfm index 24ade2e7..fd11cfef 100644 --- a/lazpaint/dialog/filter/ucustomblur.lfm +++ b/lazpaint/dialog/filter/ucustomblur.lfm @@ -66,7 +66,8 @@ object FCustomBlur: TFCustomBlur Left = 8 Height = 19 Top = 264 - Width = 20 + Width = 70 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/ucustomblur.lrj b/lazpaint/dialog/filter/ucustomblur.lrj index 076065f0..d8e7b511 100644 --- a/lazpaint/dialog/filter/ucustomblur.lrj +++ b/lazpaint/dialog/filter/ucustomblur.lrj @@ -4,5 +4,6 @@ {"hash":127421996,"name":"tfcustomblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, {"hash":113031038,"name":"tfcustomblur.button_loadmask.caption","sourcebytes":[76,111,97,100,32,109,97,115,107,46,46,46],"value":"Load mask..."}, {"hash":120776574,"name":"tfcustomblur.button_editmask.caption","sourcebytes":[69,100,105,116,32,109,97,115,107,46,46,46],"value":"Edit mask..."}, +{"hash":126662215,"name":"tfcustomblur.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":210391541,"name":"tfcustomblur.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,103,114,97,121,115,99,97,108,101,32,102,105,108,101],"value":"Open grayscale file"} ]} From 0358210f148a7f532621ccb20d877eb4e7dd2459 Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:37:29 +0200 Subject: [PATCH 17/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/uemboss.lfm | 1 + lazpaint/dialog/filter/uemboss.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/uemboss.lfm b/lazpaint/dialog/filter/uemboss.lfm index 11446562..14e3fe7a 100644 --- a/lazpaint/dialog/filter/uemboss.lfm +++ b/lazpaint/dialog/filter/uemboss.lfm @@ -85,6 +85,7 @@ object FEmboss: TFEmboss Height = 19 Top = 231 Width = 130 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/uemboss.lrj b/lazpaint/dialog/filter/uemboss.lrj index 98d3069a..ce8416e5 100644 --- a/lazpaint/dialog/filter/uemboss.lrj +++ b/lazpaint/dialog/filter/uemboss.lrj @@ -3,6 +3,7 @@ {"hash":182806666,"name":"tfemboss.label_direction.caption","sourcebytes":[68,105,114,101,99,116,105,111,110,32,58],"value":"Direction :"}, {"hash":171115524,"name":"tfemboss.checkbox_transparent.caption","sourcebytes":[84,114,97,110,115,112,97,114,101,110,116],"value":"Transparent"}, {"hash":169540963,"name":"tfemboss.checkbox_preservecolors.caption","sourcebytes":[80,114,101,115,101,114,118,101,32,99,111,108,111,114,115],"value":"Preserve colors"}, +{"hash":126662215,"name":"tfemboss.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tfemboss.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tfemboss.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From 7eba359fb5157a88f1a0c7be3d8ad7e6bcdc135b Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:37:48 +0200 Subject: [PATCH 18/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/umotionblur.lfm | 1 + lazpaint/dialog/filter/umotionblur.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/umotionblur.lfm b/lazpaint/dialog/filter/umotionblur.lfm index 1ca10d75..71c71d54 100644 --- a/lazpaint/dialog/filter/umotionblur.lfm +++ b/lazpaint/dialog/filter/umotionblur.lfm @@ -83,6 +83,7 @@ object FMotionBlur: TFMotionBlur Height = 19 Top = 179 Width = 130 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/umotionblur.lrj b/lazpaint/dialog/filter/umotionblur.lrj index 64b76afa..26352a20 100644 --- a/lazpaint/dialog/filter/umotionblur.lrj +++ b/lazpaint/dialog/filter/umotionblur.lrj @@ -2,6 +2,7 @@ {"hash":106100930,"name":"tfmotionblur.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114],"value":"Motion blur"}, {"hash":176170906,"name":"tfmotionblur.label_distance.caption","sourcebytes":[68,105,115,116,97,110,99,101,32,58],"value":"Distance :"}, {"hash":150757332,"name":"tfmotionblur.checkbox_oriented.caption","sourcebytes":[79,114,105,101,110,116,101,100],"value":"Oriented"}, +{"hash":126662215,"name":"tfmotionblur.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tfmotionblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tfmotionblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From 147401c21024ba672af678958c33ae01a227d4d7 Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:38:05 +0200 Subject: [PATCH 19/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/unoisefilter.lfm | 1 + lazpaint/dialog/filter/unoisefilter.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/unoisefilter.lfm b/lazpaint/dialog/filter/unoisefilter.lfm index cf0ad5f9..d0ac0c5d 100644 --- a/lazpaint/dialog/filter/unoisefilter.lfm +++ b/lazpaint/dialog/filter/unoisefilter.lfm @@ -94,6 +94,7 @@ object FNoiseFilter: TFNoiseFilter Height = 19 Top = 85 Width = 130 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/unoisefilter.lrj b/lazpaint/dialog/filter/unoisefilter.lrj index 4b39c326..f1dacfbc 100644 --- a/lazpaint/dialog/filter/unoisefilter.lrj +++ b/lazpaint/dialog/filter/unoisefilter.lrj @@ -3,6 +3,7 @@ {"hash":243178037,"name":"tfnoisefilter.radio_grayscalenoise.caption","sourcebytes":[71,114,97,121,115,99,97,108,101,32,110,111,105,115,101],"value":"Grayscale noise"}, {"hash":74782245,"name":"tfnoisefilter.radio_rgbnoise.caption","sourcebytes":[82,71,66,32,110,111,105,115,101],"value":"RGB noise"}, {"hash":108662442,"name":"tfnoisefilter.label_opacity.caption","sourcebytes":[79,112,97,99,105,116,121,58],"value":"Opacity:"}, +{"hash":126662215,"name":"tfnoisefilter.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tfnoisefilter.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tfnoisefilter.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From d73b45f5b8387fae5a5050710039b087fcc7e5f7 Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:38:28 +0200 Subject: [PATCH 20/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/uphongfilter.lfm | 3 ++- lazpaint/dialog/filter/uphongfilter.lrj | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lazpaint/dialog/filter/uphongfilter.lfm b/lazpaint/dialog/filter/uphongfilter.lfm index 26179d8d..b644c45b 100644 --- a/lazpaint/dialog/filter/uphongfilter.lfm +++ b/lazpaint/dialog/filter/uphongfilter.lfm @@ -197,7 +197,8 @@ object FPhongFilter: TFPhongFilter Left = 14 Height = 19 Top = 160 - Width = 20 + Width = 70 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/uphongfilter.lrj b/lazpaint/dialog/filter/uphongfilter.lrj index 11574239..aeaa974a 100644 --- a/lazpaint/dialog/filter/uphongfilter.lrj +++ b/lazpaint/dialog/filter/uphongfilter.lrj @@ -16,5 +16,6 @@ {"hash":234561107,"name":"tfphongfilter.radio_maplightness.caption","sourcebytes":[76,105,103,104,116,110,101,115,115],"value":"Lightness"}, {"hash":71,"name":"tfphongfilter.radio_mapgreen.caption","sourcebytes":[71],"value":"G"}, {"hash":66,"name":"tfphongfilter.radio_mapblue.caption","sourcebytes":[66],"value":"B"}, -{"hash":108801555,"name":"tfphongfilter.radio_maplinearlightness.caption","sourcebytes":[76,105,110,101,97,114,32,108,105,103,104,116,110,101,115,115],"value":"Linear lightness"} +{"hash":108801555,"name":"tfphongfilter.radio_maplinearlightness.caption","sourcebytes":[76,105,110,101,97,114,32,108,105,103,104,116,110,101,115,115],"value":"Linear lightness"}, +{"hash":126662215,"name":"tfphongfilter.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"} ]} From 11bf0ceb03678cd039f9b9a33b8cc5b9e41e549a Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:38:58 +0200 Subject: [PATCH 21/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/uposterize.lfm | 1 + lazpaint/dialog/filter/uposterize.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/uposterize.lfm b/lazpaint/dialog/filter/uposterize.lfm index ac058523..7dd5460b 100644 --- a/lazpaint/dialog/filter/uposterize.lfm +++ b/lazpaint/dialog/filter/uposterize.lfm @@ -67,6 +67,7 @@ object FPosterize: TFPosterize Height = 19 Top = 66 Width = 130 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/uposterize.lrj b/lazpaint/dialog/filter/uposterize.lrj index d9947c08..aecaff55 100644 --- a/lazpaint/dialog/filter/uposterize.lrj +++ b/lazpaint/dialog/filter/uposterize.lrj @@ -2,6 +2,7 @@ {"hash":179103845,"name":"tfposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101],"value":"Posterize"}, {"hash":214708250,"name":"tfposterize.label_levels.caption","sourcebytes":[76,101,118,101,108,115,32,58],"value":"Levels :"}, {"hash":157433427,"name":"tfposterize.checkbox_bylightness.caption","sourcebytes":[66,121,32,108,105,103,104,116,110,101,115,115],"value":"By lightness"}, +{"hash":126662215,"name":"tfposterize.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tfposterize.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tfposterize.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From 2059f89142c12d7707952197da766054937fb2c1 Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:39:15 +0200 Subject: [PATCH 22/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/uradialblur.lfm | 1 + lazpaint/dialog/filter/uradialblur.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/uradialblur.lfm b/lazpaint/dialog/filter/uradialblur.lfm index da9309fb..c8785681 100644 --- a/lazpaint/dialog/filter/uradialblur.lfm +++ b/lazpaint/dialog/filter/uradialblur.lfm @@ -62,6 +62,7 @@ object FRadialBlur: TFRadialBlur Height = 19 Top = 39 Width = 130 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/uradialblur.lrj b/lazpaint/dialog/filter/uradialblur.lrj index 8477de89..dd2001dd 100644 --- a/lazpaint/dialog/filter/uradialblur.lrj +++ b/lazpaint/dialog/filter/uradialblur.lrj @@ -1,6 +1,7 @@ {"version":1,"strings":[ {"hash":129960242,"name":"tfradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"}, {"hash":129024186,"name":"tfradialblur.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"}, +{"hash":126662215,"name":"tfradialblur.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tfradialblur.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tfradialblur.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From 8dc53daa81fff9ed9febf96103c3bd6633f98915 Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:39:40 +0200 Subject: [PATCH 23/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/usharpen.lfm | 1 + lazpaint/dialog/filter/usharpen.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/usharpen.lfm b/lazpaint/dialog/filter/usharpen.lfm index a9cb6b74..17249c6c 100644 --- a/lazpaint/dialog/filter/usharpen.lfm +++ b/lazpaint/dialog/filter/usharpen.lfm @@ -59,6 +59,7 @@ object FSharpen: TFSharpen Height = 19 Top = 39 Width = 130 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/usharpen.lrj b/lazpaint/dialog/filter/usharpen.lrj index f8358d7e..aad2fc18 100644 --- a/lazpaint/dialog/filter/usharpen.lrj +++ b/lazpaint/dialog/filter/usharpen.lrj @@ -1,6 +1,7 @@ {"version":1,"strings":[ {"hash":170608904,"name":"tfsharpen.caption","sourcebytes":[83,104,97,114,112,101,110,47,83,109,111,111,116,104],"value":"Sharpen/Smooth"}, {"hash":74207930,"name":"tfsharpen.label_amount.caption","sourcebytes":[65,109,111,117,110,116,32,58],"value":"Amount :"}, +{"hash":126662215,"name":"tfsharpen.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tfsharpen.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tfsharpen.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From f66922a26c81c2ca010e0e79cd1bbd0ba6057bdf Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:39:57 +0200 Subject: [PATCH 24/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/utwirl.lfm | 1 + lazpaint/dialog/filter/utwirl.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/utwirl.lfm b/lazpaint/dialog/filter/utwirl.lfm index 4b07b922..dcb84247 100644 --- a/lazpaint/dialog/filter/utwirl.lfm +++ b/lazpaint/dialog/filter/utwirl.lfm @@ -105,6 +105,7 @@ object FTwirl: TFTwirl Height = 19 Top = 183 Width = 130 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/utwirl.lrj b/lazpaint/dialog/filter/utwirl.lrj index b89c5ce0..46dc6140 100644 --- a/lazpaint/dialog/filter/utwirl.lrj +++ b/lazpaint/dialog/filter/utwirl.lrj @@ -2,6 +2,7 @@ {"hash":6021260,"name":"tftwirl.caption","sourcebytes":[84,119,105,114,108],"value":"Twirl"}, {"hash":129024186,"name":"tftwirl.label_radius.caption","sourcebytes":[82,97,100,105,117,115,32,58],"value":"Radius :"}, {"hash":139339642,"name":"tftwirl.label_angle.caption","sourcebytes":[65,110,103,108,101,32,58],"value":"Angle :"}, +{"hash":126662215,"name":"tftwirl.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tftwirl.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tftwirl.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From e20ca767fc476716b8741af45402c6c3789f135c Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 18 Sep 2023 14:40:22 +0200 Subject: [PATCH 25/70] Add missing caption on preview checkbox --- lazpaint/dialog/filter/uwavedisplacement.lfm | 1 + lazpaint/dialog/filter/uwavedisplacement.lrj | 1 + 2 files changed, 2 insertions(+) diff --git a/lazpaint/dialog/filter/uwavedisplacement.lfm b/lazpaint/dialog/filter/uwavedisplacement.lfm index fc172c66..60faa49f 100644 --- a/lazpaint/dialog/filter/uwavedisplacement.lfm +++ b/lazpaint/dialog/filter/uwavedisplacement.lfm @@ -128,6 +128,7 @@ object FWaveDisplacement: TFWaveDisplacement Height = 19 Top = 214 Width = 151 + Caption = 'rsPreview' Checked = True OnChange = CheckBox_PreviewChange State = cbChecked diff --git a/lazpaint/dialog/filter/uwavedisplacement.lrj b/lazpaint/dialog/filter/uwavedisplacement.lrj index cefd95b7..f063aa1e 100644 --- a/lazpaint/dialog/filter/uwavedisplacement.lrj +++ b/lazpaint/dialog/filter/uwavedisplacement.lrj @@ -3,6 +3,7 @@ {"hash":261514778,"name":"tfwavedisplacement.label_wavelength.caption","sourcebytes":[87,97,118,101,108,101,110,103,116,104,32,58],"value":"Wavelength :"}, {"hash":211645722,"name":"tfwavedisplacement.label_displacement.caption","sourcebytes":[68,105,115,112,108,97,99,101,109,101,110,116,32,58],"value":"Displacement :"}, {"hash":115906410,"name":"tfwavedisplacement.label_phase.caption","sourcebytes":[80,104,97,115,101,32,58],"value":"Phase :"}, +{"hash":126662215,"name":"tfwavedisplacement.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"}, {"hash":497723,"name":"tfwavedisplacement.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, {"hash":127421996,"name":"tfwavedisplacement.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} From 911e0f6447401923e3e9cee0ea5a8e96493a3118 Mon Sep 17 00:00:00 2001 From: Lulu Date: Tue, 19 Sep 2023 09:56:24 +0200 Subject: [PATCH 26/70] Add preview functionality to dialog Shift Colors --- lazpaint/dialog/color/ushiftcolors.lfm | 234 +++++++++++++------------ lazpaint/dialog/color/ushiftcolors.lrj | 7 +- lazpaint/dialog/color/ushiftcolors.pas | 66 ++++++- 3 files changed, 185 insertions(+), 122 deletions(-) diff --git a/lazpaint/dialog/color/ushiftcolors.lfm b/lazpaint/dialog/color/ushiftcolors.lfm index 73dd6582..83b68a07 100644 --- a/lazpaint/dialog/color/ushiftcolors.lfm +++ b/lazpaint/dialog/color/ushiftcolors.lfm @@ -1,113 +1,121 @@ -object FShiftColors: TFShiftColors - Left = 509 - Height = 141 - Top = 150 - Width = 490 - BorderIcons = [biSystemMenu] - BorderStyle = bsDialog - Caption = 'Shift colors' - ClientHeight = 141 - ClientWidth = 490 - Font.Height = -12 - OnCreate = FormCreate - OnShow = FormShow - Position = poOwnerFormCenter - LCLVersion = '1.2.4.0' - object Label1: TLabel - Left = 8 - Height = 15 - Top = 10 - Width = 24 - Caption = 'Hue' - ParentColor = False - end - object Label2: TLabel - Left = 8 - Height = 15 - Top = 48 - Width = 63 - Caption = 'Saturation' - ParentColor = False - end - object TrackBar_Hue: TTrackBar - Left = 70 - Height = 35 - Top = 5 - Width = 328 - OnChange = TrackBar_Change - Position = 0 - TabOrder = 0 - end - object TrackBar_Saturation: TTrackBar - Left = 70 - Height = 35 - Top = 44 - Width = 328 - OnChange = TrackBar_Change - Position = 0 - TabOrder = 1 - end - object Button_OK: TButton - Left = 163 - Height = 22 - Top = 110 - Width = 59 - Caption = 'OK' - Default = True - ModalResult = 1 - OnClick = Button_OKClick - TabOrder = 2 - end - object Button_Cancel: TButton - Left = 227 - Height = 22 - Top = 110 - Width = 72 - Cancel = True - Caption = 'Cancel' - ModalResult = 2 - TabOrder = 3 - end - object CheckBox_GSBA: TCheckBox - Left = 8 - Height = 22 - Top = 81 - Width = 195 - Caption = 'Corrected hue and lightness' - OnChange = CheckBox_GSBAChange - TabOrder = 4 - end - object FloatSpinEdit_Saturation: TFloatSpinEdit - Left = 408 - Height = 25 - Top = 43 - Width = 72 - DecimalPlaces = 3 - Increment = 1 - MaxValue = 2 - MinValue = -2 - OnChange = FloatSpinEdit_SaturationChange - TabOrder = 5 - Value = 0 - end - object FloatSpinEdit_Hue: TFloatSpinEdit - Left = 408 - Height = 25 - Top = 7 - Width = 72 - DecimalPlaces = 1 - Increment = 1 - MaxValue = 180 - MinValue = -180 - OnChange = FloatSpinEdit_HueChange - TabOrder = 6 - Value = 0 - end - object TimerDrawPendingRows: TTimer - Enabled = False - Interval = 10 - OnTimer = TimerDrawPendingRowsTimer - left = 362 - top = 80 - end -end \ No newline at end of file +object FShiftColors: TFShiftColors + Left = 509 + Height = 160 + Top = 150 + Width = 490 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'Shift colors' + ClientHeight = 160 + ClientWidth = 490 + Font.Height = -12 + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + Position = poOwnerFormCenter + LCLVersion = '2.2.4.0' + object Label1: TLabel + Left = 8 + Height = 15 + Top = 10 + Width = 22 + Caption = 'Hue' + ParentColor = False + end + object Label2: TLabel + Left = 8 + Height = 15 + Top = 48 + Width = 54 + Caption = 'Saturation' + ParentColor = False + end + object TrackBar_Hue: TTrackBar + Left = 70 + Height = 35 + Top = 5 + Width = 328 + OnChange = TrackBar_Change + Position = 0 + TabOrder = 0 + end + object TrackBar_Saturation: TTrackBar + Left = 70 + Height = 35 + Top = 44 + Width = 328 + OnChange = TrackBar_Change + Position = 0 + TabOrder = 1 + end + object Button_OK: TButton + Left = 168 + Height = 22 + Top = 128 + Width = 59 + Caption = 'rsOK' + Default = True + ModalResult = 1 + OnClick = Button_OKClick + TabOrder = 2 + end + object Button_Cancel: TButton + Left = 232 + Height = 22 + Top = 128 + Width = 72 + Cancel = True + Caption = 'rsCancel' + ModalResult = 2 + TabOrder = 3 + end + object CheckBox_GSBA: TCheckBox + Left = 8 + Height = 19 + Top = 81 + Width = 168 + Caption = 'Corrected hue and lightness' + OnChange = CheckBox_GSBAChange + TabOrder = 4 + end + object FloatSpinEdit_Saturation: TFloatSpinEdit + Left = 408 + Height = 23 + Top = 43 + Width = 72 + DecimalPlaces = 3 + MaxValue = 2 + MinValue = -2 + OnChange = FloatSpinEdit_SaturationChange + TabOrder = 5 + end + object FloatSpinEdit_Hue: TFloatSpinEdit + Left = 408 + Height = 23 + Top = 7 + Width = 72 + DecimalPlaces = 1 + MaxValue = 180 + MinValue = -180 + OnChange = FloatSpinEdit_HueChange + TabOrder = 6 + end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 109 + Width = 70 + Caption = 'rsPreview' + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 7 + end + object TimerDrawPendingRows: TTimer + Enabled = False + Interval = 10 + OnTimer = TimerDrawPendingRowsTimer + Left = 362 + Top = 80 + end +end diff --git a/lazpaint/dialog/color/ushiftcolors.lrj b/lazpaint/dialog/color/ushiftcolors.lrj index 78ba54dd..aa230d3e 100644 --- a/lazpaint/dialog/color/ushiftcolors.lrj +++ b/lazpaint/dialog/color/ushiftcolors.lrj @@ -2,7 +2,8 @@ {"hash":52227059,"name":"tfshiftcolors.caption","sourcebytes":[83,104,105,102,116,32,99,111,108,111,114,115],"value":"Shift colors"}, {"hash":20405,"name":"tfshiftcolors.label1.caption","sourcebytes":[72,117,101],"value":"Hue"}, {"hash":210581742,"name":"tfshiftcolors.label2.caption","sourcebytes":[83,97,116,117,114,97,116,105,111,110],"value":"Saturation"}, -{"hash":1339,"name":"tfshiftcolors.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfshiftcolors.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, -{"hash":72944099,"name":"tfshiftcolors.checkbox_gsba.caption","sourcebytes":[67,111,114,114,101,99,116,101,100,32,104,117,101,32,97,110,100,32,108,105,103,104,116,110,101,115,115],"value":"Corrected hue and lightness"} +{"hash":497723,"name":"tfshiftcolors.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfshiftcolors.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, +{"hash":72944099,"name":"tfshiftcolors.checkbox_gsba.caption","sourcebytes":[67,111,114,114,101,99,116,101,100,32,104,117,101,32,97,110,100,32,108,105,103,104,116,110,101,115,115],"value":"Corrected hue and lightness"}, +{"hash":126662215,"name":"tfshiftcolors.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"} ]} diff --git a/lazpaint/dialog/color/ushiftcolors.pas b/lazpaint/dialog/color/ushiftcolors.pas index 81ac892b..32cedd9a 100644 --- a/lazpaint/dialog/color/ushiftcolors.pas +++ b/lazpaint/dialog/color/ushiftcolors.pas @@ -18,6 +18,7 @@ TFShiftColors = class(TForm) Button_Cancel: TButton; Button_OK: TButton; CheckBox_GSBA: TCheckBox; + CheckBox_Preview: TCheckBox; FloatSpinEdit_Hue: TFloatSpinEdit; FloatSpinEdit_Saturation: TFloatSpinEdit; Label1: TLabel; @@ -27,9 +28,11 @@ TFShiftColors = class(TForm) TrackBar_Saturation: TTrackBar; procedure Button_OKClick(Sender: TObject); procedure CheckBox_GSBAChange(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FloatSpinEdit_HueChange(Sender: TObject); procedure FloatSpinEdit_SaturationChange(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); procedure TimerDrawPendingRowsTimer(Sender: TObject); procedure TrackBar_Change(Sender: TObject); @@ -41,6 +44,7 @@ TFShiftColors = class(TForm) FUpdatingSpinEdit: boolean; FOddRows: boolean; FPendingRows: boolean; + FComputedImage: TBGRABitmap; function GetChosenHueShiftF: single; function GetChosenSatShiftF: single; procedure SetChosenHueShiftF(AValue: single); @@ -51,7 +55,9 @@ TFShiftColors = class(TForm) procedure SetChosenHueShift(AValue: integer); procedure LoadParameters; procedure HalfApplyChosenShift; - procedure ParametersChanged; + procedure PreviewNeeded; + procedure DisplayComputedImage; + procedure StoreComputedImage; public { public declarations } function ShowModal: integer; override; @@ -85,6 +91,11 @@ procedure TFShiftColors.FormCreate(Sender: TObject); UpdateSpinEdit; end; +procedure TFShiftColors.FormDestroy(Sender: TObject); +begin + FreeAndNil(FComputedImage); +end; + procedure TFShiftColors.FormShow(Sender: TObject); begin LoadParameters; @@ -103,6 +114,7 @@ procedure TFShiftColors.TimerDrawPendingRowsTimer(Sender: TObject); FPendingRows:= false; end; Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; end; procedure TFShiftColors.TrackBar_Change(Sender: TObject); @@ -110,7 +122,7 @@ procedure TFShiftColors.TrackBar_Change(Sender: TObject); if FInitialized then begin UpdateSpinEdit; - ParametersChanged; + PreviewNeeded; end; end; @@ -174,6 +186,14 @@ procedure TFShiftColors.LoadParameters; if FFilterConnector.Parameters.IsDefined('Correction') then CheckBox_GSBA.Checked := FFilterConnector.Parameters.Booleans['Correction']; UpdateSpinEdit; + + FreeAndNil(FComputedImage); + Button_OK.Caption := rsOK; + Button_OK.Enabled := True; + Button_Cancel.Caption := rsCancel; + CheckBox_Preview.Caption := rsPreview; + CheckBox_Preview.Checked := True; + CheckBox_Preview.Enabled := True; FInitialized := OldInitialized; end; end; @@ -256,7 +276,11 @@ function TFShiftColors.ShowModal(AInstance: TLazPaintCustomInstance; AParameters procedure TFShiftColors.Button_OKClick(Sender: TObject); begin Button_OK.Enabled := false; - if FPendingRows then + CheckBox_Preview.Enabled := false; + + if not CheckBox_Preview.Checked then + DisplayComputedImage + else if FPendingRows then begin HalfApplyChosenShift; FPendingRows := false; @@ -269,7 +293,18 @@ procedure TFShiftColors.Button_OKClick(Sender: TObject); procedure TFShiftColors.CheckBox_GSBAChange(Sender: TObject); begin - if FInitialized and Visible then ParametersChanged; + if FInitialized and Visible then PreviewNeeded; +end; + +procedure TFShiftColors.CheckBox_PreviewChange(Sender: TObject); +begin + if not FInitialized then exit; + if CheckBox_Preview.Checked then + DisplayComputedImage + else begin + StoreComputedImage; + FFilterConnector.RestoreBackup; + end; end; procedure TFShiftColors.FloatSpinEdit_HueChange(Sender: TObject); @@ -294,14 +329,33 @@ procedure TFShiftColors.HalfApplyChosenShift; FOddRows:= not FOddRows; end; -procedure TFShiftColors.ParametersChanged; +procedure TFShiftColors.PreviewNeeded; begin Button_OK.Enabled := false; + + FInitialized := false; + CheckBox_Preview.Enabled := false; + CheckBox_Preview.Checked := true; + FInitialized := true; + FreeAndNil(FComputedImage); + HalfApplyChosenShift; - FPendingRows:= true; + FPendingRows := true; TimerDrawPendingRows.Enabled := true; end; +procedure TFShiftColors.DisplayComputedImage; +begin + if FComputedImage <> nil then + FFilterConnector.PutImage(FComputedImage, false, false); +end; + +procedure TFShiftColors.StoreComputedImage; +begin + if not FPendingRows and (FComputedImage = nil) then + FComputedImage := FFilterConnector.ActiveLayer.Duplicate; +end; + {$R *.lfm} end. From a956acc5d2edde94ae88bea056729f698e95eb97 Mon Sep 17 00:00:00 2001 From: Lulu Date: Tue, 19 Sep 2023 10:00:09 +0200 Subject: [PATCH 27/70] suppression of translation according to changes in the Shift Colors dialog --- lazpaint/release/bin/i18n/lazpaint.ar.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.bg.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.cs.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.de.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.es.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fi.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fr.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.it.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.ja.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.kab.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.lv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.nl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pot | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 11 ----------- lazpaint/release/bin/i18n/lazpaint.ru.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.sv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 10 ---------- 18 files changed, 181 deletions(-) diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index 4b05acba..d06ce0ee 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -2605,16 +2605,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "القدر :" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index 8baf429f..aafef752 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -2593,16 +2593,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION" msgid "Amount :" msgstr "Количество: " -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfshiftcolors.caption msgctxt "TFSHIFTCOLORS.CAPTION" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index 6bb05a68..1c877d4b 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -2452,16 +2452,6 @@ msgstr "Ostření/Vyhlazení" msgid "Amount :" msgstr "Množství :" -#: tfshiftcolors.button_cancel.caption -msgctxt "tfshiftcolors.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfshiftcolors.button_ok.caption -msgctxt "tfshiftcolors.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgid "Shift colors" msgstr "Posunout barvy" diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index d5347d01..a13c1589 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -2616,16 +2616,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Wert:" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index 85bfcf8c..91bdb20d 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -2598,16 +2598,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Cantidad:" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index 4372d221..cc150003 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -2598,16 +2598,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION" msgid "Amount :" msgstr "" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfshiftcolors.caption msgctxt "TFSHIFTCOLORS.CAPTION" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index b9160302..c54d9f27 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -2609,16 +2609,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Quantité :" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po index 8346ea5e..764e9ae5 100644 --- a/lazpaint/release/bin/i18n/lazpaint.it.po +++ b/lazpaint/release/bin/i18n/lazpaint.it.po @@ -2594,16 +2594,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po index b5389b29..8c9f2b16 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ja.po +++ b/lazpaint/release/bin/i18n/lazpaint.ja.po @@ -2603,16 +2603,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po index 8b09984a..d64561a4 100644 --- a/lazpaint/release/bin/i18n/lazpaint.kab.po +++ b/lazpaint/release/bin/i18n/lazpaint.kab.po @@ -2607,16 +2607,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Tasmekta :" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po index ddb84248..3ff3f4c0 100644 --- a/lazpaint/release/bin/i18n/lazpaint.lv.po +++ b/lazpaint/release/bin/i18n/lazpaint.lv.po @@ -2611,16 +2611,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Stiprums:" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po index 2c839022..27ec0f8f 100644 --- a/lazpaint/release/bin/i18n/lazpaint.nl.po +++ b/lazpaint/release/bin/i18n/lazpaint.nl.po @@ -2604,16 +2604,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Hoeveelheid :" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po index 7d34ce67..77c191fd 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pl.po +++ b/lazpaint/release/bin/i18n/lazpaint.pl.po @@ -2616,16 +2616,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Siła:" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot index 816ef649..8d92393b 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pot +++ b/lazpaint/release/bin/i18n/lazpaint.pot @@ -2441,16 +2441,6 @@ msgstr "" msgid "Amount :" msgstr "" -#: tfshiftcolors.button_cancel.caption -msgctxt "tfshiftcolors.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfshiftcolors.button_ok.caption -msgctxt "tfshiftcolors.button_ok.caption" -msgid "OK" -msgstr "" - #: tfshiftcolors.caption msgid "Shift colors" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po index 24b1626c..93b42428 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po +++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po @@ -2609,17 +2609,6 @@ msgctxt "TFSHARPEN.LABEL_AMOUNT.CAPTION" msgid "Amount :" msgstr "Quantidade :" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfshiftcolors.button_ok.caption -#, fuzzy -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgctxt "TFSHIFTCOLORS.CAPTION" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po index d5d2a850..b7a7187a 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ru.po +++ b/lazpaint/release/bin/i18n/lazpaint.ru.po @@ -2591,16 +2591,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Эффект:" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po index c800f058..8499e214 100644 --- a/lazpaint/release/bin/i18n/lazpaint.sv.po +++ b/lazpaint/release/bin/i18n/lazpaint.sv.po @@ -2608,16 +2608,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "Mängd :" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po index acf5aa52..ac4aa8be 100644 --- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po +++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po @@ -2604,16 +2604,6 @@ msgctxt "tfsharpen.label_amount.caption" msgid "Amount :" msgstr "数量 :" -#: tfshiftcolors.button_cancel.caption -msgctxt "TFSHIFTCOLORS.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tfshiftcolors.button_ok.caption -msgctxt "TFSHIFTCOLORS.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfshiftcolors.caption msgctxt "tfshiftcolors.caption" msgid "Shift colors" From 5080981b647f6cabb65e05292f16eaefac82e8b6 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Tue, 19 Sep 2023 16:59:31 +0200 Subject: [PATCH 28/70] improve ability to handle group undo --- lazpaint/image/uimage.pas | 33 +++++++++++++++++++++++++++------ lazpaint/image/ustatetype.pas | 27 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/lazpaint/image/uimage.pas b/lazpaint/image/uimage.pas index 527ed4cc..be0d9595 100644 --- a/lazpaint/image/uimage.pas +++ b/lazpaint/image/uimage.pas @@ -156,8 +156,9 @@ TLazPaintImage = class function CanRedo: boolean; procedure Undo; procedure Redo; - procedure DoBegin; + function DoBegin: TComposedImageDifference; procedure DoEnd(out ADoFound: boolean; out ASomethingDone: boolean); + procedure DoEnd(var ACompose: TComposedImageDifference); procedure ClearUndo; procedure CompressUndo; function UsedMemory: int64; @@ -1170,9 +1171,10 @@ procedure TLazPaintImage.Redo; end; end; -procedure TLazPaintImage.DoBegin; +function TLazPaintImage.DoBegin: TComposedImageDifference; begin - AddUndo(TComposedImageDifference.Create(True)); + result := TComposedImageDifference.Create(True); + AddUndo(result); end; procedure TLazPaintImage.DoEnd(out ADoFound: boolean; out ASomethingDone: boolean); @@ -1189,14 +1191,16 @@ procedure TLazPaintImage.DoEnd(out ADoFound: boolean; out ASomethingDone: boolea curIndex := FUndoPos; curDiff := curGroup[curIndex]; if not ((curDiff is TComposedImageDifference) and - TComposedImageDifference(curDiff).Agglutinate) then + TComposedImageDifference(curDiff).Agglutinate and + not TComposedImageDifference(curDiff).LockAgglutinate) then exit; ADoFound:= true; ASomethingDone := true; repeat insideDiff := TComposedImageDifference(curDiff).GetLast; if (insideDiff <> nil) and (insideDiff is TComposedImageDifference) and - TComposedImageDifference(insideDiff).Agglutinate then + TComposedImageDifference(insideDiff).Agglutinate and + not TComposedImageDifference(insideDiff).LockAgglutinate then begin curGroup := TComposedImageDifference(curDiff); curIndex := curGroup.Count-1; @@ -1209,12 +1213,29 @@ procedure TLazPaintImage.DoEnd(out ADoFound: boolean; out ASomethingDone: boolea if TComposedImageDifference(curDiff).Count = 0 then begin curGroup.Delete(curIndex); - if curGroup = FUndoList then dec(FUndoPos); + if (curGroup = FUndoList) and (FUndoPos >= curIndex) then dec(FUndoPos); ASomethingDone := false; end; end; end; +procedure TLazPaintImage.DoEnd(var ACompose: TComposedImageDifference); +var + index: Integer; +begin + ACompose.StopAgglutinate; + if ACompose.Count = 0 then + begin + index := FUndoList.IndexOf(ACompose); + if index <> -1 then + begin + FUndoList.Delete(index); + if FUndoPos >= index then dec(FUndoPos); + ACompose := nil; + end; + end; +end; + procedure TLazPaintImage.ClearUndo; begin try diff --git a/lazpaint/image/ustatetype.pas b/lazpaint/image/ustatetype.pas index 8535ffea..f2b60b25 100644 --- a/lazpaint/image/ustatetype.pas +++ b/lazpaint/image/ustatetype.pas @@ -68,9 +68,12 @@ TComposedImageDifference = class(TCustomImageDifference) function GetCount: integer; function GetItem(AIndex: integer): TCustomImageDifference; function GetTotalCount: integer; + procedure SetLockAgglutinate(AValue: boolean); protected FDiffs: TImageDifferenceList; FAgglutinate: boolean; + FLockAgglutinate: boolean; // prevent stopping the agglutination to have a frame + // for subactions having their own stack of composed difference function GetIsIdentity: boolean; override; function GetImageDifferenceKind: TImageDifferenceKind; override; function GetChangingBounds: TRect; override; @@ -89,11 +92,13 @@ TComposedImageDifference = class(TCustomImageDifference) procedure Clear; procedure Delete(AIndex: integer); procedure DeleteFrom(AIndex: integer); + function IndexOf(ADiff: TCustomImageDifference): integer; function GetLast: TCustomImageDifference; function ToString: ansistring; override; property Count: integer read GetCount; property TotalCount: integer read GetTotalCount; property Agglutinate: boolean read FAgglutinate; + property LockAgglutinate: boolean read FLockAgglutinate write SetLockAgglutinate; property Item[AIndex: integer]: TCustomImageDifference read GetItem; default; end; @@ -223,6 +228,14 @@ function TComposedImageDifference.GetTotalCount: integer; inc(result, FDiffs[i].GetCost); end; +procedure TComposedImageDifference.SetLockAgglutinate(AValue: boolean); +begin + if FLockAgglutinate=AValue then Exit; + if AValue and not Agglutinate then + raise Exception.Create('Currently not agglutinating actions'); + FLockAgglutinate:=AValue; +end; + function TComposedImageDifference.GetIsIdentity: boolean; var i: Integer; @@ -290,8 +303,17 @@ procedure TComposedImageDifference.ReleaseDiffs; end; procedure TComposedImageDifference.StopAgglutinate; +var + last: TComposedImageDifference; begin FAgglutinate:= false; + if (FDiffs.Count > 0) and (FDiffs[FDiffs.Count-1] is TComposedImageDifference) then + begin + last := TComposedImageDifference(FDiffs[FDiffs.Count-1]); + last.StopAgglutinate; + if last.Count = 0 then + FDiffs.Delete(FDiffs.Count-1); + end; end; destructor TComposedImageDifference.Destroy; @@ -365,6 +387,11 @@ procedure TComposedImageDifference.DeleteFrom(AIndex: integer); Delete(i); end; +function TComposedImageDifference.IndexOf(ADiff: TCustomImageDifference): integer; +begin + result := FDiffs.IndexOf(ADiff); +end; + function TComposedImageDifference.GetLast: TCustomImageDifference; begin if Count = 0 then result := nil From 1215fd12dc92f73e98965bf0b09b180dd659674e Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Tue, 19 Sep 2023 16:59:49 +0200 Subject: [PATCH 29/70] fix add layer from owned original --- lazpaint/image/uimagediff.pas | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lazpaint/image/uimagediff.pas b/lazpaint/image/uimagediff.pas index 7b13853e..36260689 100644 --- a/lazpaint/image/uimagediff.pas +++ b/lazpaint/image/uimagediff.pas @@ -306,6 +306,7 @@ TAddLayerFromOwnedOriginalStateDifference = class(TCustomImageDifference) blendOp: TBlendOperation; opacity: byte; matrix: TAffineMatrix; + originalGuid: TGuid; function UsedMemory: int64; override; function TryCompress: boolean; override; procedure ApplyTo(AState: TState); override; @@ -1657,7 +1658,7 @@ procedure TAddLayerFromOwnedOriginalStateDifference.ApplyTo(AState: TState); with AState as TImageState do begin originalData.Position:= 0; - origIdx:= LayeredBitmap.AddOriginalFromStream(originalData); + origIdx:= LayeredBitmap.AddOriginalFromStream(originalData, originalGuid); idx := LayeredBitmap.AddLayerFromOriginal(LayeredBitmap.Original[origIdx].Guid, self.blendOp, self.opacity); LayeredBitmap.LayerUniqueId[idx] := self.layerId; LayeredBitmap.LayerName[idx] := name; @@ -1676,6 +1677,8 @@ procedure TAddLayerFromOwnedOriginalStateDifference.UnapplyTo(AState: TState); idx := LayeredBitmap.GetLayerIndexFromId(self.layerId); LayeredBitmap.RemoveLayer(idx); SelectedImageLayerIndex := LayeredBitmap.GetLayerIndexFromId(self.previousActiveLayerId); + idx := LayeredBitmap.IndexOfOriginal(originalGuid); + LayeredBitmap.DeleteOriginal(idx); end; end; @@ -1695,9 +1698,11 @@ constructor TAddLayerFromOwnedOriginalStateDifference.Create(ADestination: TStat self.name := AName; self.blendOp:= AblendOp; + self.opacity:= AOpacity; self.matrix := AMatrix; self.previousActiveLayerId := imgDest.LayeredBitmap.LayerUniqueId[imgDest.SelectedImageLayerIndex]; idx := imgDest.LayeredBitmap.AddLayerFromOwnedOriginal(AOriginal, ABlendOp, AOpacity); + originalGuid := AOriginal.Guid; imgDest.LayeredBitmap.LayerName[idx] := name; imgDest.LayeredBitmap.LayerOriginalMatrix[idx] := matrix; self.layerId := imgDest.LayeredBitmap.LayerUniqueId[idx]; From 2d4c1f2a79d0116ea2a02e4924c0b1c324de1096 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Tue, 19 Sep 2023 17:51:51 +0200 Subject: [PATCH 30/70] change points by range --- lazpaintcontrols/lcvectororiginal.pas | 1 + lazpaintcontrols/lcvectorpolyshapes.pas | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lazpaintcontrols/lcvectororiginal.pas b/lazpaintcontrols/lcvectororiginal.pas index d0f7b1ac..7b8c951c 100644 --- a/lazpaintcontrols/lcvectororiginal.pas +++ b/lazpaintcontrols/lcvectororiginal.pas @@ -2741,6 +2741,7 @@ function TVectorOriginal.InternalDeleteShapeRange(AStartIndex, ACount: integer): i: Integer; begin result := EmptyRectF; + if ACount = 0 then exit; if (AStartIndex < 0) or (AStartIndex+ACount > ShapeCount) then raise exception.Create(rsIndexOutOfBounds); for i := AStartIndex to AStartIndex+ACount-1 do diff --git a/lazpaintcontrols/lcvectorpolyshapes.pas b/lazpaintcontrols/lcvectorpolyshapes.pas index 4a483068..487a5a2c 100644 --- a/lazpaintcontrols/lcvectorpolyshapes.pas +++ b/lazpaintcontrols/lcvectorpolyshapes.pas @@ -112,6 +112,8 @@ TCustomPolypointShape = class(TVectorShape) constructor Create(AContainer: TVectorOriginal); override; procedure Clear; function AddPoint(const APoint: TPointF): integer; virtual; + procedure AddPointRange(const APoints: array of TPointF); + function GetPointRange: ArrayOfTPointF; function RemovePoint(AIndex: integer): boolean; procedure RemovePointRange(AFromIndex, AToIndexPlus1: integer); procedure InsertPoint(AIndex: integer; APoint: TPointF); @@ -616,6 +618,7 @@ function TCustomPolypointShape.GetCurve(AMatrix: TAffineMatrix): ArrayOfTPointF; i: Integer; m: TAffineMatrix; begin + result := nil; setlength(result, PointCount); m:= MatrixForPixelCentered(AMatrix); for i := 0 to PointCount-1 do @@ -916,6 +919,26 @@ function TCustomPolypointShape.AddPoint(const APoint: TPointF): integer; Points[result] := APoint; end; +procedure TCustomPolypointShape.AddPointRange(const APoints: array of TPointF); +var + i: Integer; +begin + BeginUpdate(TCustomPolypointShapeDiff); + for i := 0 to high(APoints) do + AddPoint(APoints[i]); + EndUpdate; +end; + +function TCustomPolypointShape.GetPointRange: ArrayOfTPointF; +var + i: Integer; +begin + result := nil; + SetLength(result, PointCount); + for i := 0 to PointCount-1 do + result[i] := Points[i]; +end; + function TCustomPolypointShape.RemovePoint(AIndex: integer): boolean; begin if (AIndex < 0) or (AIndex >= PointCount) then exit(false); From 5121b62dff8e15ee89acea2c3a461fc266ac8d82 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Tue, 19 Sep 2023 17:56:17 +0200 Subject: [PATCH 31/70] Add hypocycloid --- lazpaint/dialog/filter/uhypocycloid.lfm | 102 ++ lazpaint/dialog/filter/uhypocycloid.lrj | 6 + lazpaint/dialog/filter/uhypocycloid.pas | 335 ++++++ lazpaint/lazpaint.lpi | 9 +- lazpaint/lazpaint.lpr | 2 +- lazpaint/lazpaintdialogs.inc | 12 + lazpaint/lazpaintinstance.pas | 3 +- lazpaint/lazpaintmainform.lfm | 1253 ++++++++++++---------- lazpaint/lazpaintmainform.lrj | 669 ++++++------ lazpaint/lazpaintmainform.pas | 1 + lazpaint/lazpainttype.pas | 10 +- lazpaint/release/bin/i18n/lazpaint.fr.po | 14 + lazpaint/uconfig.pas | 13 + lazpaint/ufilters.pas | 3 + lazpaint/umenu.pas | 2 +- 15 files changed, 1505 insertions(+), 929 deletions(-) create mode 100644 lazpaint/dialog/filter/uhypocycloid.lfm create mode 100644 lazpaint/dialog/filter/uhypocycloid.lrj create mode 100644 lazpaint/dialog/filter/uhypocycloid.pas diff --git a/lazpaint/dialog/filter/uhypocycloid.lfm b/lazpaint/dialog/filter/uhypocycloid.lfm new file mode 100644 index 00000000..e1ae205c --- /dev/null +++ b/lazpaint/dialog/filter/uhypocycloid.lfm @@ -0,0 +1,102 @@ +object FHypocycloid: TFHypocycloid + Left = 989 + Height = 90 + Top = 156 + Width = 203 + AutoSize = True + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'Hypocycloid' + ChildSizing.LeftRightSpacing = 8 + ChildSizing.TopBottomSpacing = 8 + ChildSizing.HorizontalSpacing = 8 + ChildSizing.VerticalSpacing = 8 + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 1 + ClientHeight = 90 + ClientWidth = 203 + OnCreate = FormCreate + OnHide = FormHide + OnShow = FormShow + Position = poScreenCenter + LCLVersion = '2.2.6.0' + object Panel1: TPanel + Left = 8 + Height = 21 + Top = 8 + Width = 130 + BevelOuter = bvNone + ChildSizing.HorizontalSpacing = 8 + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 2 + ClientHeight = 21 + ClientWidth = 130 + TabOrder = 0 + object Label_Amount: TLabel + Left = 0 + Height = 21 + Top = 0 + Width = 42 + Caption = 'Cusps:' + Layout = tlCenter + ParentColor = False + end + object SpinEdit_CuspCount: TSpinEdit + Left = 50 + Height = 21 + Top = 0 + Width = 65 + Constraints.MinWidth = 65 + MaxValue = 20 + MinValue = 1 + OnChange = SpinEdit_CuspCountChange + TabOrder = 0 + Value = 6 + end + end + object Panel2: TPanel + Left = 8 + Height = 20 + Top = 37 + Width = 130 + BevelOuter = bvNone + ChildSizing.HorizontalSpacing = 8 + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 2 + ClientHeight = 20 + ClientWidth = 130 + TabOrder = 1 + object Button_OK: TButton + Left = 0 + Height = 20 + Top = 0 + Width = 50 + AutoSize = True + Caption = 'rsOK' + Default = True + Enabled = False + ModalResult = 1 + OnClick = Button_OKClick + TabOrder = 0 + end + object Button_Cancel: TButton + Left = 58 + Height = 20 + Top = 0 + Width = 72 + AutoSize = True + Cancel = True + Caption = 'rsCancel' + ModalResult = 2 + OnClick = Button_CancelClick + TabOrder = 1 + end + end + object TimerDisplay: TTimer + Enabled = False + Interval = 200 + OnTimer = TimerDisplayTimer + Left = 152 + Top = 24 + end +end diff --git a/lazpaint/dialog/filter/uhypocycloid.lrj b/lazpaint/dialog/filter/uhypocycloid.lrj new file mode 100644 index 00000000..3327e187 --- /dev/null +++ b/lazpaint/dialog/filter/uhypocycloid.lrj @@ -0,0 +1,6 @@ +{"version":1,"strings":[ +{"hash":178926244,"name":"tfhypocycloid.caption","sourcebytes":[72,121,112,111,99,121,99,108,111,105,100],"value":"Hypocycloid"}, +{"hash":78423914,"name":"tfhypocycloid.label_amount.caption","sourcebytes":[67,117,115,112,115,58],"value":"Cusps:"}, +{"hash":497723,"name":"tfhypocycloid.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfhypocycloid.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} +]} diff --git a/lazpaint/dialog/filter/uhypocycloid.pas b/lazpaint/dialog/filter/uhypocycloid.pas new file mode 100644 index 00000000..355fc5ac --- /dev/null +++ b/lazpaint/dialog/filter/uhypocycloid.pas @@ -0,0 +1,335 @@ +unit uhypocycloid; + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Spin, + LazPaintType, UStateType, UScripting, UResourceStrings, LCVectorOriginal, LCVectorPolyShapes; + +const + RenderName = 'hypocycloid'; + +type + + { TFHypocycloid } + + TFHypocycloid = class(TForm) + Button_Cancel: TButton; + Button_OK: TButton; + Label_Amount: TLabel; + Panel1: TPanel; + Panel2: TPanel; + SpinEdit_CuspCount: TSpinEdit; + TimerDisplay: TTimer; + procedure Button_CancelClick(Sender: TObject); + procedure Button_OKClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormHide(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure SpinEdit_CuspCountChange(Sender: TObject); + procedure TimerDisplayTimer(Sender: TObject); + private + FComposeShape: TComposedImageDifference; + FUpdateLayer: boolean; + FInitializing: boolean; + FInstance: TLazPaintCustomInstance; + FParameters: TVariableSet; + FPreviewDone: boolean; + procedure InitParams; + procedure NeedPreview; + procedure DisplayShape; + procedure UpdateOriginal(AOriginal: TVectorOriginal; ACuspCount: integer); + function IsCorrespondingOriginal: boolean; + end; + +function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; + +// create a hypocycloid shape +function MakeHypocycloid(ASurfaceWidth, ASurfaceHeight: integer; ACuspCount: integer): TVectorShape; + +implementation + +uses LCScaleDPI, UMac, UImageAction, BGRABitmapTypes, UImageDiff, BGRATransform, Math; + +{$R *.lfm} + +function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; +var + FHypocycloid: TFHypocycloid; + doFound, somethingDone: boolean; +begin + FHypocycloid:= TFHypocycloid.create(nil); + FHypocycloid.FInstance := AInstance; + FHypocycloid.FParameters := AParameters; + try + TImageActions(AInstance.ImageAction).Deselect; + + if Assigned(AParameters) and + AParameters.Booleans['Validate'] then + begin + AInstance.Image.DoBegin; + FHypocycloid.InitParams; + FHypocycloid.DisplayShape; + AInstance.Image.DoEnd(doFound, somethingDone); + result := srOk; + end else + begin + if FHypocycloid.showModal = mrOk then result := srOk + else result := srCancelledByUser; + end; + finally + FHypocycloid.free; + end; +end; + +function MakeHypocycloid(ASurfaceWidth, ASurfaceHeight: integer; ACuspCount: integer): TVectorShape; + + // center of the small circle + function HypocycloidCenterAt(phi, nR, r: Double): TPointF; + begin + result.x := (nR - r) * cos(phi); + result.y := (nR - r) * sin(phi); + end; + + // hypocycloid position is on the small circle + function HypocycloidAt(phi, nR, r: Double): TPointF; + begin + result := HypocycloidCenterAt(phi, nR, R) + + PointF( r * cos((nR - r) / r * phi), + - r * sin((nR - r) / r * phi) ); + end; + +var + t: Double; + shape: TCurveShape; + center: TPointF; + nR: Double; // radius of bounding circle + r: Double; // radius of small circle + nbPoints, i: integer; + +begin + center := PointF(ASurfaceWidth / 2, + ASurfaceHeight / 2); + nR := Math.Min(ASurfaceWidth, ASurfaceHeight) * 0.4; + r := nR / ACuspCount; + + shape := TCurveShape.Create(nil); + shape.PenColor := CSSRed; + shape.PenWidth := 3; + shape.Closed := true; + + nbPoints := ACuspCount * 8; + for i := 0 to nbPoints - 1 do + begin + t := i/nbPoints*2*Pi; + shape.AddPoint(HypocycloidAt(t, nR, r) + center); + end; + + result := shape; +end; + +{ TFHypocycloid } + +procedure TFHypocycloid.FormCreate(Sender: TObject); +begin + ScaleControl(Self,OriginalDPI); + + Button_OK.Caption := rsOK; + Button_Cancel.Caption := rsCancel; + + CheckOKCancelBtns(Button_OK{,Button_Cancel}); + CheckSpinEdit(SpinEdit_CuspCount); + + FComposeShape := nil; + FPreviewDone := false; +end; + +procedure TFHypocycloid.Button_OKClick(Sender: TObject); +begin + TimerDisplay.Enabled := false; + if not FPreviewDone then DisplayShape; +end; + +procedure TFHypocycloid.Button_CancelClick(Sender: TObject); +begin + TimerDisplay.Enabled := false; + if Assigned(FComposeShape) then + begin + FInstance.Image.Undo; + FComposeShape := nil; + end; +end; + +procedure TFHypocycloid.FormHide(Sender: TObject); +begin + if Assigned(FComposeShape) then + begin + If ModalResult <> mrOk then + FInstance.Image.Undo; + FComposeShape := nil; + end; +end; + +procedure TFHypocycloid.FormShow(Sender: TObject); +begin + InitParams; + NeedPreview; +end; + +procedure TFHypocycloid.SpinEdit_CuspCountChange(Sender: TObject); +begin + NeedPreview; +end; + +procedure TFHypocycloid.TimerDisplayTimer(Sender: TObject); +begin + TimerDisplay.Enabled:= false; + DisplayShape; +end; + +procedure TFHypocycloid.InitParams; +var + isOriginal: Boolean; + layerIndex, cuspCount, errPos: Integer; + cuspCountStr: RawByteString; +begin + FInitializing := true; + + // default parameters + cuspCount := FInstance.Config.DefaultCuspCount; + + // parameters from current layer + layerIndex := FInstance.Image.CurrentLayerIndex; + if IsCorrespondingOriginal then + begin + cuspCountStr := FInstance.Image.GetLayerRegistry(layerIndex, 'cusp-count'); + val(cuspCountStr, cuspCount, errPos); + if errPos = 0 then + SpinEdit_CuspCount.Value := cuspCount; + FUpdateLayer:= true; + end + else + FUpdateLayer:= false; + + // supplied parameters to script function + if Assigned(FParameters) and + FParameters.IsDefined('CuspCount') then + cuspCount := FParameters.Integers['CuspCount']; + + SpinEdit_CuspCount.Value := cuspCount; + + FInitializing := false; +end; + +procedure TFHypocycloid.NeedPreview; +begin + TimerDisplay.Enabled := false; + TimerDisplay.Enabled := true; + FPreviewDone := false; + Button_OK.Enabled := false; +end; + +procedure TFHypocycloid.DisplayShape; +var + original, prevOriginal: TVectorOriginal; + curIndex, cuspCount: Integer; +begin + FPreviewDone := true; + + // cancel the preview + if Assigned(FComposeShape) then + begin + FInstance.Image.Undo; + FComposeShape := nil; + end; + + // chosen parameters + cuspCount := SpinEdit_CuspCount.Value; + + // make a new preview + FComposeShape := FInstance.Image.DoBegin; + try + // if there is already a corresponding layer + if FUpdateLayer then + begin + curIndex := FInstance.Image.CurrentLayerIndex; + prevOriginal := FInstance.Image.LayerOriginal[curIndex] as TVectorOriginal; + + // record changes made inside the original + FInstance.Image.CurrentState.DiscardOriginalDiff:= false; + UpdateOriginal(prevOriginal, cuspCount); + FInstance.Image.CurrentState.DiscardOriginalDiff:= true; + end else + begin + // create a new layer + original := TVectorOriginal.Create; + UpdateOriginal(original, cuspCount); + + // if current layer is empty, replace it + if FInstance.Image.CurrentLayerEmpty then + begin + curIndex := FInstance.Image.CurrentLayerIndex; + FInstance.Image.AddUndo( + TReplaceLayerByCustomOriginalDifference.Create(FInstance.Image.CurrentState, + FInstance.Image.CurrentLayerIndex, true, original)); + FInstance.Image.ImageMayChangeCompletely; + FInstance.Image.LayerName[curIndex] := Caption; + end + else + begin + // otherwise add the new layer + FInstance.Image.AddNewLayer(original, Caption, boTransparent, AffineMatrixIdentity); + curIndex := FInstance.Image.CurrentLayerIndex; + end; + + FInstance.Image.SetLayerRegistry(curIndex, 'render-name', RenderName); + end; + + // update the parameters saved in the layer + FInstance.Image.SetLayerRegistry(curIndex, 'cusp-count', IntToStr(cuspCount)); + + Button_OK.Enabled := true; + finally + FInstance.Image.DoEnd(FComposeShape); + end; +end; + +procedure TFHypocycloid.UpdateOriginal(AOriginal: TVectorOriginal; ACuspCount: integer); +var + shape, prevShape: TCurveShape; + i: Integer; +begin + // create prototype shape + shape := MakeHypocycloid(FInstance.Image.Width, FInstance.Image.Height, + ACuspCount) as TCurveShape; + + // find the existing hypocycloid + for i := 0 to AOriginal.ShapeCount-1 do + if AOriginal.Shape[i] is TCurveShape then + begin + prevShape := AOriginal.Shape[i] as TCurveShape; + prevShape.Clear; + prevShape.AddPointRange(shape.GetPointRange); + FreeAndNil(shape); + break; + end; + + // if the shape wasn't found, add the prototype + if Assigned(shape) then + AOriginal.AddShape(shape); +end; + +function TFHypocycloid.IsCorrespondingOriginal: boolean; +var + curIndex: Integer; +begin + curIndex := FInstance.Image.CurrentLayerIndex; + result := + (FInstance.Image.LayerOriginalClass[curIndex] = TVectorOriginal) and + (FInstance.Image.GetLayerRegistry(curIndex, 'render-name') = RenderName) +end; + +end. + diff --git a/lazpaint/lazpaint.lpi b/lazpaint/lazpaint.lpi index 13d11f48..aea57799 100644 --- a/lazpaint/lazpaint.lpi +++ b/lazpaint/lazpaint.lpi @@ -435,7 +435,7 @@ - + @@ -1062,6 +1062,13 @@ + + + + + + + diff --git a/lazpaint/lazpaint.lpr b/lazpaint/lazpaint.lpr index beff87ab..2ae3b193 100644 --- a/lazpaint/lazpaint.lpr +++ b/lazpaint/lazpaint.lpr @@ -40,7 +40,7 @@ URainType, UFormRain, UPaletteToolbar, uselectionhighlight, UImagePreview, UPreviewDialog, UQuestion, UTiff, UImageView, UDarkTheme, URaw, UProcessAuto, UPython, UImageBackup, ULayerStackInterface, - UChooseColorInterface, UIconCache; + UChooseColorInterface, UIconCache, uhypocycloid; //sometimes LResources disappear in the uses clause diff --git a/lazpaint/lazpaintdialogs.inc b/lazpaint/lazpaintdialogs.inc index bf83676a..0eb44b23 100644 --- a/lazpaint/lazpaintdialogs.inc +++ b/lazpaint/lazpaintdialogs.inc @@ -583,4 +583,16 @@ begin self.ShowTopmost(top); end; +function TLazPaintInstance.ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; +var oldSelectionNormal: boolean; + top: TTopMostInfo; +begin + top := self.HideTopmost; + oldSelectionNormal := ShowSelectionNormal; + ShowSelectionNormal := true; + result := uhypocycloid.ShowHypocycloidDlg(AInstance, AParameters); + ShowSelectionNormal := oldSelectionNormal; + self.ShowTopmost(top); +end; + diff --git a/lazpaint/lazpaintinstance.pas b/lazpaint/lazpaintinstance.pas index 5da9ac63..35dc53b7 100644 --- a/lazpaint/lazpaintinstance.pas +++ b/lazpaint/lazpaintinstance.pas @@ -260,6 +260,7 @@ TLazPaintInstance = class(TLazPaintCustomInstance) function ShowFunctionFilterDlg(AFilterConnector: TObject): TScriptResult; override; function ShowSharpenDlg(AFilterConnector: TObject): TScriptResult; override; function ShowPosterizeDlg(AParameters: TVariableSet): TScriptResult; override; + function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; override; procedure ShowPrintDlg; override; function HideTopmost: TTopMostInfo; override; procedure ShowTopmost(AInfo: TTopMostInfo); override; @@ -297,7 +298,7 @@ implementation URadialBlur, UMotionBlur, UEmboss, UTwirl, UWaveDisplacement, unewimage, uresample, UPixelate, unoisefilter, ufilters, - USharpen, uposterize, UPhongFilter, UFilterFunction, + USharpen, uposterize, uhypocycloid, UPhongFilter, UFilterFunction, uprint, USaveOption, UFormRain, {$IFDEF DARWIN}BGRAGraphics,{$ENDIF} diff --git a/lazpaint/lazpaintmainform.lfm b/lazpaint/lazpaintmainform.lfm index a2dffa16..da1b9c10 100644 --- a/lazpaint/lazpaintmainform.lfm +++ b/lazpaint/lazpaintmainform.lfm @@ -5,7 +5,7 @@ object FMain: TFMain Width = 739 AllowDropFiles = True Caption = 'LazPaint' - ClientHeight = 577 + ClientHeight = 597 ClientWidth = 739 Constraints.MinWidth = 320 Font.Height = -12 @@ -24,7 +24,7 @@ object FMain: TFMain OnUTF8KeyPress = FormUTF8KeyPress Position = poDefault ShowHint = True - LCLVersion = '2.2.0.1' + LCLVersion = '2.2.6.0' object Panel_ToolbarBackground: TPanel Left = 8 Height = 36 @@ -134,6 +134,7 @@ object FMain: TFMain Font.Color = clWindowText Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False Transparent = False end @@ -179,7 +180,7 @@ object FMain: TFMain end object Edit_Zoom: TEdit Left = 3 - Height = 23 + Height = 21 Top = 24 Width = 38 Font.Height = -12 @@ -212,6 +213,7 @@ object FMain: TFMain Caption = '100%' Font.Height = -10 Layout = tlCenter + ParentColor = False ParentFont = False end end @@ -235,6 +237,7 @@ object FMain: TFMain Caption = 'Width' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object SpinEdit_PenWidth: TBCTrackbarUpdown @@ -334,6 +337,7 @@ object FMain: TFMain Caption = 'Erase' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object ToolBar19: TToolBar @@ -487,6 +491,7 @@ object FMain: TFMain Caption = 'Tolerance' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object ToolBar6: TToolBar @@ -725,6 +730,7 @@ object FMain: TFMain Caption = '9999x9999' Font.Height = -10 Layout = tlCenter + ParentColor = False ParentFont = False end end @@ -1327,6 +1333,7 @@ object FMain: TFMain Caption = 'Grid' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object Label_GridX: TLabel @@ -1339,6 +1346,7 @@ object FMain: TFMain Caption = 'x' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object ToolBar13: TToolBar @@ -1554,6 +1562,7 @@ object FMain: TFMain Caption = 'Curve' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object ToolBar20: TToolBar @@ -1764,6 +1773,7 @@ object FMain: TFMain Caption = 'Text' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False OnMouseMove = Panel_TextMouseMove end @@ -1923,6 +1933,7 @@ object FMain: TFMain Caption = 'Shape' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object Label_PhongBorder: TLabel @@ -1934,6 +1945,7 @@ object FMain: TFMain Caption = 'Border' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object ToolBar16: TToolBar @@ -2103,6 +2115,7 @@ object FMain: TFMain Caption = 'Altitude' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object SpinEdit_ShapeAltitude: TBCTrackbarUpdown @@ -2202,6 +2215,7 @@ object FMain: TFMain Caption = 'Width' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object ToolBar17: TToolBar @@ -2360,6 +2374,7 @@ object FMain: TFMain Caption = 'Brush' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object Label_Spacing: TLabel @@ -2371,6 +2386,7 @@ object FMain: TFMain Caption = 'Spacing' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object ToolBar21: TToolBar @@ -2597,11 +2613,11 @@ object FMain: TFMain TabOrder = 25 object Combo_Ratio: TComboBox Left = 42 - Height = 23 + Height = 20 Top = 1 Width = 96 Font.Height = -12 - ItemHeight = 15 + ItemHeight = 19 Items.Strings = ( '' '2:1' @@ -2623,6 +2639,7 @@ object FMain: TFMain Caption = 'Ratio' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end end @@ -2730,6 +2747,7 @@ object FMain: TFMain Caption = 'Blur' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object SpinEdit_TextBlur: TBCTrackbarUpdown @@ -2817,6 +2835,7 @@ object FMain: TFMain Caption = 'Offset' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object SpinEdit_TextShadowX: TBCTrackbarUpdown @@ -2993,6 +3012,7 @@ object FMain: TFMain Caption = 'Pen' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object VectorialFill_Pen: TLCVectorialFillControl @@ -3177,6 +3197,7 @@ object FMain: TFMain Caption = 'Back' Font.Height = -12 Layout = tlCenter + ParentColor = False ParentFont = False end object VectorialFill_Back: TLCVectorialFillControl @@ -5614,6 +5635,11 @@ object FMain: TFMain OnUpdate = FileSaveUpdate ShortCut = 16465 end + object RenderHypocycloid: TAction + Category = 'Render' + Caption = 'Hypocycloid...' + OnExecute = RenderAnyExecute + end end object ColorDialog1: TColorDialog Title = 'Choose color' @@ -12833,592 +12859,569 @@ object FMain: TFMain Top = 514 Items = { 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574 - 662D38223F3E0D0A3C434F4E46494720436F756E743D223130223E0D0A20203C - 4974656D30205356473D22266C743B3F786D6C2076657273696F6E3D2671756F - 743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D38 - 2671756F743B3F2667743B262378443B262378413B266C743B73766720776964 - 74683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B6874 - 74703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B2068 - 65696768743D2671756F743B33322671756F743B2076696577426F783D267175 - 6F743B3020302033322033322671756F743B20786D6C6E733A696E6B73636170 - 653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F - 6E616D657370616365732F696E6B73636170652671756F743B2667743B262378 - 443B262378413B2020266C743B67206F7061636974793D2671756F743B312671 - 756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F7769 - 6B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F66 - 6F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F74 - 3B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F6465 - 3D2671756F743B6C617965722671756F743B20626772613A6F726967696E616C - 56696577426F783D2671756F743B3020302032392032382671756F743B266774 - 3B262378443B262378413B20202020266C743B7061746820643D2671756F743B - 4D32382E383433373520362E353933373520302E303933373520302E30333132 - 352671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073 - 74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163 - 6974793D2671756F743B312671756F743B2F2667743B262378443B262378413B - 20202020266C743B7061746820643D2671756F743B4D39203238203920332031 - 352033203135203238207A2671756F743B2066696C6C3D2671756F743B626C61 + 662D38223F3E0A3C434F4E46494720436F756E743D223130223E0A20203C4974 + 656D30205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B + 312E302671756F743B20656E636F64696E673D2671756F743B7574662D382671 + 756F743B3F2667743B262378413B266C743B7376672077696474683D2671756F + 743B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F7777 + 772E77332E6F72672F323030302F7376672671756F743B206865696768743D26 + 71756F743B33322671756F743B2076696577426F783D2671756F743B30203020 + 33322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F74 + 3B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D65737061 + 6365732F696E6B73636170652671756F743B2667743B262378413B2020266C74 + 3B67206F7061636974793D2671756F743B312671756F743B20786D6C6E733A62 + 6772613D2671756F743B68747470733A2F2F77696B692E667265657061736361 + 6C2E6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B20 + 696E6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F74 + 3B20696E6B73636170653A67726F75706D6F64653D2671756F743B6C61796572 + 2671756F743B20626772613A6F726967696E616C56696577426F783D2671756F + 743B3020302032392032382671756F743B2667743B262378413B20202020266C + 743B7061746820643D2671756F743B4D32382E383433373520362E3539333735 + 20302E303933373520302E30333132352671756F743B2066696C6C3D2671756F + 743B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E6526 + 71756F743B2066696C6C2D6F7061636974793D2671756F743B312671756F743B + 2F2667743B262378413B20202020266C743B7061746820643D2671756F743B4D + 39203238203920332031352033203135203238207A2671756F743B2066696C6C + 3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F743B + 6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B302E + 373932313536392671756F743B2F2667743B262378413B20202020266C743B70 + 61746820643D2671756F743B4D31352032382031382E38383436312032372E39 + 34343731205132322E37363932332032372E38383934322032342E3836323938 + 2032352E36303831372032362E39353637332032332E33323639322032362E39 + 373833362032302E31363334362032372031372032352E37352031352E323520 + 32342E352031332E352032322E32352031322E37352032302031322031372E35 + 203132204C313520313220313520313620313720313620513139203136203230 + 2E352031372032322031382032312E38323231312032302E3033383436203231 + 2E36343432332032322E30373639322032302E32363932332032322E39383331 + 372031382E38393432332032332E38383934322031362E39343731312032332E + 3934343731204C3135203234207A2671756F743B2066696C6C3D2671756F743B + 626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E65267175 + 6F743B2066696C6C2D6F7061636974793D2671756F743B302E37393231353639 + 2671756F743B2F2667743B262378413B2020266C743B2F672667743B26237841 + 3B266C743B2F7376672667743B262378413B222F3E0A20203C4974656D312053 + 56473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671 + 756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F + 2667743B262378413B266C743B7376672077696474683D2671756F743B333226 + 71756F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E + 6F72672F323030302F7376672671756F743B206865696768743D2671756F743B + 33322671756F743B2076696577426F783D2671756F743B302030203332203332 + 2671756F743B20786D6C6E733A696E6B73636170653D2671756F743B68747470 + 3A2F2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F69 + 6E6B73636170652671756F743B2667743B262378413B2020266C743B67206F70 + 61636974793D2671756F743B312671756F743B20786D6C6E733A626772613D26 + 71756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F7267 + 2F4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B7363 + 6170653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B + 73636170653A67726F75706D6F64653D2671756F743B6C617965722671756F74 + 3B20626772613A6F726967696E616C56696577426F783D2671756F743B302030 + 2032392032382671756F743B2667743B262378413B20202020266C743B706174 + 6820643D2671756F743B4D32382E383433373520362E353933373520302E3039 + 33373520302E30333132352671756F743B2066696C6C3D2671756F743B626C61 636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B - 2066696C6C2D6F7061636974793D2671756F743B302E37393231353639267175 - 6F743B2F2667743B262378443B262378413B20202020266C743B706174682064 - 3D2671756F743B4D31352032382031382E38383436312032372E393434373120 - 5132322E37363932332032372E38383934322032342E38363239382032352E36 - 303831372032362E39353637332032332E33323639322032362E393738333620 - 32302E31363334362032372031372032352E37352031352E32352032342E3520 - 31332E352032322E32352031322E37352032302031322031372E35203132204C - 3135203132203135203136203137203136205131392031362032302E35203137 - 2032322031382032312E38323231312032302E30333834362032312E36343432 - 332032322E30373639322032302E32363932332032322E39383331372031382E - 38393432332032332E38383934322031362E39343731312032332E3934343731 - 204C3135203234207A2671756F743B2066696C6C3D2671756F743B626C61636B - 2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066 - 696C6C2D6F7061636974793D2671756F743B302E373932313536392671756F74 - 3B2F2667743B262378443B262378413B2020266C743B2F672667743B26237844 - 3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D - 0A20203C4974656D31205356473D22266C743B3F786D6C2076657273696F6E3D - 2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75 - 74662D382671756F743B3F2667743B262378443B262378413B266C743B737667 - 2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F - 743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F - 743B206865696768743D2671756F743B33322671756F743B2076696577426F78 - 3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B - 73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E - 6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774 - 3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74 - 3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A - 2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53 - 56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26 - 71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570 - 6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967 - 696E616C56696577426F783D2671756F743B3020302032392032382671756F74 - 3B2667743B262378443B262378413B20202020266C743B7061746820643D2671 - 756F743B4D32382E383433373520362E353933373520302E303933373520302E - 30333132352671756F743B2066696C6C3D2671756F743B626C61636B2671756F - 743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D - 6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B26 - 2378413B20202020266C743B7061746820643D2671756F743B4D313120323820 - 31362E352031332032302E35203133203135203238207A2671756F743B206669 - 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F - 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B - 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 - 2020266C743B7061746820643D2671756F743B4D313820313020313920362032 - 3320362032312E37313837352031302E3039333735207A2671756F743B206669 - 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F - 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B - 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 - 2020266C743B7061746820643D2671756F743B4D32342E34303632352031342E - 333433373520312E303933373520302E3033313235207A2671756F743B206669 - 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F - 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B - 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 - 266C743B2F672667743B262378443B262378413B266C743B2F7376672667743B - 262378443B262378413B222F3E0D0A20203C4974656D32205356473D22266C74 - 3B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B20656E - 636F64696E673D2671756F743B7574662D382671756F743B3F2667743B262378 - 443B262378413B266C743B7376672077696474683D2671756F743B3332267175 - 6F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72 - 672F323030302F7376672671756F743B206865696768743D2671756F743B3332 - 2671756F743B2076696577426F783D2671756F743B3020302033322033322671 - 756F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F - 2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B - 73636170652671756F743B2667743B262378443B262378413B2020266C743B67 - 206F7061636974793D2671756F743B312671756F743B20786D6C6E733A626772 - 613D2671756F743B68747470733A2F2F77696B692E6672656570617363616C2E - 6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B20696E - 6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F743B20 - 696E6B73636170653A67726F75706D6F64653D2671756F743B6C617965722671 - 756F743B20626772613A6F726967696E616C56696577426F783D2671756F743B - 2D3331202D352039342033352671756F743B2667743B262378443B262378413B - 20202020266C743B7465787420783D2671756F743B302671756F743B20793D26 - 71756F743B2D352671756F743B2066696C6C3D2671756F743B626C61636B2671 - 756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E - 742D73697A653D2671756F743B33312671756F743B20666F6E742D7374796C65 - 3D2671756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D - 2671756F743B4672656553616E732671756F743B20666F6E742D776569676874 - 3D2671756F743B6E6F726D616C2671756F743B2066696C6C2D6F706163697479 - 3D2671756F743B302E373932313536392671756F743B20746578742D6465636F - 726174696F6E3D2671756F743B2671756F743B2667743B262378443B26237841 - 3B202020202020266C743B747370616E20783D2671756F743B372E3337373836 - 372671756F743B20793D2671756F743B32332671756F743B2064697265637469 - 6F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D2671 - 756F743B31372E32343432372671756F743B2667743B75266C743B2F74737061 - 6E2667743B262378443B262378413B20202020266C743B2F746578742667743B - 262378443B262378413B20202020266C743B7061746820643D2671756F743B4D - 362E3520333020362E352032362032352E352032362032352E35203330207A26 + 2066696C6C2D6F7061636974793D2671756F743B312671756F743B2F2667743B + 262378413B20202020266C743B7061746820643D2671756F743B4D3131203238 + 2031362E352031332032302E35203133203135203238207A2671756F743B2066 + 696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D267175 + 6F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F74 + 3B302E373932313536392671756F743B2F2667743B262378413B20202020266C + 743B7061746820643D2671756F743B4D31382031302031392036203233203620 + 32312E37313837352031302E3039333735207A2671756F743B2066696C6C3D26 + 71756F743B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F + 6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B302E3739 + 32313536392671756F743B2F2667743B262378413B20202020266C743B706174 + 6820643D2671756F743B4D32342E34303632352031342E333433373520312E30 + 3933373520302E3033313235207A2671756F743B2066696C6C3D2671756F743B + 626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E65267175 + 6F743B2066696C6C2D6F7061636974793D2671756F743B302E37393231353639 + 2671756F743B2F2667743B262378413B2020266C743B2F672667743B26237841 + 3B266C743B2F7376672667743B262378413B222F3E0A20203C4974656D322053 + 56473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671 + 756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F + 2667743B262378413B266C743B7376672077696474683D2671756F743B333226 + 71756F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E + 6F72672F323030302F7376672671756F743B206865696768743D2671756F743B + 33322671756F743B2076696577426F783D2671756F743B302030203332203332 + 2671756F743B20786D6C6E733A696E6B73636170653D2671756F743B68747470 + 3A2F2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F69 + 6E6B73636170652671756F743B2667743B262378413B2020266C743B67206F70 + 61636974793D2671756F743B312671756F743B20786D6C6E733A626772613D26 + 71756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F7267 + 2F4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B7363 + 6170653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B + 73636170653A67726F75706D6F64653D2671756F743B6C617965722671756F74 + 3B20626772613A6F726967696E616C56696577426F783D2671756F743B2D3331 + 202D352039342033352671756F743B2667743B262378413B20202020266C743B + 7465787420783D2671756F743B302671756F743B20793D2671756F743B2D3526 71756F743B2066696C6C3D2671756F743B626C61636B2671756F743B20737472 - 6F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974 - 793D2671756F743B302E373932313536392671756F743B2F2667743B26237844 - 3B262378413B2020266C743B2F672667743B262378443B262378413B266C743B - 2F7376672667743B262378443B262378413B222F3E0D0A20203C4974656D3320 - 5356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E3026 - 71756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B - 3F2667743B262378443B262378413B266C743B7376672077696474683D267175 - 6F743B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F77 - 77772E77332E6F72672F323030302F7376672671756F743B206865696768743D - 2671756F743B33322671756F743B2076696577426F783D2671756F743B302030 - 2033322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F - 743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D657370 - 616365732F696E6B73636170652671756F743B2667743B262378443B26237841 - 3B2020266C743B67206F7061636974793D2671756F743B312671756F743B2078 - 6D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E667265 - 6570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D617426 - 71756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61796572 - 312671756F743B20696E6B73636170653A67726F75706D6F64653D2671756F74 - 3B6C617965722671756F743B20626772613A6F726967696E616C56696577426F - 783D2671756F743B3520392032322031392671756F743B2667743B262378443B - 262378413B20202020266C743B7061746820643D2671756F743B4D352E352032 - 3020352E352031362032362E352031362032362E35203230207A2671756F743B - 2066696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D26 - 71756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D267175 - 6F743B302E373932313536392671756F743B2F2667743B262378443B26237841 - 3B20202020266C743B7061746820643D2671756F743B4D31322E373532353120 - 32322E30343231372031332E30393533342032332E3139313232205131332E34 - 333831372032342E33343032372031342E38373239312032342E363838343620 - 31362E33303736352032352E30333636352031372E37323138372032352E3030 - 3331382031392E31333630382032342E39363937312031392E36323232322032 - 342E32313834312032302E31303833352032332E34363731312031392E383433 - 31392032322E30393730392031392E35373830322032302E3732373037203137 - 2E36333334382032302E31353235342031352E36383839332031392E35373830 - 322031332E3635362031392E30343736392031312E36323330372031382E3531 - 3733362031302E363530382031372E353839323820392E363738353235203136 - 2E3636313220392E3731353133372031352E303138343420392E373531373439 - 2031332E33373536372031302E33373439312031322E33353639392031302E39 - 393830372031312E333338332031322E34303639322031302E36343935203133 - 2E383135373720392E3936303639342031362E303732383220392E3930353737 - 372031382E333239383620392E38353038362031392E35303730322031302E33 - 393633352032302E36383431382031302E39343138352032312E343832383120 - 31312E37353437332032322E32383134352031322E35363736312032322E3432 - 3437352031332E3235363431204C32322E35363830362031332E393435323220 - 31392E33363436332031342E30353530352031382E383334332031332E343532 - 3432205131382E33303339372031322E38343937382031362E36393639203132 - 2E39313030362031352E30383938322031322E39373033342031342E30363335 - 352031332E35393434322031332E30333732382031342E323138352031322E39 - 3438392031342E38363533332031322E38363035312031352E35313231362031 - 352E35353633352031362E33393630342031382E32353231392031372E323739 - 39322031392E35333338332031372E37323138362032302E3831353436203138 - 2E31363338312032312E37343335342031382E39313531312032322E36373136 - 312031392E36363634312032322E38393235382032312E31323438322032332E - 31313335362032322E35383332332032322E37362032332E3930393035203232 - 2E34303634352032352E32333438382032302E35383530362032362E36323633 - 342031382E37363336382032382E30313738312031362E33353739372032372E - 39393633362031332E39353232362032372E39373439312031322E3930333234 - 2032372E34353433392031312E38353432332032362E39333338362031302E38 - 353437362032362E303834333720392E3835353330322032352E323334383820 - 392E3732303439382032332E3632303232204C392E3538353639342032322E30 - 30353536207A2671756F743B2066696C6C3D2671756F743B626C61636B267175 - 6F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C - 2D6F7061636974793D2671756F743B302E373932313536392671756F743B2F26 - 67743B262378443B262378413B2020266C743B2F672667743B262378443B2623 - 78413B266C743B2F7376672667743B262378443B262378413B222F3E0D0A2020 - 3C4974656D34205356473D22266C743B3F786D6C2076657273696F6E3D267175 - 6F743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D - 382671756F743B3F2667743B262378443B262378413B266C743B737667207769 - 6474683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B68 - 7474703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B20 - 6865696768743D2671756F743B33322671756F743B2076696577426F783D2671 - 756F743B3020302033322033322671756F743B20786D6C6E733A696E6B736361 - 70653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F7267 - 2F6E616D657370616365732F696E6B73636170652671756F743B2667743B2623 - 78443B262378413B2020266C743B67206F7061636974793D2671756F743B3126 - 71756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77 - 696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F - 666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F - 743B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F64 - 653D2671756F743B6C617965722671756F743B20626772613A6F726967696E61 - 6C56696577426F783D2671756F743B2D313520302036322032392671756F743B - 2667743B262378443B262378413B20202020266C743B7061746820643D267175 - 6F743B4D332E352032322031302031352E352031302032302032322032302032 - 322031352E352032382E352032322032322032382E3520323220323420313020 - 32342031302032382E35207A2671756F743B2066696C6C3D2671756F743B626C - 61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F74 - 3B2066696C6C2D6F7061636974793D2671756F743B302E373932313536392671 - 756F743B2F2667743B262378443B262378413B20202020266C743B7465787420 - 783D2671756F743B302671756F743B20793D2671756F743B302671756F743B20 - 66696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671 - 756F743B6E6F6E652671756F743B20666F6E742D73697A653D2671756F743B31 - 352671756F743B20666F6E742D7374796C653D2671756F743B6E6F726D616C26 - 71756F743B20666F6E742D66616D696C793D2671756F743B4672656553616E73 - 2671756F743B20666F6E742D7765696768743D2671756F743B6E6F726D616C26 - 71756F743B2066696C6C2D6F7061636974793D2671756F743B302E3936383632 - 37352671756F743B20746578742D6465636F726174696F6E3D2671756F743B26 - 71756F743B2667743B262378443B262378413B202020202020266C743B747370 - 616E20783D2671756F743B31312E3832382671756F743B20793D2671756F743B - 31342671756F743B20646972656374696F6E3D2671756F743B6C74722671756F - 743B20746578744C656E6774683D2671756F743B382E3334343030312671756F - 743B2667743B3F266C743B2F747370616E2667743B262378443B262378413B20 - 202020266C743B2F746578742667743B262378443B262378413B2020266C743B - 2F672667743B262378443B262378413B266C743B2F7376672667743B26237844 - 3B262378413B222F3E0D0A20203C4974656D35205356473D22266C743B3F786D - 6C2076657273696F6E3D2671756F743B312E302671756F743B20656E636F6469 - 6E673D2671756F743B7574662D382671756F743B3F2667743B262378443B2623 + 6F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73697A653D26 + 71756F743B33312671756F743B20666F6E742D7374796C653D2671756F743B6E + 6F726D616C2671756F743B20666F6E742D66616D696C793D2671756F743B4672 + 656553616E732671756F743B20666F6E742D7765696768743D2671756F743B6E + 6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671756F743B30 + 2E373932313536392671756F743B20746578742D6465636F726174696F6E3D26 + 71756F743B2671756F743B2667743B262378413B202020202020266C743B7473 + 70616E20783D2671756F743B372E3337373836372671756F743B20793D267175 + 6F743B32332671756F743B20646972656374696F6E3D2671756F743B6C747226 + 71756F743B20746578744C656E6774683D2671756F743B31372E323434323726 + 71756F743B2667743B75266C743B2F747370616E2667743B262378413B202020 + 20266C743B2F746578742667743B262378413B20202020266C743B7061746820 + 643D2671756F743B4D362E3520333020362E352032362032352E352032362032 + 352E35203330207A2671756F743B2066696C6C3D2671756F743B626C61636B26 + 71756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B206669 + 6C6C2D6F7061636974793D2671756F743B302E373932313536392671756F743B + 2F2667743B262378413B2020266C743B2F672667743B262378413B266C743B2F + 7376672667743B262378413B222F3E0A20203C4974656D33205356473D22266C + 743B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B2065 + 6E636F64696E673D2671756F743B7574662D382671756F743B3F2667743B2623 78413B266C743B7376672077696474683D2671756F743B33322671756F743B20 786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72672F3230 30302F7376672671756F743B206865696768743D2671756F743B33322671756F 743B2076696577426F783D2671756F743B3020302033322033322671756F743B 20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F777777 2E696E6B73636170652E6F72672F6E616D657370616365732F696E6B73636170 - 652671756F743B2667743B262378443B262378413B2020266C743B67206F7061 - 636974793D2671756F743B312671756F743B20786D6C6E733A626772613D2671 - 756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F - 4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B736361 - 70653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73 - 636170653A67726F75706D6F64653D2671756F743B6C617965722671756F743B - 20626772613A6F726967696E616C56696577426F783D2671756F743B2D313020 - 2D312035362033302671756F743B2667743B262378443B262378413B20202020 - 266C743B7061746820643D2671756F743B4D3420323020323220323020323220 - 31352E352032382E352032322032322032382E35203232203234203420323420 + 652671756F743B2667743B262378413B2020266C743B67206F7061636974793D + 2671756F743B312671756F743B20786D6C6E733A626772613D2671756F743B68 + 747470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061 + 696E745F5356475F666F726D61742671756F743B20696E6B73636170653A6C61 + 62656C3D2671756F743B4C61796572312671756F743B20696E6B73636170653A + 67726F75706D6F64653D2671756F743B6C617965722671756F743B2062677261 + 3A6F726967696E616C56696577426F783D2671756F743B352039203232203139 + 2671756F743B2667743B262378413B20202020266C743B7061746820643D2671 + 756F743B4D352E3520323020352E352031362032362E352031362032362E3520 + 3230207A2671756F743B2066696C6C3D2671756F743B626C61636B2671756F74 + 3B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F + 7061636974793D2671756F743B302E373932313536392671756F743B2F266774 + 3B262378413B20202020266C743B7061746820643D2671756F743B4D31322E37 + 353235312032322E30343231372031332E30393533342032332E313931323220 + 5131332E34333831372032342E33343032372031342E38373239312032342E36 + 383834362031362E33303736352032352E30333636352031372E373231383720 + 32352E30303331382031392E31333630382032342E39363937312031392E3632 + 3232322032342E32313834312032302E31303833352032332E34363731312031 + 392E38343331392032322E30393730392031392E35373830322032302E373237 + 30372031372E36333334382032302E31353235342031352E3638383933203139 + 2E35373830322031332E3635362031392E30343736392031312E363233303720 + 31382E35313733362031302E363530382031372E353839323820392E36373835 + 32352031362E3636313220392E3731353133372031352E303138343420392E37 + 35313734392031332E33373536372031302E33373439312031322E3335363939 + 2031302E39393830372031312E333338332031322E34303639322031302E3634 + 39352031332E383135373720392E3936303639342031362E303732383220392E + 3930353737372031382E333239383620392E38353038362031392E3530373032 + 2031302E33393633352032302E36383431382031302E39343138352032312E34 + 383238312031312E37353437332032322E32383134352031322E353637363120 + 32322E34323437352031332E3235363431204C32322E35363830362031332E39 + 343532322031392E33363436332031342E30353530352031382E383334332031 + 332E3435323432205131382E33303339372031322E38343937382031362E3639 + 36392031322E39313030362031352E30383938322031322E3937303334203134 + 2E30363335352031332E35393434322031332E30333732382031342E32313835 + 2031322E393438392031342E38363533332031322E38363035312031352E3531 + 3231362031352E35353633352031362E33393630342031382E32353231392031 + 372E32373939322031392E35333338332031372E37323138362032302E383135 + 34362031382E31363338312032312E37343335342031382E3931353131203232 + 2E36373136312031392E36363634312032322E38393235382032312E31323438 + 322032332E31313335362032322E35383332332032322E37362032332E393039 + 30352032322E34303634352032352E32333438382032302E3538353036203236 + 2E36323633342031382E37363336382032382E30313738312031362E33353739 + 372032372E39393633362031332E39353232362032372E39373439312031322E + 39303332342032372E34353433392031312E38353432332032362E3933333836 + 2031302E38353437362032362E303834333720392E3835353330322032352E32 + 3334383820392E3732303439382032332E3632303232204C392E353835363934 + 2032322E3030353536207A2671756F743B2066696C6C3D2671756F743B626C61 + 636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B + 2066696C6C2D6F7061636974793D2671756F743B302E37393231353639267175 + 6F743B2F2667743B262378413B2020266C743B2F672667743B262378413B266C + 743B2F7376672667743B262378413B222F3E0A20203C4974656D34205356473D + 22266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671756F74 + 3B20656E636F64696E673D2671756F743B7574662D382671756F743B3F266774 + 3B262378413B266C743B7376672077696474683D2671756F743B33322671756F + 743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F7267 + 2F323030302F7376672671756F743B206865696768743D2671756F743B333226 + 71756F743B2076696577426F783D2671756F743B302030203332203332267175 + 6F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F + 7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B73 + 636170652671756F743B2667743B262378413B2020266C743B67206F70616369 + 74793D2671756F743B312671756F743B20786D6C6E733A626772613D2671756F + 743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F4C61 + 7A5061696E745F5356475F666F726D61742671756F743B20696E6B7363617065 + 3A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B736361 + 70653A67726F75706D6F64653D2671756F743B6C617965722671756F743B2062 + 6772613A6F726967696E616C56696577426F783D2671756F743B2D3135203020 + 36322032392671756F743B2667743B262378413B20202020266C743B70617468 + 20643D2671756F743B4D332E352032322031302031352E352031302032302032 + 322032302032322031352E352032382E352032322032322032382E3520323220 + 32342031302032342031302032382E35207A2671756F743B2066696C6C3D2671 + 756F743B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E + 652671756F743B2066696C6C2D6F7061636974793D2671756F743B302E373932 + 313536392671756F743B2F2667743B262378413B20202020266C743B74657874 + 20783D2671756F743B302671756F743B20793D2671756F743B302671756F743B + 2066696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D26 + 71756F743B6E6F6E652671756F743B20666F6E742D73697A653D2671756F743B + 31352671756F743B20666F6E742D7374796C653D2671756F743B6E6F726D616C + 2671756F743B20666F6E742D66616D696C793D2671756F743B4672656553616E + 732671756F743B20666F6E742D7765696768743D2671756F743B6E6F726D616C + 2671756F743B2066696C6C2D6F7061636974793D2671756F743B302E39363836 + 3237352671756F743B20746578742D6465636F726174696F6E3D2671756F743B + 2671756F743B2667743B262378413B202020202020266C743B747370616E2078 + 3D2671756F743B31312E3832382671756F743B20793D2671756F743B31342671 + 756F743B20646972656374696F6E3D2671756F743B6C74722671756F743B2074 + 6578744C656E6774683D2671756F743B382E3334343030312671756F743B2667 + 743B3F266C743B2F747370616E2667743B262378413B20202020266C743B2F74 + 6578742667743B262378413B2020266C743B2F672667743B262378413B266C74 + 3B2F7376672667743B262378413B222F3E0A20203C4974656D35205356473D22 + 266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B + 20656E636F64696E673D2671756F743B7574662D382671756F743B3F2667743B + 262378413B266C743B7376672077696474683D2671756F743B33322671756F74 + 3B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72672F + 323030302F7376672671756F743B206865696768743D2671756F743B33322671 + 756F743B2076696577426F783D2671756F743B3020302033322033322671756F + 743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F77 + 77772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B7363 + 6170652671756F743B2667743B262378413B2020266C743B67206F7061636974 + 793D2671756F743B312671756F743B20786D6C6E733A626772613D2671756F74 + 3B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A + 5061696E745F5356475F666F726D61742671756F743B20696E6B73636170653A + 6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73636170 + 653A67726F75706D6F64653D2671756F743B6C617965722671756F743B206267 + 72613A6F726967696E616C56696577426F783D2671756F743B2D3130202D3120 + 35362033302671756F743B2667743B262378413B20202020266C743B70617468 + 20643D2671756F743B4D342032302032322032302032322031352E352032382E + 352032322032322032382E352032322032342034203234207A2671756F743B20 + 66696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671 + 756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F + 743B302E373932313536392671756F743B2F2667743B262378413B2020202026 + 6C743B7465787420783D2671756F743B342671756F743B20793D2671756F743B + 2D312671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B20 + 7374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73697A + 653D2671756F743B31342671756F743B20666F6E742D7374796C653D2671756F + 743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D2671756F74 + 3B4672656553616E732671756F743B20666F6E742D7765696768743D2671756F + 743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671756F + 743B302E393638363237352671756F743B20746578742D6465636F726174696F + 6E3D2671756F743B2671756F743B2667743B262378413B202020202020266C74 + 3B747370616E20783D2671756F743B342671756F743B20793D2671756F743B31 + 322671756F743B20646972656374696F6E3D2671756F743B6C74722671756F74 + 3B20746578744C656E6774683D2671756F743B32332E31353431332671756F74 + 3B2667743BCEB1CEB2CEB3266C743B2F747370616E2667743B262378413B2020 + 2020266C743B2F746578742667743B262378413B2020266C743B2F672667743B + 262378413B266C743B2F7376672667743B262378413B222F3E0A20203C497465 + 6D36205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B31 + 2E302671756F743B20656E636F64696E673D2671756F743B7574662D38267175 + 6F743B3F2667743B262378413B266C743B7376672077696474683D2671756F74 + 3B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F777777 + 2E77332E6F72672F323030302F7376672671756F743B206865696768743D2671 + 756F743B33322671756F743B2076696577426F783D2671756F743B3020302033 + 322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F743B + 687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D6573706163 + 65732F696E6B73636170652671756F743B2667743B262378413B2020266C743B + 67206F7061636974793D2671756F743B312671756F743B20786D6C6E733A6267 + 72613D2671756F743B68747470733A2F2F77696B692E6672656570617363616C + 2E6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B2069 + 6E6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F743B + 20696E6B73636170653A67726F75706D6F64653D2671756F743B6C6179657226 + 71756F743B20626772613A6F726967696E616C56696577426F783D2671756F74 + 3B2D313520302035392032392671756F743B2667743B262378413B2020202026 + 6C743B7061746820643D2671756F743B4D332E352032322031302031352E3520 + 31302032302032382032302032382032342031302032342031302032382E3520 7A2671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073 74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163 6974793D2671756F743B302E373932313536392671756F743B2F2667743B2623 - 78443B262378413B20202020266C743B7465787420783D2671756F743B342671 - 756F743B20793D2671756F743B2D312671756F743B2066696C6C3D2671756F74 - 3B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671 - 756F743B20666F6E742D73697A653D2671756F743B31342671756F743B20666F - 6E742D7374796C653D2671756F743B6E6F726D616C2671756F743B20666F6E74 - 2D66616D696C793D2671756F743B4672656553616E732671756F743B20666F6E - 742D7765696768743D2671756F743B6E6F726D616C2671756F743B2066696C6C - 2D6F7061636974793D2671756F743B302E393638363237352671756F743B2074 - 6578742D6465636F726174696F6E3D2671756F743B2671756F743B2667743B26 - 2378443B262378413B202020202020266C743B747370616E20783D2671756F74 - 3B342671756F743B20793D2671756F743B31322671756F743B20646972656374 - 696F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D26 - 71756F743B32332E31353431332671756F743B2667743BCEB1CEB2CEB3266C74 - 3B2F747370616E2667743B262378443B262378413B20202020266C743B2F7465 - 78742667743B262378443B262378413B2020266C743B2F672667743B26237844 - 3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D - 0A20203C4974656D36205356473D22266C743B3F786D6C2076657273696F6E3D - 2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75 - 74662D382671756F743B3F2667743B262378443B262378413B266C743B737667 - 2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F - 743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F - 743B206865696768743D2671756F743B33322671756F743B2076696577426F78 - 3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B - 73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E - 6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774 - 3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74 - 3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A - 2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53 - 56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26 - 71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570 - 6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967 - 696E616C56696577426F783D2671756F743B2D31352030203539203239267175 - 6F743B2667743B262378443B262378413B20202020266C743B7061746820643D - 2671756F743B4D332E352032322031302031352E352031302032302032382032 - 302032382032342031302032342031302032382E35207A2671756F743B206669 - 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F - 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B - 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 - 2020266C743B7465787420783D2671756F743B302671756F743B20793D267175 - 6F743B302671756F743B2066696C6C3D2671756F743B626C61636B2671756F74 - 3B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73 - 697A653D2671756F743B31352671756F743B20666F6E742D7374796C653D2671 - 756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D267175 - 6F743B4672656553616E732671756F743B20666F6E742D7765696768743D2671 - 756F743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671 - 756F743B302E393638363237352671756F743B20746578742D6465636F726174 - 696F6E3D2671756F743B2671756F743B2667743B262378443B262378413B2020 + 78413B20202020266C743B7465787420783D2671756F743B302671756F743B20 + 793D2671756F743B302671756F743B2066696C6C3D2671756F743B626C61636B + 2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066 + 6F6E742D73697A653D2671756F743B31352671756F743B20666F6E742D737479 + 6C653D2671756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C + 793D2671756F743B4672656553616E732671756F743B20666F6E742D77656967 + 68743D2671756F743B6E6F726D616C2671756F743B2066696C6C2D6F70616369 + 74793D2671756F743B302E393638363237352671756F743B20746578742D6465 + 636F726174696F6E3D2671756F743B2671756F743B2667743B262378413B2020 20202020266C743B747370616E20783D2671756F743B32392671756F743B2079 3D2671756F743B31342671756F743B20646972656374696F6E3D2671756F743B 72746C2671756F743B20746578744C656E6774683D2671756F743B32322E3536 382671756F743B2667743BD790D791D792266C743B2F747370616E2667743B26 - 2378443B262378413B20202020266C743B2F746578742667743B262378443B26 - 2378413B2020266C743B2F672667743B262378443B262378413B266C743B2F73 - 76672667743B262378443B262378413B222F3E0D0A20203C4974656D37205356 - 473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E30267175 - 6F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F26 - 67743B262378443B262378413B266C743B7376672077696474683D2671756F74 - 3B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F777777 - 2E77332E6F72672F323030302F7376672671756F743B206865696768743D2671 - 756F743B33322671756F743B2076696577426F783D2671756F743B3020302033 - 322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F743B - 687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D6573706163 - 65732F696E6B73636170652671756F743B2667743B262378443B262378413B20 - 20266C743B67206F7061636974793D2671756F743B312671756F743B20786D6C - 6E733A626772613D2671756F743B68747470733A2F2F77696B692E6672656570 - 617363616C2E6F72672F4C617A5061696E745F5356475F666F726D6174267175 - 6F743B20696E6B73636170653A6C6162656C3D2671756F743B4C617965723126 - 71756F743B20696E6B73636170653A67726F75706D6F64653D2671756F743B6C - 617965722671756F743B20626772613A6F726967696E616C56696577426F783D - 2671756F743B3220342032382031342671756F743B2667743B262378443B2623 - 78413B20202020266C743B646566732667743B262378443B262378413B202020 - 202020266C743B6C696E6561724772616469656E742069643D2671756F743B6C - 61796572312D66696C6C67726164312671756F743B2078313D2671756F743B31 - 352671756F743B2078323D2671756F743B31352671756F743B2079313D267175 - 6F743B322E352671756F743B2079323D2671756F743B362E352671756F743B20 - 7370726561644D6574686F643D2671756F743B7265706561742671756F743B20 - 6772616469656E74556E6974733D2671756F743B7573657253706163654F6E55 - 73652671756F743B20636F6C6F722D696E746572706F6C6174696F6E3D267175 - 6F743B6C696E6561725247422671756F743B2667743B262378443B262378413B - 2020202020202020266C743B73746F70206F66667365743D2671756F743B3026 - 71756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F - 743B2073746F702D6F7061636974793D2671756F743B302E3439383033393226 - 71756F743B2F2667743B262378443B262378413B2020202020202020266C743B - 73746F70206F66667365743D2671756F743B302E303632352671756F743B2073 - 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 - 2D6F7061636974793D2671756F743B302E333039383033392671756F743B2F26 - 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 - 667365743D2671756F743B302E3132352671756F743B2073746F702D636F6C6F - 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479 - 3D2671756F743B302E3134353039382671756F743B2F2667743B262378443B26 - 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F - 743B302E313837352671756F743B2073746F702D636F6C6F723D2671756F743B - 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30 - 2E30333532393431322671756F743B2F2667743B262378443B262378413B2020 - 202020202020266C743B73746F70206F66667365743D2671756F743B302E3235 - 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 - 6F743B2073746F702D6F7061636974793D2671756F743B302671756F743B2F26 - 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 - 667365743D2671756F743B302E333132352671756F743B2073746F702D636F6C + 2378413B20202020266C743B2F746578742667743B262378413B2020266C743B + 2F672667743B262378413B266C743B2F7376672667743B262378413B222F3E0A + 20203C4974656D37205356473D22266C743B3F786D6C2076657273696F6E3D26 + 71756F743B312E302671756F743B20656E636F64696E673D2671756F743B7574 + 662D382671756F743B3F2667743B262378413B266C743B737667207769647468 + 3D2671756F743B33322671756F743B20786D6C6E733D2671756F743B68747470 + 3A2F2F7777772E77332E6F72672F323030302F7376672671756F743B20686569 + 6768743D2671756F743B33322671756F743B2076696577426F783D2671756F74 + 3B3020302033322033322671756F743B20786D6C6E733A696E6B73636170653D + 2671756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E61 + 6D657370616365732F696E6B73636170652671756F743B2667743B262378413B + 2020266C743B67206F7061636974793D2671756F743B312671756F743B20786D + 6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E66726565 + 70617363616C2E6F72672F4C617A5061696E745F5356475F666F726D61742671 + 756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C6179657231 + 2671756F743B20696E6B73636170653A67726F75706D6F64653D2671756F743B + 6C617965722671756F743B20626772613A6F726967696E616C56696577426F78 + 3D2671756F743B3220342032382031342671756F743B2667743B262378413B20 + 202020266C743B646566732667743B262378413B202020202020266C743B6C69 + 6E6561724772616469656E742069643D2671756F743B6C61796572312D66696C + 6C67726164312671756F743B2078313D2671756F743B31352671756F743B2078 + 323D2671756F743B31352671756F743B2079313D2671756F743B322E35267175 + 6F743B2079323D2671756F743B362E352671756F743B207370726561644D6574 + 686F643D2671756F743B7265706561742671756F743B206772616469656E7455 + 6E6974733D2671756F743B7573657253706163654F6E5573652671756F743B20 + 636F6C6F722D696E746572706F6C6174696F6E3D2671756F743B6C696E656172 + 5247422671756F743B2667743B262378413B2020202020202020266C743B7374 + 6F70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E30333532393431322671756F743B2F2667743B262378 - 443B262378413B2020202020202020266C743B73746F70206F66667365743D26 - 71756F743B302E3337352671756F743B2073746F702D636F6C6F723D2671756F - 743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74 - 3B302E3134353039382671756F743B2F2667743B262378443B262378413B2020 - 202020202020266C743B73746F70206F66667365743D2671756F743B302E3433 - 37352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 - 71756F743B2073746F702D6F7061636974793D2671756F743B302E3330393830 - 33392671756F743B2F2667743B262378443B262378413B202020202020202026 - 6C743B73746F70206F66667365743D2671756F743B302E352671756F743B2073 + 793D2671756F743B302E343938303339322671756F743B2F2667743B26237841 + 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 + 2E303632352671756F743B2073746F702D636F6C6F723D2671756F743B626C61 + 636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E3330 + 39383033392671756F743B2F2667743B262378413B2020202020202020266C74 + 3B73746F70206F66667365743D2671756F743B302E3132352671756F743B2073 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 - 2D6F7061636974793D2671756F743B302E343938303339322671756F743B2F26 - 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 - 667365743D2671756F743B302E353632352671756F743B2073746F702D636F6C + 2D6F7061636974793D2671756F743B302E3134353039382671756F743B2F2667 + 743B262378413B2020202020202020266C743B73746F70206F66667365743D26 + 71756F743B302E313837352671756F743B2073746F702D636F6C6F723D267175 + 6F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F + 743B302E30333532393431322671756F743B2F2667743B262378413B20202020 + 20202020266C743B73746F70206F66667365743D2671756F743B302E32352671 + 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 + 3B2073746F702D6F7061636974793D2671756F743B302671756F743B2F266774 + 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 + 756F743B302E333132352671756F743B2073746F702D636F6C6F723D2671756F + 743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74 + 3B302E30333532393431322671756F743B2F2667743B262378413B2020202020 + 202020266C743B73746F70206F66667365743D2671756F743B302E3337352671 + 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 + 3B2073746F702D6F7061636974793D2671756F743B302E313435303938267175 + 6F743B2F2667743B262378413B2020202020202020266C743B73746F70206F66 + 667365743D2671756F743B302E343337352671756F743B2073746F702D636F6C 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E363930313936312671756F743B2F2667743B26237844 + 793D2671756F743B302E333039383033392671756F743B2F2667743B26237841 + 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 + 2E352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 + 71756F743B2073746F702D6F7061636974793D2671756F743B302E3439383033 + 39322671756F743B2F2667743B262378413B2020202020202020266C743B7374 + 6F70206F66667365743D2671756F743B302E353632352671756F743B2073746F + 702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F + 7061636974793D2671756F743B302E363930313936312671756F743B2F266774 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 756F743B302E3632352671756F743B2073746F702D636F6C6F723D2671756F74 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E3835343930322671756F743B2F2667743B262378443B262378413B202020 - 2020202020266C743B73746F70206F66667365743D2671756F743B302E363837 - 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 - 756F743B2073746F702D6F7061636974793D2671756F743B302E393634373035 - 392671756F743B2F2667743B262378443B262378413B2020202020202020266C - 743B73746F70206F66667365743D2671756F743B302E37352671756F743B2073 - 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 - 2D6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B - 262378413B2020202020202020266C743B73746F70206F66667365743D267175 - 6F743B302E383132352671756F743B2073746F702D636F6C6F723D2671756F74 - 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E393634373035392671756F743B2F2667743B262378443B262378413B2020 - 202020202020266C743B73746F70206F66667365743D2671756F743B302E3837 - 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 - 756F743B2073746F702D6F7061636974793D2671756F743B302E383534393032 - 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74 - 3B73746F70206F66667365743D2671756F743B302E393337352671756F743B20 - 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F - 702D6F7061636974793D2671756F743B302E363930313936312671756F743B2F - 2667743B262378443B262378413B2020202020202020266C743B73746F70206F - 66667365743D2671756F743B312671756F743B2073746F702D636F6C6F723D26 + 302E3835343930322671756F743B2F2667743B262378413B2020202020202020 + 266C743B73746F70206F66667365743D2671756F743B302E363837352671756F + 743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B20 + 73746F702D6F7061636974793D2671756F743B302E393634373035392671756F + 743B2F2667743B262378413B2020202020202020266C743B73746F70206F6666 + 7365743D2671756F743B302E37352671756F743B2073746F702D636F6C6F723D + 2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D26 + 71756F743B312671756F743B2F2667743B262378413B2020202020202020266C + 743B73746F70206F66667365743D2671756F743B302E383132352671756F743B + 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 + 6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B + 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 + 743D2671756F743B302E3837352671756F743B2073746F702D636F6C6F723D26 71756F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671 - 756F743B302E343938303339322671756F743B2F2667743B262378443B262378 - 413B202020202020266C743B2F6C696E6561724772616469656E742667743B26 - 2378443B262378413B20202020266C743B2F646566732667743B262378443B26 - 2378413B20202020266C743B7061746820643D2671756F743B4D352E35203420 - 352E352036203720382037203130203220313220322031382033302031382033 - 3020313220323520313020323520382032362E3520362032362E352034207A26 - 71756F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C - 6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E6526 - 71756F743B2F2667743B262378443B262378413B2020266C743B2F672667743B - 262378443B262378413B266C743B2F7376672667743B262378443B262378413B - 222F3E0D0A20203C4974656D38205356473D22266C743B3F786D6C2076657273 - 696F6E3D2671756F743B312E302671756F743B20656E636F64696E673D267175 - 6F743B7574662D382671756F743B3F2667743B262378443B262378413B266C74 - 3B7376672077696474683D2671756F743B33322671756F743B20786D6C6E733D - 2671756F743B687474703A2F2F7777772E77332E6F72672F323030302F737667 - 2671756F743B206865696768743D2671756F743B33322671756F743B20766965 - 77426F783D2671756F743B3020302033322033322671756F743B20786D6C6E73 - 3A696E6B73636170653D2671756F743B687474703A2F2F7777772E696E6B7363 - 6170652E6F72672F6E616D657370616365732F696E6B73636170652671756F74 - 3B2667743B262378443B262378413B2020266C743B67206F7061636974793D26 - 71756F743B312671756F743B20786D6C6E733A626772613D2671756F743B6874 - 7470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A506169 - 6E745F5356475F666F726D61742671756F743B20696E6B73636170653A6C6162 - 656C3D2671756F743B4C61796572312671756F743B20696E6B73636170653A67 - 726F75706D6F64653D2671756F743B6C617965722671756F743B20626772613A - 6F726967696E616C56696577426F783D2671756F743B32203920323820313426 - 71756F743B2667743B262378443B262378413B20202020266C743B6465667326 - 67743B262378443B262378413B202020202020266C743B6C696E656172477261 - 6469656E742069643D2671756F743B6C61796572312D66696C6C677261643126 - 71756F743B2078313D2671756F743B31352671756F743B2078323D2671756F74 - 3B31352671756F743B2079313D2671756F743B372E352671756F743B2079323D - 2671756F743B31312E352671756F743B207370726561644D6574686F643D2671 - 756F743B7265706561742671756F743B206772616469656E74556E6974733D26 - 71756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D - 696E746572706F6C6174696F6E3D2671756F743B6C696E656172524742267175 - 6F743B2667743B262378443B262378413B2020202020202020266C743B73746F - 70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F - 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479 - 3D2671756F743B302E343938303339322671756F743B2F2667743B262378443B - 262378413B2020202020202020266C743B73746F70206F66667365743D267175 - 6F743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F74 - 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E333039383033392671756F743B2F2667743B262378443B262378413B2020 + 756F743B302E3835343930322671756F743B2F2667743B262378413B20202020 + 20202020266C743B73746F70206F66667365743D2671756F743B302E39333735 + 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 + 6F743B2073746F702D6F7061636974793D2671756F743B302E36393031393631 + 2671756F743B2F2667743B262378413B2020202020202020266C743B73746F70 + 206F66667365743D2671756F743B312671756F743B2073746F702D636F6C6F72 + 3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D + 2671756F743B302E343938303339322671756F743B2F2667743B262378413B20 + 2020202020266C743B2F6C696E6561724772616469656E742667743B26237841 + 3B20202020266C743B2F646566732667743B262378413B20202020266C743B70 + 61746820643D2671756F743B4D352E35203420352E3520362037203820372031 + 3020322031322032203138203330203138203330203132203235203130203235 + 20382032362E3520362032362E352034207A2671756F743B2066696C6C3D2671 + 756F743B75726C28236C61796572312D66696C6C6772616431292671756F743B + 207374726F6B653D2671756F743B6E6F6E652671756F743B2F2667743B262378 + 413B2020266C743B2F672667743B262378413B266C743B2F7376672667743B26 + 2378413B222F3E0A20203C4974656D38205356473D22266C743B3F786D6C2076 + 657273696F6E3D2671756F743B312E302671756F743B20656E636F64696E673D + 2671756F743B7574662D382671756F743B3F2667743B262378413B266C743B73 + 76672077696474683D2671756F743B33322671756F743B20786D6C6E733D2671 + 756F743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671 + 756F743B206865696768743D2671756F743B33322671756F743B207669657742 + 6F783D2671756F743B3020302033322033322671756F743B20786D6C6E733A69 + 6E6B73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170 + 652E6F72672F6E616D657370616365732F696E6B73636170652671756F743B26 + 67743B262378413B2020266C743B67206F7061636974793D2671756F743B3126 + 71756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77 + 696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F + 666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F + 743B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F64 + 653D2671756F743B6C617965722671756F743B20626772613A6F726967696E61 + 6C56696577426F783D2671756F743B3220392032382031342671756F743B2667 + 743B262378413B20202020266C743B646566732667743B262378413B20202020 + 2020266C743B6C696E6561724772616469656E742069643D2671756F743B6C61 + 796572312D66696C6C67726164312671756F743B2078313D2671756F743B3135 + 2671756F743B2078323D2671756F743B31352671756F743B2079313D2671756F + 743B372E352671756F743B2079323D2671756F743B31312E352671756F743B20 + 7370726561644D6574686F643D2671756F743B7265706561742671756F743B20 + 6772616469656E74556E6974733D2671756F743B7573657253706163654F6E55 + 73652671756F743B20636F6C6F722D696E746572706F6C6174696F6E3D267175 + 6F743B6C696E6561725247422671756F743B2667743B262378413B2020202020 + 202020266C743B73746F70206F66667365743D2671756F743B302671756F743B + 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 + 6F702D6F7061636974793D2671756F743B302E343938303339322671756F743B + 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 + 743D2671756F743B302E303632352671756F743B2073746F702D636F6C6F723D + 2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D26 + 71756F743B302E333039383033392671756F743B2F2667743B262378413B2020 202020202020266C743B73746F70206F66667365743D2671756F743B302E3132 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 756F743B2073746F702D6F7061636974793D2671756F743B302E313435303938 - 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74 - 3B73746F70206F66667365743D2671756F743B302E313837352671756F743B20 - 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F - 702D6F7061636974793D2671756F743B302E30333532393431322671756F743B - 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020 - 6F66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C - 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302671756F743B2F2667743B262378443B262378413B2020 - 202020202020266C743B73746F70206F66667365743D2671756F743B302E3331 - 32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 - 71756F743B2073746F702D6F7061636974793D2671756F743B302E3033353239 - 3431322671756F743B2F2667743B262378443B262378413B2020202020202020 - 266C743B73746F70206F66667365743D2671756F743B302E3337352671756F74 - 3B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073 - 746F702D6F7061636974793D2671756F743B302E3134353039382671756F743B - 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020 - 6F66667365743D2671756F743B302E343337352671756F743B2073746F702D63 + 2671756F743B2F2667743B262378413B2020202020202020266C743B73746F70 + 206F66667365743D2671756F743B302E313837352671756F743B2073746F702D + 636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061 + 636974793D2671756F743B302E30333532393431322671756F743B2F2667743B + 262378413B2020202020202020266C743B73746F70206F66667365743D267175 + 6F743B302E32352671756F743B2073746F702D636F6C6F723D2671756F743B62 + 6C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B3026 + 71756F743B2F2667743B262378413B2020202020202020266C743B73746F7020 + 6F66667365743D2671756F743B302E333132352671756F743B2073746F702D63 6F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F706163 - 6974793D2671756F743B302E333039383033392671756F743B2F2667743B2623 - 78443B262378413B2020202020202020266C743B73746F70206F66667365743D - 2671756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F74 - 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E343938303339322671756F743B2F2667743B262378443B262378413B2020 - 202020202020266C743B73746F70206F66667365743D2671756F743B302E3536 - 32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 - 71756F743B2073746F702D6F7061636974793D2671756F743B302E3639303139 - 36312671756F743B2F2667743B262378443B262378413B202020202020202026 - 6C743B73746F70206F66667365743D2671756F743B302E3632352671756F743B + 6974793D2671756F743B302E30333532393431322671756F743B2F2667743B26 + 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F + 743B302E3337352671756F743B2073746F702D636F6C6F723D2671756F743B62 + 6C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E + 3134353039382671756F743B2F2667743B262378413B2020202020202020266C + 743B73746F70206F66667365743D2671756F743B302E343337352671756F743B 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 - 6F702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F - 2667743B262378443B262378413B2020202020202020266C743B73746F70206F - 66667365743D2671756F743B302E363837352671756F743B2073746F702D636F + 6F702D6F7061636974793D2671756F743B302E333039383033392671756F743B + 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 + 743D2671756F743B302E352671756F743B2073746F702D636F6C6F723D267175 + 6F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F + 743B302E343938303339322671756F743B2F2667743B262378413B2020202020 + 202020266C743B73746F70206F66667365743D2671756F743B302E3536323526 + 71756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F + 743B2073746F702D6F7061636974793D2671756F743B302E3639303139363126 + 71756F743B2F2667743B262378413B2020202020202020266C743B73746F7020 + 6F66667365743D2671756F743B302E3632352671756F743B2073746F702D636F 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369 - 74793D2671756F743B302E393634373035392671756F743B2F2667743B262378 - 443B262378413B2020202020202020266C743B73746F70206F66667365743D26 - 71756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F74 + 74793D2671756F743B302E3835343930322671756F743B2F2667743B26237841 + 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 + 2E363837352671756F743B2073746F702D636F6C6F723D2671756F743B626C61 + 636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E3936 + 34373035392671756F743B2F2667743B262378413B2020202020202020266C74 + 3B73746F70206F66667365743D2671756F743B302E37352671756F743B207374 + 6F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D + 6F7061636974793D2671756F743B312671756F743B2F2667743B262378413B20 + 20202020202020266C743B73746F70206F66667365743D2671756F743B302E38 + 3132352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B + 2671756F743B2073746F702D6F7061636974793D2671756F743B302E39363437 + 3035392671756F743B2F2667743B262378413B2020202020202020266C743B73 + 746F70206F66667365743D2671756F743B302E3837352671756F743B2073746F + 702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F + 7061636974793D2671756F743B302E3835343930322671756F743B2F2667743B + 262378413B2020202020202020266C743B73746F70206F66667365743D267175 + 6F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F74 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 312671756F743B2F2667743B262378443B262378413B2020202020202020266C - 743B73746F70206F66667365743D2671756F743B302E383132352671756F743B - 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 - 6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B - 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020 - 6F66667365743D2671756F743B302E3837352671756F743B2073746F702D636F - 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369 - 74793D2671756F743B302E3835343930322671756F743B2F2667743B26237844 + 302E363930313936312671756F743B2F2667743B262378413B20202020202020 + 20266C743B73746F70206F66667365743D2671756F743B312671756F743B2073 + 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 + 2D6F7061636974793D2671756F743B302E343938303339322671756F743B2F26 + 67743B262378413B202020202020266C743B2F6C696E6561724772616469656E + 742667743B262378413B20202020266C743B2F646566732667743B262378413B + 20202020266C743B7061746820643D2671756F743B4D352E35203920352E3520 + 3131203720313320372031352032203137203220323320333020323320333020 + 31372032352031352032352031332032362E352031312032362E352039207A26 + 71756F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C + 6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E6526 + 71756F743B2F2667743B262378413B2020266C743B2F672667743B262378413B + 266C743B2F7376672667743B262378413B222F3E0A20203C4974656D39205356 + 473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E30267175 + 6F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F26 + 67743B262378413B266C743B7376672077696474683D2671756F743B33322671 + 756F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F + 72672F323030302F7376672671756F743B206865696768743D2671756F743B33 + 322671756F743B2076696577426F783D2671756F743B30203020333220333226 + 71756F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A + 2F2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E + 6B73636170652671756F743B2667743B262378413B2020266C743B67206F7061 + 636974793D2671756F743B312671756F743B20786D6C6E733A626772613D2671 + 756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F + 4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B736361 + 70653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73 + 636170653A67726F75706D6F64653D2671756F743B6C617965722671756F743B + 20626772613A6F726967696E616C56696577426F783D2671756F743B32203136 + 2032382031352671756F743B2667743B262378413B20202020266C743B646566 + 732667743B262378413B202020202020266C743B6C696E656172477261646965 + 6E742069643D2671756F743B6C61796572312D66696C6C67726164312671756F + 743B2078313D2671756F743B31352671756F743B2078323D2671756F743B3135 + 2671756F743B2079313D2671756F743B31342E35343136372671756F743B2079 + 323D2671756F743B31382E35343136372671756F743B207370726561644D6574 + 686F643D2671756F743B7265706561742671756F743B206772616469656E7455 + 6E6974733D2671756F743B7573657253706163654F6E5573652671756F743B20 + 636F6C6F722D696E746572706F6C6174696F6E3D2671756F743B6C696E656172 + 5247422671756F743B2667743B262378413B2020202020202020266C743B7374 + 6F70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C + 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 + 793D2671756F743B302E343938303339322671756F743B2F2667743B26237841 + 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 + 2E303632352671756F743B2073746F702D636F6C6F723D2671756F743B626C61 + 636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E3330 + 39383033392671756F743B2F2667743B262378413B2020202020202020266C74 + 3B73746F70206F66667365743D2671756F743B302E3132352671756F743B2073 + 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 + 2D6F7061636974793D2671756F743B302E3134353039382671756F743B2F2667 + 743B262378413B2020202020202020266C743B73746F70206F66667365743D26 + 71756F743B302E313837352671756F743B2073746F702D636F6C6F723D267175 + 6F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F + 743B302E30333532393431322671756F743B2F2667743B262378413B20202020 + 20202020266C743B73746F70206F66667365743D2671756F743B302E32352671 + 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 + 3B2073746F702D6F7061636974793D2671756F743B302671756F743B2F266774 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 - 756F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F + 756F743B302E333132352671756F743B2073746F702D636F6C6F723D2671756F 743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74 - 3B302E363930313936312671756F743B2F2667743B262378443B262378413B20 - 20202020202020266C743B73746F70206F66667365743D2671756F743B312671 + 3B302E30333532393431322671756F743B2F2667743B262378413B2020202020 + 202020266C743B73746F70206F66667365743D2671756F743B302E3337352671 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 - 3B2073746F702D6F7061636974793D2671756F743B302E343938303339322671 - 756F743B2F2667743B262378443B262378413B202020202020266C743B2F6C69 - 6E6561724772616469656E742667743B262378443B262378413B20202020266C - 743B2F646566732667743B262378443B262378413B20202020266C743B706174 - 6820643D2671756F743B4D352E35203920352E35203131203720313320372031 - 3520322031372032203233203330203233203330203137203235203135203235 - 2031332032362E352031312032362E352039207A2671756F743B2066696C6C3D - 2671756F743B75726C28236C61796572312D66696C6C6772616431292671756F - 743B207374726F6B653D2671756F743B6E6F6E652671756F743B2F2667743B26 - 2378443B262378413B2020266C743B2F672667743B262378443B262378413B26 - 6C743B2F7376672667743B262378443B262378413B222F3E0D0A20203C497465 - 6D39205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B31 - 2E302671756F743B20656E636F64696E673D2671756F743B7574662D38267175 - 6F743B3F2667743B262378443B262378413B266C743B7376672077696474683D - 2671756F743B33322671756F743B20786D6C6E733D2671756F743B687474703A - 2F2F7777772E77332E6F72672F323030302F7376672671756F743B2068656967 - 68743D2671756F743B33322671756F743B2076696577426F783D2671756F743B - 3020302033322033322671756F743B20786D6C6E733A696E6B73636170653D26 - 71756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D - 657370616365732F696E6B73636170652671756F743B2667743B262378443B26 - 2378413B2020266C743B67206F7061636974793D2671756F743B312671756F74 - 3B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E - 6672656570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D - 61742671756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61 - 796572312671756F743B20696E6B73636170653A67726F75706D6F64653D2671 - 756F743B6C617965722671756F743B20626772613A6F726967696E616C566965 - 77426F783D2671756F743B322031362032382031352671756F743B2667743B26 - 2378443B262378413B20202020266C743B646566732667743B262378443B2623 - 78413B202020202020266C743B6C696E6561724772616469656E742069643D26 - 71756F743B6C61796572312D66696C6C67726164312671756F743B2078313D26 - 71756F743B31352671756F743B2078323D2671756F743B31352671756F743B20 - 79313D2671756F743B31342E35343136372671756F743B2079323D2671756F74 - 3B31382E35343136372671756F743B207370726561644D6574686F643D267175 - 6F743B7265706561742671756F743B206772616469656E74556E6974733D2671 - 756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D69 - 6E746572706F6C6174696F6E3D2671756F743B6C696E6561725247422671756F - 743B2667743B262378443B262378413B2020202020202020266C743B73746F70 - 206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F72 - 3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D - 2671756F743B302E343938303339322671756F743B2F2667743B262378443B26 - 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F - 743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F743B - 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30 - 2E333039383033392671756F743B2F2667743B262378443B262378413B202020 - 2020202020266C743B73746F70206F66667365743D2671756F743B302E313235 - 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 - 6F743B2073746F702D6F7061636974793D2671756F743B302E31343530393826 - 71756F743B2F2667743B262378443B262378413B2020202020202020266C743B - 73746F70206F66667365743D2671756F743B302E313837352671756F743B2073 - 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 - 2D6F7061636974793D2671756F743B302E30333532393431322671756F743B2F - 2667743B262378443B262378413B2020202020202020266C743B73746F70206F - 66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C6F - 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479 - 3D2671756F743B302671756F743B2F2667743B262378443B262378413B202020 - 2020202020266C743B73746F70206F66667365743D2671756F743B302E333132 - 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 - 756F743B2073746F702D6F7061636974793D2671756F743B302E303335323934 - 31322671756F743B2F2667743B262378443B262378413B202020202020202026 - 6C743B73746F70206F66667365743D2671756F743B302E3337352671756F743B - 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 - 6F702D6F7061636974793D2671756F743B302E3134353039382671756F743B2F - 2667743B262378443B262378413B2020202020202020266C743B73746F70206F - 66667365743D2671756F743B302E343337352671756F743B2073746F702D636F - 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369 - 74793D2671756F743B302E333039383033392671756F743B2F2667743B262378 - 443B262378413B2020202020202020266C743B73746F70206F66667365743D26 - 71756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F743B - 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30 - 2E343938303339322671756F743B2F2667743B262378443B262378413B202020 - 2020202020266C743B73746F70206F66667365743D2671756F743B302E353632 - 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 - 756F743B2073746F702D6F7061636974793D2671756F743B302E363930313936 - 312671756F743B2F2667743B262378443B262378413B2020202020202020266C - 743B73746F70206F66667365743D2671756F743B302E3632352671756F743B20 - 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F - 702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F26 - 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 - 667365743D2671756F743B302E363837352671756F743B2073746F702D636F6C + 3B2073746F702D6F7061636974793D2671756F743B302E313435303938267175 + 6F743B2F2667743B262378413B2020202020202020266C743B73746F70206F66 + 667365743D2671756F743B302E343337352671756F743B2073746F702D636F6C 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E393634373035392671756F743B2F2667743B26237844 + 793D2671756F743B302E333039383033392671756F743B2F2667743B26237841 + 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 + 2E352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 + 71756F743B2073746F702D6F7061636974793D2671756F743B302E3439383033 + 39322671756F743B2F2667743B262378413B2020202020202020266C743B7374 + 6F70206F66667365743D2671756F743B302E353632352671756F743B2073746F + 702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F + 7061636974793D2671756F743B302E363930313936312671756F743B2F266774 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 - 756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F743B - 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B31 - 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74 - 3B73746F70206F66667365743D2671756F743B302E383132352671756F743B20 - 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F - 702D6F7061636974793D2671756F743B302E393634373035392671756F743B2F - 2667743B262378443B262378413B2020202020202020266C743B73746F70206F - 66667365743D2671756F743B302E3837352671756F743B2073746F702D636F6C - 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E3835343930322671756F743B2F2667743B262378443B - 262378413B2020202020202020266C743B73746F70206F66667365743D267175 - 6F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F74 + 756F743B302E3632352671756F743B2073746F702D636F6C6F723D2671756F74 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E363930313936312671756F743B2F2667743B262378443B262378413B2020 - 202020202020266C743B73746F70206F66667365743D2671756F743B31267175 - 6F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B - 2073746F702D6F7061636974793D2671756F743B302E34393830333932267175 - 6F743B2F2667743B262378443B262378413B202020202020266C743B2F6C696E - 6561724772616469656E742667743B262378443B262378413B20202020266C74 - 3B2F646566732667743B262378443B262378413B20202020266C743B70617468 - 20643D2671756F743B4D352E352031362E303431363620352E352031382E3034 - 31363620372032302E303431363620372032322E303431363620322032342E30 - 3431363620322033302E30343136362033302033302E30343136362033302032 - 342E30343136362032352032322E30343136362032352032302E303431363620 - 32362E352031382E30343136362032362E352031362E3034313636207A267175 - 6F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C6C67 - 72616431292671756F743B207374726F6B653D2671756F743B6E6F6E65267175 - 6F743B2F2667743B262378443B262378413B2020266C743B2F672667743B2623 - 78443B262378413B266C743B2F7376672667743B262378443B262378413B222F - 3E0D0A3C2F434F4E4649473E0D0A + 302E3835343930322671756F743B2F2667743B262378413B2020202020202020 + 266C743B73746F70206F66667365743D2671756F743B302E363837352671756F + 743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B20 + 73746F702D6F7061636974793D2671756F743B302E393634373035392671756F + 743B2F2667743B262378413B2020202020202020266C743B73746F70206F6666 + 7365743D2671756F743B302E37352671756F743B2073746F702D636F6C6F723D + 2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D26 + 71756F743B312671756F743B2F2667743B262378413B2020202020202020266C + 743B73746F70206F66667365743D2671756F743B302E383132352671756F743B + 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 + 6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B + 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 + 743D2671756F743B302E3837352671756F743B2073746F702D636F6C6F723D26 + 71756F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671 + 756F743B302E3835343930322671756F743B2F2667743B262378413B20202020 + 20202020266C743B73746F70206F66667365743D2671756F743B302E39333735 + 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 + 6F743B2073746F702D6F7061636974793D2671756F743B302E36393031393631 + 2671756F743B2F2667743B262378413B2020202020202020266C743B73746F70 + 206F66667365743D2671756F743B312671756F743B2073746F702D636F6C6F72 + 3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D + 2671756F743B302E343938303339322671756F743B2F2667743B262378413B20 + 2020202020266C743B2F6C696E6561724772616469656E742667743B26237841 + 3B20202020266C743B2F646566732667743B262378413B20202020266C743B70 + 61746820643D2671756F743B4D352E352031362E303431363620352E35203138 + 2E303431363620372032302E303431363620372032322E303431363620322032 + 342E303431363620322033302E30343136362033302033302E30343136362033 + 302032342E30343136362032352032322E30343136362032352032302E303431 + 36362032362E352031382E30343136362032362E352031362E3034313636207A + 2671756F743B2066696C6C3D2671756F743B75726C28236C61796572312D6669 + 6C6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E65 + 2671756F743B2F2667743B262378413B2020266C743B2F672667743B26237841 + 3B266C743B2F7376672667743B262378413B222F3E0A3C2F434F4E4649473E0A } end object SVGRasterImageList1: TBGRAImageList @@ -13426,38 +13429,112 @@ object FMain: TFMain Left = 653 Top = 216 Bitmap = { - 4C7A0A0000001000000010000000D90300000000000078DAED9AEB4B145118C6 - 77575D3745BBA1959154BA84A56592D98D0AA220A80F29DDCBB2302FA4D03D2A - A3AB9154DA05CC2222A1A2E80A417401A53B5B7D32128CBEF4298220A83FA0E7 - D0B3701866C63367B6B5705EF831EC719E3967CE9CF73DEF7BD0E78BB915814A - 52A4A117BA08A9ECE7FA765E3BC165B01C2469E8659A81DFC1F81340189C97DA - 8B35DE7F8CD4BE5A435F20B5AF70A04F0685E0AAD49EE762FE0E6ACCFF73700D - 94733E3D8BAF35F03BCCD7D4DF032F40AA8B318434754BB9A6066968878337E0 - 7E2F3E6F65EB396F559A63BF497DB6867602B59734FBDE417D998636113CE637 - 4FD7D0CF61DFC73DD78BBBD5839986F5BE1DCC50D43FA2BF05A4B667A04251DF - 01AA0D7A27B9C0BFA0DF2CED53E90EF54F4093A45FE0502F7CE6153802F682EB - 0EF503C13EEEB7621C59A011CC8BC3DA6B35C9178CB4FE45BD67B135BF42BE6D - 6622BFBCC0752CBED91DEE09AA7BCF43F01AEC67DC69E75E94A5A0CF649F270D - 3140A56E13BAB7E03BF8057E802FE083610D16D9E805EFC027F015FCE4B3BE81 - F7367A2B0B329E09DD1285FBA37546BD212688B6950A7A11B71EF0DB1D039B58 - 333D653EA562D9D47490168EAB3F59126BAF10D7B4134B609C1375EF477E4B27 - 6B7928D80546D1173F731D39B561E0369FA553B7AD03A7C000CD395CC6BA37E0 - D05FE49A3953CA85820ADA169BBFB7D83C23AA8DD8E82316CF90B52A189FE156 - EF76FCB1983F9FC2370AC6D17727B1762A5058FB41D66B22EF1E0F66315F6BE4 - B5803E99225D659B0E6A402D3804CE809DCC051B78DEB3182CE235D3A017FBC3 - 36309BDA5BFC5DCF3DB49A35C00DB015A419F41BC11E500A2E527F94E735A2FF - 0D6037BF7FB9C9FB17B25DF473009CA3DF8B3ED7704EAAF8EC628B3C6304C805 - A3390E113B4AD8EE67FEBA4A710F1279C25843DC116DE35CC422D5F5EBD3F49F - 884BFF75AB773BFE78CC5FBCFCBFAF4CC499C1CC19C43A1DC233B7007388E8FB - A758E847B27EAFA5AF74B20614EDF9602D7392C336F9BEC84D4FF0BE0C709AB9 - 7B1ACF0116829716FA14F6D12CE53C15F4DD69E02EEBE3B316EF3E155CE13A99 - CB7C57C4912D7CA732B637999C4526307E4C061379DE51CA9C57C4CC299C073F - DF215563FF52C91D222EB5AAC452EF76FCB198BFFEE2E35626F6BA1E454A2C7C - 57D45DE15EC8F6599F85D729F45D67A24B664E92A3D07F0EEF4D96F43D9A442D - AC49ACFAF7CCB3FFDD12996FA860769E21F6DE6E059FE9E6BD6696A1E0B31916 - 5A5127B429F4DFC67B8DDA5C077123D7F08CBE8E5F759A78E699677F4C9C4B74 - 2962768611A04FE6F742D8E63CB346A1EF1A135D88F1284FA1FF3CDE2BFF3F46 - 972651CBD72456FD6BDB6F31F08DBA + 4C7A0A0000001000000010000000EA0300000000000078DAED9AEB4B544118C6 + D75D37AD4C23D8D22E4BA17E902CCA08298C0A2A3F5474CFA28C6E6A566B4214 + DD9422E94A6550A84108A10905511104151815956B116165D8A7FA521441507F + 40CFD0B3309CCE9E9D33E7A849E7851F2B73CE33333B33EFFBCE8CEBF3B96E05 + A08C1468E8852E4ACAFE73FD157E3E04CDA0040435F432E740928DFE07402E68 + 94CAA76B7CFF0952F93A0DFD24A97C8D0D7D0A98025AA5F23C07E3774463FC1F + 83AB6003C7D3B3BEB51ACEC37C4DFD4DF0040C75D087544DDD2AAEA9E11ADA4C + F01CDC4AE0F3F16C23C7AD42B3EFD7A80F6B6827527B59B3ED3DD4AFD0D02683 + 7B9CF3740DFD6CB67DD2733D5B26D6E841B01AF8A57211AF8F818C047A3FE7ED + 8421CECEE35C8E55D0B783B3067D31E773DC00D1B718F42B15F5C2EE800E9026 + D5D96A43BF1F3C03F741C4907755F483F8FD3B58CF75E65CA1CFB2B196FCFD90 + 6B1B4CF60B461A7A51EF99FBF128A8A113F1EA1278CA39BBC19CA09A7BEE72ED + D7824DDC478AF8355A413F926D9E31C45095739BD07582EFE017F8013E813786 + 355860A117BC001FC017F093757D052F2DF456F1601B75CB14DE8F9D33AAA4B2 + 0C96AD55D0071803C5DC1D07E53C333DE07E4AC5C2D4B4937AF66BA0AD7DBFE6 + BEB190E3F78DB93CD9A6BE9ABA2AE691348D3E6473EC6B7806B46BBBE87FE99A + E3B788E7E4A0A65EECFBE770FDFB6CFA8BCEB3D8F37A8BE7F51675C4B4510B7D + 344E1DB25605631D4EF54EFBEFC6F8B9317F6ED918AEBF03BC734A9477C4D974 + 2ED80C96F353F8CE79C65091C326B3DE3C937DFC2CEE1B8F326E36B0EDC3E014 + C76D2B5808D69BEC234B192B66B09E669E234A59E7053E177DA934394B2F605B + B5DC3BDF66FEAEA16607EB157BD1C526317114FB56C1774FB3CDBD1C8FF16037 + CF259916F1361673A78222F63396C38B88EA5DC31043FE1FEC2096D959BF3E4D + FF893AF45FA77AA7FDEF8BF1EB2BFFB76B01AEB920737D2A736E40EA77B2B436 + 930CEB5EDCE7BEA3AF8ABBE1B7DC3F94F0CEED2238C4B8F1DAE43E29897B8E28 + FF4E659C10F147DC5D2F01EFC14EF091BE21DB30E6EB57529FA7813AC6AD46C6 + 84CFF46B63FFCBF9BC93FBFC62C68116D6FB08CC642C6B032183BE9AB16B3BD8 + C25854C778B114ECE3BE3EC431CAE9A53592287FA968A30EB5AAB8A977DA7F37 + C6EF5FF7F1DE36E1BF3D8A14C6C99F61FABB15618B334D44A1ED88892E85FE99 + ADD07E36DF95CF243D9AC42C5713B7DAF7CCB3816E627F324211B3FB0C9193BB + 157CA6DB227F87147C3614472BEEC69B14DA6FF2FD7D8F9EC53EA9C68D1C431D + FD1DBF229A78E699677F4CDC55762962F6FB1F3F7D323F01B9BEF8FF97A85468 + BB32CE7D4716EF9612B59FC777E5DF63746912B37C4DDC6A5FDB7E034D569A1F + } + BitmapAdv = { + 4C69010000004C7A0A0000002000000020000000C70800000000000078DAED5D + 7D908D551C3ED76AEDAE6F858DC6473EA3C4B63E76521A46446ACA584D832217 + 25A4428A88C6129226934926B1A652610B490865E996BE7C954A354D52534DA5 + A6FFD2F9CD7DEEEC71E67DEF7DEFDDF39EF7B5FB7B669E3FEC9E7D9FF3FD9EE7 + 77CE7909C1380F107321EBB33EEBB37E50FA2AF74A6E945C2A3952B285657D9D + 0725174BE607A49FE076C94B03D427BE2E99ED63FFCB916C27395672A74BDA9B + 2DF5FF26929B1CD22EB538FE0639A4DD6C51BFBD43DA3D16F50B1DD2BE6B517F + B243DA572DE977937CCF21EDA33EE9D7966C2A59048D7297B40501CE3F4B029C + FFA8DDEB07A4BF4CB2A185F70F8DAD5D925B25D7484E93BC926D1383C1605841 + BE36276FB0AC3F58D39F68597FB6A6DFD9B2FE66457B6B407D204FB2AE642E0F + 076B58A4F5BB3E16B5EB49BEAF68EF90AC69517FA856F66996EB7E758063BE45 + C0F3ED784DFF4E8BDA11C9322DD6956F51BF402BFBB396EBFE114D7F88456D8A + A3ED16E7C63DF32CEAF7D7CA3ECF72DD3FA5E9F7B2A87DA1E401ED3D5FC3A2FE + ED5AD9275BAEFB524DBF2DBFFE190C4615C605221E436D90626D1D51D2D536A4 + 4DEF9622ACAB1F90EC94246D43A47B5072B421FD2CC90998EBCBE1F1DDCADE0A + E93E907C8DF5599FF5AB9CFE4D49F43BF8A41F55F447279927AFF349FF46C5E3 + 2E47599DDE110B7CD027AD8ECA7A9BCE36146A79206DDAEFDFE7837E22C6B45B + A98395F02114E71A8038C406258FA6F5A90DC628E58B213FA5D02957EAC60F7D + 017F3D019AFB350FF40EE20151457FBD0FEB903AE8E314E7B917A4BA2F16F133 + 27F590876892716A0AB5C02C5E1EFA86A8A8FCB98704A3AC7FDEE933180C0623 + BCA03599CDFDF61AF0802B44FCCC9DFA8E794B72BAE4453E69D319C6551EDE75 + B41E2EF041BFC4458FBCC01EED67BBB026368506F03E89E7BF2DE2E7C9EB2969 + 0A359F34DCA07E5771EE5E6B6B9774392EFEB4B2E8A6D5EF389FFBBCBEF63A24 + 7946F26F857F49FE28795CF243C36B30A7B5DF579ABE535E8E25C94B65F58987 + 254F39D485CADF258FFAA49FE04728EBF792BFB9E4E3A8C535309D3DB85BF3E6 + 4F07F03E2816E79EC53185C4D93ADA7B7E2549BAA6C2CC7D0B1D455A5B767749 + 778992E66583FA8DB5F997623D2344FC9E49AED207162A69C61A6EDB5969F8BD + E744E5EE3B3981E27CD3B47A70E2029FE7663AD7FFB888DF71DA8BF8DB56D47D + 2FC160540F4402D26D82F7CC439233256FC3FC68233FB9D0FC0C6B8013921F4B + 4EF1D177A8E800DD2D92A324EF92FC14EBA2CB2DE8D33AF845C91B5017E4C7D6 + 49FE2AD9C3823ED5714FF891087CC01B589B76B3DC0FAFC51A8BEA7F8E61BFE5 + C577AF15F1BD16F2BCCD2C8FC77C78C0D996CBAD969FFAFF655817D806DD27A7 + F32874CFBE5100FABD3107BD24D93200FDE622BE1FA8C700AA2A2EB6F4376E63 + 2D93BBEB9B45E5CFA427B433F9D645AC927950B533D5CF340FBA7665F4D3CD83 + 93B6097AC9835FDA5EF310B47ED0F51F86FE1786F11786F9270CF36F18DE3F8C + F0211771A861227EF6ADA5C575700DF83F3AF3B607FE8BEE9FF5B5E441C8033E + 29E2B1B7FB25A78AF85EE012431E9CCE74D1B79446C0D7D3DDB68192D788F85E + 27F94FFACED65CB4432368AF11F1FB973DB03EAF83E7D19E542FFCDC4B1B5D05 + 5FB91B1E8BE28CFBA0D1026B6EFAA6D564E4730CE201255897538CF479C92E78 + 1E9D8BA7EFD2CCF2B056CFC1DFEF477AEA5BF325BF907C41B28DE4ADC8D354D4 + CF11C9EFD01674EE7F3CF23B5289D7D09DB5C5F0EDA97C05EDEDD23E6B2B25E6 + B1D6417F92889F4DA5582CC55FE91B5B74269362F565689F1C78C452A4CB49A1 + DF1EF10D8A2127EE14D2BEEF139AFE769433827423E1C51FC69C4FDFBA5A0D9F + 588CB6BCC7C3F8A0FD839568FFC4BBA3359E45FA6DA15F8EF6A9853445E803F3 + 911F3A1BB90DF121CA0B7D83A7BB87BE97074FBF17FEAE07FAC361F4C53ED0A7 + 18D40ECC3F8588C551F9EFC3F8E98336A2EF30ED44DFF072473382B1538AB9A5 + 0CCFD9823E49B10E3A037D10319F6DCA3CB40A638740FB40745699F6E1D62B63 + C10BB251579350C7C3307E47603CDC81B2AF401DCD405FB84254DC85CCC2DF1E + 419C22D373A24EFD25D1FF47E1F76E7D6A3AC685E9FBF805A89BDE29D25D2FE2 + 7B926D0CEBE7A17DEBA648571B63D7E6F700C2B4FE32B9FECC04B180F3100B38 + 0F99FAAF20BDAF9FFA5EF35055F56DF7C358C063200CE32FC8F927E8F997FD3F + 83911EC81F36C6FA52F52BB5E0A3693C3713EE77E173902E57599747F0EFFA22 + F599A8BEF0F9CBE12513771DFBC183922F7C065E7A2AFC4E96A2D3177180F1A2 + E28C2C79FEA1F029A9F6C807C16BD399869FE0A1A93CB720BEB10E9EEC4BFC7E + B5F2CC08D6FCE4C54EC083D6858FA778C401F8F564A07AED047FF109F43A20AE + 43DEBC233C69143AA7903651077510933889180495E76AF8C74DA84F2FE80CDF + B851F1947A3B53FBD059D3854AACA726E23154FE33888D511D7D83366DEA51BF + 15FC6C99703F57417750E98CE932F45981BAA376A2B3B8BF48FE091E421C2295 + 178A208FC5F0ED6F0AF7336D0351C76AB9C89B7F8D722F82EEBFF0CACD3D94BB + 2B6218147FF85924FF6E797FF481843E796FBA87FA8FE463D0A358C60F4A3922 + 29E28A73D177B6C0E39F46FC833CEF708D14233A86D8CE28F8DCF9A8EFE97866 + 17C4324E2366996CAF7E20E2253B308EC722C6B10CB184CF359E84D61FC8EF10 + D4F9B7A2E2AC7196A8B81B7D1CEDE31683EC8E38CD00CC7DED103FA2313B1875 + 3BCB85A3316668FC4F442C4428F3CF60A4EB278239AF713EAFA532DD7F32A91D + 0B583B16B0762C606D930C523BECFA41D77F18FA5F18C65F18E69F30CCBFECE5 + 198CEA07DAB39B6398E9EC0352FAB38639270D7DF262330D967DA6B0733FC334 + 4C953F53986AFB74900DBF1D3558FE289E995D0DDA3AD33E71D632C3567E6EFF + 60DB9FC16030180C0683C16070FC89E34F1C7FE2F813C71F38FEC4EDCFF12706 + 83C16030180C068351D540DF989962983DD3F482FF19663A9E97CEBBD2FFAB5E + 6288F34466676823869829661862A630D5F6E980EEA8D13DB07106DB7F1C9E59 + D372BBA7D30F6658A65F6D9D699F28B14C5B6DEEB52F54F7F6CFB1CC50E07F7B + F54674 } end object TimerHideTextMore: TTimer diff --git a/lazpaint/lazpaintmainform.lrj b/lazpaint/lazpaintmainform.lrj index 2f7417d2..dc81d99d 100644 --- a/lazpaint/lazpaintmainform.lrj +++ b/lazpaint/lazpaintmainform.lrj @@ -1,334 +1,335 @@ -{"version":1,"strings":[ -{"hash":150371188,"name":"tfmain.caption","sourcebytes":[76,97,122,80,97,105,110,116],"value":"LazPaint"}, -{"hash":44380332,"name":"tfmain.image_currenttool.hint","sourcebytes":[83,101,108,101,99,116,101,100,32,116,111,111,108],"value":"Selected tool"}, -{"hash":30191261,"name":"tfmain.label_currentzoom.hint","sourcebytes":[67,117,114,114,101,110,116,32,122,111,111,109],"value":"Current zoom"}, -{"hash":37,"name":"tfmain.label_currentzoom.caption","sourcebytes":[37],"value":"%"}, -{"hash":176868709,"name":"tfmain.label_currentdiff.hint","sourcebytes":[67,111,108,111,114,32,100,105,102,102,101,114,101,110,99,101],"value":"Color difference"}, -{"hash":213797,"name":"tfmain.label_currentdiff.caption","sourcebytes":[49,48,48,37],"value":"100%"}, -{"hash":6159272,"name":"tfmain.label_penwidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"}, -{"hash":8236392,"name":"tfmain.spinedit_penwidth.hint","sourcebytes":[80,101,110,32,119,105,100,116,104],"value":"Pen width"}, -{"hash":5015701,"name":"tfmain.label_eraser.caption","sourcebytes":[69,114,97,115,101],"value":"Erase"}, -{"hash":219565076,"name":"tfmain.tool_erasealpha.hint","sourcebytes":[77,97,107,101,32,116,114,97,110,115,112,97,114,101,110,116],"value":"Make transparent"}, -{"hash":94755518,"name":"tfmain.tool_eraseblur.hint","sourcebytes":[83,111,102,116,101,110],"value":"Soften"}, -{"hash":50199278,"name":"tfmain.tool_eraselighten.hint","sourcebytes":[76,105,103,104,116,101,110],"value":"Lighten"}, -{"hash":78156222,"name":"tfmain.tool_erasedarken.hint","sourcebytes":[68,97,114,107,101,110],"value":"Darken"}, -{"hash":166237934,"name":"tfmain.tool_erasesharpen.hint","sourcebytes":[83,104,97,114,112,101,110],"value":"Sharpen"}, -{"hash":250503177,"name":"tfmain.spinedit_eraser.hint","sourcebytes":[69,114,97,115,101,114,32,111,112,97,99,105,116,121],"value":"Eraser opacity"}, -{"hash":46678005,"name":"tfmain.label_tolerance.caption","sourcebytes":[84,111,108,101,114,97,110,99,101],"value":"Tolerance"}, -{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.hint","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"}, -{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.caption","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"}, -{"hash":115147346,"name":"tfmain.tool_drawshapeborder.hint","sourcebytes":[68,114,97,119,32,98,111,114,100,101,114],"value":"Draw border"}, -{"hash":243087429,"name":"tfmain.tool_fillshape.hint","sourcebytes":[70,105,108,108,32,115,104,97,112,101],"value":"Fill shape"}, -{"hash":181333059,"name":"tfmain.label_coordinates.hint","sourcebytes":[67,111,111,114,100,105,110,97,116,101,115],"value":"Coordinates"}, -{"hash":218886153,"name":"tfmain.label_coordinates.caption","sourcebytes":[57,57,57,57,120,57,57,57,57],"value":"9999x9999"}, -{"hash":42364240,"name":"tfmain.tool_capflat.hint","sourcebytes":[70,108,97,116,32,99,97,112],"value":"Flat cap"}, -{"hash":205926624,"name":"tfmain.tool_capround.hint","sourcebytes":[82,111,117,110,100,32,99,97,112],"value":"Round cap"}, -{"hash":142786864,"name":"tfmain.tool_capsquare.hint","sourcebytes":[83,113,117,97,114,101,32,99,97,112],"value":"Square cap"}, -{"hash":224157463,"name":"tfmain.spinedit_arrowsizex.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Horizontal size of the arrow"}, -{"hash":47574855,"name":"tfmain.spinedit_arrowsizey.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Vertical size of the arrow"}, -{"hash":65090695,"name":"tfmain.combobox_arrowstart.hint","sourcebytes":[83,116,97,114,116,105,110,103,32,97,114,114,111,119],"value":"Starting arrow"}, -{"hash":229386535,"name":"tfmain.combobox_arrowend.hint","sourcebytes":[69,110,100,105,110,103,32,97,114,114,111,119],"value":"Ending arrow"}, -{"hash":199465278,"name":"tfmain.tool_joinbevel.hint","sourcebytes":[66,101,118,101,108,32,106,111,105,110],"value":"Bevel join"}, -{"hash":73704254,"name":"tfmain.tool_joinround.hint","sourcebytes":[82,111,117,110,100,32,106,111,105,110],"value":"Round join"}, -{"hash":205804894,"name":"tfmain.tool_joinmiter.hint","sourcebytes":[77,105,116,101,114,32,106,111,105,110],"value":"Miter join"}, -{"hash":8055525,"name":"tfmain.combobox_penstyle.hint","sourcebytes":[80,101,110,32,115,116,121,108,101],"value":"Pen style"}, -{"hash":321780,"name":"tfmain.label_grid.caption","sourcebytes":[71,114,105,100],"value":"Grid"}, -{"hash":120,"name":"tfmain.label_gridx.caption","sourcebytes":[120],"value":"x"}, -{"hash":65314814,"name":"tfmain.tool_gridmovewithoutdeformation.hint","sourcebytes":[77,111,118,101,32,103,114,105,100,32,119,105,116,104,111,117,116,32,100,101,102,111,114,109,97,116,105,111,110],"value":"Move grid without deformation"}, -{"hash":4901317,"name":"tfmain.label_curve.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"}, -{"hash":200334437,"name":"tfmain.tool_curvemodeangle.hint","sourcebytes":[68,114,97,119,32,97,110,32,97,110,103,108,101],"value":"Draw an angle"}, -{"hash":131219621,"name":"tfmain.tool_curvemodecurve.hint","sourcebytes":[68,114,97,119,32,97,32,99,117,114,118,101],"value":"Draw a curve"}, -{"hash":218543091,"name":"tfmain.tool_curvemodeauto.hint","sourcebytes":[65,117,116,111,100,101,116,101,99,116,32,97,110,103,108,101,115],"value":"Autodetect angles"}, -{"hash":125049492,"name":"tfmain.tool_curvemovepoint.hint","sourcebytes":[77,111,118,101,32,112,111,105,110,116],"value":"Move point"}, -{"hash":371956,"name":"tfmain.label_text.caption","sourcebytes":[84,101,120,116],"value":"Text"}, -{"hash":71566590,"name":"tfmain.tool_textfont.hint","sourcebytes":[67,104,111,111,115,101,32,102,111,110,116,46,46,46],"value":"Choose font..."}, -{"hash":180162887,"name":"tfmain.tool_textphong.hint","sourcebytes":[84,101,120,116,32,112,104,111,110,103,32,115,104,97,100,105,110,103],"value":"Text phong shading"}, -{"hash":235120932,"name":"tfmain.tool_textalignleft.hint","sourcebytes":[65,108,105,103,110,32,108,101,102,116],"value":"Align left"}, -{"hash":77355714,"name":"tfmain.tool_textaligncenter.hint","sourcebytes":[67,101,110,116,101,114],"value":"Center"}, -{"hash":3199508,"name":"tfmain.tool_textalignright.hint","sourcebytes":[65,108,105,103,110,32,114,105,103,104,116],"value":"Align right"}, -{"hash":258464709,"name":"tfmain.spinedit_textsize.hint","sourcebytes":[84,101,120,116,32,115,105,122,101],"value":"Text size"}, -{"hash":5892197,"name":"tfmain.label_shape.caption","sourcebytes":[83,104,97,112,101],"value":"Shape"}, -{"hash":76974786,"name":"tfmain.label_phongborder.caption","sourcebytes":[66,111,114,100,101,114],"value":"Border"}, -{"hash":178787989,"name":"tfmain.tool_phongshaperectangle.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"}, -{"hash":4807381,"name":"tfmain.tool_phongshaperoundrect.hint","sourcebytes":[82,111,117,110,100,101,100,32,114,101,99,116,97,110,103,108,101],"value":"Rounded rectangle"}, -{"hash":94825605,"name":"tfmain.tool_phongshapesphere.hint","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"}, -{"hash":304709,"name":"tfmain.tool_phongshapecone.hint","sourcebytes":[67,111,110,101],"value":"Cone"}, -{"hash":187648901,"name":"tfmain.tool_phongshapeverticalcone.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,111,110,101],"value":"Vertical cone"}, -{"hash":115522882,"name":"tfmain.tool_phongshapehorizontalcylinder.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,99,121,108,105,110,100,101,114],"value":"Horizontal cylinder"}, -{"hash":31811010,"name":"tfmain.tool_phongshapeverticalcylinder.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,121,108,105,110,100,101,114],"value":"Vertical cylinder"}, -{"hash":202312101,"name":"tfmain.spinedit_phongbordersize.hint","sourcebytes":[66,111,114,100,101,114,32,115,105,122,101],"value":"Border size"}, -{"hash":61914917,"name":"tfmain.label_altitude.caption","sourcebytes":[65,108,116,105,116,117,100,101],"value":"Altitude"}, -{"hash":221694037,"name":"tfmain.spinedit_shapealtitude.hint","sourcebytes":[83,104,97,112,101,32,97,108,116,105,116,117,100,101],"value":"Shape altitude"}, -{"hash":6159272,"name":"tfmain.label_outlinewidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"}, -{"hash":57137717,"name":"tfmain.tool_textoutline.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101],"value":"Text outline"}, -{"hash":68821400,"name":"tfmain.spinedit_textoutlinewidth.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101,32,119,105,100,116,104],"value":"Text outline width"}, -{"hash":30209135,"name":"tfmain.perspective_twoplanes.hint","sourcebytes":[68,114,97,119,32,111,112,112,111,115,105,116,101,32,112,108,97,110,101,32,116,111,111],"value":"Draw opposite plane too"}, -{"hash":65297493,"name":"tfmain.perspective_repeat.hint","sourcebytes":[82,101,112,101,97,116,32,105,109,97,103,101],"value":"Repeat image"}, -{"hash":4824216,"name":"tfmain.label_brush.caption","sourcebytes":[66,114,117,115,104],"value":"Brush"}, -{"hash":174563351,"name":"tfmain.label_spacing.caption","sourcebytes":[83,112,97,99,105,110,103],"value":"Spacing"}, -{"hash":70662787,"name":"tfmain.spinedit_brushspacing.hint","sourcebytes":[83,112,97,99,105,110,103,32,98,101,116,119,101,101,110,32,112,97,116,116,101,114,110,115],"value":"Spacing between patterns"}, -{"hash":5802751,"name":"tfmain.label_ratio.caption","sourcebytes":[82,97,116,105,111],"value":"Ratio"}, -{"hash":67807111,"name":"tfmain.tool_aliasing.hint","sourcebytes":[68,105,115,97,98,108,101,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Disable antialiasing"}, -{"hash":120839925,"name":"tfmain.tool_closeshape.hint","sourcebytes":[67,108,111,115,101,32,115,104,97,112,101],"value":"Close shape"}, -{"hash":130332167,"name":"tfmain.tool_textshadow.hint","sourcebytes":[84,101,120,116,32,115,104,97,100,111,119],"value":"Text shadow"}, -{"hash":299970,"name":"tfmain.label_textblur.caption","sourcebytes":[66,108,117,114],"value":"Blur"}, -{"hash":114259058,"name":"tfmain.spinedit_textblur.hint","sourcebytes":[83,104,97,100,111,119,32,98,108,117,114],"value":"Shadow blur"}, -{"hash":89971140,"name":"tfmain.label_shadowoffset.caption","sourcebytes":[79,102,102,115,101,116],"value":"Offset"}, -{"hash":236421172,"name":"tfmain.spinedit_textshadowx.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Horizontal shadow offset"}, -{"hash":105381300,"name":"tfmain.spinedit_textshadowy.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Vertical shadow offset"}, -{"hash":22206,"name":"tfmain.label_pen.caption","sourcebytes":[80,101,110],"value":"Pen"}, -{"hash":264792562,"name":"tfmain.image_swapcolors.hint","sourcebytes":[83,119,105,116,99,104,32,99,111,108,111,114],"value":"Switch color"}, -{"hash":296859,"name":"tfmain.label_back.caption","sourcebytes":[66,97,99,107],"value":"Back"}, -{"hash":76172398,"name":"tfmain.button_donate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."}, -{"hash":300580,"name":"tfmain.tool_textbold.hint","sourcebytes":[66,111,108,100],"value":"Bold"}, -{"hash":84574963,"name":"tfmain.tool_textitalic.hint","sourcebytes":[73,116,97,108,105,99],"value":"Italic"}, -{"hash":180974597,"name":"tfmain.tool_textunderline.hint","sourcebytes":[85,110,100,101,114,108,105,110,101],"value":"Underline"}, -{"hash":151125108,"name":"tfmain.tool_textstrikeout.hint","sourcebytes":[83,116,114,105,107,101,111,117,116],"value":"Strikeout"}, -{"hash":39152780,"name":"tfmain.tool_textbidirectional.hint","sourcebytes":[66,105,100,105,114,101,99,116,105,111,110,97,108],"value":"Bidirectional"}, -{"hash":63280628,"name":"tfmain.tool_textltr.hint","sourcebytes":[76,101,102,116,32,116,111,32,114,105,103,104,116],"value":"Left to right"}, -{"hash":65854964,"name":"tfmain.tool_textrtl.hint","sourcebytes":[82,105,103,104,116,32,116,111,32,108,101,102,116],"value":"Right to left"}, -{"hash":266351424,"name":"tfmain.tool_textaligntop.hint","sourcebytes":[65,108,105,103,110,32,116,111,112],"value":"Align top"}, -{"hash":116886537,"name":"tfmain.tool_textalignmiddle.hint","sourcebytes":[67,101,110,116,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Center vertically"}, -{"hash":34882909,"name":"tfmain.tool_textalignbottom.hint","sourcebytes":[65,108,105,103,110,32,98,111,116,116,111,109],"value":"Align bottom"}, -{"hash":88908046,"name":"tfmain.filenew.caption","sourcebytes":[78,101,119,46,46,46],"value":"New..."}, -{"hash":111833829,"name":"tfmain.filenew.hint","sourcebytes":[67,114,101,97,116,101,32,97,32,110,101,119,32,102,105,108,101],"value":"Create a new file"}, -{"hash":107745630,"name":"tfmain.fileopen.caption","sourcebytes":[79,112,101,110,46,46,46],"value":"Open..."}, -{"hash":218146437,"name":"tfmain.fileopen.hint","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101],"value":"Open existing file"}, -{"hash":23459486,"name":"tfmain.viewzoomin.hint","sourcebytes":[90,111,111,109,32,105,110],"value":"Zoom in"}, -{"hash":106918100,"name":"tfmain.viewzoomout.hint","sourcebytes":[90,111,111,109,32,111,117,116],"value":"Zoom out"}, -{"hash":251132352,"name":"tfmain.imagehorizontalflip.caption","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,102,108,105,112],"value":"Horizontal flip"}, -{"hash":107134297,"name":"tfmain.imagehorizontalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip image horizontally"}, -{"hash":187662016,"name":"tfmain.imageverticalflip.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,102,108,105,112],"value":"Vertical flip"}, -{"hash":128483817,"name":"tfmain.imageverticalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip image vertically"}, -{"hash":72010382,"name":"tfmain.imageresample.caption","sourcebytes":[82,101,115,97,109,112,108,101,46,46,46],"value":"Resample..."}, -{"hash":200831861,"name":"tfmain.imageresample.hint","sourcebytes":[82,101,115,97,109,112,108,101,32,105,109,97,103,101],"value":"Resample image"}, -{"hash":192766339,"name":"tfmain.imagesmartzoom3.caption","sourcebytes":[83,109,97,114,116,32,122,111,111,109,32,120,51],"value":"Smart zoom x3"}, -{"hash":23626005,"name":"tfmain.viewzoomoriginal.caption","sourcebytes":[79,114,105,103,105,110,97,108,32,115,105,122,101],"value":"Original size"}, -{"hash":259531189,"name":"tfmain.viewzoomoriginal.hint","sourcebytes":[90,111,111,109,32,116,111,32,111,114,105,103,105,110,97,108,32,112,105,120,101,108,32,115,105,122,101],"value":"Zoom to original pixel size"}, -{"hash":378031,"name":"tfmain.editundo.caption","sourcebytes":[85,110,100,111],"value":"Undo"}, -{"hash":130699086,"name":"tfmain.editundo.hint","sourcebytes":[85,110,100,111,32,108,97,115,116,32,109,111,100,105,102,105,99,97,116,105,111,110],"value":"Undo last modification"}, -{"hash":363439,"name":"tfmain.editredo.hint","sourcebytes":[82,101,100,111],"value":"Redo"}, -{"hash":106916628,"name":"tfmain.viewzoomfit.caption","sourcebytes":[90,111,111,109,32,102,105,116],"value":"Zoom fit"}, -{"hash":131274455,"name":"tfmain.viewzoomfit.hint","sourcebytes":[90,111,111,109,32,116,111,32,102,105,116,32,105,110,32,116,104,101,32,119,105,110,100,111,119],"value":"Zoom to fit in the window"}, -{"hash":211562244,"name":"tfmain.editdeselect.hint","sourcebytes":[68,101,115,101,108,101,99,116],"value":"Deselect"}, -{"hash":237622494,"name":"tfmain.editinvertselection.hint","sourcebytes":[73,110,118,101,114,116,32,115,101,108,101,99,116,105,111,110],"value":"Invert selection"}, -{"hash":17148597,"name":"tfmain.toolselectrect.hint","sourcebytes":[83,101,108,101,99,116,32,114,101,99,116,97,110,103,108,101],"value":"Select rectangle"}, -{"hash":135963749,"name":"tfmain.toolselectellipse.hint","sourcebytes":[83,101,108,101,99,116,32,101,108,108,105,112,115,101],"value":"Select ellipse"}, -{"hash":193486782,"name":"tfmain.toolselectpoly.hint","sourcebytes":[83,101,108,101,99,116,32,112,111,108,121,103,111,110],"value":"Select polygon"}, -{"hash":66511461,"name":"tfmain.toolselectspline.hint","sourcebytes":[83,101,108,101,99,116,32,99,117,114,118,101],"value":"Select curve"}, -{"hash":75354974,"name":"tfmain.toolmoveselection.hint","sourcebytes":[77,111,118,101,32,115,101,108,101,99,116,105,111,110],"value":"Move selection"}, -{"hash":128109646,"name":"tfmain.toolselectpen.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,112,101,110],"value":"Selection pen"}, -{"hash":228577870,"name":"tfmain.toolselectpen.hint","sourcebytes":[68,114,97,119,32,115,101,108,101,99,116,105,111,110,32,119,105,116,104,32,112,101,110],"value":"Draw selection with pen"}, -{"hash":304761,"name":"tfmain.editcopy.caption","sourcebytes":[67,111,112,121],"value":"Copy"}, -{"hash":79811454,"name":"tfmain.editcopy.hint","sourcebytes":[67,111,112,121,32,115,101,108,101,99,116,105,111,110],"value":"Copy selection"}, -{"hash":5671589,"name":"tfmain.editpaste.hint","sourcebytes":[80,97,115,116,101],"value":"Paste"}, -{"hash":19140,"name":"tfmain.editcut.caption","sourcebytes":[67,117,116],"value":"Cut"}, -{"hash":142399070,"name":"tfmain.editcut.hint","sourcebytes":[67,117,116,32,115,101,108,101,99,116,105,111,110],"value":"Cut selection"}, -{"hash":78392485,"name":"tfmain.editdeleteselection.caption","sourcebytes":[68,101,108,101,116,101],"value":"Delete"}, -{"hash":236551166,"name":"tfmain.editdeleteselection.hint","sourcebytes":[68,101,108,101,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Delete selection"}, -{"hash":169361790,"name":"tfmain.toolrotateselection.hint","sourcebytes":[82,111,116,97,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Rotate selection"}, -{"hash":195296268,"name":"tfmain.editselectall.caption","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"}, -{"hash":195296268,"name":"tfmain.editselectall.hint","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"}, -{"hash":191244600,"name":"tfmain.viewtoolbox.caption","sourcebytes":[84,111,111,108,98,111,120],"value":"Toolbox"}, -{"hash":78001811,"name":"tfmain.viewcolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"}, -{"hash":88162814,"name":"tfmain.imagecrop.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110],"value":"Crop to selection"}, -{"hash":128112628,"name":"tfmain.editselectionfit.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,102,105,116],"value":"Selection fit"}, -{"hash":73053668,"name":"tfmain.imageclearalpha.caption","sourcebytes":[67,108,101,97,114,32,97,108,112,104,97,32,99,104,97,110,110,101,108,32,97,110,100,32,115,101,116,32,98,97,99,107,103,114,111,117,110,100],"value":"Clear alpha channel and set background"}, -{"hash":32413959,"name":"tfmain.imagefillbackground.caption","sourcebytes":[70,105,108,108,32,98,97,99,107,103,114,111,117,110,100,32,119,105,116,104,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Fill background with antialiasing"}, -{"hash":40698606,"name":"tfmain.imagechangecanvassize.caption","sourcebytes":[67,97,110,118,97,115,32,115,105,122,101,46,46,46],"value":"Canvas size..."}, -{"hash":174425639,"name":"tfmain.imagerotatecw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,87],"value":"Rotate 90\u00B0 CW"}, -{"hash":106458407,"name":"tfmain.imagerotateccw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,67,87],"value":"Rotate 90\u00B0 CCW"}, -{"hash":44176496,"name":"tfmain.imagerotate180.caption","sourcebytes":[82,111,116,97,116,101,32,49,56,48,194,176],"value":"Rotate 180\u00B0"}, -{"hash":219032926,"name":"tfmain.colorintensity.caption","sourcebytes":[73,110,116,101,110,115,105,116,121,46,46,46],"value":"Intensity..."}, -{"hash":102010462,"name":"tfmain.colorlightness.caption","sourcebytes":[66,114,105,103,104,116,110,101,115,115,32,47,32,67,111,110,116,114,97,115,116,46,46,46],"value":"Brightness / Contrast..."}, -{"hash":247427790,"name":"tfmain.colorshiftcolors.caption","sourcebytes":[83,104,105,102,116,32,99,111,108,111,114,115,46,46,46],"value":"Shift colors..."}, -{"hash":156902510,"name":"tfmain.colorcolorize.caption","sourcebytes":[67,111,108,111,114,105,122,101,46,46,46],"value":"Colorize..."}, -{"hash":78427662,"name":"tfmain.helpindex.caption","sourcebytes":[73,110,100,101,120,46,46,46],"value":"Index..."}, -{"hash":158102910,"name":"tfmain.helpabout.caption","sourcebytes":[65,98,111,117,116,46,46,46],"value":"About..."}, -{"hash":112740814,"name":"tfmain.imagerepeat.caption","sourcebytes":[82,101,112,101,97,116,46,46,46],"value":"Repeat..."}, -{"hash":257089940,"name":"tfmain.toolmagicwand.caption","sourcebytes":[77,97,103,105,99,32,119,97,110,100],"value":"Magic wand"}, -{"hash":45494836,"name":"tfmain.toolmagicwand.hint","sourcebytes":[77,97,103,105,99,32,119,97,110,100,32,115,101,108,101,99,116],"value":"Magic wand select"}, -{"hash":77818803,"name":"tfmain.renderclouds.caption","sourcebytes":[67,108,111,117,100,115],"value":"Clouds"}, -{"hash":240690499,"name":"tfmain.rendercustomwater.caption","sourcebytes":[87,97,116,101,114,32,119,105,116,104,32,99,117,115,116,111,109,32,99,111,108,111,114,115],"value":"Water with custom colors"}, -{"hash":85578645,"name":"tfmain.renderperlinnoise.caption","sourcebytes":[80,101,114,108,105,110,32,110,111,105,115,101],"value":"Perlin noise"}, -{"hash":261781,"name":"tfmain.rendercyclicperlinnoise.caption","sourcebytes":[67,121,99,108,105,99,32,80,101,114,108,105,110,32,110,111,105,115,101],"value":"Cyclic Perlin noise"}, -{"hash":386644,"name":"tfmain.renderwood.caption","sourcebytes":[87,111,111,100],"value":"Wood"}, -{"hash":120105643,"name":"tfmain.renderplastik.caption","sourcebytes":[80,108,97,115,116,105,107],"value":"Plastik"}, -{"hash":239140882,"name":"tfmain.rendermetalfloor.caption","sourcebytes":[77,101,116,97,108,32,102,108,111,111,114],"value":"Metal floor"}, -{"hash":112836501,"name":"tfmain.rendercamouflage.caption","sourcebytes":[67,97,109,111,117,102,108,97,103,101],"value":"Camouflage"}, -{"hash":158477108,"name":"tfmain.rendersnowprint.caption","sourcebytes":[83,110,111,119,32,112,114,105,110,116],"value":"Snow print"}, -{"hash":5944901,"name":"tfmain.renderstone.caption","sourcebytes":[83,116,111,110,101],"value":"Stone"}, -{"hash":103012869,"name":"tfmain.renderroundstone.caption","sourcebytes":[82,111,117,110,100,32,115,116,111,110,101],"value":"Round stone"}, -{"hash":87591205,"name":"tfmain.rendermarble.caption","sourcebytes":[77,97,114,98,108,101],"value":"Marble"}, -{"hash":6130370,"name":"tfmain.renderwater.caption","sourcebytes":[87,97,116,101,114],"value":"Water"}, -{"hash":187599764,"name":"tfmain.renderwoodvertical.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,119,111,111,100],"value":"Vertical wood"}, -{"hash":137342309,"name":"tfmain.embeddedvalidate.caption","sourcebytes":[86,97,108,105,100,97,116,101],"value":"Validate"}, -{"hash":75331571,"name":"tfmain.embeddedvalidate.hint","sourcebytes":[86,97,108,105,100,97,116,101,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Validate modifications"}, -{"hash":77089212,"name":"tfmain.embeddedcancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, -{"hash":93963171,"name":"tfmain.embeddedcancel.hint","sourcebytes":[67,97,110,99,101,108,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Cancel modifications"}, -{"hash":321780,"name":"tfmain.viewgrid.caption","sourcebytes":[71,114,105,100],"value":"Grid"}, -{"hash":176417125,"name":"tfmain.editpasteasnew.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,105,109,97,103,101],"value":"Paste as new image"}, -{"hash":221621454,"name":"tfmain.editselection.caption","sourcebytes":[69,100,105,116,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Edit selection..."}, -{"hash":86572179,"name":"tfmain.viewlayerstack.caption","sourcebytes":[76,97,121,101,114,115],"value":"Layers"}, -{"hash":124848643,"name":"tfmain.viewlayerstackbutton.caption","sourcebytes":[83,104,111,119,32,108,97,121,101,114,115],"value":"Show layers"}, -{"hash":214344631,"name":"tfmain.viewlayerstackbutton.hint","sourcebytes":[83,104,111,119,32,111,114,32,104,105,100,101,32,108,97,121,101,114,32,115,116,97,99,107,32,119,105,110,100,111,119],"value":"Show or hide layer stack window"}, -{"hash":161226738,"name":"tfmain.imagecroplayer.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110,32,97,110,100,32,99,117,114,114,101,110,116,32,108,97,121,101,114],"value":"Crop to selection and current layer"}, -{"hash":97075273,"name":"tfmain.layerhorizontalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip layer horizontally"}, -{"hash":110750825,"name":"tfmain.layerverticalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip layer vertically"}, -{"hash":248838978,"name":"tfmain.layeraddnew.hint","sourcebytes":[65,100,100,32,110,101,119,32,108,97,121,101,114],"value":"Add new layer"}, -{"hash":50252034,"name":"tfmain.layerremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,108,97,121,101,114],"value":"Remove layer"}, -{"hash":26157074,"name":"tfmain.layerduplicate.hint","sourcebytes":[68,117,112,108,105,99,97,116,101,32,115,101,108,101,99,116,101,100,32,108,97,121,101,114],"value":"Duplicate selected layer"}, -{"hash":20150450,"name":"tfmain.layermergeover.hint","sourcebytes":[77,101,114,103,101,32,108,97,121,101,114,32,111,118,101,114],"value":"Merge layer over"}, -{"hash":224054046,"name":"tfmain.layerfromfile.hint","sourcebytes":[73,109,112,111,114,116,32,108,97,121,101,114,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Import layer from file..."}, -{"hash":125290754,"name":"tfmain.layermove.hint","sourcebytes":[77,111,118,101,32,108,97,121,101,114],"value":"Move layer"}, -{"hash":50603874,"name":"tfmain.layerrotate.hint","sourcebytes":[82,111,116,97,116,101,32,108,97,121,101,114],"value":"Rotate layer"}, -{"hash":222858453,"name":"tfmain.imageflatten.caption","sourcebytes":[70,108,97,116,116,101,110,32,105,109,97,103,101],"value":"Flatten image"}, -{"hash":93074804,"name":"tfmain.filereload.caption","sourcebytes":[82,101,108,111,97,100],"value":"Reload"}, -{"hash":366789,"name":"tfmain.filesave.caption","sourcebytes":[83,97,118,101],"value":"Save"}, -{"hash":60022005,"name":"tfmain.filesave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101],"value":"Save current file"}, -{"hash":124639694,"name":"tfmain.filesaveas.caption","sourcebytes":[83,97,118,101,32,97,115,46,46,46],"value":"Save as..."}, -{"hash":159035875,"name":"tfmain.filesaveas.hint","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115],"value":"Save file as"}, -{"hash":363524,"name":"tfmain.filequit.hint","sourcebytes":[81,117,105,116],"value":"Quit"}, -{"hash":169186686,"name":"tfmain.filesaveselectionas.caption","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."}, -{"hash":223186382,"name":"tfmain.fileloadselection.caption","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Load selection..."}, -{"hash":59477454,"name":"tfmain.fileimport3d.caption","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116,46,46,46],"value":"Import 3D object..."}, -{"hash":164375502,"name":"tfmain.colorcurves.caption","sourcebytes":[67,117,114,118,101,115,46,46,46],"value":"Curves..."}, -{"hash":243723214,"name":"tfmain.colorposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101,46,46,46],"value":"Posterize..."}, -{"hash":151352958,"name":"tfmain.fileprint.caption","sourcebytes":[80,114,105,110,116,46,46,46],"value":"Print..."}, -{"hash":225719252,"name":"tfmain.viewimagelist.caption","sourcebytes":[73,109,97,103,101,32,108,105,115,116],"value":"Image list"}, -{"hash":66110750,"name":"tfmain.filesaveasinsamefolder.caption","sourcebytes":[83,97,118,101,32,105,110,32,115,97,109,101,32,102,111,108,100,101,114,46,46,46],"value":"Save in same folder..."}, -{"hash":178213234,"name":"tfmain.editpasteasnewlayer.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,108,97,121,101,114],"value":"Paste as new layer"}, -{"hash":158677870,"name":"tfmain.filterblurbox.caption","sourcebytes":[66,111,120,32,98,108,117,114,46,46,46],"value":"Box blur..."}, -{"hash":234157934,"name":"tfmain.filterblurfast.caption","sourcebytes":[70,97,115,116,32,98,108,117,114,46,46,46],"value":"Fast blur..."}, -{"hash":61344174,"name":"tfmain.filterblurradial.caption","sourcebytes":[71,97,117,115,115,105,97,110,32,98,108,117,114,46,46,46],"value":"Gaussian blur..."}, -{"hash":262805710,"name":"tfmain.filterblurcorona.caption","sourcebytes":[67,111,114,111,110,97,32,98,108,117,114,46,46,46],"value":"Corona blur..."}, -{"hash":227339886,"name":"tfmain.filterblurdisk.caption","sourcebytes":[68,105,115,107,32,98,108,117,114,46,46,46],"value":"Disk blur..."}, -{"hash":77369838,"name":"tfmain.filterblurprecise.caption","sourcebytes":[80,114,101,99,105,115,101,32,98,108,117,114,46,46,46],"value":"Precise blur..."}, -{"hash":260847150,"name":"tfmain.filterblurmotion.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114,46,46,46],"value":"Motion blur..."}, -{"hash":93793486,"name":"tfmain.filterblurcustom.caption","sourcebytes":[67,117,115,116,111,109,32,98,108,117,114,46,46,46],"value":"Custom blur..."}, -{"hash":158314382,"name":"tfmain.filtersharpen.caption","sourcebytes":[83,104,97,114,112,101,110,46,46,46],"value":"Sharpen..."}, -{"hash":94660264,"name":"tfmain.filtersmooth.caption","sourcebytes":[83,109,111,111,116,104],"value":"Smooth"}, -{"hash":87797630,"name":"tfmain.filtermedian.caption","sourcebytes":[77,101,100,105,97,110],"value":"Median"}, -{"hash":157953342,"name":"tfmain.filteremboss.caption","sourcebytes":[69,109,98,111,115,115,46,46,46],"value":"Emboss..."}, -{"hash":154699365,"name":"tfmain.filternormalize.caption","sourcebytes":[78,111,114,109,97,108,105,122,101],"value":"Normalize"}, -{"hash":198751621,"name":"tfmain.filternegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"}, -{"hash":151640741,"name":"tfmain.filtergrayscale.caption","sourcebytes":[71,114,97,121,115,99,97,108,101],"value":"Grayscale"}, -{"hash":174438018,"name":"tfmain.filtercontour.caption","sourcebytes":[67,111,110,116,111,117,114],"value":"Contour"}, -{"hash":94825605,"name":"tfmain.filtersphere.caption","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"}, -{"hash":3165810,"name":"tfmain.filtercylinder.caption","sourcebytes":[67,121,108,105,110,100,101,114],"value":"Cylinder"}, -{"hash":258000517,"name":"tfmain.filterlinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"}, -{"hash":126661353,"name":"tfmain.filterplane.caption","sourcebytes":[80,108,97,110,101,32,40,115,108,111,119,41],"value":"Plane (slow)"}, -{"hash":235468478,"name":"tfmain.filtertwirl.caption","sourcebytes":[84,119,105,114,108,46,46,46],"value":"Twirl..."}, -{"hash":48074702,"name":"tfmain.filterpixelate.caption","sourcebytes":[80,105,120,101,108,97,116,101,46,46,46],"value":"Pixelate..."}, -{"hash":193464901,"name":"tfmain.filtercleartype.caption","sourcebytes":[67,108,101,97,114,84,121,112,101],"value":"ClearType"}, -{"hash":37795461,"name":"tfmain.filtercleartypeinverse.caption","sourcebytes":[73,110,118,101,114,115,101,32,67,108,101,97,114,84,121,112,101],"value":"Inverse ClearType"}, -{"hash":14654542,"name":"tfmain.filterphong.caption","sourcebytes":[83,104,97,100,101,100,32,109,97,112,46,46,46],"value":"Shaded map..."}, -{"hash":31581342,"name":"tfmain.filterfunction.caption","sourcebytes":[65,112,112,108,121,32,102,117,110,99,116,105,111,110,46,46,46],"value":"Apply function..."}, -{"hash":144289715,"name":"tfmain.filtercomplementarycolor.caption","sourcebytes":[67,111,109,112,108,101,109,101,110,116,97,114,121,32,99,111,108,111,114,115],"value":"Complementary colors"}, -{"hash":54233774,"name":"tfmain.filternoise.caption","sourcebytes":[78,111,105,115,101,32,102,105,108,116,101,114,46,46,46],"value":"Noise filter..."}, -{"hash":142610782,"name":"tfmain.filterrain.caption","sourcebytes":[82,97,105,110,46,46,46],"value":"Rain..."}, -{"hash":197181954,"name":"tfmain.viewstatusbar.caption","sourcebytes":[83,116,97,116,117,115,32,98,97,114],"value":"Status bar"}, -{"hash":109235189,"name":"tfmain.viewpalette.caption","sourcebytes":[80,97,108,101,116,116,101],"value":"Palette"}, -{"hash":167619026,"name":"tfmain.fileuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"}, -{"hash":64004190,"name":"tfmain.filechooseentry.caption","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,46,46,46],"value":"Choose entry..."}, -{"hash":143653317,"name":"tfmain.filechooseentry.hint","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,32,119,105,116,104,105,110,32,102,105,108,101],"value":"Choose entry within file"}, -{"hash":116001155,"name":"tfmain.forgetdialoganswers.caption","sourcebytes":[70,111,114,103,101,116,32,100,105,97,108,111,103,32,98,111,120,32,97,110,115,119,101,114,115],"value":"Forget dialog box answers"}, -{"hash":224505747,"name":"tfmain.forgetdialoganswers.hint","sourcebytes":[70,111,114,103,101,116,32,97,110,115,119,101,114,115,32,103,105,118,101,110,32,116,111,32,100,105,97,108,111,103,32,98,111,120,101,115],"value":"Forget answers given to dialog boxes"}, -{"hash":198751621,"name":"tfmain.imagenegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"}, -{"hash":258000517,"name":"tfmain.imagelinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"}, -{"hash":179963859,"name":"tfmain.imageswapredblue.caption","sourcebytes":[83,119,97,112,32,114,101,100,32,97,110,100,32,98,108,117,101,32,99,104,97,110,110,101,108,115],"value":"Swap red and blue channels"}, -{"hash":259299730,"name":"tfmain.layerzoom.hint","sourcebytes":[90,111,111,109,32,108,97,121,101,114],"value":"Zoom layer"}, -{"hash":153208601,"name":"tfmain.selectionhorizontalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip selection horizontally"}, -{"hash":166020249,"name":"tfmain.selectionverticalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip selection vertically"}, -{"hash":244531892,"name":"tfmain.fileremembersaveformat.hint","sourcebytes":[82,101,109,101,109,98,101,114,32,115,97,118,101,32,102,111,114,109,97,116],"value":"Remember save format"}, -{"hash":232678978,"name":"tfmain.layerrasterize.hint","sourcebytes":[82,97,115,116,101,114,105,122,101,32,108,97,121,101,114],"value":"Rasterize layer"}, -{"hash":97266030,"name":"tfmain.viewworkspacecolor.caption","sourcebytes":[83,101,116,32,119,111,114,107,115,112,97,99,101,32,99,111,108,111,114,46,46,46],"value":"Set workspace color..."}, -{"hash":226378933,"name":"tfmain.viewdarktheme.caption","sourcebytes":[68,97,114,107,32,116,104,101,109,101],"value":"Dark theme"}, -{"hash":17857150,"name":"tfmain.filterwavedisplacement.caption","sourcebytes":[87,97,118,101,32,100,105,115,112,108,97,99,101,109,101,110,116,46,46,46],"value":"Wave displacement..."}, -{"hash":321604,"name":"tfmain.toolhand.caption","sourcebytes":[72,97,110,100],"value":"Hand"}, -{"hash":171743509,"name":"tfmain.toolhand.hint","sourcebytes":[77,111,118,101,32,97,110,100,32,115,99,114,111,108,108,32,112,105,99,116,117,114,101],"value":"Move and scroll picture"}, -{"hash":107455380,"name":"tfmain.toolhotspot.caption","sourcebytes":[72,111,116,32,115,112,111,116],"value":"Hot spot"}, -{"hash":14124562,"name":"tfmain.toolhotspot.hint","sourcebytes":[67,104,111,111,115,101,32,104,111,116,32,115,112,111,116,32,111,102,32,97,32,99,117,114,115,111,114],"value":"Choose hot spot of a cursor"}, -{"hash":63551362,"name":"tfmain.toolcolorpicker.hint","sourcebytes":[67,111,108,111,114,32,112,105,99,107,101,114],"value":"Color picker"}, -{"hash":22206,"name":"tfmain.toolpen.caption","sourcebytes":[80,101,110],"value":"Pen"}, -{"hash":119723774,"name":"tfmain.toolpen.hint","sourcebytes":[83,105,109,112,108,101,32,112,101,110],"value":"Simple pen"}, -{"hash":4824216,"name":"tfmain.toolbrush.hint","sourcebytes":[66,114,117,115,104],"value":"Brush"}, -{"hash":80251330,"name":"tfmain.tooleraser.hint","sourcebytes":[69,114,97,115,101,114],"value":"Eraser"}, -{"hash":106595100,"name":"tfmain.toolfloodfill.hint","sourcebytes":[70,108,111,111,100,102,105,108,108],"value":"Floodfill"}, -{"hash":74651452,"name":"tfmain.toolclone.hint","sourcebytes":[67,108,111,110,101,32,116,111,111,108],"value":"Clone tool"}, -{"hash":108876645,"name":"tfmain.tooleditshape.hint","sourcebytes":[69,100,105,116,32,115,104,97,112,101],"value":"Edit shape"}, -{"hash":178787989,"name":"tfmain.toolrect.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"}, -{"hash":204670933,"name":"tfmain.toolellipse.hint","sourcebytes":[69,108,108,105,112,115,101],"value":"Ellipse"}, -{"hash":123993614,"name":"tfmain.toolpolygon.caption","sourcebytes":[80,111,108,121,103,111,110],"value":"Polygon"}, -{"hash":53188549,"name":"tfmain.toolpolygon.hint","sourcebytes":[80,111,108,121,103,111,110,32,111,114,32,112,111,108,121,108,105,110,101],"value":"Polygon or polyline"}, -{"hash":4901317,"name":"tfmain.toolspline.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"}, -{"hash":4901317,"name":"tfmain.toolspline.hint","sourcebytes":[67,117,114,118,101],"value":"Curve"}, -{"hash":142278836,"name":"tfmain.toolgradient.caption","sourcebytes":[71,114,97,100,105,101,110,116],"value":"Gradient"}, -{"hash":215410292,"name":"tfmain.toolgradient.hint","sourcebytes":[82,101,110,100,101,114,32,103,114,97,100,105,101,110,116],"value":"Render gradient"}, -{"hash":65508053,"name":"tfmain.toolphong.hint","sourcebytes":[83,104,97,100,101,100,32,115,104,97,112,101],"value":"Shaded shape"}, -{"hash":371956,"name":"tfmain.tooltext.hint","sourcebytes":[84,101,120,116],"value":"Text"}, -{"hash":158470974,"name":"tfmain.tooldeformation.caption","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110],"value":"Deformation"}, -{"hash":76663236,"name":"tfmain.tooldeformation.hint","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110,32,103,114,105,100],"value":"Deformation grid"}, -{"hash":205239287,"name":"tfmain.tooltexturemapping.hint","sourcebytes":[84,101,120,116,117,114,101,32,109,97,112,112,105,110,103],"value":"Texture mapping"}, -{"hash":43972261,"name":"tfmain.toollayermapping.hint","sourcebytes":[76,97,121,101,114,32,112,101,114,115,112,101,99,116,105,118,101],"value":"Layer perspective"}, -{"hash":98487735,"name":"tfmain.toolchangedocking.hint","sourcebytes":[67,104,97,110,103,101,32,100,111,99,107,105,110,103],"value":"Change docking"}, -{"hash":200728952,"name":"tfmain.brushcreategeometric.hint","sourcebytes":[67,114,101,97,116,101,32,103,101,111,109,101,116,114,105,99,32,98,114,117,115,104],"value":"Create geometric brush"}, -{"hash":217170606,"name":"tfmain.brushloadfromfile.hint","sourcebytes":[76,111,97,100,32,98,114,117,115,104,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Load brush from file..."}, -{"hash":15128104,"name":"tfmain.brushremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,99,117,114,114,101,110,116,32,98,114,117,115,104],"value":"Remove current brush"}, -{"hash":74217360,"name":"tfmain.editmoveup.hint","sourcebytes":[77,111,118,101,32,117,112],"value":"Move up"}, -{"hash":141109012,"name":"tfmain.editmovetofront.hint","sourcebytes":[66,114,105,110,103,32,116,111,32,102,114,111,110,116],"value":"Bring to front"}, -{"hash":209126078,"name":"tfmain.editmovedown.hint","sourcebytes":[77,111,118,101,32,100,111,119,110],"value":"Move down"}, -{"hash":9093403,"name":"tfmain.editmovetoback.hint","sourcebytes":[83,101,110,100,32,116,111,32,98,97,99,107],"value":"Send to back"}, -{"hash":141965220,"name":"tfmain.editshapealignleft.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,108,101,102,116],"value":"Align shape left"}, -{"hash":244832953,"name":"tfmain.editshapecenterhorizontally.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Center shape horizontally"}, -{"hash":122239604,"name":"tfmain.editshapealignright.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,114,105,103,104,116],"value":"Align shape right"}, -{"hash":43235424,"name":"tfmain.editshapealigntop.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,116,111,112],"value":"Align shape to the top"}, -{"hash":8451721,"name":"tfmain.editshapecentervertically.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Center shape vertically"}, -{"hash":174494829,"name":"tfmain.editshapealignbottom.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,98,111,116,116,111,109],"value":"Align shape to the bottom"}, -{"hash":52527029,"name":"tfmain.editshapetocurve.hint","sourcebytes":[67,111,110,118,101,114,116,32,115,104,97,112,101,32,116,111,32,99,117,114,118,101],"value":"Convert shape to curve"}, -{"hash":46607102,"name":"tfmain.filerunscript.caption","sourcebytes":[82,117,110,32,115,99,114,105,112,116,46,46,46],"value":"Run script..."}, -{"hash":104868661,"name":"tfmain.toolpolyline.hint","sourcebytes":[80,111,108,121,108,105,110,101],"value":"Polyline"}, -{"hash":51121525,"name":"tfmain.toolopenedcurve.hint","sourcebytes":[79,112,101,110,101,100,32,99,117,114,118,101],"value":"Opened curve"}, -{"hash":124337662,"name":"tfmain.fileexport.caption","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."}, -{"hash":124337662,"name":"tfmain.layerexport.hint","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."}, -{"hash":164762421,"name":"tfmain.filequicksave.caption","sourcebytes":[81,117,105,99,107,32,115,97,118,101],"value":"Quick save"}, -{"hash":215358547,"name":"tfmain.filequicksave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101,32,119,105,116,104,111,117,116,32,100,105,97,108,111,103,115],"value":"Save current file without dialogs"}, -{"hash":66536946,"name":"tfmain.colordialog1.title","sourcebytes":[67,104,111,111,115,101,32,99,111,108,111,114],"value":"Choose color"}, -{"hash":315429,"name":"tfmain.menufile.caption","sourcebytes":[70,105,108,101],"value":"File"}, -{"hash":167619026,"name":"tfmain.itemuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"}, -{"hash":65502867,"name":"tfmain.menurecentfiles.caption","sourcebytes":[82,101,99,101,110,116,32,102,105,108,101,115],"value":"Recent files"}, -{"hash":139375349,"name":"tfmain.menulanguage.caption","sourcebytes":[76,97,110,103,117,97,103,101],"value":"Language"}, -{"hash":76172398,"name":"tfmain.itemdonate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."}, -{"hash":310020,"name":"tfmain.menuedit.caption","sourcebytes":[69,100,105,116],"value":"Edit"}, -{"hash":94120868,"name":"tfmain.menuselect.caption","sourcebytes":[83,101,108,101,99,116],"value":"Select"}, -{"hash":380871,"name":"tfmain.menuview.caption","sourcebytes":[86,105,101,119],"value":"View"}, -{"hash":267499032,"name":"tfmain.itemviewdocktoolbox.caption","sourcebytes":[68,111,99,107,32,116,111,111,108,98,111,120],"value":"Dock toolbox"}, -{"hash":46565539,"name":"tfmain.itemdocklayersandcolors.caption","sourcebytes":[68,111,99,107,32,108,97,121,101,114,115,32,97,110,100,32,99,111,108,111,114,115],"value":"Dock layers and colors"}, -{"hash":60708750,"name":"tfmain.itemfullscreen.caption","sourcebytes":[70,117,108,108,115,99,114,101,101,110],"value":"Fullscreen"}, -{"hash":5257173,"name":"tfmain.menuimage.caption","sourcebytes":[73,109,97,103,101],"value":"Image"}, -{"hash":167030057,"name":"tfmain.menuremovetransparency.caption","sourcebytes":[82,101,109,111,118,101,32,116,114,97,110,115,112,97,114,101,110,99,121],"value":"Remove transparency"}, -{"hash":78001811,"name":"tfmain.menucolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"}, -{"hash":5989939,"name":"tfmain.menutool.caption","sourcebytes":[84,111,111,108,115],"value":"Tools"}, -{"hash":80755394,"name":"tfmain.menufilter.caption","sourcebytes":[70,105,108,116,101,114],"value":"Filter"}, -{"hash":129960242,"name":"tfmain.menuradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"}, -{"hash":93080258,"name":"tfmain.menurender.caption","sourcebytes":[82,101,110,100,101,114],"value":"Render"}, -{"hash":94015604,"name":"tfmain.menuscript.caption","sourcebytes":[83,99,114,105,112,116],"value":"Script"}, -{"hash":322608,"name":"tfmain.menuhelp.caption","sourcebytes":[72,101,108,112],"value":"Help"}, -{"hash":130864334,"name":"tfmain.loadselectiondialog.title","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110],"value":"Load selection"}, -{"hash":695557,"name":"tfmain.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,105,109,97,103,101],"value":"Open existing image"}, -{"hash":262765813,"name":"tfmain.opentexturedialog.title","sourcebytes":[79,112,101,110,32,116,101,120,116,117,114,101],"value":"Open texture"}, -{"hash":30161076,"name":"tfmain.open3dobjectdialog.title","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116],"value":"Import 3D object"}, -{"hash":186570926,"name":"tfmain.savepicturedialog1.title","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115,46,46,46],"value":"Save file as..."}, -{"hash":169186686,"name":"tfmain.saveselectiondialog.title","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."}, -{"hash":7141976,"name":"tfmain.openbrushdialog.title","sourcebytes":[79,112,101,110,32,98,114,117,115,104],"value":"Open brush"}, -{"hash":231995746,"name":"tfmain.menufiletoolbar.caption","sourcebytes":[83,104,111,119,32,102,105,108,101,32,116,111,111,108,98,97,114],"value":"Show file toolbar"}, -{"hash":55148898,"name":"tfmain.menuzoomtoolbar.caption","sourcebytes":[83,104,111,119,32,122,111,111,109,32,116,111,111,108,98,97,114],"value":"Show zoom toolbar"}, -{"hash":185663746,"name":"tfmain.menucopypastetoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,112,121,47,112,97,115,116,101,32,116,111,111,108,98,97,114],"value":"Show copy/paste toolbar"}, -{"hash":61428515,"name":"tfmain.menucoordinatestoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,111,114,100,105,110,97,116,101,115],"value":"Show coordinates"}, -{"hash":112373618,"name":"tfmain.menuundoredotoolbar.caption","sourcebytes":[83,104,111,119,32,117,110,100,111,47,114,101,100,111,32,116,111,111,108,98,97,114],"value":"Show undo/redo toolbar"}, -{"hash":66953941,"name":"tfmain.menushowpalette.caption","sourcebytes":[83,104,111,119,32,112,97,108,101,116,116,101],"value":"Show palette"}, -{"hash":165109892,"name":"tfmain.menudocktoolboxleft.caption","sourcebytes":[68,111,99,107,32,108,101,102,116],"value":"Dock left"}, -{"hash":226248804,"name":"tfmain.menudocktoolboxright.caption","sourcebytes":[68,111,99,107,32,114,105,103,104,116],"value":"Dock right"}, -{"hash":96777627,"name":"tfmain.menuundocktoolbox.caption","sourcebytes":[85,110,100,111,99,107],"value":"Undock"}, -{"hash":44513182,"name":"tfmain.exportpicturedialog.title","sourcebytes":[69,120,112,111,114,116,32,97,115,46,46,46],"value":"Export as..."} -]} +{"version":1,"strings":[ +{"hash":150371188,"name":"tfmain.caption","sourcebytes":[76,97,122,80,97,105,110,116],"value":"LazPaint"}, +{"hash":44380332,"name":"tfmain.image_currenttool.hint","sourcebytes":[83,101,108,101,99,116,101,100,32,116,111,111,108],"value":"Selected tool"}, +{"hash":30191261,"name":"tfmain.label_currentzoom.hint","sourcebytes":[67,117,114,114,101,110,116,32,122,111,111,109],"value":"Current zoom"}, +{"hash":37,"name":"tfmain.label_currentzoom.caption","sourcebytes":[37],"value":"%"}, +{"hash":176868709,"name":"tfmain.label_currentdiff.hint","sourcebytes":[67,111,108,111,114,32,100,105,102,102,101,114,101,110,99,101],"value":"Color difference"}, +{"hash":213797,"name":"tfmain.label_currentdiff.caption","sourcebytes":[49,48,48,37],"value":"100%"}, +{"hash":6159272,"name":"tfmain.label_penwidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"}, +{"hash":8236392,"name":"tfmain.spinedit_penwidth.hint","sourcebytes":[80,101,110,32,119,105,100,116,104],"value":"Pen width"}, +{"hash":5015701,"name":"tfmain.label_eraser.caption","sourcebytes":[69,114,97,115,101],"value":"Erase"}, +{"hash":219565076,"name":"tfmain.tool_erasealpha.hint","sourcebytes":[77,97,107,101,32,116,114,97,110,115,112,97,114,101,110,116],"value":"Make transparent"}, +{"hash":94755518,"name":"tfmain.tool_eraseblur.hint","sourcebytes":[83,111,102,116,101,110],"value":"Soften"}, +{"hash":50199278,"name":"tfmain.tool_eraselighten.hint","sourcebytes":[76,105,103,104,116,101,110],"value":"Lighten"}, +{"hash":78156222,"name":"tfmain.tool_erasedarken.hint","sourcebytes":[68,97,114,107,101,110],"value":"Darken"}, +{"hash":166237934,"name":"tfmain.tool_erasesharpen.hint","sourcebytes":[83,104,97,114,112,101,110],"value":"Sharpen"}, +{"hash":250503177,"name":"tfmain.spinedit_eraser.hint","sourcebytes":[69,114,97,115,101,114,32,111,112,97,99,105,116,121],"value":"Eraser opacity"}, +{"hash":46678005,"name":"tfmain.label_tolerance.caption","sourcebytes":[84,111,108,101,114,97,110,99,101],"value":"Tolerance"}, +{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.hint","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"}, +{"hash":24460908,"name":"tfmain.tool_progressivefloodfill.caption","sourcebytes":[80,114,111,103,114,101,115,115,105,118,101,32,102,108,111,111,100,102,105,108,108],"value":"Progressive floodfill"}, +{"hash":115147346,"name":"tfmain.tool_drawshapeborder.hint","sourcebytes":[68,114,97,119,32,98,111,114,100,101,114],"value":"Draw border"}, +{"hash":243087429,"name":"tfmain.tool_fillshape.hint","sourcebytes":[70,105,108,108,32,115,104,97,112,101],"value":"Fill shape"}, +{"hash":181333059,"name":"tfmain.label_coordinates.hint","sourcebytes":[67,111,111,114,100,105,110,97,116,101,115],"value":"Coordinates"}, +{"hash":218886153,"name":"tfmain.label_coordinates.caption","sourcebytes":[57,57,57,57,120,57,57,57,57],"value":"9999x9999"}, +{"hash":42364240,"name":"tfmain.tool_capflat.hint","sourcebytes":[70,108,97,116,32,99,97,112],"value":"Flat cap"}, +{"hash":205926624,"name":"tfmain.tool_capround.hint","sourcebytes":[82,111,117,110,100,32,99,97,112],"value":"Round cap"}, +{"hash":142786864,"name":"tfmain.tool_capsquare.hint","sourcebytes":[83,113,117,97,114,101,32,99,97,112],"value":"Square cap"}, +{"hash":224157463,"name":"tfmain.spinedit_arrowsizex.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Horizontal size of the arrow"}, +{"hash":47574855,"name":"tfmain.spinedit_arrowsizey.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,97,114,114,111,119],"value":"Vertical size of the arrow"}, +{"hash":65090695,"name":"tfmain.combobox_arrowstart.hint","sourcebytes":[83,116,97,114,116,105,110,103,32,97,114,114,111,119],"value":"Starting arrow"}, +{"hash":229386535,"name":"tfmain.combobox_arrowend.hint","sourcebytes":[69,110,100,105,110,103,32,97,114,114,111,119],"value":"Ending arrow"}, +{"hash":199465278,"name":"tfmain.tool_joinbevel.hint","sourcebytes":[66,101,118,101,108,32,106,111,105,110],"value":"Bevel join"}, +{"hash":73704254,"name":"tfmain.tool_joinround.hint","sourcebytes":[82,111,117,110,100,32,106,111,105,110],"value":"Round join"}, +{"hash":205804894,"name":"tfmain.tool_joinmiter.hint","sourcebytes":[77,105,116,101,114,32,106,111,105,110],"value":"Miter join"}, +{"hash":8055525,"name":"tfmain.combobox_penstyle.hint","sourcebytes":[80,101,110,32,115,116,121,108,101],"value":"Pen style"}, +{"hash":321780,"name":"tfmain.label_grid.caption","sourcebytes":[71,114,105,100],"value":"Grid"}, +{"hash":120,"name":"tfmain.label_gridx.caption","sourcebytes":[120],"value":"x"}, +{"hash":65314814,"name":"tfmain.tool_gridmovewithoutdeformation.hint","sourcebytes":[77,111,118,101,32,103,114,105,100,32,119,105,116,104,111,117,116,32,100,101,102,111,114,109,97,116,105,111,110],"value":"Move grid without deformation"}, +{"hash":4901317,"name":"tfmain.label_curve.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"}, +{"hash":200334437,"name":"tfmain.tool_curvemodeangle.hint","sourcebytes":[68,114,97,119,32,97,110,32,97,110,103,108,101],"value":"Draw an angle"}, +{"hash":131219621,"name":"tfmain.tool_curvemodecurve.hint","sourcebytes":[68,114,97,119,32,97,32,99,117,114,118,101],"value":"Draw a curve"}, +{"hash":218543091,"name":"tfmain.tool_curvemodeauto.hint","sourcebytes":[65,117,116,111,100,101,116,101,99,116,32,97,110,103,108,101,115],"value":"Autodetect angles"}, +{"hash":125049492,"name":"tfmain.tool_curvemovepoint.hint","sourcebytes":[77,111,118,101,32,112,111,105,110,116],"value":"Move point"}, +{"hash":371956,"name":"tfmain.label_text.caption","sourcebytes":[84,101,120,116],"value":"Text"}, +{"hash":71566590,"name":"tfmain.tool_textfont.hint","sourcebytes":[67,104,111,111,115,101,32,102,111,110,116,46,46,46],"value":"Choose font..."}, +{"hash":180162887,"name":"tfmain.tool_textphong.hint","sourcebytes":[84,101,120,116,32,112,104,111,110,103,32,115,104,97,100,105,110,103],"value":"Text phong shading"}, +{"hash":235120932,"name":"tfmain.tool_textalignleft.hint","sourcebytes":[65,108,105,103,110,32,108,101,102,116],"value":"Align left"}, +{"hash":77355714,"name":"tfmain.tool_textaligncenter.hint","sourcebytes":[67,101,110,116,101,114],"value":"Center"}, +{"hash":3199508,"name":"tfmain.tool_textalignright.hint","sourcebytes":[65,108,105,103,110,32,114,105,103,104,116],"value":"Align right"}, +{"hash":258464709,"name":"tfmain.spinedit_textsize.hint","sourcebytes":[84,101,120,116,32,115,105,122,101],"value":"Text size"}, +{"hash":5892197,"name":"tfmain.label_shape.caption","sourcebytes":[83,104,97,112,101],"value":"Shape"}, +{"hash":76974786,"name":"tfmain.label_phongborder.caption","sourcebytes":[66,111,114,100,101,114],"value":"Border"}, +{"hash":178787989,"name":"tfmain.tool_phongshaperectangle.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"}, +{"hash":4807381,"name":"tfmain.tool_phongshaperoundrect.hint","sourcebytes":[82,111,117,110,100,101,100,32,114,101,99,116,97,110,103,108,101],"value":"Rounded rectangle"}, +{"hash":94825605,"name":"tfmain.tool_phongshapesphere.hint","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"}, +{"hash":304709,"name":"tfmain.tool_phongshapecone.hint","sourcebytes":[67,111,110,101],"value":"Cone"}, +{"hash":187648901,"name":"tfmain.tool_phongshapeverticalcone.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,111,110,101],"value":"Vertical cone"}, +{"hash":115522882,"name":"tfmain.tool_phongshapehorizontalcylinder.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,99,121,108,105,110,100,101,114],"value":"Horizontal cylinder"}, +{"hash":31811010,"name":"tfmain.tool_phongshapeverticalcylinder.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,99,121,108,105,110,100,101,114],"value":"Vertical cylinder"}, +{"hash":202312101,"name":"tfmain.spinedit_phongbordersize.hint","sourcebytes":[66,111,114,100,101,114,32,115,105,122,101],"value":"Border size"}, +{"hash":61914917,"name":"tfmain.label_altitude.caption","sourcebytes":[65,108,116,105,116,117,100,101],"value":"Altitude"}, +{"hash":221694037,"name":"tfmain.spinedit_shapealtitude.hint","sourcebytes":[83,104,97,112,101,32,97,108,116,105,116,117,100,101],"value":"Shape altitude"}, +{"hash":6159272,"name":"tfmain.label_outlinewidth.caption","sourcebytes":[87,105,100,116,104],"value":"Width"}, +{"hash":57137717,"name":"tfmain.tool_textoutline.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101],"value":"Text outline"}, +{"hash":68821400,"name":"tfmain.spinedit_textoutlinewidth.hint","sourcebytes":[84,101,120,116,32,111,117,116,108,105,110,101,32,119,105,100,116,104],"value":"Text outline width"}, +{"hash":30209135,"name":"tfmain.perspective_twoplanes.hint","sourcebytes":[68,114,97,119,32,111,112,112,111,115,105,116,101,32,112,108,97,110,101,32,116,111,111],"value":"Draw opposite plane too"}, +{"hash":65297493,"name":"tfmain.perspective_repeat.hint","sourcebytes":[82,101,112,101,97,116,32,105,109,97,103,101],"value":"Repeat image"}, +{"hash":4824216,"name":"tfmain.label_brush.caption","sourcebytes":[66,114,117,115,104],"value":"Brush"}, +{"hash":174563351,"name":"tfmain.label_spacing.caption","sourcebytes":[83,112,97,99,105,110,103],"value":"Spacing"}, +{"hash":70662787,"name":"tfmain.spinedit_brushspacing.hint","sourcebytes":[83,112,97,99,105,110,103,32,98,101,116,119,101,101,110,32,112,97,116,116,101,114,110,115],"value":"Spacing between patterns"}, +{"hash":5802751,"name":"tfmain.label_ratio.caption","sourcebytes":[82,97,116,105,111],"value":"Ratio"}, +{"hash":67807111,"name":"tfmain.tool_aliasing.hint","sourcebytes":[68,105,115,97,98,108,101,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Disable antialiasing"}, +{"hash":120839925,"name":"tfmain.tool_closeshape.hint","sourcebytes":[67,108,111,115,101,32,115,104,97,112,101],"value":"Close shape"}, +{"hash":130332167,"name":"tfmain.tool_textshadow.hint","sourcebytes":[84,101,120,116,32,115,104,97,100,111,119],"value":"Text shadow"}, +{"hash":299970,"name":"tfmain.label_textblur.caption","sourcebytes":[66,108,117,114],"value":"Blur"}, +{"hash":114259058,"name":"tfmain.spinedit_textblur.hint","sourcebytes":[83,104,97,100,111,119,32,98,108,117,114],"value":"Shadow blur"}, +{"hash":89971140,"name":"tfmain.label_shadowoffset.caption","sourcebytes":[79,102,102,115,101,116],"value":"Offset"}, +{"hash":236421172,"name":"tfmain.spinedit_textshadowx.hint","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Horizontal shadow offset"}, +{"hash":105381300,"name":"tfmain.spinedit_textshadowy.hint","sourcebytes":[86,101,114,116,105,99,97,108,32,115,104,97,100,111,119,32,111,102,102,115,101,116],"value":"Vertical shadow offset"}, +{"hash":22206,"name":"tfmain.label_pen.caption","sourcebytes":[80,101,110],"value":"Pen"}, +{"hash":264792562,"name":"tfmain.image_swapcolors.hint","sourcebytes":[83,119,105,116,99,104,32,99,111,108,111,114],"value":"Switch color"}, +{"hash":296859,"name":"tfmain.label_back.caption","sourcebytes":[66,97,99,107],"value":"Back"}, +{"hash":76172398,"name":"tfmain.button_donate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."}, +{"hash":300580,"name":"tfmain.tool_textbold.hint","sourcebytes":[66,111,108,100],"value":"Bold"}, +{"hash":84574963,"name":"tfmain.tool_textitalic.hint","sourcebytes":[73,116,97,108,105,99],"value":"Italic"}, +{"hash":180974597,"name":"tfmain.tool_textunderline.hint","sourcebytes":[85,110,100,101,114,108,105,110,101],"value":"Underline"}, +{"hash":151125108,"name":"tfmain.tool_textstrikeout.hint","sourcebytes":[83,116,114,105,107,101,111,117,116],"value":"Strikeout"}, +{"hash":39152780,"name":"tfmain.tool_textbidirectional.hint","sourcebytes":[66,105,100,105,114,101,99,116,105,111,110,97,108],"value":"Bidirectional"}, +{"hash":63280628,"name":"tfmain.tool_textltr.hint","sourcebytes":[76,101,102,116,32,116,111,32,114,105,103,104,116],"value":"Left to right"}, +{"hash":65854964,"name":"tfmain.tool_textrtl.hint","sourcebytes":[82,105,103,104,116,32,116,111,32,108,101,102,116],"value":"Right to left"}, +{"hash":266351424,"name":"tfmain.tool_textaligntop.hint","sourcebytes":[65,108,105,103,110,32,116,111,112],"value":"Align top"}, +{"hash":116886537,"name":"tfmain.tool_textalignmiddle.hint","sourcebytes":[67,101,110,116,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Center vertically"}, +{"hash":34882909,"name":"tfmain.tool_textalignbottom.hint","sourcebytes":[65,108,105,103,110,32,98,111,116,116,111,109],"value":"Align bottom"}, +{"hash":88908046,"name":"tfmain.filenew.caption","sourcebytes":[78,101,119,46,46,46],"value":"New..."}, +{"hash":111833829,"name":"tfmain.filenew.hint","sourcebytes":[67,114,101,97,116,101,32,97,32,110,101,119,32,102,105,108,101],"value":"Create a new file"}, +{"hash":107745630,"name":"tfmain.fileopen.caption","sourcebytes":[79,112,101,110,46,46,46],"value":"Open..."}, +{"hash":218146437,"name":"tfmain.fileopen.hint","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101],"value":"Open existing file"}, +{"hash":23459486,"name":"tfmain.viewzoomin.hint","sourcebytes":[90,111,111,109,32,105,110],"value":"Zoom in"}, +{"hash":106918100,"name":"tfmain.viewzoomout.hint","sourcebytes":[90,111,111,109,32,111,117,116],"value":"Zoom out"}, +{"hash":251132352,"name":"tfmain.imagehorizontalflip.caption","sourcebytes":[72,111,114,105,122,111,110,116,97,108,32,102,108,105,112],"value":"Horizontal flip"}, +{"hash":107134297,"name":"tfmain.imagehorizontalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip image horizontally"}, +{"hash":187662016,"name":"tfmain.imageverticalflip.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,102,108,105,112],"value":"Vertical flip"}, +{"hash":128483817,"name":"tfmain.imageverticalflip.hint","sourcebytes":[70,108,105,112,32,105,109,97,103,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip image vertically"}, +{"hash":72010382,"name":"tfmain.imageresample.caption","sourcebytes":[82,101,115,97,109,112,108,101,46,46,46],"value":"Resample..."}, +{"hash":200831861,"name":"tfmain.imageresample.hint","sourcebytes":[82,101,115,97,109,112,108,101,32,105,109,97,103,101],"value":"Resample image"}, +{"hash":192766339,"name":"tfmain.imagesmartzoom3.caption","sourcebytes":[83,109,97,114,116,32,122,111,111,109,32,120,51],"value":"Smart zoom x3"}, +{"hash":23626005,"name":"tfmain.viewzoomoriginal.caption","sourcebytes":[79,114,105,103,105,110,97,108,32,115,105,122,101],"value":"Original size"}, +{"hash":259531189,"name":"tfmain.viewzoomoriginal.hint","sourcebytes":[90,111,111,109,32,116,111,32,111,114,105,103,105,110,97,108,32,112,105,120,101,108,32,115,105,122,101],"value":"Zoom to original pixel size"}, +{"hash":378031,"name":"tfmain.editundo.caption","sourcebytes":[85,110,100,111],"value":"Undo"}, +{"hash":130699086,"name":"tfmain.editundo.hint","sourcebytes":[85,110,100,111,32,108,97,115,116,32,109,111,100,105,102,105,99,97,116,105,111,110],"value":"Undo last modification"}, +{"hash":363439,"name":"tfmain.editredo.hint","sourcebytes":[82,101,100,111],"value":"Redo"}, +{"hash":106916628,"name":"tfmain.viewzoomfit.caption","sourcebytes":[90,111,111,109,32,102,105,116],"value":"Zoom fit"}, +{"hash":131274455,"name":"tfmain.viewzoomfit.hint","sourcebytes":[90,111,111,109,32,116,111,32,102,105,116,32,105,110,32,116,104,101,32,119,105,110,100,111,119],"value":"Zoom to fit in the window"}, +{"hash":211562244,"name":"tfmain.editdeselect.hint","sourcebytes":[68,101,115,101,108,101,99,116],"value":"Deselect"}, +{"hash":237622494,"name":"tfmain.editinvertselection.hint","sourcebytes":[73,110,118,101,114,116,32,115,101,108,101,99,116,105,111,110],"value":"Invert selection"}, +{"hash":17148597,"name":"tfmain.toolselectrect.hint","sourcebytes":[83,101,108,101,99,116,32,114,101,99,116,97,110,103,108,101],"value":"Select rectangle"}, +{"hash":135963749,"name":"tfmain.toolselectellipse.hint","sourcebytes":[83,101,108,101,99,116,32,101,108,108,105,112,115,101],"value":"Select ellipse"}, +{"hash":193486782,"name":"tfmain.toolselectpoly.hint","sourcebytes":[83,101,108,101,99,116,32,112,111,108,121,103,111,110],"value":"Select polygon"}, +{"hash":66511461,"name":"tfmain.toolselectspline.hint","sourcebytes":[83,101,108,101,99,116,32,99,117,114,118,101],"value":"Select curve"}, +{"hash":75354974,"name":"tfmain.toolmoveselection.hint","sourcebytes":[77,111,118,101,32,115,101,108,101,99,116,105,111,110],"value":"Move selection"}, +{"hash":128109646,"name":"tfmain.toolselectpen.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,112,101,110],"value":"Selection pen"}, +{"hash":228577870,"name":"tfmain.toolselectpen.hint","sourcebytes":[68,114,97,119,32,115,101,108,101,99,116,105,111,110,32,119,105,116,104,32,112,101,110],"value":"Draw selection with pen"}, +{"hash":304761,"name":"tfmain.editcopy.caption","sourcebytes":[67,111,112,121],"value":"Copy"}, +{"hash":79811454,"name":"tfmain.editcopy.hint","sourcebytes":[67,111,112,121,32,115,101,108,101,99,116,105,111,110],"value":"Copy selection"}, +{"hash":5671589,"name":"tfmain.editpaste.hint","sourcebytes":[80,97,115,116,101],"value":"Paste"}, +{"hash":19140,"name":"tfmain.editcut.caption","sourcebytes":[67,117,116],"value":"Cut"}, +{"hash":142399070,"name":"tfmain.editcut.hint","sourcebytes":[67,117,116,32,115,101,108,101,99,116,105,111,110],"value":"Cut selection"}, +{"hash":78392485,"name":"tfmain.editdeleteselection.caption","sourcebytes":[68,101,108,101,116,101],"value":"Delete"}, +{"hash":236551166,"name":"tfmain.editdeleteselection.hint","sourcebytes":[68,101,108,101,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Delete selection"}, +{"hash":169361790,"name":"tfmain.toolrotateselection.hint","sourcebytes":[82,111,116,97,116,101,32,115,101,108,101,99,116,105,111,110],"value":"Rotate selection"}, +{"hash":195296268,"name":"tfmain.editselectall.caption","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"}, +{"hash":195296268,"name":"tfmain.editselectall.hint","sourcebytes":[83,101,108,101,99,116,32,97,108,108],"value":"Select all"}, +{"hash":191244600,"name":"tfmain.viewtoolbox.caption","sourcebytes":[84,111,111,108,98,111,120],"value":"Toolbox"}, +{"hash":78001811,"name":"tfmain.viewcolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"}, +{"hash":88162814,"name":"tfmain.imagecrop.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110],"value":"Crop to selection"}, +{"hash":128112628,"name":"tfmain.editselectionfit.caption","sourcebytes":[83,101,108,101,99,116,105,111,110,32,102,105,116],"value":"Selection fit"}, +{"hash":73053668,"name":"tfmain.imageclearalpha.caption","sourcebytes":[67,108,101,97,114,32,97,108,112,104,97,32,99,104,97,110,110,101,108,32,97,110,100,32,115,101,116,32,98,97,99,107,103,114,111,117,110,100],"value":"Clear alpha channel and set background"}, +{"hash":32413959,"name":"tfmain.imagefillbackground.caption","sourcebytes":[70,105,108,108,32,98,97,99,107,103,114,111,117,110,100,32,119,105,116,104,32,97,110,116,105,97,108,105,97,115,105,110,103],"value":"Fill background with antialiasing"}, +{"hash":40698606,"name":"tfmain.imagechangecanvassize.caption","sourcebytes":[67,97,110,118,97,115,32,115,105,122,101,46,46,46],"value":"Canvas size..."}, +{"hash":174425639,"name":"tfmain.imagerotatecw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,87],"value":"Rotate 90\u00B0 CW"}, +{"hash":106458407,"name":"tfmain.imagerotateccw.caption","sourcebytes":[82,111,116,97,116,101,32,57,48,194,176,32,67,67,87],"value":"Rotate 90\u00B0 CCW"}, +{"hash":44176496,"name":"tfmain.imagerotate180.caption","sourcebytes":[82,111,116,97,116,101,32,49,56,48,194,176],"value":"Rotate 180\u00B0"}, +{"hash":219032926,"name":"tfmain.colorintensity.caption","sourcebytes":[73,110,116,101,110,115,105,116,121,46,46,46],"value":"Intensity..."}, +{"hash":102010462,"name":"tfmain.colorlightness.caption","sourcebytes":[66,114,105,103,104,116,110,101,115,115,32,47,32,67,111,110,116,114,97,115,116,46,46,46],"value":"Brightness / Contrast..."}, +{"hash":247427790,"name":"tfmain.colorshiftcolors.caption","sourcebytes":[83,104,105,102,116,32,99,111,108,111,114,115,46,46,46],"value":"Shift colors..."}, +{"hash":156902510,"name":"tfmain.colorcolorize.caption","sourcebytes":[67,111,108,111,114,105,122,101,46,46,46],"value":"Colorize..."}, +{"hash":78427662,"name":"tfmain.helpindex.caption","sourcebytes":[73,110,100,101,120,46,46,46],"value":"Index..."}, +{"hash":158102910,"name":"tfmain.helpabout.caption","sourcebytes":[65,98,111,117,116,46,46,46],"value":"About..."}, +{"hash":112740814,"name":"tfmain.imagerepeat.caption","sourcebytes":[82,101,112,101,97,116,46,46,46],"value":"Repeat..."}, +{"hash":257089940,"name":"tfmain.toolmagicwand.caption","sourcebytes":[77,97,103,105,99,32,119,97,110,100],"value":"Magic wand"}, +{"hash":45494836,"name":"tfmain.toolmagicwand.hint","sourcebytes":[77,97,103,105,99,32,119,97,110,100,32,115,101,108,101,99,116],"value":"Magic wand select"}, +{"hash":77818803,"name":"tfmain.renderclouds.caption","sourcebytes":[67,108,111,117,100,115],"value":"Clouds"}, +{"hash":240690499,"name":"tfmain.rendercustomwater.caption","sourcebytes":[87,97,116,101,114,32,119,105,116,104,32,99,117,115,116,111,109,32,99,111,108,111,114,115],"value":"Water with custom colors"}, +{"hash":85578645,"name":"tfmain.renderperlinnoise.caption","sourcebytes":[80,101,114,108,105,110,32,110,111,105,115,101],"value":"Perlin noise"}, +{"hash":261781,"name":"tfmain.rendercyclicperlinnoise.caption","sourcebytes":[67,121,99,108,105,99,32,80,101,114,108,105,110,32,110,111,105,115,101],"value":"Cyclic Perlin noise"}, +{"hash":386644,"name":"tfmain.renderwood.caption","sourcebytes":[87,111,111,100],"value":"Wood"}, +{"hash":120105643,"name":"tfmain.renderplastik.caption","sourcebytes":[80,108,97,115,116,105,107],"value":"Plastik"}, +{"hash":239140882,"name":"tfmain.rendermetalfloor.caption","sourcebytes":[77,101,116,97,108,32,102,108,111,111,114],"value":"Metal floor"}, +{"hash":112836501,"name":"tfmain.rendercamouflage.caption","sourcebytes":[67,97,109,111,117,102,108,97,103,101],"value":"Camouflage"}, +{"hash":158477108,"name":"tfmain.rendersnowprint.caption","sourcebytes":[83,110,111,119,32,112,114,105,110,116],"value":"Snow print"}, +{"hash":5944901,"name":"tfmain.renderstone.caption","sourcebytes":[83,116,111,110,101],"value":"Stone"}, +{"hash":103012869,"name":"tfmain.renderroundstone.caption","sourcebytes":[82,111,117,110,100,32,115,116,111,110,101],"value":"Round stone"}, +{"hash":87591205,"name":"tfmain.rendermarble.caption","sourcebytes":[77,97,114,98,108,101],"value":"Marble"}, +{"hash":6130370,"name":"tfmain.renderwater.caption","sourcebytes":[87,97,116,101,114],"value":"Water"}, +{"hash":187599764,"name":"tfmain.renderwoodvertical.caption","sourcebytes":[86,101,114,116,105,99,97,108,32,119,111,111,100],"value":"Vertical wood"}, +{"hash":137342309,"name":"tfmain.embeddedvalidate.caption","sourcebytes":[86,97,108,105,100,97,116,101],"value":"Validate"}, +{"hash":75331571,"name":"tfmain.embeddedvalidate.hint","sourcebytes":[86,97,108,105,100,97,116,101,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Validate modifications"}, +{"hash":77089212,"name":"tfmain.embeddedcancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, +{"hash":93963171,"name":"tfmain.embeddedcancel.hint","sourcebytes":[67,97,110,99,101,108,32,109,111,100,105,102,105,99,97,116,105,111,110,115],"value":"Cancel modifications"}, +{"hash":321780,"name":"tfmain.viewgrid.caption","sourcebytes":[71,114,105,100],"value":"Grid"}, +{"hash":176417125,"name":"tfmain.editpasteasnew.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,105,109,97,103,101],"value":"Paste as new image"}, +{"hash":221621454,"name":"tfmain.editselection.caption","sourcebytes":[69,100,105,116,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Edit selection..."}, +{"hash":86572179,"name":"tfmain.viewlayerstack.caption","sourcebytes":[76,97,121,101,114,115],"value":"Layers"}, +{"hash":124848643,"name":"tfmain.viewlayerstackbutton.caption","sourcebytes":[83,104,111,119,32,108,97,121,101,114,115],"value":"Show layers"}, +{"hash":214344631,"name":"tfmain.viewlayerstackbutton.hint","sourcebytes":[83,104,111,119,32,111,114,32,104,105,100,101,32,108,97,121,101,114,32,115,116,97,99,107,32,119,105,110,100,111,119],"value":"Show or hide layer stack window"}, +{"hash":161226738,"name":"tfmain.imagecroplayer.caption","sourcebytes":[67,114,111,112,32,116,111,32,115,101,108,101,99,116,105,111,110,32,97,110,100,32,99,117,114,114,101,110,116,32,108,97,121,101,114],"value":"Crop to selection and current layer"}, +{"hash":97075273,"name":"tfmain.layerhorizontalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip layer horizontally"}, +{"hash":110750825,"name":"tfmain.layerverticalflip.hint","sourcebytes":[70,108,105,112,32,108,97,121,101,114,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip layer vertically"}, +{"hash":248838978,"name":"tfmain.layeraddnew.hint","sourcebytes":[65,100,100,32,110,101,119,32,108,97,121,101,114],"value":"Add new layer"}, +{"hash":50252034,"name":"tfmain.layerremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,108,97,121,101,114],"value":"Remove layer"}, +{"hash":26157074,"name":"tfmain.layerduplicate.hint","sourcebytes":[68,117,112,108,105,99,97,116,101,32,115,101,108,101,99,116,101,100,32,108,97,121,101,114],"value":"Duplicate selected layer"}, +{"hash":20150450,"name":"tfmain.layermergeover.hint","sourcebytes":[77,101,114,103,101,32,108,97,121,101,114,32,111,118,101,114],"value":"Merge layer over"}, +{"hash":224054046,"name":"tfmain.layerfromfile.hint","sourcebytes":[73,109,112,111,114,116,32,108,97,121,101,114,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Import layer from file..."}, +{"hash":125290754,"name":"tfmain.layermove.hint","sourcebytes":[77,111,118,101,32,108,97,121,101,114],"value":"Move layer"}, +{"hash":50603874,"name":"tfmain.layerrotate.hint","sourcebytes":[82,111,116,97,116,101,32,108,97,121,101,114],"value":"Rotate layer"}, +{"hash":222858453,"name":"tfmain.imageflatten.caption","sourcebytes":[70,108,97,116,116,101,110,32,105,109,97,103,101],"value":"Flatten image"}, +{"hash":93074804,"name":"tfmain.filereload.caption","sourcebytes":[82,101,108,111,97,100],"value":"Reload"}, +{"hash":366789,"name":"tfmain.filesave.caption","sourcebytes":[83,97,118,101],"value":"Save"}, +{"hash":60022005,"name":"tfmain.filesave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101],"value":"Save current file"}, +{"hash":124639694,"name":"tfmain.filesaveas.caption","sourcebytes":[83,97,118,101,32,97,115,46,46,46],"value":"Save as..."}, +{"hash":159035875,"name":"tfmain.filesaveas.hint","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115],"value":"Save file as"}, +{"hash":363524,"name":"tfmain.filequit.hint","sourcebytes":[81,117,105,116],"value":"Quit"}, +{"hash":169186686,"name":"tfmain.filesaveselectionas.caption","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."}, +{"hash":223186382,"name":"tfmain.fileloadselection.caption","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110,46,46,46],"value":"Load selection..."}, +{"hash":59477454,"name":"tfmain.fileimport3d.caption","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116,46,46,46],"value":"Import 3D object..."}, +{"hash":164375502,"name":"tfmain.colorcurves.caption","sourcebytes":[67,117,114,118,101,115,46,46,46],"value":"Curves..."}, +{"hash":243723214,"name":"tfmain.colorposterize.caption","sourcebytes":[80,111,115,116,101,114,105,122,101,46,46,46],"value":"Posterize..."}, +{"hash":151352958,"name":"tfmain.fileprint.caption","sourcebytes":[80,114,105,110,116,46,46,46],"value":"Print..."}, +{"hash":225719252,"name":"tfmain.viewimagelist.caption","sourcebytes":[73,109,97,103,101,32,108,105,115,116],"value":"Image list"}, +{"hash":66110750,"name":"tfmain.filesaveasinsamefolder.caption","sourcebytes":[83,97,118,101,32,105,110,32,115,97,109,101,32,102,111,108,100,101,114,46,46,46],"value":"Save in same folder..."}, +{"hash":178213234,"name":"tfmain.editpasteasnewlayer.caption","sourcebytes":[80,97,115,116,101,32,97,115,32,110,101,119,32,108,97,121,101,114],"value":"Paste as new layer"}, +{"hash":158677870,"name":"tfmain.filterblurbox.caption","sourcebytes":[66,111,120,32,98,108,117,114,46,46,46],"value":"Box blur..."}, +{"hash":234157934,"name":"tfmain.filterblurfast.caption","sourcebytes":[70,97,115,116,32,98,108,117,114,46,46,46],"value":"Fast blur..."}, +{"hash":61344174,"name":"tfmain.filterblurradial.caption","sourcebytes":[71,97,117,115,115,105,97,110,32,98,108,117,114,46,46,46],"value":"Gaussian blur..."}, +{"hash":262805710,"name":"tfmain.filterblurcorona.caption","sourcebytes":[67,111,114,111,110,97,32,98,108,117,114,46,46,46],"value":"Corona blur..."}, +{"hash":227339886,"name":"tfmain.filterblurdisk.caption","sourcebytes":[68,105,115,107,32,98,108,117,114,46,46,46],"value":"Disk blur..."}, +{"hash":77369838,"name":"tfmain.filterblurprecise.caption","sourcebytes":[80,114,101,99,105,115,101,32,98,108,117,114,46,46,46],"value":"Precise blur..."}, +{"hash":260847150,"name":"tfmain.filterblurmotion.caption","sourcebytes":[77,111,116,105,111,110,32,98,108,117,114,46,46,46],"value":"Motion blur..."}, +{"hash":93793486,"name":"tfmain.filterblurcustom.caption","sourcebytes":[67,117,115,116,111,109,32,98,108,117,114,46,46,46],"value":"Custom blur..."}, +{"hash":158314382,"name":"tfmain.filtersharpen.caption","sourcebytes":[83,104,97,114,112,101,110,46,46,46],"value":"Sharpen..."}, +{"hash":94660264,"name":"tfmain.filtersmooth.caption","sourcebytes":[83,109,111,111,116,104],"value":"Smooth"}, +{"hash":87797630,"name":"tfmain.filtermedian.caption","sourcebytes":[77,101,100,105,97,110],"value":"Median"}, +{"hash":157953342,"name":"tfmain.filteremboss.caption","sourcebytes":[69,109,98,111,115,115,46,46,46],"value":"Emboss..."}, +{"hash":154699365,"name":"tfmain.filternormalize.caption","sourcebytes":[78,111,114,109,97,108,105,122,101],"value":"Normalize"}, +{"hash":198751621,"name":"tfmain.filternegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"}, +{"hash":151640741,"name":"tfmain.filtergrayscale.caption","sourcebytes":[71,114,97,121,115,99,97,108,101],"value":"Grayscale"}, +{"hash":174438018,"name":"tfmain.filtercontour.caption","sourcebytes":[67,111,110,116,111,117,114],"value":"Contour"}, +{"hash":94825605,"name":"tfmain.filtersphere.caption","sourcebytes":[83,112,104,101,114,101],"value":"Sphere"}, +{"hash":3165810,"name":"tfmain.filtercylinder.caption","sourcebytes":[67,121,108,105,110,100,101,114],"value":"Cylinder"}, +{"hash":258000517,"name":"tfmain.filterlinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"}, +{"hash":126661353,"name":"tfmain.filterplane.caption","sourcebytes":[80,108,97,110,101,32,40,115,108,111,119,41],"value":"Plane (slow)"}, +{"hash":235468478,"name":"tfmain.filtertwirl.caption","sourcebytes":[84,119,105,114,108,46,46,46],"value":"Twirl..."}, +{"hash":48074702,"name":"tfmain.filterpixelate.caption","sourcebytes":[80,105,120,101,108,97,116,101,46,46,46],"value":"Pixelate..."}, +{"hash":193464901,"name":"tfmain.filtercleartype.caption","sourcebytes":[67,108,101,97,114,84,121,112,101],"value":"ClearType"}, +{"hash":37795461,"name":"tfmain.filtercleartypeinverse.caption","sourcebytes":[73,110,118,101,114,115,101,32,67,108,101,97,114,84,121,112,101],"value":"Inverse ClearType"}, +{"hash":14654542,"name":"tfmain.filterphong.caption","sourcebytes":[83,104,97,100,101,100,32,109,97,112,46,46,46],"value":"Shaded map..."}, +{"hash":31581342,"name":"tfmain.filterfunction.caption","sourcebytes":[65,112,112,108,121,32,102,117,110,99,116,105,111,110,46,46,46],"value":"Apply function..."}, +{"hash":144289715,"name":"tfmain.filtercomplementarycolor.caption","sourcebytes":[67,111,109,112,108,101,109,101,110,116,97,114,121,32,99,111,108,111,114,115],"value":"Complementary colors"}, +{"hash":54233774,"name":"tfmain.filternoise.caption","sourcebytes":[78,111,105,115,101,32,102,105,108,116,101,114,46,46,46],"value":"Noise filter..."}, +{"hash":142610782,"name":"tfmain.filterrain.caption","sourcebytes":[82,97,105,110,46,46,46],"value":"Rain..."}, +{"hash":197181954,"name":"tfmain.viewstatusbar.caption","sourcebytes":[83,116,97,116,117,115,32,98,97,114],"value":"Status bar"}, +{"hash":109235189,"name":"tfmain.viewpalette.caption","sourcebytes":[80,97,108,101,116,116,101],"value":"Palette"}, +{"hash":167619026,"name":"tfmain.fileuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"}, +{"hash":64004190,"name":"tfmain.filechooseentry.caption","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,46,46,46],"value":"Choose entry..."}, +{"hash":143653317,"name":"tfmain.filechooseentry.hint","sourcebytes":[67,104,111,111,115,101,32,101,110,116,114,121,32,119,105,116,104,105,110,32,102,105,108,101],"value":"Choose entry within file"}, +{"hash":116001155,"name":"tfmain.forgetdialoganswers.caption","sourcebytes":[70,111,114,103,101,116,32,100,105,97,108,111,103,32,98,111,120,32,97,110,115,119,101,114,115],"value":"Forget dialog box answers"}, +{"hash":224505747,"name":"tfmain.forgetdialoganswers.hint","sourcebytes":[70,111,114,103,101,116,32,97,110,115,119,101,114,115,32,103,105,118,101,110,32,116,111,32,100,105,97,108,111,103,32,98,111,120,101,115],"value":"Forget answers given to dialog boxes"}, +{"hash":198751621,"name":"tfmain.imagenegative.caption","sourcebytes":[78,101,103,97,116,105,118,101],"value":"Negative"}, +{"hash":258000517,"name":"tfmain.imagelinearnegative.caption","sourcebytes":[76,105,110,101,97,114,32,110,101,103,97,116,105,118,101],"value":"Linear negative"}, +{"hash":179963859,"name":"tfmain.imageswapredblue.caption","sourcebytes":[83,119,97,112,32,114,101,100,32,97,110,100,32,98,108,117,101,32,99,104,97,110,110,101,108,115],"value":"Swap red and blue channels"}, +{"hash":259299730,"name":"tfmain.layerzoom.hint","sourcebytes":[90,111,111,109,32,108,97,121,101,114],"value":"Zoom layer"}, +{"hash":153208601,"name":"tfmain.selectionhorizontalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Flip selection horizontally"}, +{"hash":166020249,"name":"tfmain.selectionverticalflip.hint","sourcebytes":[70,108,105,112,32,115,101,108,101,99,116,105,111,110,32,118,101,114,116,105,99,97,108,108,121],"value":"Flip selection vertically"}, +{"hash":244531892,"name":"tfmain.fileremembersaveformat.hint","sourcebytes":[82,101,109,101,109,98,101,114,32,115,97,118,101,32,102,111,114,109,97,116],"value":"Remember save format"}, +{"hash":232678978,"name":"tfmain.layerrasterize.hint","sourcebytes":[82,97,115,116,101,114,105,122,101,32,108,97,121,101,114],"value":"Rasterize layer"}, +{"hash":97266030,"name":"tfmain.viewworkspacecolor.caption","sourcebytes":[83,101,116,32,119,111,114,107,115,112,97,99,101,32,99,111,108,111,114,46,46,46],"value":"Set workspace color..."}, +{"hash":226378933,"name":"tfmain.viewdarktheme.caption","sourcebytes":[68,97,114,107,32,116,104,101,109,101],"value":"Dark theme"}, +{"hash":17857150,"name":"tfmain.filterwavedisplacement.caption","sourcebytes":[87,97,118,101,32,100,105,115,112,108,97,99,101,109,101,110,116,46,46,46],"value":"Wave displacement..."}, +{"hash":321604,"name":"tfmain.toolhand.caption","sourcebytes":[72,97,110,100],"value":"Hand"}, +{"hash":171743509,"name":"tfmain.toolhand.hint","sourcebytes":[77,111,118,101,32,97,110,100,32,115,99,114,111,108,108,32,112,105,99,116,117,114,101],"value":"Move and scroll picture"}, +{"hash":107455380,"name":"tfmain.toolhotspot.caption","sourcebytes":[72,111,116,32,115,112,111,116],"value":"Hot spot"}, +{"hash":14124562,"name":"tfmain.toolhotspot.hint","sourcebytes":[67,104,111,111,115,101,32,104,111,116,32,115,112,111,116,32,111,102,32,97,32,99,117,114,115,111,114],"value":"Choose hot spot of a cursor"}, +{"hash":63551362,"name":"tfmain.toolcolorpicker.hint","sourcebytes":[67,111,108,111,114,32,112,105,99,107,101,114],"value":"Color picker"}, +{"hash":22206,"name":"tfmain.toolpen.caption","sourcebytes":[80,101,110],"value":"Pen"}, +{"hash":119723774,"name":"tfmain.toolpen.hint","sourcebytes":[83,105,109,112,108,101,32,112,101,110],"value":"Simple pen"}, +{"hash":4824216,"name":"tfmain.toolbrush.hint","sourcebytes":[66,114,117,115,104],"value":"Brush"}, +{"hash":80251330,"name":"tfmain.tooleraser.hint","sourcebytes":[69,114,97,115,101,114],"value":"Eraser"}, +{"hash":106595100,"name":"tfmain.toolfloodfill.hint","sourcebytes":[70,108,111,111,100,102,105,108,108],"value":"Floodfill"}, +{"hash":74651452,"name":"tfmain.toolclone.hint","sourcebytes":[67,108,111,110,101,32,116,111,111,108],"value":"Clone tool"}, +{"hash":108876645,"name":"tfmain.tooleditshape.hint","sourcebytes":[69,100,105,116,32,115,104,97,112,101],"value":"Edit shape"}, +{"hash":178787989,"name":"tfmain.toolrect.hint","sourcebytes":[82,101,99,116,97,110,103,108,101],"value":"Rectangle"}, +{"hash":204670933,"name":"tfmain.toolellipse.hint","sourcebytes":[69,108,108,105,112,115,101],"value":"Ellipse"}, +{"hash":123993614,"name":"tfmain.toolpolygon.caption","sourcebytes":[80,111,108,121,103,111,110],"value":"Polygon"}, +{"hash":53188549,"name":"tfmain.toolpolygon.hint","sourcebytes":[80,111,108,121,103,111,110,32,111,114,32,112,111,108,121,108,105,110,101],"value":"Polygon or polyline"}, +{"hash":4901317,"name":"tfmain.toolspline.caption","sourcebytes":[67,117,114,118,101],"value":"Curve"}, +{"hash":4901317,"name":"tfmain.toolspline.hint","sourcebytes":[67,117,114,118,101],"value":"Curve"}, +{"hash":142278836,"name":"tfmain.toolgradient.caption","sourcebytes":[71,114,97,100,105,101,110,116],"value":"Gradient"}, +{"hash":215410292,"name":"tfmain.toolgradient.hint","sourcebytes":[82,101,110,100,101,114,32,103,114,97,100,105,101,110,116],"value":"Render gradient"}, +{"hash":65508053,"name":"tfmain.toolphong.hint","sourcebytes":[83,104,97,100,101,100,32,115,104,97,112,101],"value":"Shaded shape"}, +{"hash":371956,"name":"tfmain.tooltext.hint","sourcebytes":[84,101,120,116],"value":"Text"}, +{"hash":158470974,"name":"tfmain.tooldeformation.caption","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110],"value":"Deformation"}, +{"hash":76663236,"name":"tfmain.tooldeformation.hint","sourcebytes":[68,101,102,111,114,109,97,116,105,111,110,32,103,114,105,100],"value":"Deformation grid"}, +{"hash":205239287,"name":"tfmain.tooltexturemapping.hint","sourcebytes":[84,101,120,116,117,114,101,32,109,97,112,112,105,110,103],"value":"Texture mapping"}, +{"hash":43972261,"name":"tfmain.toollayermapping.hint","sourcebytes":[76,97,121,101,114,32,112,101,114,115,112,101,99,116,105,118,101],"value":"Layer perspective"}, +{"hash":98487735,"name":"tfmain.toolchangedocking.hint","sourcebytes":[67,104,97,110,103,101,32,100,111,99,107,105,110,103],"value":"Change docking"}, +{"hash":200728952,"name":"tfmain.brushcreategeometric.hint","sourcebytes":[67,114,101,97,116,101,32,103,101,111,109,101,116,114,105,99,32,98,114,117,115,104],"value":"Create geometric brush"}, +{"hash":217170606,"name":"tfmain.brushloadfromfile.hint","sourcebytes":[76,111,97,100,32,98,114,117,115,104,32,102,114,111,109,32,102,105,108,101,46,46,46],"value":"Load brush from file..."}, +{"hash":15128104,"name":"tfmain.brushremovecurrent.hint","sourcebytes":[82,101,109,111,118,101,32,99,117,114,114,101,110,116,32,98,114,117,115,104],"value":"Remove current brush"}, +{"hash":74217360,"name":"tfmain.editmoveup.hint","sourcebytes":[77,111,118,101,32,117,112],"value":"Move up"}, +{"hash":141109012,"name":"tfmain.editmovetofront.hint","sourcebytes":[66,114,105,110,103,32,116,111,32,102,114,111,110,116],"value":"Bring to front"}, +{"hash":209126078,"name":"tfmain.editmovedown.hint","sourcebytes":[77,111,118,101,32,100,111,119,110],"value":"Move down"}, +{"hash":9093403,"name":"tfmain.editmovetoback.hint","sourcebytes":[83,101,110,100,32,116,111,32,98,97,99,107],"value":"Send to back"}, +{"hash":141965220,"name":"tfmain.editshapealignleft.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,108,101,102,116],"value":"Align shape left"}, +{"hash":244832953,"name":"tfmain.editshapecenterhorizontally.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,104,111,114,105,122,111,110,116,97,108,108,121],"value":"Center shape horizontally"}, +{"hash":122239604,"name":"tfmain.editshapealignright.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,114,105,103,104,116],"value":"Align shape right"}, +{"hash":43235424,"name":"tfmain.editshapealigntop.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,116,111,112],"value":"Align shape to the top"}, +{"hash":8451721,"name":"tfmain.editshapecentervertically.hint","sourcebytes":[67,101,110,116,101,114,32,115,104,97,112,101,32,118,101,114,116,105,99,97,108,108,121],"value":"Center shape vertically"}, +{"hash":174494829,"name":"tfmain.editshapealignbottom.hint","sourcebytes":[65,108,105,103,110,32,115,104,97,112,101,32,116,111,32,116,104,101,32,98,111,116,116,111,109],"value":"Align shape to the bottom"}, +{"hash":52527029,"name":"tfmain.editshapetocurve.hint","sourcebytes":[67,111,110,118,101,114,116,32,115,104,97,112,101,32,116,111,32,99,117,114,118,101],"value":"Convert shape to curve"}, +{"hash":46607102,"name":"tfmain.filerunscript.caption","sourcebytes":[82,117,110,32,115,99,114,105,112,116,46,46,46],"value":"Run script..."}, +{"hash":104868661,"name":"tfmain.toolpolyline.hint","sourcebytes":[80,111,108,121,108,105,110,101],"value":"Polyline"}, +{"hash":51121525,"name":"tfmain.toolopenedcurve.hint","sourcebytes":[79,112,101,110,101,100,32,99,117,114,118,101],"value":"Opened curve"}, +{"hash":124337662,"name":"tfmain.fileexport.caption","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."}, +{"hash":124337662,"name":"tfmain.layerexport.hint","sourcebytes":[69,120,112,111,114,116,46,46,46],"value":"Export..."}, +{"hash":164762421,"name":"tfmain.filequicksave.caption","sourcebytes":[81,117,105,99,107,32,115,97,118,101],"value":"Quick save"}, +{"hash":215358547,"name":"tfmain.filequicksave.hint","sourcebytes":[83,97,118,101,32,99,117,114,114,101,110,116,32,102,105,108,101,32,119,105,116,104,111,117,116,32,100,105,97,108,111,103,115],"value":"Save current file without dialogs"}, +{"hash":53140398,"name":"tfmain.renderhypocycloid.caption","sourcebytes":[72,121,112,111,99,121,99,108,111,105,100,46,46,46],"value":"Hypocycloid..."}, +{"hash":66536946,"name":"tfmain.colordialog1.title","sourcebytes":[67,104,111,111,115,101,32,99,111,108,111,114],"value":"Choose color"}, +{"hash":315429,"name":"tfmain.menufile.caption","sourcebytes":[70,105,108,101],"value":"File"}, +{"hash":167619026,"name":"tfmain.itemuseimagebrowser.caption","sourcebytes":[85,115,101,32,105,109,97,103,101,32,98,114,111,119,115,101,114],"value":"Use image browser"}, +{"hash":65502867,"name":"tfmain.menurecentfiles.caption","sourcebytes":[82,101,99,101,110,116,32,102,105,108,101,115],"value":"Recent files"}, +{"hash":139375349,"name":"tfmain.menulanguage.caption","sourcebytes":[76,97,110,103,117,97,103,101],"value":"Language"}, +{"hash":76172398,"name":"tfmain.itemdonate.caption","sourcebytes":[68,111,110,97,116,101,46,46,46],"value":"Donate..."}, +{"hash":310020,"name":"tfmain.menuedit.caption","sourcebytes":[69,100,105,116],"value":"Edit"}, +{"hash":94120868,"name":"tfmain.menuselect.caption","sourcebytes":[83,101,108,101,99,116],"value":"Select"}, +{"hash":380871,"name":"tfmain.menuview.caption","sourcebytes":[86,105,101,119],"value":"View"}, +{"hash":267499032,"name":"tfmain.itemviewdocktoolbox.caption","sourcebytes":[68,111,99,107,32,116,111,111,108,98,111,120],"value":"Dock toolbox"}, +{"hash":46565539,"name":"tfmain.itemdocklayersandcolors.caption","sourcebytes":[68,111,99,107,32,108,97,121,101,114,115,32,97,110,100,32,99,111,108,111,114,115],"value":"Dock layers and colors"}, +{"hash":60708750,"name":"tfmain.itemfullscreen.caption","sourcebytes":[70,117,108,108,115,99,114,101,101,110],"value":"Fullscreen"}, +{"hash":5257173,"name":"tfmain.menuimage.caption","sourcebytes":[73,109,97,103,101],"value":"Image"}, +{"hash":167030057,"name":"tfmain.menuremovetransparency.caption","sourcebytes":[82,101,109,111,118,101,32,116,114,97,110,115,112,97,114,101,110,99,121],"value":"Remove transparency"}, +{"hash":78001811,"name":"tfmain.menucolors.caption","sourcebytes":[67,111,108,111,114,115],"value":"Colors"}, +{"hash":5989939,"name":"tfmain.menutool.caption","sourcebytes":[84,111,111,108,115],"value":"Tools"}, +{"hash":80755394,"name":"tfmain.menufilter.caption","sourcebytes":[70,105,108,116,101,114],"value":"Filter"}, +{"hash":129960242,"name":"tfmain.menuradialblur.caption","sourcebytes":[82,97,100,105,97,108,32,98,108,117,114],"value":"Radial blur"}, +{"hash":93080258,"name":"tfmain.menurender.caption","sourcebytes":[82,101,110,100,101,114],"value":"Render"}, +{"hash":94015604,"name":"tfmain.menuscript.caption","sourcebytes":[83,99,114,105,112,116],"value":"Script"}, +{"hash":322608,"name":"tfmain.menuhelp.caption","sourcebytes":[72,101,108,112],"value":"Help"}, +{"hash":130864334,"name":"tfmain.loadselectiondialog.title","sourcebytes":[76,111,97,100,32,115,101,108,101,99,116,105,111,110],"value":"Load selection"}, +{"hash":695557,"name":"tfmain.openpicturedialog1.title","sourcebytes":[79,112,101,110,32,101,120,105,115,116,105,110,103,32,105,109,97,103,101],"value":"Open existing image"}, +{"hash":262765813,"name":"tfmain.opentexturedialog.title","sourcebytes":[79,112,101,110,32,116,101,120,116,117,114,101],"value":"Open texture"}, +{"hash":30161076,"name":"tfmain.open3dobjectdialog.title","sourcebytes":[73,109,112,111,114,116,32,51,68,32,111,98,106,101,99,116],"value":"Import 3D object"}, +{"hash":186570926,"name":"tfmain.savepicturedialog1.title","sourcebytes":[83,97,118,101,32,102,105,108,101,32,97,115,46,46,46],"value":"Save file as..."}, +{"hash":169186686,"name":"tfmain.saveselectiondialog.title","sourcebytes":[83,97,118,101,32,115,101,108,101,99,116,105,111,110,32,97,115,46,46,46],"value":"Save selection as..."}, +{"hash":7141976,"name":"tfmain.openbrushdialog.title","sourcebytes":[79,112,101,110,32,98,114,117,115,104],"value":"Open brush"}, +{"hash":231995746,"name":"tfmain.menufiletoolbar.caption","sourcebytes":[83,104,111,119,32,102,105,108,101,32,116,111,111,108,98,97,114],"value":"Show file toolbar"}, +{"hash":55148898,"name":"tfmain.menuzoomtoolbar.caption","sourcebytes":[83,104,111,119,32,122,111,111,109,32,116,111,111,108,98,97,114],"value":"Show zoom toolbar"}, +{"hash":185663746,"name":"tfmain.menucopypastetoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,112,121,47,112,97,115,116,101,32,116,111,111,108,98,97,114],"value":"Show copy/paste toolbar"}, +{"hash":61428515,"name":"tfmain.menucoordinatestoolbar.caption","sourcebytes":[83,104,111,119,32,99,111,111,114,100,105,110,97,116,101,115],"value":"Show coordinates"}, +{"hash":112373618,"name":"tfmain.menuundoredotoolbar.caption","sourcebytes":[83,104,111,119,32,117,110,100,111,47,114,101,100,111,32,116,111,111,108,98,97,114],"value":"Show undo/redo toolbar"}, +{"hash":66953941,"name":"tfmain.menushowpalette.caption","sourcebytes":[83,104,111,119,32,112,97,108,101,116,116,101],"value":"Show palette"}, +{"hash":165109892,"name":"tfmain.menudocktoolboxleft.caption","sourcebytes":[68,111,99,107,32,108,101,102,116],"value":"Dock left"}, +{"hash":226248804,"name":"tfmain.menudocktoolboxright.caption","sourcebytes":[68,111,99,107,32,114,105,103,104,116],"value":"Dock right"}, +{"hash":96777627,"name":"tfmain.menuundocktoolbox.caption","sourcebytes":[85,110,100,111,99,107],"value":"Undock"}, +{"hash":44513182,"name":"tfmain.exportpicturedialog.title","sourcebytes":[69,120,112,111,114,116,32,97,115,46,46,46],"value":"Export as..."} +]} diff --git a/lazpaint/lazpaintmainform.pas b/lazpaint/lazpaintmainform.pas index 0fe875cc..a47050df 100644 --- a/lazpaint/lazpaintmainform.pas +++ b/lazpaint/lazpaintmainform.pas @@ -25,6 +25,7 @@ interface { TFMain } TFMain = class(TForm) + RenderHypocycloid: TAction; FileQuickSave: TAction; SVGRasterImageList1: TBGRAImageList; Panel_TextMore: TPanel; diff --git a/lazpaint/lazpainttype.pas b/lazpaint/lazpainttype.pas index 32435352..f88c3ebe 100644 --- a/lazpaint/lazpainttype.pas +++ b/lazpaint/lazpainttype.pas @@ -73,7 +73,8 @@ interface pfEmboss, pfPhong, pfContour, pfGrayscale, pfNegative, pfLinearNegative, pfComplementaryColor, pfNormalize, pfSphere, pfTwirl, pfWaveDisplacement, pfCylinder, pfPlane, pfPerlinNoise,pfCyclicPerlinNoise,pfClouds,pfCustomWater,pfWater,pfRain,pfWood,pfWoodVertical,pfPlastik,pfMetalFloor,pfCamouflage, - pfSnowPrint,pfStone,pfRoundStone,pfMarble); + pfSnowPrint,pfStone,pfRoundStone,pfMarble, + pfHypocycloid); const PictureFilterStr : array[TPictureFilter] of string = @@ -83,7 +84,8 @@ interface 'Emboss', 'Phong', 'Contour', 'Grayscale', 'Negative', 'LinearNegative', 'ComplementaryColor', 'Normalize', 'Sphere', 'Twirl', 'WaveDisplacement', 'Cylinder', 'Plane', 'PerlinNoise','CyclicPerlinNoise','Clouds','CustomWater','Water','Rain','Wood','WoodVertical','Plastik','MetalFloor','Camouflage', - 'SnowPrint','Stone','RoundStone','Marble'); + 'SnowPrint','Stone','RoundStone','Marble', + 'Hypocycloid'); IsColoredFilter: array[TPictureFilter] of boolean = (false, @@ -92,7 +94,8 @@ interface false, true, false, false, false, false, false, false, false, false, false, false, false, false,false,true,true,true,true,true,true,true,true,true, - true,true,true,true); + true,true,true,true, + true); const MinZoomForGrid = 4; @@ -290,6 +293,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider) function ShowFunctionFilterDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract; function ShowSharpenDlg(AFilterConnector: TObject): TScriptResult; virtual; abstract; function ShowPosterizeDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract; + function ShowHypocycloidDlg(AInstance: TLazPaintCustomInstance; AParameters: TVariableSet): TScriptResult; virtual; abstract; procedure ShowPrintDlg; virtual; abstract; function OpenImage (FileName: string; AddToRecent: Boolean= True): boolean; virtual; abstract; procedure AddToImageList(const FileNames: array of String); virtual; abstract; diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index b9160302..a7626f77 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -446,6 +446,15 @@ msgstr "Gradient d'opacité" msgid "Number of sides:" msgstr "Nombre de côtés :" +#: tfhypocycloid.caption +msgctxt "tfhypocycloid.caption" +msgid "Hypocycloid" +msgstr "Hypocycloïde" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "Arches:" + #: tfimagelist.caption msgid "Image List" msgstr "Liste d'images" @@ -1478,6 +1487,11 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Bruit de Perlin cyclique" +#: tfmain.renderhypocycloid.caption +msgctxt "tfmain.renderhypocycloid.caption" +msgid "Hypocycloid..." +msgstr "Hypocycloïde..." + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marbre" diff --git a/lazpaint/uconfig.pas b/lazpaint/uconfig.pas index ee16357c..1bc6bb33 100644 --- a/lazpaint/uconfig.pas +++ b/lazpaint/uconfig.pas @@ -301,6 +301,9 @@ TLazPaintConfig = class function DefaultRainQuantity: double; procedure SetDefaultRainQuantity(value: double); + function DefaultCuspCount: integer; + procedure SetDefaultCuspCount(value: integer); + //twirl config function DefaultTwirlRadius: double; procedure SetDefaultTwirlRadius(value: double); @@ -1271,6 +1274,16 @@ procedure TLazPaintConfig.SetDefaultRainQuantity(value: double); iniOptions.WriteFloat('Filter','RainQuantity',value); end; +function TLazPaintConfig.DefaultCuspCount: integer; +begin + result := iniOptions.ReadInteger('Filter','CuspCount',6); +end; + +procedure TLazPaintConfig.SetDefaultCuspCount(value: integer); +begin + iniOptions.WriteInteger('Filter','CuspCount',value); +end; + function TLazPaintConfig.DefaultTwirlRadius: double; begin result := iniOptions.ReadFloat('Filter','TwirlRadius',100); diff --git a/lazpaint/ufilters.pas b/lazpaint/ufilters.pas index 5b8303bc..c691adba 100644 --- a/lazpaint/ufilters.pas +++ b/lazpaint/ufilters.pas @@ -126,6 +126,9 @@ function ExecuteFilter(AInstance: TLazPaintCustomInstance; filter: TPictureFilte if AInstance.Image.SelectionLayerIsEmpty then applyOfsBefore := true; + if filter = pfHypocycloid then + exit(AInstance.ShowHypocycloidDlg(AInstance, AParameters)); + try FilterConnector := TFilterConnector.Create(AInstance, AParameters, applyOfsBefore); layer := FilterConnector.ActiveLayer; diff --git a/lazpaint/umenu.pas b/lazpaint/umenu.pas index 76704dc5..a87631ff 100644 --- a/lazpaint/umenu.pas +++ b/lazpaint/umenu.pas @@ -484,7 +484,7 @@ procedure TMainFormMenu.Apply; AddMenus('MenuRadialBlur', 'FilterBlurBox,FilterBlurFast,FilterBlurRadial,FilterBlurCorona,FilterBlurDisk'); AddMenus('MenuColors', 'ColorCurves,ColorPosterize,ColorColorize,ColorShiftColors,FilterComplementaryColor,ColorIntensity,-,ColorLightness,FilterNegative,FilterLinearNegative,FilterNormalize,FilterGrayscale'); AddMenus('MenuTool', 'ToolHand,ToolHotSpot,ToolColorPicker,-,ToolPen,ToolBrush,ToolEraser,ToolFloodFill,ToolClone,-,ToolEditShape,ToolRect,ToolEllipse,ToolPolyline,ToolOpenedCurve,ToolPolygon,ToolSpline,ToolGradient,ToolPhong,ToolText,-,ToolDeformation,ToolTextureMapping'); - AddMenus('MenuRender', 'RenderPerlinNoise,RenderCyclicPerlinNoise,-,RenderWater,RenderCustomWater,RenderSnowPrint,RenderWood,RenderWoodVertical,RenderMetalFloor,RenderPlastik,RenderStone,RenderRoundStone,RenderMarble,RenderCamouflage,-,RenderClouds,FilterRain'); + AddMenus('MenuRender', 'RenderPerlinNoise,RenderCyclicPerlinNoise,-,RenderWater,RenderCustomWater,RenderSnowPrint,RenderWood,RenderWoodVertical,RenderMetalFloor,RenderPlastik,RenderStone,RenderRoundStone,RenderMarble,RenderCamouflage,-,RenderClouds,FilterRain,RenderHypocycloid'); AddMenus('MenuScript', 'FileRunScript,-,InstalledScripts'); AddMenus('MenuHelp', 'HelpIndex,-,HelpAbout'); for i := 0 to high(FMainMenus) do From 3b0ca5e06b0fa351685094b0177fc9248a65299d Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 22 Sep 2023 14:23:19 +0200 Subject: [PATCH 32/70] Added preview functionality for dialog Colorize --- lazpaint/dialog/color/ucolorize.lfm | 55 ++++++++++++++++------------- lazpaint/dialog/color/ucolorize.lrj | 7 ++-- lazpaint/dialog/color/ucolorize.pas | 21 +++++++++++ 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/lazpaint/dialog/color/ucolorize.lfm b/lazpaint/dialog/color/ucolorize.lfm index dcdb33c8..4d5c1863 100644 --- a/lazpaint/dialog/color/ucolorize.lfm +++ b/lazpaint/dialog/color/ucolorize.lfm @@ -1,23 +1,23 @@ object FColorize: TFColorize Left = 476 - Height = 174 + Height = 193 Top = 173 Width = 489 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Colorize' - ClientHeight = 174 + ClientHeight = 193 ClientWidth = 489 Font.Height = -12 OnCreate = FormCreate OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.2.4.0' object Label_Hue: TLabel Left = 8 Height = 15 Top = 10 - Width = 24 + Width = 22 Caption = 'Hue' ParentColor = False end @@ -25,7 +25,7 @@ object FColorize: TFColorize Left = 8 Height = 15 Top = 48 - Width = 57 + Width = 52 Caption = 'Colorness' ParentColor = False end @@ -50,10 +50,10 @@ object FColorize: TFColorize object Button_OK: TButton Left = 173 Height = 22 - Top = 143 + Top = 162 Width = 59 Anchors = [akLeft, akBottom] - Caption = 'OK' + Caption = 'rsOK' Default = True ModalResult = 1 OnClick = Button_OKClick @@ -62,43 +62,39 @@ object FColorize: TFColorize object Button_Cancel: TButton Left = 237 Height = 22 - Top = 143 + Top = 162 Width = 72 Anchors = [akLeft, akBottom] Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 3 end object FloatSpinEdit_Hue: TFloatSpinEdit Left = 408 - Height = 27 + Height = 23 Top = 7 Width = 72 DecimalPlaces = 1 MaxValue = 360 - MinValue = 0 OnChange = FloatSpinEdit_HueChange TabOrder = 4 - Value = 0 end object FloatSpinEdit_Saturation: TFloatSpinEdit Left = 408 - Height = 27 + Height = 23 Top = 43 Width = 72 DecimalPlaces = 3 MaxValue = 1 - MinValue = 0 OnChange = FloatSpinEdit_SaturationChange TabOrder = 5 - Value = 0 end object CheckBox_GSBA: TCheckBox Left = 8 - Height = 23 + Height = 19 Top = 80 - Width = 197 + Width = 168 Caption = 'Corrected hue and lightness' OnChange = CheckBox_GSBAChange TabOrder = 6 @@ -117,8 +113,8 @@ object FColorize: TFColorize object Label_Preset: TLabel Left = 0 Height = 15 - Top = 7 - Width = 37 + Top = 4 + Width = 32 AutoSize = False BorderSpacing.Right = 6 BorderSpacing.CellAlignVertical = ccaCenter @@ -126,21 +122,21 @@ object FColorize: TFColorize ParentColor = False end object Combo_Preset: TComboBox - Left = 43 - Height = 29 + Left = 38 + Height = 23 Top = 0 Width = 100 BorderSpacing.Right = 6 BorderSpacing.CellAlignVertical = ccaCenter - ItemHeight = 0 + ItemHeight = 15 OnChange = Combo_PresetChange Style = csDropDownList TabOrder = 0 end object ToolBar_AddRemove: TToolBar - Left = 149 + Left = 144 Height = 22 - Top = 3 + Top = 0 Width = 47 Align = alNone BorderSpacing.CellAlignVertical = ccaCenter @@ -160,4 +156,15 @@ object FColorize: TFColorize end end end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 136 + Width = 70 + Caption = 'rsPreview' + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 8 + end end diff --git a/lazpaint/dialog/color/ucolorize.lrj b/lazpaint/dialog/color/ucolorize.lrj index f0506786..a6e7ffa4 100644 --- a/lazpaint/dialog/color/ucolorize.lrj +++ b/lazpaint/dialog/color/ucolorize.lrj @@ -2,8 +2,9 @@ {"hash":104240549,"name":"tfcolorize.caption","sourcebytes":[67,111,108,111,114,105,122,101],"value":"Colorize"}, {"hash":20405,"name":"tfcolorize.label_hue.caption","sourcebytes":[72,117,101],"value":"Hue"}, {"hash":57214659,"name":"tfcolorize.label_colorness.caption","sourcebytes":[67,111,108,111,114,110,101,115,115],"value":"Colorness"}, -{"hash":1339,"name":"tfcolorize.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfcolorize.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, +{"hash":497723,"name":"tfcolorize.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfcolorize.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, {"hash":72944099,"name":"tfcolorize.checkbox_gsba.caption","sourcebytes":[67,111,114,114,101,99,116,101,100,32,104,117,101,32,97,110,100,32,108,105,103,104,116,110,101,115,115],"value":"Corrected hue and lightness"}, -{"hash":91802052,"name":"tfcolorize.label_preset.caption","sourcebytes":[80,114,101,115,101,116],"value":"Preset"} +{"hash":91802052,"name":"tfcolorize.label_preset.caption","sourcebytes":[80,114,101,115,101,116],"value":"Preset"}, +{"hash":126662215,"name":"tfcolorize.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"} ]} diff --git a/lazpaint/dialog/color/ucolorize.pas b/lazpaint/dialog/color/ucolorize.pas index a2e0a669..53a82a1f 100644 --- a/lazpaint/dialog/color/ucolorize.pas +++ b/lazpaint/dialog/color/ucolorize.pas @@ -18,6 +18,7 @@ TFColorize = class(TForm) Button_Cancel: TButton; Button_OK: TButton; CheckBox_GSBA: TCheckBox; + CheckBox_Preview: TCheckBox; Combo_Preset: TComboBox; FloatSpinEdit_Hue: TFloatSpinEdit; FloatSpinEdit_Saturation: TFloatSpinEdit; @@ -32,6 +33,7 @@ TFColorize = class(TForm) TrackBar_Saturation: TTrackBar; procedure Button_OKClick(Sender: TObject); procedure CheckBox_GSBAChange(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure Combo_PresetChange(Sender: TObject); procedure FloatSpinEdit_HueChange(Sender: TObject); procedure FloatSpinEdit_SaturationChange(Sender: TObject); @@ -114,6 +116,15 @@ procedure TFColorize.CheckBox_GSBAChange(Sender: TObject); end; end; +procedure TFColorize.CheckBox_PreviewChange(Sender: TObject); +begin + if not FInitialized then exit; + if CheckBox_Preview.Checked then + ApplyChosenColor + else + FFilterConnector.RestoreBackup; +end; + procedure TFColorize.Combo_PresetChange(Sender: TObject); begin if FInComboPreset then exit; @@ -266,6 +277,12 @@ procedure TFColorize.LoadParameters(AParams: TVariableSet); if AParams.IsDefined('Correction') then CheckBox_GSBA.Checked := AParams.Booleans['Correction']; UpdateSpinEdit; + + Button_OK.Caption := rsOK; + Button_Cancel.Caption := rsCancel; + CheckBox_Preview.Caption := rsPreview; + CheckBox_Preview.Checked := True; + CheckBox_Preview.Enabled := True; FInitialized := OldInitialized; end; @@ -359,6 +376,10 @@ function TFColorize.ShowModal(AInstance: TLazPaintCustomInstance; AParameters: T procedure TFColorize.ApplyChosenColor; begin Colorize(FFilterConnector, ChosenHueDegF, ChosenSatF, CheckBox_GSBA.Checked); + + FInitialized := False; + CheckBox_Preview.Checked := True; + FInitialized := True; end; {$R *.lfm} From e7fb2eeed34ffe64f005137b84a1e03f05a31121 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 22 Sep 2023 14:26:07 +0200 Subject: [PATCH 33/70] suppression of redundant translations in dialog Colorize --- lazpaint/release/bin/i18n/lazpaint.ar.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.bg.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.cs.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.de.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.es.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.fi.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.fr.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.it.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.ja.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.kab.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.lv.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.nl.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.pl.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.pot | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.ru.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.sv.po | 22 +++++++++++---------- lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 22 +++++++++++---------- 18 files changed, 204 insertions(+), 180 deletions(-) diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index d06ce0ee..273cca25 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -270,16 +270,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "إزاحة" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -444,6 +434,14 @@ msgstr "" msgid "Number of sides:" msgstr "" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "قائمة الصور" @@ -1474,6 +1472,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "ضجيج بيرلين دائري" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "رخام" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index aafef752..fcf5db6d 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -270,16 +270,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION" msgid "Shift" msgstr "Отместване" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfcolorize.caption msgctxt "TFCOLORIZE.CAPTION" msgid "Colorize" @@ -444,6 +434,14 @@ msgstr "Преливане на непрозрачността" msgid "Number of sides:" msgstr "Брой страни:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Списък с изображения" @@ -1470,6 +1468,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION" msgid "Cyclic Perlin noise" msgstr "Повтарящ пърлинов шум" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Мрамор" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index 1c877d4b..f3662ef6 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -254,16 +254,6 @@ msgstr "Násobek" msgid "Shift" msgstr "Posun" -#: tfcolorize.button_cancel.caption -msgctxt "tfcolorize.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfcolorize.button_ok.caption -msgctxt "tfcolorize.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgid "Colorize" msgstr "Obarvení" @@ -420,6 +410,14 @@ msgstr "Gradient průhlednosti" msgid "Number of sides:" msgstr "Počet stran:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Seznam obrázků" @@ -1391,6 +1389,10 @@ msgstr "Voda s vlastními barvami" msgid "Cyclic Perlin noise" msgstr "Kruhový Perlinův šum" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Mramor" diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index a13c1589..2a314dd8 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -280,16 +280,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Verschieben" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -454,6 +444,14 @@ msgstr "Deckkraft Verlauf" msgid "Number of sides:" msgstr "Anzahl der Seiten:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Bilderliste" @@ -1485,6 +1483,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Perlin-Rauschen (zyklisch)" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marmor" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index 91bdb20d..078c685e 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -272,16 +272,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Cambiar" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -443,6 +433,14 @@ msgstr "Opacidad de degradado" msgid "Number of sides:" msgstr "Número de lados:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Lista de imágenes" @@ -1468,6 +1466,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Ruido Perlin Cíclico" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Mármol" diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index cc150003..056d967e 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -262,16 +262,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION" msgid "Shift" msgstr "" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfcolorize.caption msgctxt "TFCOLORIZE.CAPTION" msgid "Colorize" @@ -433,6 +423,14 @@ msgstr "Liukuva peittävyys" msgid "Number of sides:" msgstr "Sivujen määrä:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Kuvaluettelo" @@ -1464,6 +1462,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION" msgid "Cyclic Perlin noise" msgstr "Jaksottainen Perlin kohina" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marmori" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index 6ab4b844..3bbf4479 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -272,16 +272,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Décaler" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po index 764e9ae5..49f75100 100644 --- a/lazpaint/release/bin/i18n/lazpaint.it.po +++ b/lazpaint/release/bin/i18n/lazpaint.it.po @@ -262,16 +262,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -433,6 +423,14 @@ msgstr "Gradiente di opacità" msgid "Number of sides:" msgstr "" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "" @@ -1463,6 +1461,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marmo" diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po index 8c9f2b16..223923be 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ja.po +++ b/lazpaint/release/bin/i18n/lazpaint.ja.po @@ -270,16 +270,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "シフト" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -441,6 +431,14 @@ msgstr "" msgid "Number of sides:" msgstr "" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "" @@ -1471,6 +1469,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Cyclic Perlinノイズ" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "マーブル大理石" diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po index d64561a4..6b54d270 100644 --- a/lazpaint/release/bin/i18n/lazpaint.kab.po +++ b/lazpaint/release/bin/i18n/lazpaint.kab.po @@ -273,16 +273,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Sekḥer" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -447,6 +437,14 @@ msgstr "Tiḍullest n ufesniw" msgid "Number of sides:" msgstr "Amḍan n idisan:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Tabdart n tugniwin" @@ -1477,6 +1475,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Asxerxec n Perlin s wallus" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Aṛxam" diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po index 3ff3f4c0..4e398fe8 100644 --- a/lazpaint/release/bin/i18n/lazpaint.lv.po +++ b/lazpaint/release/bin/i18n/lazpaint.lv.po @@ -278,16 +278,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Nobīde" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -452,6 +442,14 @@ msgstr "Izgaišana uz malām" msgid "Number of sides:" msgstr "Malu skaits:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Attēlu saraksts" @@ -1480,6 +1478,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Perlina troksnis flīzēm" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marmors" diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po index 27ec0f8f..6b937322 100644 --- a/lazpaint/release/bin/i18n/lazpaint.nl.po +++ b/lazpaint/release/bin/i18n/lazpaint.nl.po @@ -276,16 +276,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Verschuiven" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -450,6 +440,14 @@ msgstr "Dekkingsgradiënt" msgid "Number of sides:" msgstr "Aantal zijden:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Afbeeldingslijst" @@ -1475,6 +1473,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Cyclische Perlin-ruis" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marmer" diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po index 77c191fd..58d978b0 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pl.po +++ b/lazpaint/release/bin/i18n/lazpaint.pl.po @@ -280,16 +280,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Zmień" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -454,6 +444,14 @@ msgstr "Gradient krycia" msgid "Number of sides:" msgstr "Liczba stron:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Lista obrazów" @@ -1485,6 +1483,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Szum Perlina (cykliczny)" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marmur" diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot index 8d92393b..4b0ce0cd 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pot +++ b/lazpaint/release/bin/i18n/lazpaint.pot @@ -243,16 +243,6 @@ msgstr "" msgid "Shift" msgstr "" -#: tfcolorize.button_cancel.caption -msgctxt "tfcolorize.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfcolorize.button_ok.caption -msgctxt "tfcolorize.button_ok.caption" -msgid "OK" -msgstr "" - #: tfcolorize.caption msgid "Colorize" msgstr "" @@ -409,6 +399,14 @@ msgstr "" msgid "Number of sides:" msgstr "" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "" @@ -1380,6 +1378,10 @@ msgstr "" msgid "Cyclic Perlin noise" msgstr "" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po index 93b42428..8fa370ea 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po +++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po @@ -272,16 +272,6 @@ msgctxt "TFCOLORINTENSITY.LABEL_SHIFT.CAPTION" msgid "Shift" msgstr "Alterar" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgctxt "TFCOLORIZE.CAPTION" msgid "Colorize" @@ -443,6 +433,14 @@ msgstr "Gradiente de opacidade" msgid "Number of sides:" msgstr "Número de lados:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Lista de Imagens" @@ -1472,6 +1470,10 @@ msgctxt "TFMAIN.RENDERCYCLICPERLINNOISE.CAPTION" msgid "Cyclic Perlin noise" msgstr "Ruído Perlin cíclica" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Mármore" diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po index b7a7187a..cd857bf9 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ru.po +++ b/lazpaint/release/bin/i18n/lazpaint.ru.po @@ -267,16 +267,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Сдвиг" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -438,6 +428,14 @@ msgstr "Градиент непрозрачности" msgid "Number of sides:" msgstr "Кол-во сторон:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Список изображений" @@ -1463,6 +1461,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Циклический шум Перлина" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Мрамор" diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po index 8499e214..b18d0bb5 100644 --- a/lazpaint/release/bin/i18n/lazpaint.sv.po +++ b/lazpaint/release/bin/i18n/lazpaint.sv.po @@ -262,16 +262,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "Ändra" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -443,6 +433,14 @@ msgstr "Genomskinlig gradient" msgid "Number of sides:" msgstr "Antal sidor:" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "Bildlista" @@ -1473,6 +1471,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "Cyklisk Perlinbrus" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "Marmor" diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po index ac4aa8be..cc3989f8 100644 --- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po +++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po @@ -272,16 +272,6 @@ msgctxt "tfcolorintensity.label_shift.caption" msgid "Shift" msgstr "位移" -#: tfcolorize.button_cancel.caption -msgctxt "TFCOLORIZE.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tfcolorize.button_ok.caption -msgctxt "TFCOLORIZE.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfcolorize.caption msgctxt "tfcolorize.caption" msgid "Colorize" @@ -446,6 +436,14 @@ msgstr "透明度渐变" msgid "Number of sides:" msgstr "边数 :" +#: tfhypocycloid.caption +msgid "Hypocycloid" +msgstr "" + +#: tfhypocycloid.label_amount.caption +msgid "Cusps:" +msgstr "" + #: tfimagelist.caption msgid "Image List" msgstr "图像列表" @@ -1474,6 +1472,10 @@ msgctxt "tfmain.rendercyclicperlinnoise.caption" msgid "Cyclic Perlin noise" msgstr "环状佩林噪声" +#: tfmain.renderhypocycloid.caption +msgid "Hypocycloid..." +msgstr "" + #: tfmain.rendermarble.caption msgid "Marble" msgstr "大理石" From 110ca6b26134e259ffa3332d9fe82b9ff283acd6 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 22 Sep 2023 14:50:39 +0200 Subject: [PATCH 34/70] added preview functionality to dialog Color Intensity/Brightness --- lazpaint/dialog/color/ucolorintensity.lfm | 37 ++++++++++++++--------- lazpaint/dialog/color/ucolorintensity.lrj | 5 +-- lazpaint/dialog/color/ucolorintensity.pas | 20 ++++++++++++ 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/lazpaint/dialog/color/ucolorintensity.lfm b/lazpaint/dialog/color/ucolorintensity.lfm index 5bc28c19..49abb1f1 100644 --- a/lazpaint/dialog/color/ucolorintensity.lfm +++ b/lazpaint/dialog/color/ucolorintensity.lfm @@ -1,31 +1,31 @@ object FColorIntensity: TFColorIntensity Left = 405 - Height = 109 + Height = 128 Top = 187 Width = 472 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Intensity' - ClientHeight = 109 + ClientHeight = 128 ClientWidth = 472 Font.Height = -12 OnCreate = FormCreate OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '1.0.10.0' + LCLVersion = '2.2.4.0' object Label_Multiply: TLabel Left = 8 - Height = 16 + Height = 15 Top = 46 - Width = 45 + Width = 44 Caption = 'Multiply' ParentColor = False end object Label_Shift: TLabel Left = 8 - Height = 16 + Height = 15 Top = 13 - Width = 25 + Width = 24 Caption = 'Shift' ParentColor = False end @@ -50,9 +50,9 @@ object FColorIntensity: TFColorIntensity object Button_OK: TButton Left = 165 Height = 22 - Top = 80 + Top = 96 Width = 59 - Caption = 'OK' + Caption = 'rsOK' Default = True ModalResult = 1 OnClick = Button_OKClick @@ -61,10 +61,10 @@ object FColorIntensity: TFColorIntensity object Button_Cancel: TButton Left = 229 Height = 22 - Top = 80 + Top = 96 Width = 72 Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 3 end @@ -74,12 +74,10 @@ object FColorIntensity: TFColorIntensity Top = 8 Width = 72 DecimalPlaces = 3 - Increment = 1 MaxValue = 1 MinValue = -1 OnChange = FloatSpinEdit_ShiftChange TabOrder = 4 - Value = 0 end object FloatSpinEdit_Factor: TFloatSpinEdit Left = 392 @@ -87,11 +85,20 @@ object FColorIntensity: TFColorIntensity Top = 43 Width = 72 DecimalPlaces = 3 - Increment = 1 MaxValue = 2 MinValue = -2 OnChange = FloatSpinEdit_FactorChange TabOrder = 5 - Value = 0 + end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 80 + Width = 70 + Caption = 'rsPreview' + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 6 end end diff --git a/lazpaint/dialog/color/ucolorintensity.lrj b/lazpaint/dialog/color/ucolorintensity.lrj index 0da0a416..cb602311 100644 --- a/lazpaint/dialog/color/ucolorintensity.lrj +++ b/lazpaint/dialog/color/ucolorintensity.lrj @@ -2,6 +2,7 @@ {"hash":180736233,"name":"tfcolorintensity.caption","sourcebytes":[73,110,116,101,110,115,105,116,121],"value":"Intensity"}, {"hash":205194361,"name":"tfcolorintensity.label_multiply.caption","sourcebytes":[77,117,108,116,105,112,108,121],"value":"Multiply"}, {"hash":5894100,"name":"tfcolorintensity.label_shift.caption","sourcebytes":[83,104,105,102,116],"value":"Shift"}, -{"hash":1339,"name":"tfcolorintensity.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfcolorintensity.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfcolorintensity.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfcolorintensity.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, +{"hash":126662215,"name":"tfcolorintensity.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"} ]} diff --git a/lazpaint/dialog/color/ucolorintensity.pas b/lazpaint/dialog/color/ucolorintensity.pas index f584a07d..23ff04fe 100644 --- a/lazpaint/dialog/color/ucolorintensity.pas +++ b/lazpaint/dialog/color/ucolorintensity.pas @@ -18,6 +18,7 @@ interface TFColorIntensity = class(TForm) Button_Cancel: TButton; Button_OK: TButton; + CheckBox_Preview: TCheckBox; FloatSpinEdit_Shift: TFloatSpinEdit; FloatSpinEdit_Factor: TFloatSpinEdit; Label_Multiply: TLabel; @@ -25,6 +26,7 @@ TFColorIntensity = class(TForm) TrackBar_Multiply: TTrackBar; TrackBar_Shift: TTrackBar; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FloatSpinEdit_FactorChange(Sender: TObject); procedure FloatSpinEdit_ShiftChange(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -92,6 +94,15 @@ procedure TFColorIntensity.Button_OKClick(Sender: TObject); FFilterConnector.Parameters.Floats['Shift'] := FloatSpinEdit_Shift.Value; end; +procedure TFColorIntensity.CheckBox_PreviewChange(Sender: TObject); +begin + if not FInitialized then exit; + if CheckBox_Preview.Checked then + ApplyChosenIntensity + else + FFilterConnector.RestoreBackup; +end; + procedure TFColorIntensity.FloatSpinEdit_FactorChange(Sender: TObject); begin FUpdatingSpinEdit := true; @@ -198,6 +209,11 @@ procedure TFColorIntensity.LoadParameters; if FFilterConnector.Parameters.IsDefined('Shift') then ChosenShift := FFilterConnector.Parameters.Floats['Shift']; UpdateSpinEdit; + + Button_OK.Caption := rsOK; + Button_Cancel.Caption := rsCancel; + CheckBox_Preview.Caption := rsPreview; + CheckBox_Preview.Checked := True; FInitialized := OldInitialized; end; end; @@ -272,6 +288,10 @@ procedure TFColorIntensity.ApplyChosenIntensity; ciIntensity: FilterIntensity(FFilterConnector, ChosenFactor,ChosenShift); ciLightness: FilterLightness(FFilterConnector, ChosenFactor,ChosenShift); end; + + FInitialized := False; + CheckBox_Preview.Checked := True; + FInitialized := True; end; {$R *.lfm} From ea5d929a2164c3712dfc98c4b3a414df1737ae44 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 22 Sep 2023 14:51:38 +0200 Subject: [PATCH 35/70] suppression of redundant translations in dialog Color Intensity/Brightness --- lazpaint/release/bin/i18n/lazpaint.ar.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.bg.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.cs.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.de.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.es.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fi.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fr.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.it.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.ja.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.kab.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.lv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.nl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pot | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.ru.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.sv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 10 ---------- 18 files changed, 180 deletions(-) diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index 273cca25..573e44f9 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -245,16 +245,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "لون" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "إلغاء" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "موافق" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index fcf5db6d..02c937aa 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -245,16 +245,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION" msgid "Color" msgstr "Цвят" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отказ" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Добре" - #: tfcolorintensity.caption msgctxt "TFCOLORINTENSITY.CAPTION" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index f3662ef6..31997a30 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -231,16 +231,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Barva" -#: tfcolorintensity.button_cancel.caption -msgctxt "tfcolorintensity.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfcolorintensity.button_ok.caption -msgctxt "tfcolorintensity.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index 2a314dd8..457426a3 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -255,16 +255,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Farbe" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Abbruch" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index 078c685e..0cef0c09 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -247,16 +247,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Color" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Aceptar" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index 056d967e..9a1718ca 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -237,16 +237,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION" msgid "Color" msgstr "Väri" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfcolorintensity.caption msgctxt "TFCOLORINTENSITY.CAPTION" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index 3bbf4479..2e3ac49d 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -247,16 +247,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Couleur" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuler" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po index 49f75100..3e465499 100644 --- a/lazpaint/release/bin/i18n/lazpaint.it.po +++ b/lazpaint/release/bin/i18n/lazpaint.it.po @@ -237,16 +237,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Colore" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancella" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po index 223923be..cd96914c 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ja.po +++ b/lazpaint/release/bin/i18n/lazpaint.ja.po @@ -245,16 +245,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "色" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "キャンセル" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po index 6b54d270..9314e471 100644 --- a/lazpaint/release/bin/i18n/lazpaint.kab.po +++ b/lazpaint/release/bin/i18n/lazpaint.kab.po @@ -248,16 +248,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Ini" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Sefsex" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Ih" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po index 4e398fe8..0041fa3a 100644 --- a/lazpaint/release/bin/i18n/lazpaint.lv.po +++ b/lazpaint/release/bin/i18n/lazpaint.lv.po @@ -253,16 +253,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Krāsa" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Atcelt" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "Labi" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po index 6b937322..bdbb9f0a 100644 --- a/lazpaint/release/bin/i18n/lazpaint.nl.po +++ b/lazpaint/release/bin/i18n/lazpaint.nl.po @@ -251,16 +251,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Kleur" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Annuleren" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po index 58d978b0..b1942746 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pl.po +++ b/lazpaint/release/bin/i18n/lazpaint.pl.po @@ -255,16 +255,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Kolory" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Anuluj" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot index 4b0ce0cd..9034dc8e 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pot +++ b/lazpaint/release/bin/i18n/lazpaint.pot @@ -220,16 +220,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "" -#: tfcolorintensity.button_cancel.caption -msgctxt "tfcolorintensity.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfcolorintensity.button_ok.caption -msgctxt "tfcolorintensity.button_ok.caption" -msgid "OK" -msgstr "" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po index 8fa370ea..b50ae91c 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po +++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po @@ -247,16 +247,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION" msgid "Color" msgstr "Cor" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "TFCOLORINTENSITY.CAPTION" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po index cd857bf9..cb0eb5fb 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ru.po +++ b/lazpaint/release/bin/i18n/lazpaint.ru.po @@ -242,16 +242,6 @@ msgctxt "TFCHOOSECOLOR.CAPTION" msgid "Color" msgstr "Цвет" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Отмена" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "ОК" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po index b18d0bb5..181c5d89 100644 --- a/lazpaint/release/bin/i18n/lazpaint.sv.po +++ b/lazpaint/release/bin/i18n/lazpaint.sv.po @@ -237,16 +237,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "Färg" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Avbryt" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po index cc3989f8..77fd2afb 100644 --- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po +++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po @@ -247,16 +247,6 @@ msgctxt "tfchoosecolor.caption" msgid "Color" msgstr "颜色" -#: tfcolorintensity.button_cancel.caption -msgctxt "TFCOLORINTENSITY.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "取消" - -#: tfcolorintensity.button_ok.caption -msgctxt "TFCOLORINTENSITY.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "确定" - #: tfcolorintensity.caption msgctxt "tfcolorintensity.caption" msgid "Intensity" From b53f8b1c1dcc0317769a8da5ad3653b71743c6f8 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 22 Sep 2023 16:28:42 +0200 Subject: [PATCH 36/70] Added preview functionality to dialog Adjust curves --- lazpaint/dialog/color/uadjustcurves.lfm | 45 +++++++++++++--------- lazpaint/dialog/color/uadjustcurves.lrj | 5 ++- lazpaint/dialog/color/uadjustcurves.pas | 51 ++++++++++++++++++++++++- 3 files changed, 80 insertions(+), 21 deletions(-) diff --git a/lazpaint/dialog/color/uadjustcurves.lfm b/lazpaint/dialog/color/uadjustcurves.lfm index d2d51c9e..c1f8bb63 100644 --- a/lazpaint/dialog/color/uadjustcurves.lfm +++ b/lazpaint/dialog/color/uadjustcurves.lfm @@ -1,11 +1,11 @@ object FAdjustCurves: TFAdjustCurves Left = 439 - Height = 326 + Height = 345 Top = 193 Width = 432 BorderIcons = [biSystemMenu, biMinimize] Caption = 'Adjust curves' - ClientHeight = 326 + ClientHeight = 345 ClientWidth = 432 KeyPreview = True OnCloseQuery = FormCloseQuery @@ -15,7 +15,7 @@ object FAdjustCurves: TFAdjustCurves OnKeyDown = FormKeyDown OnShow = FormShow Position = poOwnerFormCenter - LCLVersion = '1.8.2.0' + LCLVersion = '2.2.4.0' object TabControl1: TTabControl Left = 0 Height = 289 @@ -33,12 +33,11 @@ object FAdjustCurves: TFAdjustCurves 'Alpha' ) Align = alClient - Anchors = [akLeft, akTop, akRight, akBottom] TabOrder = 0 object vsChart: TBGRAVirtualScreen Left = 2 - Height = 230 - Top = 57 + Height = 239 + Top = 48 Width = 428 OnRedraw = vsChartRedraw Align = alClient @@ -53,7 +52,7 @@ object FAdjustCurves: TFAdjustCurves object Panel2: TPanel Left = 2 Height = 25 - Top = 32 + Top = 23 Width = 428 Align = alTop ClientHeight = 25 @@ -65,7 +64,6 @@ object FAdjustCurves: TFAdjustCurves Top = 0 Width = 90 Align = alNone - Anchors = [akTop, akLeft] EdgeBorders = [] Images = FMain.ImageList16 ParentShowHint = False @@ -98,50 +96,61 @@ object FAdjustCurves: TFAdjustCurves end object Panel1: TPanel Left = 0 - Height = 37 + Height = 56 Top = 289 Width = 432 Align = alBottom BevelOuter = bvNone - ClientHeight = 37 + ClientHeight = 56 ClientWidth = 432 TabOrder = 1 object Button_Cancel: TButton Left = 213 Height = 22 - Top = 7 + Top = 26 Width = 72 Anchors = [akLeft, akBottom] Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 0 end object Button_OK: TButton Left = 149 Height = 22 - Top = 7 + Top = 26 Width = 59 Anchors = [akLeft, akBottom] - Caption = 'OK' + Caption = 'rsOK' Default = True ModalResult = 1 OnClick = Button_OKClick TabOrder = 1 end + object CheckBox_Preview: TCheckBox + Left = 8 + Height = 19 + Top = 0 + Width = 70 + Caption = 'rsPreview' + Checked = True + OnChange = CheckBox_PreviewChange + State = cbChecked + TabOrder = 2 + end end object Timer_Thread: TTimer Enabled = False Interval = 200 OnTimer = Timer_ThreadTimer - left = 62 - top = 466 + Left = 62 + Top = 466 end object Timer_Chart: TTimer Enabled = False Interval = 20 OnTimer = Timer_ChartTimer - left = 123 - top = 467 + Left = 123 + Top = 467 end end diff --git a/lazpaint/dialog/color/uadjustcurves.lrj b/lazpaint/dialog/color/uadjustcurves.lrj index 6c7a205a..5ac4ca48 100644 --- a/lazpaint/dialog/color/uadjustcurves.lrj +++ b/lazpaint/dialog/color/uadjustcurves.lrj @@ -3,6 +3,7 @@ {"hash":26714085,"name":"tfadjustcurves.toolbutton_newcurve.hint","sourcebytes":[68,105,115,99,97,114,100,32,99,117,114,114,101,110,116,32,99,117,114,118,101,32,97,110,100,32,115,116,97,114,116,32,97,32,110,101,119,32,111,110,101],"value":"Discard current curve and start a new one"}, {"hash":1994857,"name":"tfadjustcurves.toolbutton_removepoint.hint","sourcebytes":[82,101,109,111,118,101,32,115,101,108,101,99,116,101,100,32,112,111,105,110,116,32,40,68,101,108,41],"value":"Remove selected point (Del)"}, {"hash":179103845,"name":"tfadjustcurves.toolbutton_posterize.hint","sourcebytes":[80,111,115,116,101,114,105,122,101],"value":"Posterize"}, -{"hash":77089212,"name":"tfadjustcurves.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"}, -{"hash":1339,"name":"tfadjustcurves.button_ok.caption","sourcebytes":[79,75],"value":"OK"} +{"hash":127421996,"name":"tfadjustcurves.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"}, +{"hash":497723,"name":"tfadjustcurves.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":126662215,"name":"tfadjustcurves.checkbox_preview.caption","sourcebytes":[114,115,80,114,101,118,105,101,119],"value":"rsPreview"} ]} diff --git a/lazpaint/dialog/color/uadjustcurves.pas b/lazpaint/dialog/color/uadjustcurves.pas index 310c0af5..7fc41c83 100644 --- a/lazpaint/dialog/color/uadjustcurves.pas +++ b/lazpaint/dialog/color/uadjustcurves.pas @@ -25,6 +25,7 @@ interface { TFAdjustCurves } TFAdjustCurves = class(TForm) + CheckBox_Preview: TCheckBox; Panel2: TPanel; Timer_Chart: TTimer; Timer_Thread: TTimer; @@ -38,6 +39,7 @@ TFAdjustCurves = class(TForm) Panel1: TPanel; TabControl1: TTabControl; procedure Button_OKClick(Sender: TObject); + procedure CheckBox_PreviewChange(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormDestroy(Sender: TObject); procedure FormHide(Sender: TObject); @@ -104,6 +106,11 @@ TFAdjustCurves = class(TForm) procedure DiscardHistogram; procedure QueryHistogramRedraw; procedure OnTaskEvent({%H-}ASender: TObject; AEvent: TThreadManagerEvent); + private + FInitializingGui: boolean; + FComputedImage: TBGRABitmap; + procedure DisplayComputedImage; + procedure StoreComputedImage; public { public declarations } function ShowModal: integer; override; @@ -336,6 +343,13 @@ procedure TFAdjustCurves.FormShow(Sender: TObject); begin vsChart.DiscardBitmap; DiscardHistogram; + + FInitializingGui := True; + Button_OK.Caption := rsOK; + Button_Cancel.Caption := rsCancel; + CheckBox_Preview.Caption := rsPreview; + CheckBox_Preview.Checked := True; + FInitializingGui := False; end; procedure TFAdjustCurves.TabControl1Change(Sender: TObject); @@ -428,14 +442,29 @@ procedure TFAdjustCurves.FormDestroy(Sender: TObject); begin FreeAndNil(FGraphBackgroundLeft); FreeAndNil(FGraphBackgroundBottom); + FreeAndNil(FComputedImage); end; procedure TFAdjustCurves.Button_OKClick(Sender: TObject); begin + if not CheckBox_Preview.Checked then DisplayComputedImage; + if not FFilterConnector.ActionDone then FFilterConnector.ValidateAction; ModalResult := mrOK; end; +procedure TFAdjustCurves.CheckBox_PreviewChange(Sender: TObject); +begin + if FInitializingGui then exit; + if CheckBox_Preview.Checked then + DisplayComputedImage + else + begin + StoreComputedImage; + FFilterConnector.RestoreBackup; + end; +end; + procedure TFAdjustCurves.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin FThreadManager.Quit; @@ -947,7 +976,10 @@ procedure TFAdjustCurves.OnTaskEvent(ASender: TObject; if FThreadManager.ReadyToClose then Close else - if AEvent = tmeCompletedTask then Button_OK.Enabled := true; + if AEvent = tmeCompletedTask then begin + Button_OK.Enabled := true; + CheckBox_Preview.Enabled := true; + end; end; tmeStartingNewTask: begin @@ -955,10 +987,27 @@ procedure TFAdjustCurves.OnTaskEvent(ASender: TObject; Timer_Thread.Interval := 100; Timer_Thread.Enabled := true; Button_OK.Enabled := false; + FInitializingGui := True; + CheckBox_Preview.Enabled := false; + CheckBox_Preview.Checked := True; + FreeAndNil(FComputedImage); + FInitializingGui := False; end; end; end; +procedure TFAdjustCurves.DisplayComputedImage; +begin + if FComputedImage <> nil then + FFilterConnector.PutImage(FComputedImage, false, false); +end; + +procedure TFAdjustCurves.StoreComputedImage; +begin + if FComputedImage = nil then + FComputedImage := FFilterConnector.ActiveLayer.Duplicate; +end; + function TFAdjustCurves.ShowModal: integer; begin if (FFilterConnector = nil) or (FFilterConnector.ActiveLayer = nil) then From bf37c80487caa135fd8c0ea0a767150ae5e59fc9 Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 22 Sep 2023 16:29:35 +0200 Subject: [PATCH 37/70] suppression of redundant translations in dialog Adjust curves --- lazpaint/release/bin/i18n/lazpaint.ar.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.bg.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.cs.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.de.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.es.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fi.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fr.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.it.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.ja.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.kab.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.lv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.nl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pot | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.ru.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.sv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 10 ---------- 18 files changed, 180 deletions(-) diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index 573e44f9..edee9731 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -62,16 +62,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "مفتوح المصدر (جي بي ال 3) " -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "ضبط المنحنيات" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index 02c937aa..8df38c3d 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -65,16 +65,6 @@ msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION" msgid "Open source (GPLv3)" msgstr "Отворен код (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Отказ" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "Добре" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Настройка на кривите" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index 31997a30..9c408801 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -58,16 +58,6 @@ msgstr "Licence:" msgid "Open source (GPLv3)" msgstr "Otevřený kód (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Nastavit křivky" diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index 457426a3..16eb6e77 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -72,16 +72,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Open Source (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Farbkurven anpassen" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index 0cef0c09..444ecc8e 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -64,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Código libre (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "Aceptar" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Ajustar curvas" diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index 9a1718ca..3b7ba898 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -54,16 +54,6 @@ msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION" msgid "Open source (GPLv3)" msgstr "Avoin lähdekoodi (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "TFADJUSTCURVES.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfadjustcurves.button_ok.caption -msgctxt "TFADJUSTCURVES.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Muokkaa käyriä" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index 2e3ac49d..512fdd88 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -64,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Code libre (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Ajuster les courbes" diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po index 3e465499..02732e2f 100644 --- a/lazpaint/release/bin/i18n/lazpaint.it.po +++ b/lazpaint/release/bin/i18n/lazpaint.it.po @@ -54,16 +54,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Aggiusta curve" diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po index cd96914c..375c3a8f 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ja.po +++ b/lazpaint/release/bin/i18n/lazpaint.ja.po @@ -62,16 +62,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Open source (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po index 9314e471..709f98f2 100644 --- a/lazpaint/release/bin/i18n/lazpaint.kab.po +++ b/lazpaint/release/bin/i18n/lazpaint.kab.po @@ -65,16 +65,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Open source (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Sgaddi izligen" diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po index 0041fa3a..3d826828 100644 --- a/lazpaint/release/bin/i18n/lazpaint.lv.po +++ b/lazpaint/release/bin/i18n/lazpaint.lv.po @@ -70,16 +70,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Atklātā pirmkoda (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Mainīt līknes" diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po index bdbb9f0a..f2983cb2 100644 --- a/lazpaint/release/bin/i18n/lazpaint.nl.po +++ b/lazpaint/release/bin/i18n/lazpaint.nl.po @@ -68,16 +68,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Open source (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Krommen aanpassen" diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po index b1942746..b3c175b8 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pl.po +++ b/lazpaint/release/bin/i18n/lazpaint.pl.po @@ -72,16 +72,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Otwarte źródło (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Dostosuj krzywe kolorów" diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot index 9034dc8e..b5196df2 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pot +++ b/lazpaint/release/bin/i18n/lazpaint.pot @@ -47,16 +47,6 @@ msgstr "" msgid "Open source (GPLv3)" msgstr "" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po index b50ae91c..0ef3769b 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po +++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po @@ -64,16 +64,6 @@ msgctxt "TFABOUT.LABEL_OPENSOURCE.CAPTION" msgid "Open source (GPLv3)" msgstr "Código aberto (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "TFADJUSTCURVES.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Cancelar" - -#: tfadjustcurves.button_ok.caption -msgctxt "TFADJUSTCURVES.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Ajustar curvas" diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po index cb0eb5fb..060a8fcf 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ru.po +++ b/lazpaint/release/bin/i18n/lazpaint.ru.po @@ -64,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "С открытым исходным кодом (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Регулировка кривых" diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po index 181c5d89..48ec9264 100644 --- a/lazpaint/release/bin/i18n/lazpaint.sv.po +++ b/lazpaint/release/bin/i18n/lazpaint.sv.po @@ -54,16 +54,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "Öppen källkod (GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "Justera kurvor" diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po index 77fd2afb..efa2d23b 100644 --- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po +++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po @@ -64,16 +64,6 @@ msgctxt "tfabout.label_opensource.caption" msgid "Open source (GPLv3)" msgstr "开源(GPLv3)" -#: tfadjustcurves.button_cancel.caption -msgctxt "tfadjustcurves.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tfadjustcurves.button_ok.caption -msgctxt "tfadjustcurves.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tfadjustcurves.caption msgid "Adjust curves" msgstr "调整曲线" From 22dc7a405c74afc9af6ef88a47a5600bedca3608 Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 25 Sep 2023 15:57:00 +0200 Subject: [PATCH 38/70] rain quantity is more reactive --- lazpaint/dialog/filter/uformrain.lfm | 55 ++++++++++++++-------------- lazpaint/dialog/filter/uformrain.lrj | 4 +- lazpaint/dialog/filter/uformrain.pas | 12 +++++- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/lazpaint/dialog/filter/uformrain.lfm b/lazpaint/dialog/filter/uformrain.lfm index 319dfcfc..b4389bad 100644 --- a/lazpaint/dialog/filter/uformrain.lfm +++ b/lazpaint/dialog/filter/uformrain.lfm @@ -20,20 +20,20 @@ object FRain: TFRain OnHide = FormHide OnShow = FormShow Position = poMainFormCenter - LCLVersion = '1.6.0.4' + LCLVersion = '2.2.4.0' object Label_Wind: TLabel Left = 8 - Height = 20 + Height = 15 Top = 8 - Width = 124 + Width = 130 Caption = 'Wind :' ParentColor = False end object PaintBox_Wind: TPaintBox Left = 8 Height = 105 - Top = 36 - Width = 124 + Top = 31 + Width = 130 OnMouseDown = PaintBox_WindMouseDown OnMouseMove = PaintBox_WindMouseMove OnMouseUp = PaintBox_WindMouseUp @@ -41,29 +41,30 @@ object FRain: TFRain end object Label_Quantity: TLabel Left = 8 - Height = 20 - Top = 149 - Width = 124 + Height = 15 + Top = 144 + Width = 130 Caption = 'Quantity:' ParentColor = False end object Panel2: TPanel Left = 8 Height = 25 - Top = 177 - Width = 124 + Top = 167 + Width = 130 BevelOuter = bvNone ClientHeight = 25 - ClientWidth = 124 + ClientWidth = 130 TabOrder = 1 object TrackBar_Quantity: TTrackBar Left = 0 Height = 25 Top = 0 - Width = 124 + Width = 130 Frequency = 100 Max = 100 - PageSize = 200 + OnChange = TrackBar_QuantityChange + PageSize = 10 Position = 0 ScalePos = trRight Align = alClient @@ -72,35 +73,35 @@ object FRain: TFRain end object Panel1: TPanel Left = 8 - Height = 30 - Top = 210 - Width = 124 + Height = 25 + Top = 200 + Width = 130 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 - ClientHeight = 30 - ClientWidth = 124 + ClientHeight = 25 + ClientWidth = 130 TabOrder = 0 object Button_OK: TButton Left = 0 - Height = 30 + Height = 25 Top = 0 - Width = 46 + Width = 51 AutoSize = True - Caption = 'OK' + Caption = 'rsOK' Default = True OnClick = Button_OKClick TabOrder = 0 end object Button_Cancel: TButton - Left = 54 - Height = 30 + Left = 59 + Height = 25 Top = 0 - Width = 70 + Width = 71 AutoSize = True Cancel = True - Caption = 'Cancel' + Caption = 'rsCancel' ModalResult = 2 TabOrder = 1 end @@ -109,7 +110,7 @@ object FRain: TFRain Enabled = False Interval = 100 OnTimer = Timer1Timer - left = 96 - top = 40 + Left = 96 + Top = 40 end end diff --git a/lazpaint/dialog/filter/uformrain.lrj b/lazpaint/dialog/filter/uformrain.lrj index cc8d3a88..340b7380 100644 --- a/lazpaint/dialog/filter/uformrain.lrj +++ b/lazpaint/dialog/filter/uformrain.lrj @@ -2,6 +2,6 @@ {"hash":362494,"name":"tfrain.caption","sourcebytes":[82,97,105,110],"value":"Rain"}, {"hash":98584122,"name":"tfrain.label_wind.caption","sourcebytes":[87,105,110,100,32,58],"value":"Wind :"}, {"hash":140202874,"name":"tfrain.label_quantity.caption","sourcebytes":[81,117,97,110,116,105,116,121,58],"value":"Quantity:"}, -{"hash":1339,"name":"tfrain.button_ok.caption","sourcebytes":[79,75],"value":"OK"}, -{"hash":77089212,"name":"tfrain.button_cancel.caption","sourcebytes":[67,97,110,99,101,108],"value":"Cancel"} +{"hash":497723,"name":"tfrain.button_ok.caption","sourcebytes":[114,115,79,75],"value":"rsOK"}, +{"hash":127421996,"name":"tfrain.button_cancel.caption","sourcebytes":[114,115,67,97,110,99,101,108],"value":"rsCancel"} ]} diff --git a/lazpaint/dialog/filter/uformrain.pas b/lazpaint/dialog/filter/uformrain.pas index 633cbc69..4aa55554 100644 --- a/lazpaint/dialog/filter/uformrain.pas +++ b/lazpaint/dialog/filter/uformrain.pas @@ -37,6 +37,7 @@ TFRain = class(TForm) {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer); procedure PaintBox_WindPaint(Sender: TObject); procedure Timer1Timer(Sender: TObject); + procedure TrackBar_QuantityChange(Sender: TObject); private { private declarations } wind: single; @@ -64,7 +65,7 @@ function ShowRainDlg(AFilterConnector: TObject): TScriptResult; implementation -uses LCScaleDPI, umac, LazPaintType; +uses LCScaleDPI, umac, LazPaintType, UResourceStrings; function ShowRainDlg(AFilterConnector: TObject): TScriptResult; var @@ -128,6 +129,9 @@ procedure TFRain.FormShow(Sender: TObject); PreviewNeeded; Left := FilterConnector.LazPaintInstance.MainFormBounds.Left; Timer1.Enabled := true; + + Button_OK.Caption := rsOK; + Button_Cancel.Caption := rsCancel; end; procedure TFRain.PaintBox_WindMouseDown(Sender: TObject; Button: TMouseButton; @@ -189,6 +193,12 @@ procedure TFRain.Timer1Timer(Sender: TObject); Timer1.Enabled:= true; end; +procedure TFRain.TrackBar_QuantityChange(Sender: TObject); +begin + FreeAndNil(FRenderer); + PreviewNeeded; +end; + function TFRain.GetRainRenderer: TRainRenderer; begin if FRenderer = nil then From 5fcc07dff77a00bf05c1c0cda57870e9897c9e16 Mon Sep 17 00:00:00 2001 From: Lulu Date: Mon, 25 Sep 2023 15:58:40 +0200 Subject: [PATCH 39/70] deletion of duplicate translations --- lazpaint/release/bin/i18n/lazpaint.ar.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.bg.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.cs.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.de.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.es.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fi.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.fr.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.it.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.ja.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.kab.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.lv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.nl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pl.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pot | 10 ---------- lazpaint/release/bin/i18n/lazpaint.pt_BR.po | 11 ----------- lazpaint/release/bin/i18n/lazpaint.ru.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.sv.po | 10 ---------- lazpaint/release/bin/i18n/lazpaint.zh_CN.po | 10 ---------- 18 files changed, 181 deletions(-) diff --git a/lazpaint/release/bin/i18n/lazpaint.ar.po b/lazpaint/release/bin/i18n/lazpaint.ar.po index edee9731..adc2f904 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ar.po +++ b/lazpaint/release/bin/i18n/lazpaint.ar.po @@ -2450,16 +2450,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "نصف القطر :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "إلغاء" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "موافق" - #: tfrain.caption msgid "Rain" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.bg.po b/lazpaint/release/bin/i18n/lazpaint.bg.po index 8df38c3d..ccde1459 100644 --- a/lazpaint/release/bin/i18n/lazpaint.bg.po +++ b/lazpaint/release/bin/i18n/lazpaint.bg.po @@ -2438,16 +2438,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION" msgid "Radius :" msgstr "Радиус:" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Отказ" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "Добре" - #: tfrain.caption msgid "Rain" msgstr "Дъжд" diff --git a/lazpaint/release/bin/i18n/lazpaint.cs.po b/lazpaint/release/bin/i18n/lazpaint.cs.po index 9c408801..f0f93ab1 100644 --- a/lazpaint/release/bin/i18n/lazpaint.cs.po +++ b/lazpaint/release/bin/i18n/lazpaint.cs.po @@ -2299,16 +2299,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Poloměr :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Zrušit" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "Déšť" diff --git a/lazpaint/release/bin/i18n/lazpaint.de.po b/lazpaint/release/bin/i18n/lazpaint.de.po index 16eb6e77..6a172a28 100644 --- a/lazpaint/release/bin/i18n/lazpaint.de.po +++ b/lazpaint/release/bin/i18n/lazpaint.de.po @@ -2461,16 +2461,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Radius:" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Abbruch" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "Regen" diff --git a/lazpaint/release/bin/i18n/lazpaint.es.po b/lazpaint/release/bin/i18n/lazpaint.es.po index 444ecc8e..9516f321 100644 --- a/lazpaint/release/bin/i18n/lazpaint.es.po +++ b/lazpaint/release/bin/i18n/lazpaint.es.po @@ -2443,16 +2443,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Radio:" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "Aceptar" - #: tfrain.caption msgid "Rain" msgstr "Lluvia" diff --git a/lazpaint/release/bin/i18n/lazpaint.fi.po b/lazpaint/release/bin/i18n/lazpaint.fi.po index 3b7ba898..b214990f 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fi.po +++ b/lazpaint/release/bin/i18n/lazpaint.fi.po @@ -2443,16 +2443,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION" msgid "Radius :" msgstr "Säde :" -#: tfrain.button_cancel.caption -msgctxt "TFRAIN.BUTTON_CANCEL.CAPTION" -msgid "Cancel" -msgstr "Peru" - -#: tfrain.button_ok.caption -msgctxt "TFRAIN.BUTTON_OK.CAPTION" -msgid "OK" -msgstr "" - #: tfrain.caption msgid "Rain" msgstr "Sade" diff --git a/lazpaint/release/bin/i18n/lazpaint.fr.po b/lazpaint/release/bin/i18n/lazpaint.fr.po index 512fdd88..774f367f 100644 --- a/lazpaint/release/bin/i18n/lazpaint.fr.po +++ b/lazpaint/release/bin/i18n/lazpaint.fr.po @@ -2456,16 +2456,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Rayon :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Annuler" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "Pluie" diff --git a/lazpaint/release/bin/i18n/lazpaint.it.po b/lazpaint/release/bin/i18n/lazpaint.it.po index 02732e2f..12b751e0 100644 --- a/lazpaint/release/bin/i18n/lazpaint.it.po +++ b/lazpaint/release/bin/i18n/lazpaint.it.po @@ -2439,16 +2439,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Raggio :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Cancella" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "" - #: tfrain.caption msgid "Rain" msgstr "Pioggia" diff --git a/lazpaint/release/bin/i18n/lazpaint.ja.po b/lazpaint/release/bin/i18n/lazpaint.ja.po index 375c3a8f..ab00897a 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ja.po +++ b/lazpaint/release/bin/i18n/lazpaint.ja.po @@ -2448,16 +2448,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "半径:" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "キャンセル" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.kab.po b/lazpaint/release/bin/i18n/lazpaint.kab.po index 709f98f2..30862456 100644 --- a/lazpaint/release/bin/i18n/lazpaint.kab.po +++ b/lazpaint/release/bin/i18n/lazpaint.kab.po @@ -2452,16 +2452,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Aqqar :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Sefsex" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "Ih" - #: tfrain.caption msgid "Rain" msgstr "Agfur" diff --git a/lazpaint/release/bin/i18n/lazpaint.lv.po b/lazpaint/release/bin/i18n/lazpaint.lv.po index 3d826828..bcca54e0 100644 --- a/lazpaint/release/bin/i18n/lazpaint.lv.po +++ b/lazpaint/release/bin/i18n/lazpaint.lv.po @@ -2456,16 +2456,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Rādiuss:" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Atcelt" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "Labi" - #: tfrain.caption msgid "Rain" msgstr "Lietus" diff --git a/lazpaint/release/bin/i18n/lazpaint.nl.po b/lazpaint/release/bin/i18n/lazpaint.nl.po index f2983cb2..1a77228f 100644 --- a/lazpaint/release/bin/i18n/lazpaint.nl.po +++ b/lazpaint/release/bin/i18n/lazpaint.nl.po @@ -2449,16 +2449,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Straal :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Annuleren" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "Regen" diff --git a/lazpaint/release/bin/i18n/lazpaint.pl.po b/lazpaint/release/bin/i18n/lazpaint.pl.po index b3c175b8..286c2c49 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pl.po +++ b/lazpaint/release/bin/i18n/lazpaint.pl.po @@ -2461,16 +2461,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Promień:" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Anuluj" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "Deszcz" diff --git a/lazpaint/release/bin/i18n/lazpaint.pot b/lazpaint/release/bin/i18n/lazpaint.pot index b5196df2..99c007c4 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pot +++ b/lazpaint/release/bin/i18n/lazpaint.pot @@ -2288,16 +2288,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "" - #: tfrain.caption msgid "Rain" msgstr "" diff --git a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po index 0ef3769b..6494075b 100644 --- a/lazpaint/release/bin/i18n/lazpaint.pt_BR.po +++ b/lazpaint/release/bin/i18n/lazpaint.pt_BR.po @@ -2451,17 +2451,6 @@ msgctxt "TFRADIALBLUR.LABEL_RADIUS.CAPTION" msgid "Radius :" msgstr "Raio :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Cancelar" - -#: tfrain.button_ok.caption -#, fuzzy -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "Chuva" diff --git a/lazpaint/release/bin/i18n/lazpaint.ru.po b/lazpaint/release/bin/i18n/lazpaint.ru.po index 060a8fcf..f95cca91 100644 --- a/lazpaint/release/bin/i18n/lazpaint.ru.po +++ b/lazpaint/release/bin/i18n/lazpaint.ru.po @@ -2436,16 +2436,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Радиус:" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Отмена" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "ОК" - #: tfrain.caption msgid "Rain" msgstr "Дождь" diff --git a/lazpaint/release/bin/i18n/lazpaint.sv.po b/lazpaint/release/bin/i18n/lazpaint.sv.po index 48ec9264..3742bde9 100644 --- a/lazpaint/release/bin/i18n/lazpaint.sv.po +++ b/lazpaint/release/bin/i18n/lazpaint.sv.po @@ -2453,16 +2453,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "Radie :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "Avbryt" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "OK" - #: tfrain.caption msgid "Rain" msgstr "Regn" diff --git a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po index efa2d23b..af60def4 100644 --- a/lazpaint/release/bin/i18n/lazpaint.zh_CN.po +++ b/lazpaint/release/bin/i18n/lazpaint.zh_CN.po @@ -2449,16 +2449,6 @@ msgctxt "tfradialblur.label_radius.caption" msgid "Radius :" msgstr "半径 :" -#: tfrain.button_cancel.caption -msgctxt "tfrain.button_cancel.caption" -msgid "Cancel" -msgstr "取消" - -#: tfrain.button_ok.caption -msgctxt "tfrain.button_ok.caption" -msgid "OK" -msgstr "确定" - #: tfrain.caption msgid "Rain" msgstr "雨" From cb6827e31ed54495df22177b51fc24817b6eb79e Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Tue, 26 Sep 2023 13:49:10 +0200 Subject: [PATCH 40/70] call CatchToolKey instead of ToolManager --- lazpaint/lazpaintmainform.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lazpaint/lazpaintmainform.pas b/lazpaint/lazpaintmainform.pas index a47050df..67ca2c7b 100644 --- a/lazpaint/lazpaintmainform.pas +++ b/lazpaint/lazpaintmainform.pas @@ -3911,12 +3911,12 @@ procedure TFMain.UpdateSpecialKeys(Shift: TShiftState); begin if (AShift in Shift) and not APressed then begin - if ToolManager.ToolKeyDown(ACode) then PaintPictureNow; + if CatchToolKeyDown(ACode) then PaintPictureNow; APressed:= true; end else if not (AShift in Shift) and APressed then begin - if ToolManager.ToolKeyUp(ACode) then PaintPictureNow; + if CatchToolKeyUp(ACode) then PaintPictureNow; APressed:= false; end; end; From ef76535b73cadd75b6d04bd1232ee3020220c0f9 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Tue, 26 Sep 2023 14:04:53 +0200 Subject: [PATCH 41/70] grow palette item height if there is some room --- lazpaint/upalettetoolbar.pas | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas index a0479cca..3a41a5b0 100644 --- a/lazpaint/upalettetoolbar.pas +++ b/lazpaint/upalettetoolbar.pas @@ -106,7 +106,7 @@ implementation uses LCScaleDPI, Graphics, Forms, UGraph, UResourceStrings, BGRAColorQuantization, ULayerAction, UCursors, UFileSystem, - udarktheme, UTool, LCVectorialFill; + udarktheme, UTool, LCVectorialFill, math; { TPaletteToolbar } @@ -742,7 +742,7 @@ procedure TPaletteToolbar.PaletteChanged; procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); var i,x,y,w,aw,a,h: integer; c: TBGRAPixel; - nbVisible, maxScroll, availHeight: integer; + nbVisible, maxScroll, availHeight, minItemHeight, maxItemHeight: integer; clInterm, cSign: TBGRAPixel; begin FCanvasScale := (Sender as TControl).GetCanvasScaleFactor; @@ -763,6 +763,10 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); h := DoScaleY(round(FPaletteItemHeight*FCanvasScale), OriginalDPI); if h < 3 then h := 3; availHeight := Bitmap.Height - 2 - y - 1; + minItemHeight:= h-1; + maxItemHeight := availHeight div max(FColors.Count, 1); + FPaletteColorItemHeight := max(min(maxItemHeight, minItemHeight*2), minItemHeight); + nbVisible := availHeight div (h-1); if nbVisible < 1 then nbVisible:= 1; maxScroll := FColors.Count-nbVisible; @@ -779,7 +783,7 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); if not Assigned(FScrollbar) then w := Bitmap.Width-2-x; FPaletteColorRect := rect(x,y,x+w,y); - FPaletteColorItemHeight := h-1; + h := FPaletteColorItemHeight+1; nbVisible := (availHeight+h-2) div (h-1); for i := FScrollPos to FScrollPos+nbVisible-1 do if (i >= 0) and (i < FColors.Count) then From b8778c3afe703c1eb2ffa494e02c33608f6be427 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Tue, 26 Sep 2023 15:57:24 +0200 Subject: [PATCH 42/70] compilation fix for latest Lazarus --- lazpaint/lazpaintinstance.pas | 4 ++-- lazpaint/tools/utoolbrush.pas | 2 +- lazpaint/uimageview.pas | 4 ++-- lazpaintcontrols/lcvectorpolyshapes.pas | 4 ++-- lazpaintcontrols/lcvectorrectshapes.pas | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lazpaint/lazpaintinstance.pas b/lazpaint/lazpaintinstance.pas index 35dc53b7..1050a5de 100644 --- a/lazpaint/lazpaintinstance.pas +++ b/lazpaint/lazpaintinstance.pas @@ -300,7 +300,7 @@ implementation unewimage, uresample, UPixelate, unoisefilter, ufilters, USharpen, uposterize, uhypocycloid, UPhongFilter, UFilterFunction, uprint, USaveOption, UFormRain, - {$IFDEF DARWIN}BGRAGraphics,{$ENDIF} + {$IFDEF DARWIN}Graphics, BGRAGraphics,{$ENDIF} ugraph, LCScaleDPI, ucommandline, uabout, UPython; @@ -1462,7 +1462,7 @@ function TLazPaintInstance.GetIcons(ASize: integer): TImageList; begin unscaled.GetBitmap(i, bmpUnscaled); retina.GetBitmap(i, bmpRetina); - result.AddMultipleResolutions([bmpUnscaled, bmpRetina]); + result.AddMultipleResolutions([TCustomBitmap(bmpUnscaled), TCustomBitmap(bmpRetina)]); end; bmpUnscaled.Free; diff --git a/lazpaint/tools/utoolbrush.pas b/lazpaint/tools/utoolbrush.pas index 2705c041..fd663529 100644 --- a/lazpaint/tools/utoolbrush.pas +++ b/lazpaint/tools/utoolbrush.pas @@ -327,7 +327,7 @@ function TToolGenericBrush.ContinueDrawing(toolDest: TBGRABitmap; originF, if not SubPixelAccuracy then len := max(abs(v.x),abs(v.y)) else - len := sqrt(v*v); + len := sqrt(v**v); minLen := round(power(BrushInfo.Size/10,0.8)); if minLen < 1 then minLen := 1; if minLen > 5 then minLen := 5; diff --git a/lazpaint/uimageview.pas b/lazpaint/uimageview.pas index 8f6228a7..8ffbffb9 100644 --- a/lazpaint/uimageview.pas +++ b/lazpaint/uimageview.pas @@ -9,7 +9,7 @@ interface uses - Classes, SysUtils, USelectionHighlight, BGRABitmap, BGRABitmapTypes, + Classes, SysUtils, USelectionHighlight, Types, BGRABitmap, BGRABitmapTypes, LazPaintType, UImage, UZoom, Graphics, Controls, LCLType, UImageObservation, laztablet, LMessages; @@ -145,7 +145,7 @@ TImageView = class implementation -uses BGRATransform, LCLIntf, Types, ugraph, math, UTool, BGRAThumbnail, LCScaleDPI, Forms, +uses BGRATransform, LCLIntf, ugraph, math, UTool, BGRAThumbnail, LCScaleDPI, Forms, UToolVectorial, ExtCtrls; procedure InvalidateControlRect(AControl: TControl; AArea: TRect); diff --git a/lazpaintcontrols/lcvectorpolyshapes.pas b/lazpaintcontrols/lcvectorpolyshapes.pas index 487a5a2c..154890f0 100644 --- a/lazpaintcontrols/lcvectorpolyshapes.pas +++ b/lazpaintcontrols/lcvectorpolyshapes.pas @@ -818,11 +818,11 @@ procedure TCustomPolypointShape.InsertPointAuto(AShift: TShiftState); if segmentLen > 0 then begin u *= 1/segmentLen; - segmentPos := (FMousePos-Points[i])*u; + segmentPos := (FMousePos-Points[i])**u; if (segmentPos > 0) and (segmentPos< segmentLen) then begin n := PointF(u.y,-u.x); - segmentDist := abs((FMousePos-Points[i])*n); + segmentDist := abs((FMousePos-Points[i])**n); if segmentDist <= bestSegmentDist then begin bestSegmentDist := segmentDist; diff --git a/lazpaintcontrols/lcvectorrectshapes.pas b/lazpaintcontrols/lcvectorrectshapes.pas index c5378854..6776fcc5 100644 --- a/lazpaintcontrols/lcvectorrectshapes.pas +++ b/lazpaintcontrols/lcvectorrectshapes.pas @@ -489,7 +489,7 @@ procedure TCustomRectShape.DoMoveXAxis(ANewCoord: TPointF; AShift: TShiftState; FOrigin := FOriginBackup; end else begin - newSize := AFactor*FXUnitBackup*(ANewCoord-FOriginBackup); + newSize := AFactor*FXUnitBackup**(ANewCoord-FOriginBackup); if ssShift in AShift then begin FXAxis := FOriginBackup+FXUnitBackup*newSize; @@ -528,7 +528,7 @@ procedure TCustomRectShape.DoMoveYAxis(ANewCoord: TPointF; AShift: TShiftState; FOrigin := FOriginBackup; end else begin - newSizeY := AFactor*FYUnitBackup*(ANewCoord-FOriginBackup); + newSizeY := AFactor*FYUnitBackup**(ANewCoord-FOriginBackup); if ssShift in AShift then begin FYAxis := FOriginBackup+FYUnitBackup*newSizeY; From 1c3976756b0b3d378f5518f82042a107a7412e9e Mon Sep 17 00:00:00 2001 From: Lulu Date: Fri, 29 Sep 2023 11:44:30 +0200 Subject: [PATCH 43/70] implementation of color association with keyboard digits --- lazpaint/dialog/uchoosecolorinterface.pas | 21 +- lazpaint/lazpaintinstance.pas | 27 + lazpaint/lazpaintmainform.lfm | 1225 ++++++++++----------- lazpaint/lazpainttype.pas | 4 + lazpaint/uchoosecolor.lfm | 19 +- lazpaint/uchoosecolor.pas | 20 + lazpaint/umainformlayout.pas | 15 +- lazpaint/upalettetoolbar.pas | 163 ++- 8 files changed, 800 insertions(+), 694 deletions(-) diff --git a/lazpaint/dialog/uchoosecolorinterface.pas b/lazpaint/dialog/uchoosecolorinterface.pas index 6791d2f3..4aea96bc 100644 --- a/lazpaint/dialog/uchoosecolorinterface.pas +++ b/lazpaint/dialog/uchoosecolorinterface.pas @@ -122,6 +122,7 @@ TChooseColorInterface = class procedure HideEditor; function GetPreferredSize: TSize; procedure AdjustControlHeight; + procedure SimpleRedraw; property DarkTheme: boolean read FDarkTheme write SetDarkTheme; property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance; @@ -211,7 +212,7 @@ procedure TChooseColorInterface.vsColorViewRedraw(Sender: TObject; bmpRect: TRect; previewSize: single; previewRect: TRectF; - c: TBGRAPixel; + c, cDigit: TBGRAPixel; bmpColorXYSize: integer; bmpCursorWidth, i: integer; bmpCursorOpacity: byte; @@ -297,8 +298,21 @@ procedure TChooseColorInterface.vsColorViewRedraw(Sender: TObject; c := GetCurrentColor; c.alpha := 255; with InterfaceToPixel(previewRect) do + begin Bitmap.RoundRectAntialias(Left, Top, Right - 1, Bottom - 1, previewSize/6, previewSize/6, BGRA(0,0,0,192), bmpCursorWidth, c, []); + c := GetCurrentColor; + s := FLazPaintInstance.GetDigitFromColorsBindToKey(c); + if Length(s) > 0 then + begin + if GetLightness(c)/65535 > 0.5 then + cDigit := BGRABlack else cDigit := BGRAWhite; + Bitmap.FontHeight := Round(Height*2/3); + Bitmap.TextOut(CenterPoint.x, + CenterPoint.y-Bitmap.TextSize(s).cy div 2, + s, cDigit, taCenter); + end; + end; end; end; end; @@ -1172,5 +1186,10 @@ procedure TChooseColorInterface.AdjustControlHeight; Container.Height := round(h + FTextAreaHeight + ExternalMargin); end; +procedure TChooseColorInterface.SimpleRedraw; +begin + UpdateColorview(False, False, True); +end; + end. diff --git a/lazpaint/lazpaintinstance.pas b/lazpaint/lazpaintinstance.pas index 1050a5de..35690a9b 100644 --- a/lazpaint/lazpaintinstance.pas +++ b/lazpaint/lazpaintinstance.pas @@ -240,6 +240,7 @@ TLazPaintInstance = class(TLazPaintCustomInstance) procedure ColorToFChooseColor; override; procedure ExitColorEditor; override; function ColorEditorActive: boolean; override; + procedure FChooseColorSimpleRedraw; override; function ShowSaveOptionDlg({%H-}AParameters: TVariableSet; AOutputFilenameUTF8: string; ASkipOptions: boolean; AExport: boolean): boolean; override; function ShowColorIntensityDlg(AParameters: TVariableSet): TScriptResult; override; @@ -289,7 +290,10 @@ TLazPaintInstance = class(TLazPaintCustomInstance) procedure UpdateEditPicture(ADelayed: boolean); override; procedure AddColorToPalette(AColor: TBGRAPixel); override; procedure RemoveColorFromPalette(AColor: TBGRAPixel); override; + function GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; override; property Initialized: boolean read GetInitialized; + procedure SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState); override; + procedure SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState); override; end; implementation @@ -1981,6 +1985,11 @@ function TLazPaintInstance.ColorEditorActive: boolean; else result := false; end; +procedure TLazPaintInstance.FChooseColorSimpleRedraw; +begin + if Assigned(FChooseColor) then FChooseColor.SimpleRedraw; +end; + function TLazPaintInstance.ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string; ASkipOptions: boolean; AExport: boolean): boolean; begin @@ -2195,5 +2204,23 @@ procedure TLazPaintInstance.RemoveColorFromPalette(AColor: TBGRAPixel); if Assigned(FMain) then FMain.Layout.RemoveColorFromPalette(AColor); end; +function TLazPaintInstance.GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; +begin + if Assigned(FMain) and + Assigned(FMain.Layout) and + Assigned(FMain.Layout.PaletteToolbar) then Result := FMain.Layout.PaletteToolbar.GetDigitFromColorsBindToKey(AColor) + else Result := ''; +end; + +procedure TLazPaintInstance.SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState); +begin + if Assigned(FMain) then FMain.FormKeyDown(FMain, key, Shift); +end; + +procedure TLazPaintInstance.SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState); +begin + if Assigned(FMain) then FMain.FormKeyUp(FMain, key, Shift); +end; + end. diff --git a/lazpaint/lazpaintmainform.lfm b/lazpaint/lazpaintmainform.lfm index da1b9c10..433b33b4 100644 --- a/lazpaint/lazpaintmainform.lfm +++ b/lazpaint/lazpaintmainform.lfm @@ -5,7 +5,7 @@ object FMain: TFMain Width = 739 AllowDropFiles = True Caption = 'LazPaint' - ClientHeight = 597 + ClientHeight = 577 ClientWidth = 739 Constraints.MinWidth = 320 Font.Height = -12 @@ -180,7 +180,7 @@ object FMain: TFMain end object Edit_Zoom: TEdit Left = 3 - Height = 21 + Height = 23 Top = 24 Width = 38 Font.Height = -12 @@ -2613,11 +2613,11 @@ object FMain: TFMain TabOrder = 25 object Combo_Ratio: TComboBox Left = 42 - Height = 20 + Height = 23 Top = 1 Width = 96 Font.Height = -12 - ItemHeight = 19 + ItemHeight = 15 Items.Strings = ( '' '2:1' @@ -12859,569 +12859,592 @@ object FMain: TFMain Top = 514 Items = { 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574 - 662D38223F3E0A3C434F4E46494720436F756E743D223130223E0A20203C4974 - 656D30205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B - 312E302671756F743B20656E636F64696E673D2671756F743B7574662D382671 - 756F743B3F2667743B262378413B266C743B7376672077696474683D2671756F - 743B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F7777 - 772E77332E6F72672F323030302F7376672671756F743B206865696768743D26 - 71756F743B33322671756F743B2076696577426F783D2671756F743B30203020 - 33322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F74 - 3B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D65737061 - 6365732F696E6B73636170652671756F743B2667743B262378413B2020266C74 - 3B67206F7061636974793D2671756F743B312671756F743B20786D6C6E733A62 - 6772613D2671756F743B68747470733A2F2F77696B692E667265657061736361 - 6C2E6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B20 - 696E6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F74 - 3B20696E6B73636170653A67726F75706D6F64653D2671756F743B6C61796572 - 2671756F743B20626772613A6F726967696E616C56696577426F783D2671756F - 743B3020302032392032382671756F743B2667743B262378413B20202020266C - 743B7061746820643D2671756F743B4D32382E383433373520362E3539333735 - 20302E303933373520302E30333132352671756F743B2066696C6C3D2671756F - 743B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E6526 - 71756F743B2066696C6C2D6F7061636974793D2671756F743B312671756F743B - 2F2667743B262378413B20202020266C743B7061746820643D2671756F743B4D - 39203238203920332031352033203135203238207A2671756F743B2066696C6C - 3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F743B - 6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B302E - 373932313536392671756F743B2F2667743B262378413B20202020266C743B70 - 61746820643D2671756F743B4D31352032382031382E38383436312032372E39 - 34343731205132322E37363932332032372E38383934322032342E3836323938 - 2032352E36303831372032362E39353637332032332E33323639322032362E39 - 373833362032302E31363334362032372031372032352E37352031352E323520 - 32342E352031332E352032322E32352031322E37352032302031322031372E35 - 203132204C313520313220313520313620313720313620513139203136203230 - 2E352031372032322031382032312E38323231312032302E3033383436203231 - 2E36343432332032322E30373639322032302E32363932332032322E39383331 - 372031382E38393432332032332E38383934322031362E39343731312032332E - 3934343731204C3135203234207A2671756F743B2066696C6C3D2671756F743B - 626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E65267175 - 6F743B2066696C6C2D6F7061636974793D2671756F743B302E37393231353639 - 2671756F743B2F2667743B262378413B2020266C743B2F672667743B26237841 - 3B266C743B2F7376672667743B262378413B222F3E0A20203C4974656D312053 - 56473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671 - 756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F - 2667743B262378413B266C743B7376672077696474683D2671756F743B333226 - 71756F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E - 6F72672F323030302F7376672671756F743B206865696768743D2671756F743B - 33322671756F743B2076696577426F783D2671756F743B302030203332203332 - 2671756F743B20786D6C6E733A696E6B73636170653D2671756F743B68747470 - 3A2F2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F69 - 6E6B73636170652671756F743B2667743B262378413B2020266C743B67206F70 - 61636974793D2671756F743B312671756F743B20786D6C6E733A626772613D26 - 71756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F7267 - 2F4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B7363 - 6170653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B - 73636170653A67726F75706D6F64653D2671756F743B6C617965722671756F74 - 3B20626772613A6F726967696E616C56696577426F783D2671756F743B302030 - 2032392032382671756F743B2667743B262378413B20202020266C743B706174 - 6820643D2671756F743B4D32382E383433373520362E353933373520302E3039 - 33373520302E30333132352671756F743B2066696C6C3D2671756F743B626C61 + 662D38223F3E0D0A3C434F4E46494720436F756E743D223130223E0D0A20203C + 4974656D30205356473D22266C743B3F786D6C2076657273696F6E3D2671756F + 743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D38 + 2671756F743B3F2667743B262378443B262378413B266C743B73766720776964 + 74683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B6874 + 74703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B2068 + 65696768743D2671756F743B33322671756F743B2076696577426F783D267175 + 6F743B3020302033322033322671756F743B20786D6C6E733A696E6B73636170 + 653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F + 6E616D657370616365732F696E6B73636170652671756F743B2667743B262378 + 443B262378413B2020266C743B67206F7061636974793D2671756F743B312671 + 756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F7769 + 6B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F66 + 6F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F74 + 3B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F6465 + 3D2671756F743B6C617965722671756F743B20626772613A6F726967696E616C + 56696577426F783D2671756F743B3020302032392032382671756F743B266774 + 3B262378443B262378413B20202020266C743B7061746820643D2671756F743B + 4D32382E383433373520362E353933373520302E303933373520302E30333132 + 352671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073 + 74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163 + 6974793D2671756F743B312671756F743B2F2667743B262378443B262378413B + 20202020266C743B7061746820643D2671756F743B4D39203238203920332031 + 352033203135203238207A2671756F743B2066696C6C3D2671756F743B626C61 636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B - 2066696C6C2D6F7061636974793D2671756F743B312671756F743B2F2667743B - 262378413B20202020266C743B7061746820643D2671756F743B4D3131203238 - 2031362E352031332032302E35203133203135203238207A2671756F743B2066 - 696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D267175 - 6F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F74 - 3B302E373932313536392671756F743B2F2667743B262378413B20202020266C - 743B7061746820643D2671756F743B4D31382031302031392036203233203620 - 32312E37313837352031302E3039333735207A2671756F743B2066696C6C3D26 - 71756F743B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F - 6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B302E3739 - 32313536392671756F743B2F2667743B262378413B20202020266C743B706174 - 6820643D2671756F743B4D32342E34303632352031342E333433373520312E30 - 3933373520302E3033313235207A2671756F743B2066696C6C3D2671756F743B - 626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E65267175 - 6F743B2066696C6C2D6F7061636974793D2671756F743B302E37393231353639 - 2671756F743B2F2667743B262378413B2020266C743B2F672667743B26237841 - 3B266C743B2F7376672667743B262378413B222F3E0A20203C4974656D322053 - 56473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671 - 756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F - 2667743B262378413B266C743B7376672077696474683D2671756F743B333226 - 71756F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E - 6F72672F323030302F7376672671756F743B206865696768743D2671756F743B - 33322671756F743B2076696577426F783D2671756F743B302030203332203332 - 2671756F743B20786D6C6E733A696E6B73636170653D2671756F743B68747470 - 3A2F2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F69 - 6E6B73636170652671756F743B2667743B262378413B2020266C743B67206F70 - 61636974793D2671756F743B312671756F743B20786D6C6E733A626772613D26 - 71756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F7267 - 2F4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B7363 - 6170653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B - 73636170653A67726F75706D6F64653D2671756F743B6C617965722671756F74 - 3B20626772613A6F726967696E616C56696577426F783D2671756F743B2D3331 - 202D352039342033352671756F743B2667743B262378413B20202020266C743B - 7465787420783D2671756F743B302671756F743B20793D2671756F743B2D3526 + 2066696C6C2D6F7061636974793D2671756F743B302E37393231353639267175 + 6F743B2F2667743B262378443B262378413B20202020266C743B706174682064 + 3D2671756F743B4D31352032382031382E38383436312032372E393434373120 + 5132322E37363932332032372E38383934322032342E38363239382032352E36 + 303831372032362E39353637332032332E33323639322032362E393738333620 + 32302E31363334362032372031372032352E37352031352E32352032342E3520 + 31332E352032322E32352031322E37352032302031322031372E35203132204C + 3135203132203135203136203137203136205131392031362032302E35203137 + 2032322031382032312E38323231312032302E30333834362032312E36343432 + 332032322E30373639322032302E32363932332032322E39383331372031382E + 38393432332032332E38383934322031362E39343731312032332E3934343731 + 204C3135203234207A2671756F743B2066696C6C3D2671756F743B626C61636B + 2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066 + 696C6C2D6F7061636974793D2671756F743B302E373932313536392671756F74 + 3B2F2667743B262378443B262378413B2020266C743B2F672667743B26237844 + 3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D + 0A20203C4974656D31205356473D22266C743B3F786D6C2076657273696F6E3D + 2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75 + 74662D382671756F743B3F2667743B262378443B262378413B266C743B737667 + 2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F + 743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F + 743B206865696768743D2671756F743B33322671756F743B2076696577426F78 + 3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B + 73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E + 6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774 + 3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74 + 3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A + 2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53 + 56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26 + 71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570 + 6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967 + 696E616C56696577426F783D2671756F743B3020302032392032382671756F74 + 3B2667743B262378443B262378413B20202020266C743B7061746820643D2671 + 756F743B4D32382E383433373520362E353933373520302E303933373520302E + 30333132352671756F743B2066696C6C3D2671756F743B626C61636B2671756F + 743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D + 6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B26 + 2378413B20202020266C743B7061746820643D2671756F743B4D313120323820 + 31362E352031332032302E35203133203135203238207A2671756F743B206669 + 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F + 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B + 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 + 2020266C743B7061746820643D2671756F743B4D313820313020313920362032 + 3320362032312E37313837352031302E3039333735207A2671756F743B206669 + 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F + 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B + 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 + 2020266C743B7061746820643D2671756F743B4D32342E34303632352031342E + 333433373520312E303933373520302E3033313235207A2671756F743B206669 + 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F + 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B + 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 + 266C743B2F672667743B262378443B262378413B266C743B2F7376672667743B + 262378443B262378413B222F3E0D0A20203C4974656D32205356473D22266C74 + 3B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B20656E + 636F64696E673D2671756F743B7574662D382671756F743B3F2667743B262378 + 443B262378413B266C743B7376672077696474683D2671756F743B3332267175 + 6F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72 + 672F323030302F7376672671756F743B206865696768743D2671756F743B3332 + 2671756F743B2076696577426F783D2671756F743B3020302033322033322671 + 756F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F + 2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B + 73636170652671756F743B2667743B262378443B262378413B2020266C743B67 + 206F7061636974793D2671756F743B312671756F743B20786D6C6E733A626772 + 613D2671756F743B68747470733A2F2F77696B692E6672656570617363616C2E + 6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B20696E + 6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F743B20 + 696E6B73636170653A67726F75706D6F64653D2671756F743B6C617965722671 + 756F743B20626772613A6F726967696E616C56696577426F783D2671756F743B + 2D3331202D352039342033352671756F743B2667743B262378443B262378413B + 20202020266C743B7465787420783D2671756F743B302671756F743B20793D26 + 71756F743B2D352671756F743B2066696C6C3D2671756F743B626C61636B2671 + 756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E + 742D73697A653D2671756F743B33312671756F743B20666F6E742D7374796C65 + 3D2671756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D + 2671756F743B4672656553616E732671756F743B20666F6E742D776569676874 + 3D2671756F743B6E6F726D616C2671756F743B2066696C6C2D6F706163697479 + 3D2671756F743B302E373932313536392671756F743B20746578742D6465636F + 726174696F6E3D2671756F743B2671756F743B2667743B262378443B26237841 + 3B202020202020266C743B747370616E20783D2671756F743B372E3337373836 + 372671756F743B20793D2671756F743B32332671756F743B2064697265637469 + 6F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D2671 + 756F743B31372E32343432372671756F743B2667743B75266C743B2F74737061 + 6E2667743B262378443B262378413B20202020266C743B2F746578742667743B + 262378443B262378413B20202020266C743B7061746820643D2671756F743B4D + 362E3520333020362E352032362032352E352032362032352E35203330207A26 71756F743B2066696C6C3D2671756F743B626C61636B2671756F743B20737472 - 6F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73697A653D26 - 71756F743B33312671756F743B20666F6E742D7374796C653D2671756F743B6E - 6F726D616C2671756F743B20666F6E742D66616D696C793D2671756F743B4672 - 656553616E732671756F743B20666F6E742D7765696768743D2671756F743B6E - 6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671756F743B30 - 2E373932313536392671756F743B20746578742D6465636F726174696F6E3D26 - 71756F743B2671756F743B2667743B262378413B202020202020266C743B7473 - 70616E20783D2671756F743B372E3337373836372671756F743B20793D267175 - 6F743B32332671756F743B20646972656374696F6E3D2671756F743B6C747226 - 71756F743B20746578744C656E6774683D2671756F743B31372E323434323726 - 71756F743B2667743B75266C743B2F747370616E2667743B262378413B202020 - 20266C743B2F746578742667743B262378413B20202020266C743B7061746820 - 643D2671756F743B4D362E3520333020362E352032362032352E352032362032 - 352E35203330207A2671756F743B2066696C6C3D2671756F743B626C61636B26 - 71756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B206669 - 6C6C2D6F7061636974793D2671756F743B302E373932313536392671756F743B - 2F2667743B262378413B2020266C743B2F672667743B262378413B266C743B2F - 7376672667743B262378413B222F3E0A20203C4974656D33205356473D22266C - 743B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B2065 - 6E636F64696E673D2671756F743B7574662D382671756F743B3F2667743B2623 + 6F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974 + 793D2671756F743B302E373932313536392671756F743B2F2667743B26237844 + 3B262378413B2020266C743B2F672667743B262378443B262378413B266C743B + 2F7376672667743B262378443B262378413B222F3E0D0A20203C4974656D3320 + 5356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E3026 + 71756F743B20656E636F64696E673D2671756F743B7574662D382671756F743B + 3F2667743B262378443B262378413B266C743B7376672077696474683D267175 + 6F743B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F77 + 77772E77332E6F72672F323030302F7376672671756F743B206865696768743D + 2671756F743B33322671756F743B2076696577426F783D2671756F743B302030 + 2033322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F + 743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D657370 + 616365732F696E6B73636170652671756F743B2667743B262378443B26237841 + 3B2020266C743B67206F7061636974793D2671756F743B312671756F743B2078 + 6D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E667265 + 6570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D617426 + 71756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61796572 + 312671756F743B20696E6B73636170653A67726F75706D6F64653D2671756F74 + 3B6C617965722671756F743B20626772613A6F726967696E616C56696577426F + 783D2671756F743B3520392032322031392671756F743B2667743B262378443B + 262378413B20202020266C743B7061746820643D2671756F743B4D352E352032 + 3020352E352031362032362E352031362032362E35203230207A2671756F743B + 2066696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D26 + 71756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D267175 + 6F743B302E373932313536392671756F743B2F2667743B262378443B26237841 + 3B20202020266C743B7061746820643D2671756F743B4D31322E373532353120 + 32322E30343231372031332E30393533342032332E3139313232205131332E34 + 333831372032342E33343032372031342E38373239312032342E363838343620 + 31362E33303736352032352E30333636352031372E37323138372032352E3030 + 3331382031392E31333630382032342E39363937312031392E36323232322032 + 342E32313834312032302E31303833352032332E34363731312031392E383433 + 31392032322E30393730392031392E35373830322032302E3732373037203137 + 2E36333334382032302E31353235342031352E36383839332031392E35373830 + 322031332E3635362031392E30343736392031312E36323330372031382E3531 + 3733362031302E363530382031372E353839323820392E363738353235203136 + 2E3636313220392E3731353133372031352E303138343420392E373531373439 + 2031332E33373536372031302E33373439312031322E33353639392031302E39 + 393830372031312E333338332031322E34303639322031302E36343935203133 + 2E383135373720392E3936303639342031362E303732383220392E3930353737 + 372031382E333239383620392E38353038362031392E35303730322031302E33 + 393633352032302E36383431382031302E39343138352032312E343832383120 + 31312E37353437332032322E32383134352031322E35363736312032322E3432 + 3437352031332E3235363431204C32322E35363830362031332E393435323220 + 31392E33363436332031342E30353530352031382E383334332031332E343532 + 3432205131382E33303339372031322E38343937382031362E36393639203132 + 2E39313030362031352E30383938322031322E39373033342031342E30363335 + 352031332E35393434322031332E30333732382031342E323138352031322E39 + 3438392031342E38363533332031322E38363035312031352E35313231362031 + 352E35353633352031362E33393630342031382E32353231392031372E323739 + 39322031392E35333338332031372E37323138362032302E3831353436203138 + 2E31363338312032312E37343335342031382E39313531312032322E36373136 + 312031392E36363634312032322E38393235382032312E31323438322032332E + 31313335362032322E35383332332032322E37362032332E3930393035203232 + 2E34303634352032352E32333438382032302E35383530362032362E36323633 + 342031382E37363336382032382E30313738312031362E33353739372032372E + 39393633362031332E39353232362032372E39373439312031322E3930333234 + 2032372E34353433392031312E38353432332032362E39333338362031302E38 + 353437362032362E303834333720392E3835353330322032352E323334383820 + 392E3732303439382032332E3632303232204C392E3538353639342032322E30 + 30353536207A2671756F743B2066696C6C3D2671756F743B626C61636B267175 + 6F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C + 2D6F7061636974793D2671756F743B302E373932313536392671756F743B2F26 + 67743B262378443B262378413B2020266C743B2F672667743B262378443B2623 + 78413B266C743B2F7376672667743B262378443B262378413B222F3E0D0A2020 + 3C4974656D34205356473D22266C743B3F786D6C2076657273696F6E3D267175 + 6F743B312E302671756F743B20656E636F64696E673D2671756F743B7574662D + 382671756F743B3F2667743B262378443B262378413B266C743B737667207769 + 6474683D2671756F743B33322671756F743B20786D6C6E733D2671756F743B68 + 7474703A2F2F7777772E77332E6F72672F323030302F7376672671756F743B20 + 6865696768743D2671756F743B33322671756F743B2076696577426F783D2671 + 756F743B3020302033322033322671756F743B20786D6C6E733A696E6B736361 + 70653D2671756F743B687474703A2F2F7777772E696E6B73636170652E6F7267 + 2F6E616D657370616365732F696E6B73636170652671756F743B2667743B2623 + 78443B262378413B2020266C743B67206F7061636974793D2671756F743B3126 + 71756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77 + 696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F + 666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F + 743B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F64 + 653D2671756F743B6C617965722671756F743B20626772613A6F726967696E61 + 6C56696577426F783D2671756F743B2D313520302036322032392671756F743B + 2667743B262378443B262378413B20202020266C743B7061746820643D267175 + 6F743B4D332E352032322031302031352E352031302032302032322032302032 + 322031352E352032382E352032322032322032382E3520323220323420313020 + 32342031302032382E35207A2671756F743B2066696C6C3D2671756F743B626C + 61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F74 + 3B2066696C6C2D6F7061636974793D2671756F743B302E373932313536392671 + 756F743B2F2667743B262378443B262378413B20202020266C743B7465787420 + 783D2671756F743B302671756F743B20793D2671756F743B302671756F743B20 + 66696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671 + 756F743B6E6F6E652671756F743B20666F6E742D73697A653D2671756F743B31 + 352671756F743B20666F6E742D7374796C653D2671756F743B6E6F726D616C26 + 71756F743B20666F6E742D66616D696C793D2671756F743B4672656553616E73 + 2671756F743B20666F6E742D7765696768743D2671756F743B6E6F726D616C26 + 71756F743B2066696C6C2D6F7061636974793D2671756F743B302E3936383632 + 37352671756F743B20746578742D6465636F726174696F6E3D2671756F743B26 + 71756F743B2667743B262378443B262378413B202020202020266C743B747370 + 616E20783D2671756F743B31312E3832382671756F743B20793D2671756F743B + 31342671756F743B20646972656374696F6E3D2671756F743B6C74722671756F + 743B20746578744C656E6774683D2671756F743B382E3334343030312671756F + 743B2667743B3F266C743B2F747370616E2667743B262378443B262378413B20 + 202020266C743B2F746578742667743B262378443B262378413B2020266C743B + 2F672667743B262378443B262378413B266C743B2F7376672667743B26237844 + 3B262378413B222F3E0D0A20203C4974656D35205356473D22266C743B3F786D + 6C2076657273696F6E3D2671756F743B312E302671756F743B20656E636F6469 + 6E673D2671756F743B7574662D382671756F743B3F2667743B262378443B2623 78413B266C743B7376672077696474683D2671756F743B33322671756F743B20 786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72672F3230 30302F7376672671756F743B206865696768743D2671756F743B33322671756F 743B2076696577426F783D2671756F743B3020302033322033322671756F743B 20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F777777 2E696E6B73636170652E6F72672F6E616D657370616365732F696E6B73636170 - 652671756F743B2667743B262378413B2020266C743B67206F7061636974793D - 2671756F743B312671756F743B20786D6C6E733A626772613D2671756F743B68 - 747470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061 - 696E745F5356475F666F726D61742671756F743B20696E6B73636170653A6C61 - 62656C3D2671756F743B4C61796572312671756F743B20696E6B73636170653A - 67726F75706D6F64653D2671756F743B6C617965722671756F743B2062677261 - 3A6F726967696E616C56696577426F783D2671756F743B352039203232203139 - 2671756F743B2667743B262378413B20202020266C743B7061746820643D2671 - 756F743B4D352E3520323020352E352031362032362E352031362032362E3520 - 3230207A2671756F743B2066696C6C3D2671756F743B626C61636B2671756F74 - 3B207374726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F - 7061636974793D2671756F743B302E373932313536392671756F743B2F266774 - 3B262378413B20202020266C743B7061746820643D2671756F743B4D31322E37 - 353235312032322E30343231372031332E30393533342032332E313931323220 - 5131332E34333831372032342E33343032372031342E38373239312032342E36 - 383834362031362E33303736352032352E30333636352031372E373231383720 - 32352E30303331382031392E31333630382032342E39363937312031392E3632 - 3232322032342E32313834312032302E31303833352032332E34363731312031 - 392E38343331392032322E30393730392031392E35373830322032302E373237 - 30372031372E36333334382032302E31353235342031352E3638383933203139 - 2E35373830322031332E3635362031392E30343736392031312E363233303720 - 31382E35313733362031302E363530382031372E353839323820392E36373835 - 32352031362E3636313220392E3731353133372031352E303138343420392E37 - 35313734392031332E33373536372031302E33373439312031322E3335363939 - 2031302E39393830372031312E333338332031322E34303639322031302E3634 - 39352031332E383135373720392E3936303639342031362E303732383220392E - 3930353737372031382E333239383620392E38353038362031392E3530373032 - 2031302E33393633352032302E36383431382031302E39343138352032312E34 - 383238312031312E37353437332032322E32383134352031322E353637363120 - 32322E34323437352031332E3235363431204C32322E35363830362031332E39 - 343532322031392E33363436332031342E30353530352031382E383334332031 - 332E3435323432205131382E33303339372031322E38343937382031362E3639 - 36392031322E39313030362031352E30383938322031322E3937303334203134 - 2E30363335352031332E35393434322031332E30333732382031342E32313835 - 2031322E393438392031342E38363533332031322E38363035312031352E3531 - 3231362031352E35353633352031362E33393630342031382E32353231392031 - 372E32373939322031392E35333338332031372E37323138362032302E383135 - 34362031382E31363338312032312E37343335342031382E3931353131203232 - 2E36373136312031392E36363634312032322E38393235382032312E31323438 - 322032332E31313335362032322E35383332332032322E37362032332E393039 - 30352032322E34303634352032352E32333438382032302E3538353036203236 - 2E36323633342031382E37363336382032382E30313738312031362E33353739 - 372032372E39393633362031332E39353232362032372E39373439312031322E - 39303332342032372E34353433392031312E38353432332032362E3933333836 - 2031302E38353437362032362E303834333720392E3835353330322032352E32 - 3334383820392E3732303439382032332E3632303232204C392E353835363934 - 2032322E3030353536207A2671756F743B2066696C6C3D2671756F743B626C61 - 636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B - 2066696C6C2D6F7061636974793D2671756F743B302E37393231353639267175 - 6F743B2F2667743B262378413B2020266C743B2F672667743B262378413B266C - 743B2F7376672667743B262378413B222F3E0A20203C4974656D34205356473D - 22266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671756F74 - 3B20656E636F64696E673D2671756F743B7574662D382671756F743B3F266774 - 3B262378413B266C743B7376672077696474683D2671756F743B33322671756F - 743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F7267 - 2F323030302F7376672671756F743B206865696768743D2671756F743B333226 - 71756F743B2076696577426F783D2671756F743B302030203332203332267175 - 6F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F - 7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B73 - 636170652671756F743B2667743B262378413B2020266C743B67206F70616369 - 74793D2671756F743B312671756F743B20786D6C6E733A626772613D2671756F - 743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F4C61 - 7A5061696E745F5356475F666F726D61742671756F743B20696E6B7363617065 - 3A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B736361 - 70653A67726F75706D6F64653D2671756F743B6C617965722671756F743B2062 - 6772613A6F726967696E616C56696577426F783D2671756F743B2D3135203020 - 36322032392671756F743B2667743B262378413B20202020266C743B70617468 - 20643D2671756F743B4D332E352032322031302031352E352031302032302032 - 322032302032322031352E352032382E352032322032322032382E3520323220 - 32342031302032342031302032382E35207A2671756F743B2066696C6C3D2671 - 756F743B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E - 652671756F743B2066696C6C2D6F7061636974793D2671756F743B302E373932 - 313536392671756F743B2F2667743B262378413B20202020266C743B74657874 - 20783D2671756F743B302671756F743B20793D2671756F743B302671756F743B - 2066696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D26 - 71756F743B6E6F6E652671756F743B20666F6E742D73697A653D2671756F743B - 31352671756F743B20666F6E742D7374796C653D2671756F743B6E6F726D616C - 2671756F743B20666F6E742D66616D696C793D2671756F743B4672656553616E - 732671756F743B20666F6E742D7765696768743D2671756F743B6E6F726D616C - 2671756F743B2066696C6C2D6F7061636974793D2671756F743B302E39363836 - 3237352671756F743B20746578742D6465636F726174696F6E3D2671756F743B - 2671756F743B2667743B262378413B202020202020266C743B747370616E2078 - 3D2671756F743B31312E3832382671756F743B20793D2671756F743B31342671 - 756F743B20646972656374696F6E3D2671756F743B6C74722671756F743B2074 - 6578744C656E6774683D2671756F743B382E3334343030312671756F743B2667 - 743B3F266C743B2F747370616E2667743B262378413B20202020266C743B2F74 - 6578742667743B262378413B2020266C743B2F672667743B262378413B266C74 - 3B2F7376672667743B262378413B222F3E0A20203C4974656D35205356473D22 - 266C743B3F786D6C2076657273696F6E3D2671756F743B312E302671756F743B - 20656E636F64696E673D2671756F743B7574662D382671756F743B3F2667743B - 262378413B266C743B7376672077696474683D2671756F743B33322671756F74 - 3B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F72672F - 323030302F7376672671756F743B206865696768743D2671756F743B33322671 - 756F743B2076696577426F783D2671756F743B3020302033322033322671756F - 743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A2F2F77 - 77772E696E6B73636170652E6F72672F6E616D657370616365732F696E6B7363 - 6170652671756F743B2667743B262378413B2020266C743B67206F7061636974 - 793D2671756F743B312671756F743B20786D6C6E733A626772613D2671756F74 - 3B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A - 5061696E745F5356475F666F726D61742671756F743B20696E6B73636170653A - 6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73636170 - 653A67726F75706D6F64653D2671756F743B6C617965722671756F743B206267 - 72613A6F726967696E616C56696577426F783D2671756F743B2D3130202D3120 - 35362033302671756F743B2667743B262378413B20202020266C743B70617468 - 20643D2671756F743B4D342032302032322032302032322031352E352032382E - 352032322032322032382E352032322032342034203234207A2671756F743B20 - 66696C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671 - 756F743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F - 743B302E373932313536392671756F743B2F2667743B262378413B2020202026 - 6C743B7465787420783D2671756F743B342671756F743B20793D2671756F743B - 2D312671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B20 - 7374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73697A - 653D2671756F743B31342671756F743B20666F6E742D7374796C653D2671756F - 743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D2671756F74 - 3B4672656553616E732671756F743B20666F6E742D7765696768743D2671756F - 743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671756F - 743B302E393638363237352671756F743B20746578742D6465636F726174696F - 6E3D2671756F743B2671756F743B2667743B262378413B202020202020266C74 - 3B747370616E20783D2671756F743B342671756F743B20793D2671756F743B31 - 322671756F743B20646972656374696F6E3D2671756F743B6C74722671756F74 - 3B20746578744C656E6774683D2671756F743B32332E31353431332671756F74 - 3B2667743BCEB1CEB2CEB3266C743B2F747370616E2667743B262378413B2020 - 2020266C743B2F746578742667743B262378413B2020266C743B2F672667743B - 262378413B266C743B2F7376672667743B262378413B222F3E0A20203C497465 - 6D36205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B31 - 2E302671756F743B20656E636F64696E673D2671756F743B7574662D38267175 - 6F743B3F2667743B262378413B266C743B7376672077696474683D2671756F74 - 3B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F777777 - 2E77332E6F72672F323030302F7376672671756F743B206865696768743D2671 - 756F743B33322671756F743B2076696577426F783D2671756F743B3020302033 - 322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F743B - 687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D6573706163 - 65732F696E6B73636170652671756F743B2667743B262378413B2020266C743B - 67206F7061636974793D2671756F743B312671756F743B20786D6C6E733A6267 - 72613D2671756F743B68747470733A2F2F77696B692E6672656570617363616C - 2E6F72672F4C617A5061696E745F5356475F666F726D61742671756F743B2069 - 6E6B73636170653A6C6162656C3D2671756F743B4C61796572312671756F743B - 20696E6B73636170653A67726F75706D6F64653D2671756F743B6C6179657226 - 71756F743B20626772613A6F726967696E616C56696577426F783D2671756F74 - 3B2D313520302035392032392671756F743B2667743B262378413B2020202026 - 6C743B7061746820643D2671756F743B4D332E352032322031302031352E3520 - 31302032302032382032302032382032342031302032342031302032382E3520 + 652671756F743B2667743B262378443B262378413B2020266C743B67206F7061 + 636974793D2671756F743B312671756F743B20786D6C6E733A626772613D2671 + 756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F + 4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B736361 + 70653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73 + 636170653A67726F75706D6F64653D2671756F743B6C617965722671756F743B + 20626772613A6F726967696E616C56696577426F783D2671756F743B2D313020 + 2D312035362033302671756F743B2667743B262378443B262378413B20202020 + 266C743B7061746820643D2671756F743B4D3420323020323220323020323220 + 31352E352032382E352032322032322032382E35203232203234203420323420 7A2671756F743B2066696C6C3D2671756F743B626C61636B2671756F743B2073 74726F6B653D2671756F743B6E6F6E652671756F743B2066696C6C2D6F706163 6974793D2671756F743B302E373932313536392671756F743B2F2667743B2623 - 78413B20202020266C743B7465787420783D2671756F743B302671756F743B20 - 793D2671756F743B302671756F743B2066696C6C3D2671756F743B626C61636B - 2671756F743B207374726F6B653D2671756F743B6E6F6E652671756F743B2066 - 6F6E742D73697A653D2671756F743B31352671756F743B20666F6E742D737479 - 6C653D2671756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C - 793D2671756F743B4672656553616E732671756F743B20666F6E742D77656967 - 68743D2671756F743B6E6F726D616C2671756F743B2066696C6C2D6F70616369 - 74793D2671756F743B302E393638363237352671756F743B20746578742D6465 - 636F726174696F6E3D2671756F743B2671756F743B2667743B262378413B2020 + 78443B262378413B20202020266C743B7465787420783D2671756F743B342671 + 756F743B20793D2671756F743B2D312671756F743B2066696C6C3D2671756F74 + 3B626C61636B2671756F743B207374726F6B653D2671756F743B6E6F6E652671 + 756F743B20666F6E742D73697A653D2671756F743B31342671756F743B20666F + 6E742D7374796C653D2671756F743B6E6F726D616C2671756F743B20666F6E74 + 2D66616D696C793D2671756F743B4672656553616E732671756F743B20666F6E + 742D7765696768743D2671756F743B6E6F726D616C2671756F743B2066696C6C + 2D6F7061636974793D2671756F743B302E393638363237352671756F743B2074 + 6578742D6465636F726174696F6E3D2671756F743B2671756F743B2667743B26 + 2378443B262378413B202020202020266C743B747370616E20783D2671756F74 + 3B342671756F743B20793D2671756F743B31322671756F743B20646972656374 + 696F6E3D2671756F743B6C74722671756F743B20746578744C656E6774683D26 + 71756F743B32332E31353431332671756F743B2667743BCEB1CEB2CEB3266C74 + 3B2F747370616E2667743B262378443B262378413B20202020266C743B2F7465 + 78742667743B262378443B262378413B2020266C743B2F672667743B26237844 + 3B262378413B266C743B2F7376672667743B262378443B262378413B222F3E0D + 0A20203C4974656D36205356473D22266C743B3F786D6C2076657273696F6E3D + 2671756F743B312E302671756F743B20656E636F64696E673D2671756F743B75 + 74662D382671756F743B3F2667743B262378443B262378413B266C743B737667 + 2077696474683D2671756F743B33322671756F743B20786D6C6E733D2671756F + 743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671756F + 743B206865696768743D2671756F743B33322671756F743B2076696577426F78 + 3D2671756F743B3020302033322033322671756F743B20786D6C6E733A696E6B + 73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170652E + 6F72672F6E616D657370616365732F696E6B73636170652671756F743B266774 + 3B262378443B262378413B2020266C743B67206F7061636974793D2671756F74 + 3B312671756F743B20786D6C6E733A626772613D2671756F743B68747470733A + 2F2F77696B692E6672656570617363616C2E6F72672F4C617A5061696E745F53 + 56475F666F726D61742671756F743B20696E6B73636170653A6C6162656C3D26 + 71756F743B4C61796572312671756F743B20696E6B73636170653A67726F7570 + 6D6F64653D2671756F743B6C617965722671756F743B20626772613A6F726967 + 696E616C56696577426F783D2671756F743B2D31352030203539203239267175 + 6F743B2667743B262378443B262378413B20202020266C743B7061746820643D + 2671756F743B4D332E352032322031302031352E352031302032302032382032 + 302032382032342031302032342031302032382E35207A2671756F743B206669 + 6C6C3D2671756F743B626C61636B2671756F743B207374726F6B653D2671756F + 743B6E6F6E652671756F743B2066696C6C2D6F7061636974793D2671756F743B + 302E373932313536392671756F743B2F2667743B262378443B262378413B2020 + 2020266C743B7465787420783D2671756F743B302671756F743B20793D267175 + 6F743B302671756F743B2066696C6C3D2671756F743B626C61636B2671756F74 + 3B207374726F6B653D2671756F743B6E6F6E652671756F743B20666F6E742D73 + 697A653D2671756F743B31352671756F743B20666F6E742D7374796C653D2671 + 756F743B6E6F726D616C2671756F743B20666F6E742D66616D696C793D267175 + 6F743B4672656553616E732671756F743B20666F6E742D7765696768743D2671 + 756F743B6E6F726D616C2671756F743B2066696C6C2D6F7061636974793D2671 + 756F743B302E393638363237352671756F743B20746578742D6465636F726174 + 696F6E3D2671756F743B2671756F743B2667743B262378443B262378413B2020 20202020266C743B747370616E20783D2671756F743B32392671756F743B2079 3D2671756F743B31342671756F743B20646972656374696F6E3D2671756F743B 72746C2671756F743B20746578744C656E6774683D2671756F743B32322E3536 382671756F743B2667743BD790D791D792266C743B2F747370616E2667743B26 - 2378413B20202020266C743B2F746578742667743B262378413B2020266C743B - 2F672667743B262378413B266C743B2F7376672667743B262378413B222F3E0A - 20203C4974656D37205356473D22266C743B3F786D6C2076657273696F6E3D26 - 71756F743B312E302671756F743B20656E636F64696E673D2671756F743B7574 - 662D382671756F743B3F2667743B262378413B266C743B737667207769647468 - 3D2671756F743B33322671756F743B20786D6C6E733D2671756F743B68747470 - 3A2F2F7777772E77332E6F72672F323030302F7376672671756F743B20686569 - 6768743D2671756F743B33322671756F743B2076696577426F783D2671756F74 - 3B3020302033322033322671756F743B20786D6C6E733A696E6B73636170653D - 2671756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E61 - 6D657370616365732F696E6B73636170652671756F743B2667743B262378413B - 2020266C743B67206F7061636974793D2671756F743B312671756F743B20786D - 6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E66726565 - 70617363616C2E6F72672F4C617A5061696E745F5356475F666F726D61742671 - 756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C6179657231 - 2671756F743B20696E6B73636170653A67726F75706D6F64653D2671756F743B - 6C617965722671756F743B20626772613A6F726967696E616C56696577426F78 - 3D2671756F743B3220342032382031342671756F743B2667743B262378413B20 - 202020266C743B646566732667743B262378413B202020202020266C743B6C69 - 6E6561724772616469656E742069643D2671756F743B6C61796572312D66696C - 6C67726164312671756F743B2078313D2671756F743B31352671756F743B2078 - 323D2671756F743B31352671756F743B2079313D2671756F743B322E35267175 - 6F743B2079323D2671756F743B362E352671756F743B207370726561644D6574 - 686F643D2671756F743B7265706561742671756F743B206772616469656E7455 - 6E6974733D2671756F743B7573657253706163654F6E5573652671756F743B20 - 636F6C6F722D696E746572706F6C6174696F6E3D2671756F743B6C696E656172 - 5247422671756F743B2667743B262378413B2020202020202020266C743B7374 - 6F70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C - 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E343938303339322671756F743B2F2667743B26237841 - 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 - 2E303632352671756F743B2073746F702D636F6C6F723D2671756F743B626C61 - 636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E3330 - 39383033392671756F743B2F2667743B262378413B2020202020202020266C74 - 3B73746F70206F66667365743D2671756F743B302E3132352671756F743B2073 + 2378443B262378413B20202020266C743B2F746578742667743B262378443B26 + 2378413B2020266C743B2F672667743B262378443B262378413B266C743B2F73 + 76672667743B262378443B262378413B222F3E0D0A20203C4974656D37205356 + 473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E30267175 + 6F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F26 + 67743B262378443B262378413B266C743B7376672077696474683D2671756F74 + 3B33322671756F743B20786D6C6E733D2671756F743B687474703A2F2F777777 + 2E77332E6F72672F323030302F7376672671756F743B206865696768743D2671 + 756F743B33322671756F743B2076696577426F783D2671756F743B3020302033 + 322033322671756F743B20786D6C6E733A696E6B73636170653D2671756F743B + 687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D6573706163 + 65732F696E6B73636170652671756F743B2667743B262378443B262378413B20 + 20266C743B67206F7061636974793D2671756F743B312671756F743B20786D6C + 6E733A626772613D2671756F743B68747470733A2F2F77696B692E6672656570 + 617363616C2E6F72672F4C617A5061696E745F5356475F666F726D6174267175 + 6F743B20696E6B73636170653A6C6162656C3D2671756F743B4C617965723126 + 71756F743B20696E6B73636170653A67726F75706D6F64653D2671756F743B6C + 617965722671756F743B20626772613A6F726967696E616C56696577426F783D + 2671756F743B3220342032382031342671756F743B2667743B262378443B2623 + 78413B20202020266C743B646566732667743B262378443B262378413B202020 + 202020266C743B6C696E6561724772616469656E742069643D2671756F743B6C + 61796572312D66696C6C67726164312671756F743B2078313D2671756F743B31 + 352671756F743B2078323D2671756F743B31352671756F743B2079313D267175 + 6F743B322E352671756F743B2079323D2671756F743B362E352671756F743B20 + 7370726561644D6574686F643D2671756F743B7265706561742671756F743B20 + 6772616469656E74556E6974733D2671756F743B7573657253706163654F6E55 + 73652671756F743B20636F6C6F722D696E746572706F6C6174696F6E3D267175 + 6F743B6C696E6561725247422671756F743B2667743B262378443B262378413B + 2020202020202020266C743B73746F70206F66667365743D2671756F743B3026 + 71756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F + 743B2073746F702D6F7061636974793D2671756F743B302E3439383033393226 + 71756F743B2F2667743B262378443B262378413B2020202020202020266C743B + 73746F70206F66667365743D2671756F743B302E303632352671756F743B2073 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 - 2D6F7061636974793D2671756F743B302E3134353039382671756F743B2F2667 - 743B262378413B2020202020202020266C743B73746F70206F66667365743D26 - 71756F743B302E313837352671756F743B2073746F702D636F6C6F723D267175 - 6F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F - 743B302E30333532393431322671756F743B2F2667743B262378413B20202020 - 20202020266C743B73746F70206F66667365743D2671756F743B302E32352671 - 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 - 3B2073746F702D6F7061636974793D2671756F743B302671756F743B2F266774 - 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 - 756F743B302E333132352671756F743B2073746F702D636F6C6F723D2671756F + 2D6F7061636974793D2671756F743B302E333039383033392671756F743B2F26 + 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 + 667365743D2671756F743B302E3132352671756F743B2073746F702D636F6C6F + 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479 + 3D2671756F743B302E3134353039382671756F743B2F2667743B262378443B26 + 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F + 743B302E313837352671756F743B2073746F702D636F6C6F723D2671756F743B + 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30 + 2E30333532393431322671756F743B2F2667743B262378443B262378413B2020 + 202020202020266C743B73746F70206F66667365743D2671756F743B302E3235 + 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 + 6F743B2073746F702D6F7061636974793D2671756F743B302671756F743B2F26 + 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 + 667365743D2671756F743B302E333132352671756F743B2073746F702D636F6C + 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 + 793D2671756F743B302E30333532393431322671756F743B2F2667743B262378 + 443B262378413B2020202020202020266C743B73746F70206F66667365743D26 + 71756F743B302E3337352671756F743B2073746F702D636F6C6F723D2671756F 743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74 - 3B302E30333532393431322671756F743B2F2667743B262378413B2020202020 - 202020266C743B73746F70206F66667365743D2671756F743B302E3337352671 - 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 - 3B2073746F702D6F7061636974793D2671756F743B302E313435303938267175 - 6F743B2F2667743B262378413B2020202020202020266C743B73746F70206F66 - 667365743D2671756F743B302E343337352671756F743B2073746F702D636F6C + 3B302E3134353039382671756F743B2F2667743B262378443B262378413B2020 + 202020202020266C743B73746F70206F66667365743D2671756F743B302E3433 + 37352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 + 71756F743B2073746F702D6F7061636974793D2671756F743B302E3330393830 + 33392671756F743B2F2667743B262378443B262378413B202020202020202026 + 6C743B73746F70206F66667365743D2671756F743B302E352671756F743B2073 + 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 + 2D6F7061636974793D2671756F743B302E343938303339322671756F743B2F26 + 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 + 667365743D2671756F743B302E353632352671756F743B2073746F702D636F6C 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E333039383033392671756F743B2F2667743B26237841 - 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 - 2E352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 - 71756F743B2073746F702D6F7061636974793D2671756F743B302E3439383033 - 39322671756F743B2F2667743B262378413B2020202020202020266C743B7374 - 6F70206F66667365743D2671756F743B302E353632352671756F743B2073746F - 702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F - 7061636974793D2671756F743B302E363930313936312671756F743B2F266774 + 793D2671756F743B302E363930313936312671756F743B2F2667743B26237844 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 756F743B302E3632352671756F743B2073746F702D636F6C6F723D2671756F74 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E3835343930322671756F743B2F2667743B262378413B2020202020202020 - 266C743B73746F70206F66667365743D2671756F743B302E363837352671756F - 743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B20 - 73746F702D6F7061636974793D2671756F743B302E393634373035392671756F - 743B2F2667743B262378413B2020202020202020266C743B73746F70206F6666 - 7365743D2671756F743B302E37352671756F743B2073746F702D636F6C6F723D - 2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D26 - 71756F743B312671756F743B2F2667743B262378413B2020202020202020266C - 743B73746F70206F66667365743D2671756F743B302E383132352671756F743B - 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 - 6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B - 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 - 743D2671756F743B302E3837352671756F743B2073746F702D636F6C6F723D26 + 302E3835343930322671756F743B2F2667743B262378443B262378413B202020 + 2020202020266C743B73746F70206F66667365743D2671756F743B302E363837 + 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 + 756F743B2073746F702D6F7061636974793D2671756F743B302E393634373035 + 392671756F743B2F2667743B262378443B262378413B2020202020202020266C + 743B73746F70206F66667365743D2671756F743B302E37352671756F743B2073 + 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 + 2D6F7061636974793D2671756F743B312671756F743B2F2667743B262378443B + 262378413B2020202020202020266C743B73746F70206F66667365743D267175 + 6F743B302E383132352671756F743B2073746F702D636F6C6F723D2671756F74 + 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B + 302E393634373035392671756F743B2F2667743B262378443B262378413B2020 + 202020202020266C743B73746F70206F66667365743D2671756F743B302E3837 + 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 + 756F743B2073746F702D6F7061636974793D2671756F743B302E383534393032 + 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74 + 3B73746F70206F66667365743D2671756F743B302E393337352671756F743B20 + 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F + 702D6F7061636974793D2671756F743B302E363930313936312671756F743B2F + 2667743B262378443B262378413B2020202020202020266C743B73746F70206F + 66667365743D2671756F743B312671756F743B2073746F702D636F6C6F723D26 71756F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671 - 756F743B302E3835343930322671756F743B2F2667743B262378413B20202020 - 20202020266C743B73746F70206F66667365743D2671756F743B302E39333735 - 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 - 6F743B2073746F702D6F7061636974793D2671756F743B302E36393031393631 - 2671756F743B2F2667743B262378413B2020202020202020266C743B73746F70 - 206F66667365743D2671756F743B312671756F743B2073746F702D636F6C6F72 - 3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D - 2671756F743B302E343938303339322671756F743B2F2667743B262378413B20 - 2020202020266C743B2F6C696E6561724772616469656E742667743B26237841 - 3B20202020266C743B2F646566732667743B262378413B20202020266C743B70 - 61746820643D2671756F743B4D352E35203420352E3520362037203820372031 - 3020322031322032203138203330203138203330203132203235203130203235 - 20382032362E3520362032362E352034207A2671756F743B2066696C6C3D2671 - 756F743B75726C28236C61796572312D66696C6C6772616431292671756F743B - 207374726F6B653D2671756F743B6E6F6E652671756F743B2F2667743B262378 - 413B2020266C743B2F672667743B262378413B266C743B2F7376672667743B26 - 2378413B222F3E0A20203C4974656D38205356473D22266C743B3F786D6C2076 - 657273696F6E3D2671756F743B312E302671756F743B20656E636F64696E673D - 2671756F743B7574662D382671756F743B3F2667743B262378413B266C743B73 - 76672077696474683D2671756F743B33322671756F743B20786D6C6E733D2671 - 756F743B687474703A2F2F7777772E77332E6F72672F323030302F7376672671 - 756F743B206865696768743D2671756F743B33322671756F743B207669657742 - 6F783D2671756F743B3020302033322033322671756F743B20786D6C6E733A69 - 6E6B73636170653D2671756F743B687474703A2F2F7777772E696E6B73636170 - 652E6F72672F6E616D657370616365732F696E6B73636170652671756F743B26 - 67743B262378413B2020266C743B67206F7061636974793D2671756F743B3126 - 71756F743B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77 - 696B692E6672656570617363616C2E6F72672F4C617A5061696E745F5356475F - 666F726D61742671756F743B20696E6B73636170653A6C6162656C3D2671756F - 743B4C61796572312671756F743B20696E6B73636170653A67726F75706D6F64 - 653D2671756F743B6C617965722671756F743B20626772613A6F726967696E61 - 6C56696577426F783D2671756F743B3220392032382031342671756F743B2667 - 743B262378413B20202020266C743B646566732667743B262378413B20202020 - 2020266C743B6C696E6561724772616469656E742069643D2671756F743B6C61 - 796572312D66696C6C67726164312671756F743B2078313D2671756F743B3135 - 2671756F743B2078323D2671756F743B31352671756F743B2079313D2671756F - 743B372E352671756F743B2079323D2671756F743B31312E352671756F743B20 - 7370726561644D6574686F643D2671756F743B7265706561742671756F743B20 - 6772616469656E74556E6974733D2671756F743B7573657253706163654F6E55 - 73652671756F743B20636F6C6F722D696E746572706F6C6174696F6E3D267175 - 6F743B6C696E6561725247422671756F743B2667743B262378413B2020202020 - 202020266C743B73746F70206F66667365743D2671756F743B302671756F743B - 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 - 6F702D6F7061636974793D2671756F743B302E343938303339322671756F743B - 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 - 743D2671756F743B302E303632352671756F743B2073746F702D636F6C6F723D - 2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D26 - 71756F743B302E333039383033392671756F743B2F2667743B262378413B2020 + 756F743B302E343938303339322671756F743B2F2667743B262378443B262378 + 413B202020202020266C743B2F6C696E6561724772616469656E742667743B26 + 2378443B262378413B20202020266C743B2F646566732667743B262378443B26 + 2378413B20202020266C743B7061746820643D2671756F743B4D352E35203420 + 352E352036203720382037203130203220313220322031382033302031382033 + 3020313220323520313020323520382032362E3520362032362E352034207A26 + 71756F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C + 6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E6526 + 71756F743B2F2667743B262378443B262378413B2020266C743B2F672667743B + 262378443B262378413B266C743B2F7376672667743B262378443B262378413B + 222F3E0D0A20203C4974656D38205356473D22266C743B3F786D6C2076657273 + 696F6E3D2671756F743B312E302671756F743B20656E636F64696E673D267175 + 6F743B7574662D382671756F743B3F2667743B262378443B262378413B266C74 + 3B7376672077696474683D2671756F743B33322671756F743B20786D6C6E733D + 2671756F743B687474703A2F2F7777772E77332E6F72672F323030302F737667 + 2671756F743B206865696768743D2671756F743B33322671756F743B20766965 + 77426F783D2671756F743B3020302033322033322671756F743B20786D6C6E73 + 3A696E6B73636170653D2671756F743B687474703A2F2F7777772E696E6B7363 + 6170652E6F72672F6E616D657370616365732F696E6B73636170652671756F74 + 3B2667743B262378443B262378413B2020266C743B67206F7061636974793D26 + 71756F743B312671756F743B20786D6C6E733A626772613D2671756F743B6874 + 7470733A2F2F77696B692E6672656570617363616C2E6F72672F4C617A506169 + 6E745F5356475F666F726D61742671756F743B20696E6B73636170653A6C6162 + 656C3D2671756F743B4C61796572312671756F743B20696E6B73636170653A67 + 726F75706D6F64653D2671756F743B6C617965722671756F743B20626772613A + 6F726967696E616C56696577426F783D2671756F743B32203920323820313426 + 71756F743B2667743B262378443B262378413B20202020266C743B6465667326 + 67743B262378443B262378413B202020202020266C743B6C696E656172477261 + 6469656E742069643D2671756F743B6C61796572312D66696C6C677261643126 + 71756F743B2078313D2671756F743B31352671756F743B2078323D2671756F74 + 3B31352671756F743B2079313D2671756F743B372E352671756F743B2079323D + 2671756F743B31312E352671756F743B207370726561644D6574686F643D2671 + 756F743B7265706561742671756F743B206772616469656E74556E6974733D26 + 71756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D + 696E746572706F6C6174696F6E3D2671756F743B6C696E656172524742267175 + 6F743B2667743B262378443B262378413B2020202020202020266C743B73746F + 70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F + 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479 + 3D2671756F743B302E343938303339322671756F743B2F2667743B262378443B + 262378413B2020202020202020266C743B73746F70206F66667365743D267175 + 6F743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F74 + 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B + 302E333039383033392671756F743B2F2667743B262378443B262378413B2020 202020202020266C743B73746F70206F66667365743D2671756F743B302E3132 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 756F743B2073746F702D6F7061636974793D2671756F743B302E313435303938 - 2671756F743B2F2667743B262378413B2020202020202020266C743B73746F70 - 206F66667365743D2671756F743B302E313837352671756F743B2073746F702D - 636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061 - 636974793D2671756F743B302E30333532393431322671756F743B2F2667743B - 262378413B2020202020202020266C743B73746F70206F66667365743D267175 - 6F743B302E32352671756F743B2073746F702D636F6C6F723D2671756F743B62 - 6C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B3026 - 71756F743B2F2667743B262378413B2020202020202020266C743B73746F7020 - 6F66667365743D2671756F743B302E333132352671756F743B2073746F702D63 + 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74 + 3B73746F70206F66667365743D2671756F743B302E313837352671756F743B20 + 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F + 702D6F7061636974793D2671756F743B302E30333532393431322671756F743B + 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020 + 6F66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C + 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 + 793D2671756F743B302671756F743B2F2667743B262378443B262378413B2020 + 202020202020266C743B73746F70206F66667365743D2671756F743B302E3331 + 32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 + 71756F743B2073746F702D6F7061636974793D2671756F743B302E3033353239 + 3431322671756F743B2F2667743B262378443B262378413B2020202020202020 + 266C743B73746F70206F66667365743D2671756F743B302E3337352671756F74 + 3B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073 + 746F702D6F7061636974793D2671756F743B302E3134353039382671756F743B + 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020 + 6F66667365743D2671756F743B302E343337352671756F743B2073746F702D63 6F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F706163 - 6974793D2671756F743B302E30333532393431322671756F743B2F2667743B26 - 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F - 743B302E3337352671756F743B2073746F702D636F6C6F723D2671756F743B62 - 6C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E - 3134353039382671756F743B2F2667743B262378413B2020202020202020266C - 743B73746F70206F66667365743D2671756F743B302E343337352671756F743B + 6974793D2671756F743B302E333039383033392671756F743B2F2667743B2623 + 78443B262378413B2020202020202020266C743B73746F70206F66667365743D + 2671756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F74 + 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B + 302E343938303339322671756F743B2F2667743B262378443B262378413B2020 + 202020202020266C743B73746F70206F66667365743D2671756F743B302E3536 + 32352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 + 71756F743B2073746F702D6F7061636974793D2671756F743B302E3639303139 + 36312671756F743B2F2667743B262378443B262378413B202020202020202026 + 6C743B73746F70206F66667365743D2671756F743B302E3632352671756F743B 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 - 6F702D6F7061636974793D2671756F743B302E333039383033392671756F743B - 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 - 743D2671756F743B302E352671756F743B2073746F702D636F6C6F723D267175 - 6F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F - 743B302E343938303339322671756F743B2F2667743B262378413B2020202020 - 202020266C743B73746F70206F66667365743D2671756F743B302E3536323526 - 71756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F - 743B2073746F702D6F7061636974793D2671756F743B302E3639303139363126 - 71756F743B2F2667743B262378413B2020202020202020266C743B73746F7020 - 6F66667365743D2671756F743B302E3632352671756F743B2073746F702D636F + 6F702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F + 2667743B262378443B262378413B2020202020202020266C743B73746F70206F + 66667365743D2671756F743B302E363837352671756F743B2073746F702D636F 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369 - 74793D2671756F743B302E3835343930322671756F743B2F2667743B26237841 - 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 - 2E363837352671756F743B2073746F702D636F6C6F723D2671756F743B626C61 - 636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E3936 - 34373035392671756F743B2F2667743B262378413B2020202020202020266C74 - 3B73746F70206F66667365743D2671756F743B302E37352671756F743B207374 - 6F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D - 6F7061636974793D2671756F743B312671756F743B2F2667743B262378413B20 - 20202020202020266C743B73746F70206F66667365743D2671756F743B302E38 - 3132352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B - 2671756F743B2073746F702D6F7061636974793D2671756F743B302E39363437 - 3035392671756F743B2F2667743B262378413B2020202020202020266C743B73 - 746F70206F66667365743D2671756F743B302E3837352671756F743B2073746F - 702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F - 7061636974793D2671756F743B302E3835343930322671756F743B2F2667743B - 262378413B2020202020202020266C743B73746F70206F66667365743D267175 - 6F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F74 + 74793D2671756F743B302E393634373035392671756F743B2F2667743B262378 + 443B262378413B2020202020202020266C743B73746F70206F66667365743D26 + 71756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F74 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E363930313936312671756F743B2F2667743B262378413B20202020202020 - 20266C743B73746F70206F66667365743D2671756F743B312671756F743B2073 - 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 - 2D6F7061636974793D2671756F743B302E343938303339322671756F743B2F26 - 67743B262378413B202020202020266C743B2F6C696E6561724772616469656E - 742667743B262378413B20202020266C743B2F646566732667743B262378413B - 20202020266C743B7061746820643D2671756F743B4D352E35203920352E3520 - 3131203720313320372031352032203137203220323320333020323320333020 - 31372032352031352032352031332032362E352031312032362E352039207A26 - 71756F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C - 6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E6526 - 71756F743B2F2667743B262378413B2020266C743B2F672667743B262378413B - 266C743B2F7376672667743B262378413B222F3E0A20203C4974656D39205356 - 473D22266C743B3F786D6C2076657273696F6E3D2671756F743B312E30267175 - 6F743B20656E636F64696E673D2671756F743B7574662D382671756F743B3F26 - 67743B262378413B266C743B7376672077696474683D2671756F743B33322671 - 756F743B20786D6C6E733D2671756F743B687474703A2F2F7777772E77332E6F - 72672F323030302F7376672671756F743B206865696768743D2671756F743B33 - 322671756F743B2076696577426F783D2671756F743B30203020333220333226 - 71756F743B20786D6C6E733A696E6B73636170653D2671756F743B687474703A - 2F2F7777772E696E6B73636170652E6F72672F6E616D657370616365732F696E - 6B73636170652671756F743B2667743B262378413B2020266C743B67206F7061 - 636974793D2671756F743B312671756F743B20786D6C6E733A626772613D2671 - 756F743B68747470733A2F2F77696B692E6672656570617363616C2E6F72672F - 4C617A5061696E745F5356475F666F726D61742671756F743B20696E6B736361 - 70653A6C6162656C3D2671756F743B4C61796572312671756F743B20696E6B73 - 636170653A67726F75706D6F64653D2671756F743B6C617965722671756F743B - 20626772613A6F726967696E616C56696577426F783D2671756F743B32203136 - 2032382031352671756F743B2667743B262378413B20202020266C743B646566 - 732667743B262378413B202020202020266C743B6C696E656172477261646965 - 6E742069643D2671756F743B6C61796572312D66696C6C67726164312671756F - 743B2078313D2671756F743B31352671756F743B2078323D2671756F743B3135 - 2671756F743B2079313D2671756F743B31342E35343136372671756F743B2079 - 323D2671756F743B31382E35343136372671756F743B207370726561644D6574 - 686F643D2671756F743B7265706561742671756F743B206772616469656E7455 - 6E6974733D2671756F743B7573657253706163654F6E5573652671756F743B20 - 636F6C6F722D696E746572706F6C6174696F6E3D2671756F743B6C696E656172 - 5247422671756F743B2667743B262378413B2020202020202020266C743B7374 - 6F70206F66667365743D2671756F743B302671756F743B2073746F702D636F6C - 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E343938303339322671756F743B2F2667743B26237841 - 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 - 2E303632352671756F743B2073746F702D636F6C6F723D2671756F743B626C61 - 636B2671756F743B2073746F702D6F7061636974793D2671756F743B302E3330 - 39383033392671756F743B2F2667743B262378413B2020202020202020266C74 - 3B73746F70206F66667365743D2671756F743B302E3132352671756F743B2073 - 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 - 2D6F7061636974793D2671756F743B302E3134353039382671756F743B2F2667 - 743B262378413B2020202020202020266C743B73746F70206F66667365743D26 - 71756F743B302E313837352671756F743B2073746F702D636F6C6F723D267175 - 6F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F - 743B302E30333532393431322671756F743B2F2667743B262378413B20202020 - 20202020266C743B73746F70206F66667365743D2671756F743B302E32352671 - 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 - 3B2073746F702D6F7061636974793D2671756F743B302671756F743B2F266774 + 312671756F743B2F2667743B262378443B262378413B2020202020202020266C + 743B73746F70206F66667365743D2671756F743B302E383132352671756F743B + 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 + 6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B + 2F2667743B262378443B262378413B2020202020202020266C743B73746F7020 + 6F66667365743D2671756F743B302E3837352671756F743B2073746F702D636F + 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369 + 74793D2671756F743B302E3835343930322671756F743B2F2667743B26237844 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 - 756F743B302E333132352671756F743B2073746F702D636F6C6F723D2671756F + 756F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F 743B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F74 - 3B302E30333532393431322671756F743B2F2667743B262378413B2020202020 - 202020266C743B73746F70206F66667365743D2671756F743B302E3337352671 + 3B302E363930313936312671756F743B2F2667743B262378443B262378413B20 + 20202020202020266C743B73746F70206F66667365743D2671756F743B312671 756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F74 - 3B2073746F702D6F7061636974793D2671756F743B302E313435303938267175 - 6F743B2F2667743B262378413B2020202020202020266C743B73746F70206F66 - 667365743D2671756F743B302E343337352671756F743B2073746F702D636F6C + 3B2073746F702D6F7061636974793D2671756F743B302E343938303339322671 + 756F743B2F2667743B262378443B262378413B202020202020266C743B2F6C69 + 6E6561724772616469656E742667743B262378443B262378413B20202020266C + 743B2F646566732667743B262378443B262378413B20202020266C743B706174 + 6820643D2671756F743B4D352E35203920352E35203131203720313320372031 + 3520322031372032203233203330203233203330203137203235203135203235 + 2031332032362E352031312032362E352039207A2671756F743B2066696C6C3D + 2671756F743B75726C28236C61796572312D66696C6C6772616431292671756F + 743B207374726F6B653D2671756F743B6E6F6E652671756F743B2F2667743B26 + 2378443B262378413B2020266C743B2F672667743B262378443B262378413B26 + 6C743B2F7376672667743B262378443B262378413B222F3E0D0A20203C497465 + 6D39205356473D22266C743B3F786D6C2076657273696F6E3D2671756F743B31 + 2E302671756F743B20656E636F64696E673D2671756F743B7574662D38267175 + 6F743B3F2667743B262378443B262378413B266C743B7376672077696474683D + 2671756F743B33322671756F743B20786D6C6E733D2671756F743B687474703A + 2F2F7777772E77332E6F72672F323030302F7376672671756F743B2068656967 + 68743D2671756F743B33322671756F743B2076696577426F783D2671756F743B + 3020302033322033322671756F743B20786D6C6E733A696E6B73636170653D26 + 71756F743B687474703A2F2F7777772E696E6B73636170652E6F72672F6E616D + 657370616365732F696E6B73636170652671756F743B2667743B262378443B26 + 2378413B2020266C743B67206F7061636974793D2671756F743B312671756F74 + 3B20786D6C6E733A626772613D2671756F743B68747470733A2F2F77696B692E + 6672656570617363616C2E6F72672F4C617A5061696E745F5356475F666F726D + 61742671756F743B20696E6B73636170653A6C6162656C3D2671756F743B4C61 + 796572312671756F743B20696E6B73636170653A67726F75706D6F64653D2671 + 756F743B6C617965722671756F743B20626772613A6F726967696E616C566965 + 77426F783D2671756F743B322031362032382031352671756F743B2667743B26 + 2378443B262378413B20202020266C743B646566732667743B262378443B2623 + 78413B202020202020266C743B6C696E6561724772616469656E742069643D26 + 71756F743B6C61796572312D66696C6C67726164312671756F743B2078313D26 + 71756F743B31352671756F743B2078323D2671756F743B31352671756F743B20 + 79313D2671756F743B31342E35343136372671756F743B2079323D2671756F74 + 3B31382E35343136372671756F743B207370726561644D6574686F643D267175 + 6F743B7265706561742671756F743B206772616469656E74556E6974733D2671 + 756F743B7573657253706163654F6E5573652671756F743B20636F6C6F722D69 + 6E746572706F6C6174696F6E3D2671756F743B6C696E6561725247422671756F + 743B2667743B262378443B262378413B2020202020202020266C743B73746F70 + 206F66667365743D2671756F743B302671756F743B2073746F702D636F6C6F72 + 3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D + 2671756F743B302E343938303339322671756F743B2F2667743B262378443B26 + 2378413B2020202020202020266C743B73746F70206F66667365743D2671756F + 743B302E303632352671756F743B2073746F702D636F6C6F723D2671756F743B + 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30 + 2E333039383033392671756F743B2F2667743B262378443B262378413B202020 + 2020202020266C743B73746F70206F66667365743D2671756F743B302E313235 + 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 + 6F743B2073746F702D6F7061636974793D2671756F743B302E31343530393826 + 71756F743B2F2667743B262378443B262378413B2020202020202020266C743B + 73746F70206F66667365743D2671756F743B302E313837352671756F743B2073 + 746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F70 + 2D6F7061636974793D2671756F743B302E30333532393431322671756F743B2F + 2667743B262378443B262378413B2020202020202020266C743B73746F70206F + 66667365743D2671756F743B302E32352671756F743B2073746F702D636F6C6F + 723D2671756F743B626C61636B2671756F743B2073746F702D6F706163697479 + 3D2671756F743B302671756F743B2F2667743B262378443B262378413B202020 + 2020202020266C743B73746F70206F66667365743D2671756F743B302E333132 + 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 + 756F743B2073746F702D6F7061636974793D2671756F743B302E303335323934 + 31322671756F743B2F2667743B262378443B262378413B202020202020202026 + 6C743B73746F70206F66667365743D2671756F743B302E3337352671756F743B + 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 + 6F702D6F7061636974793D2671756F743B302E3134353039382671756F743B2F + 2667743B262378443B262378413B2020202020202020266C743B73746F70206F + 66667365743D2671756F743B302E343337352671756F743B2073746F702D636F + 6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F70616369 + 74793D2671756F743B302E333039383033392671756F743B2F2667743B262378 + 443B262378413B2020202020202020266C743B73746F70206F66667365743D26 + 71756F743B302E352671756F743B2073746F702D636F6C6F723D2671756F743B + 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B30 + 2E343938303339322671756F743B2F2667743B262378443B262378413B202020 + 2020202020266C743B73746F70206F66667365743D2671756F743B302E353632 + 352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671 + 756F743B2073746F702D6F7061636974793D2671756F743B302E363930313936 + 312671756F743B2F2667743B262378443B262378413B2020202020202020266C + 743B73746F70206F66667365743D2671756F743B302E3632352671756F743B20 + 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F + 702D6F7061636974793D2671756F743B302E3835343930322671756F743B2F26 + 67743B262378443B262378413B2020202020202020266C743B73746F70206F66 + 667365743D2671756F743B302E363837352671756F743B2073746F702D636F6C 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 - 793D2671756F743B302E333039383033392671756F743B2F2667743B26237841 - 3B2020202020202020266C743B73746F70206F66667365743D2671756F743B30 - 2E352671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B26 - 71756F743B2073746F702D6F7061636974793D2671756F743B302E3439383033 - 39322671756F743B2F2667743B262378413B2020202020202020266C743B7374 - 6F70206F66667365743D2671756F743B302E353632352671756F743B2073746F - 702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F702D6F - 7061636974793D2671756F743B302E363930313936312671756F743B2F266774 + 793D2671756F743B302E393634373035392671756F743B2F2667743B26237844 3B262378413B2020202020202020266C743B73746F70206F66667365743D2671 - 756F743B302E3632352671756F743B2073746F702D636F6C6F723D2671756F74 + 756F743B302E37352671756F743B2073746F702D636F6C6F723D2671756F743B + 626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B31 + 2671756F743B2F2667743B262378443B262378413B2020202020202020266C74 + 3B73746F70206F66667365743D2671756F743B302E383132352671756F743B20 + 73746F702D636F6C6F723D2671756F743B626C61636B2671756F743B2073746F + 702D6F7061636974793D2671756F743B302E393634373035392671756F743B2F + 2667743B262378443B262378413B2020202020202020266C743B73746F70206F + 66667365743D2671756F743B302E3837352671756F743B2073746F702D636F6C + 6F723D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974 + 793D2671756F743B302E3835343930322671756F743B2F2667743B262378443B + 262378413B2020202020202020266C743B73746F70206F66667365743D267175 + 6F743B302E393337352671756F743B2073746F702D636F6C6F723D2671756F74 3B626C61636B2671756F743B2073746F702D6F7061636974793D2671756F743B - 302E3835343930322671756F743B2F2667743B262378413B2020202020202020 - 266C743B73746F70206F66667365743D2671756F743B302E363837352671756F - 743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B20 - 73746F702D6F7061636974793D2671756F743B302E393634373035392671756F - 743B2F2667743B262378413B2020202020202020266C743B73746F70206F6666 - 7365743D2671756F743B302E37352671756F743B2073746F702D636F6C6F723D - 2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D26 - 71756F743B312671756F743B2F2667743B262378413B2020202020202020266C - 743B73746F70206F66667365743D2671756F743B302E383132352671756F743B - 2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B207374 - 6F702D6F7061636974793D2671756F743B302E393634373035392671756F743B - 2F2667743B262378413B2020202020202020266C743B73746F70206F66667365 - 743D2671756F743B302E3837352671756F743B2073746F702D636F6C6F723D26 - 71756F743B626C61636B2671756F743B2073746F702D6F7061636974793D2671 - 756F743B302E3835343930322671756F743B2F2667743B262378413B20202020 - 20202020266C743B73746F70206F66667365743D2671756F743B302E39333735 - 2671756F743B2073746F702D636F6C6F723D2671756F743B626C61636B267175 - 6F743B2073746F702D6F7061636974793D2671756F743B302E36393031393631 - 2671756F743B2F2667743B262378413B2020202020202020266C743B73746F70 - 206F66667365743D2671756F743B312671756F743B2073746F702D636F6C6F72 - 3D2671756F743B626C61636B2671756F743B2073746F702D6F7061636974793D - 2671756F743B302E343938303339322671756F743B2F2667743B262378413B20 - 2020202020266C743B2F6C696E6561724772616469656E742667743B26237841 - 3B20202020266C743B2F646566732667743B262378413B20202020266C743B70 - 61746820643D2671756F743B4D352E352031362E303431363620352E35203138 - 2E303431363620372032302E303431363620372032322E303431363620322032 - 342E303431363620322033302E30343136362033302033302E30343136362033 - 302032342E30343136362032352032322E30343136362032352032302E303431 - 36362032362E352031382E30343136362032362E352031362E3034313636207A - 2671756F743B2066696C6C3D2671756F743B75726C28236C61796572312D6669 - 6C6C6772616431292671756F743B207374726F6B653D2671756F743B6E6F6E65 - 2671756F743B2F2667743B262378413B2020266C743B2F672667743B26237841 - 3B266C743B2F7376672667743B262378413B222F3E0A3C2F434F4E4649473E0A + 302E363930313936312671756F743B2F2667743B262378443B262378413B2020 + 202020202020266C743B73746F70206F66667365743D2671756F743B31267175 + 6F743B2073746F702D636F6C6F723D2671756F743B626C61636B2671756F743B + 2073746F702D6F7061636974793D2671756F743B302E34393830333932267175 + 6F743B2F2667743B262378443B262378413B202020202020266C743B2F6C696E + 6561724772616469656E742667743B262378443B262378413B20202020266C74 + 3B2F646566732667743B262378443B262378413B20202020266C743B70617468 + 20643D2671756F743B4D352E352031362E303431363620352E352031382E3034 + 31363620372032302E303431363620372032322E303431363620322032342E30 + 3431363620322033302E30343136362033302033302E30343136362033302032 + 342E30343136362032352032322E30343136362032352032302E303431363620 + 32362E352031382E30343136362032362E352031362E3034313636207A267175 + 6F743B2066696C6C3D2671756F743B75726C28236C61796572312D66696C6C67 + 72616431292671756F743B207374726F6B653D2671756F743B6E6F6E65267175 + 6F743B2F2667743B262378443B262378413B2020266C743B2F672667743B2623 + 78443B262378413B266C743B2F7376672667743B262378443B262378413B222F + 3E0D0A3C2F434F4E4649473E0D0A } end object SVGRasterImageList1: TBGRAImageList @@ -13429,112 +13452,38 @@ object FMain: TFMain Left = 653 Top = 216 Bitmap = { - 4C7A0A0000001000000010000000EA0300000000000078DAED9AEB4B544118C6 - D75D37AD4C23D8D22E4BA17E902CCA08298C0A2A3F5474CFA28C6E6A566B4214 - DD9422E94A6550A84108A10905511104151815956B116165D8A7FA521441507F - 40CFD0B3309CCE9E9D33E7A849E7851F2B73CE33333B33EFFBCE8CEBF3B96E05 - A08C1468E8852E4ACAFE73FD157E3E04CDA0040435F432E740928DFE07402E68 - 94CAA76B7CFF0952F93A0DFD24A97C8D0D7D0A98025AA5F23C07E3774463FC1F - 83AB6003C7D3B3BEB51ACEC37C4DFD4DF0040C75D087544DDD2AAEA9E11ADA4C - F01CDC4AE0F3F16C23C7AD42B3EFD7A80F6B6827527B59B3ED3DD4AFD0D02683 - 7B9CF3740DFD6CB67DD2733D5B26D6E841B01AF8A57211AF8F818C047A3FE7ED - 8421CECEE35C8E55D0B783B3067D31E773DC00D1B718F42B15F5C2EE800E9026 - D5D96A43BF1F3C03F741C4907755F483F8FD3B58CF75E65CA1CFB2B196FCFD90 - 6B1B4CF60B461A7A51EF99FBF128A8A113F1EA1278CA39BBC19CA09A7BEE72ED - D7824DDC478AF8355A413F926D9E31C45095739BD07582EFE017F8013E813786 - 355860A117BC001FC017F093757D052F2DF456F1601B75CB14DE8F9D33AAA4B2 - 0C96AD55D0071803C5DC1D07E53C333DE07E4AC5C2D4B4937AF66BA0AD7DBFE6 - BEB190E3F78DB93CD9A6BE9ABA2AE691348D3E6473EC6B7806B46BBBE87FE99A - E3B788E7E4A0A65EECFBE770FDFB6CFA8BCEB3D8F37A8BE7F51675C4B4510B7D - 344E1DB25605631D4EF54EFBEFC6F8B9317F6ED918AEBF03BC734A9477C4D974 - 2ED80C96F353F8CE79C65091C326B3DE3C937DFC2CEE1B8F326E36B0EDC3E014 - C76D2B5808D69BEC234B192B66B09E669E234A59E7053E177DA934394B2F605B - B5DC3BDF66FEAEA16607EB157BD1C526317114FB56C1774FB3CDBD1C8FF16037 - CF259916F1361673A78222F63396C38B88EA5DC31043FE1FEC2096D959BF3E4D - FF893AF45FA77AA7FDEF8BF1EB2BFFB76B01AEB920737D2A736E40EA77B2B436 - 930CEB5EDCE7BEA3AF8ABBE1B7DC3F94F0CEED2238C4B8F1DAE43E29897B8E28 - FF4E659C10F147DC5D2F01EFC14EF091BE21DB30E6EB57529FA7813AC6AD46C6 - 84CFF46B63FFCBF9BC93FBFC62C68116D6FB08CC642C6B032183BE9AB16B3BD8 - C25854C778B114ECE3BE3EC431CAE9A53592287FA968A30EB5AAB8A977DA7F37 - C6EF5FF7F1DE36E1BF3D8A14C6C99F61FABB15618B334D44A1ED88892E85FE99 - ADD07E36DF95CF243D9AC42C5713B7DAF7CCB3816E627F324211B3FB0C9193BB - 157CA6DB227F87147C3614472BEEC69B14DA6FF2FD7D8F9EC53EA9C68D1C431D - FD1DBF229A78E699677F4CDC55762962F6FB1F3F7D323F01B9BEF8FF97A85468 - BB32CE7D4716EF9612B59FC777E5DF63746912B37C4DDC6A5FDB7E034D569A1F - } - BitmapAdv = { - 4C69010000004C7A0A0000002000000020000000C70800000000000078DAED5D - 7D908D551C3ED76AEDAE6F858DC6473EA3C4B63E76521A46446ACA584D832217 - 25A4428A88C6129226934926B1A652610B490865E996BE7C954A354D52534DA5 - A6FFD2F9CD7DEEEC71E67DEF7DEFDDF39EF7B5FB7B669E3FEC9E7D9FF3FD9EE7 - 77CE7909C1380F107321EBB33EEBB37E50FA2AF74A6E945C2A3952B285657D9D - 0725174BE607A49FE076C94B03D427BE2E99ED63FFCB916C27395672A74BDA9B - 2DF5FF26929B1CD22EB538FE0639A4DD6C51BFBD43DA3D16F50B1DD2BE6B517F - B243DA572DE977937CCF21EDA33EE9D7966C2A59048D7297B40501CE3F4B029C - FFA8DDEB07A4BF4CB2A185F70F8DAD5D925B25D7484E93BC926D1383C1605841 - BE36276FB0AC3F58D39F68597FB6A6DFD9B2FE66457B6B407D204FB2AE642E0F - 076B58A4F5BB3E16B5EB49BEAF68EF90AC69517FA856F66996EB7E758063BE45 - C0F3ED784DFF4E8BDA11C9322DD6956F51BF402BFBB396EBFE114D7F88456D8A - A3ED16E7C63DF32CEAF7D7CA3ECF72DD3FA5E9F7B2A87DA1E401ED3D5FC3A2FE - ED5AD9275BAEFB524DBF2DBFFE190C4615C605221E436D90626D1D51D2D536A4 - 4DEF9622ACAB1F90EC94246D43A47B5072B421FD2CC90998EBCBE1F1DDCADE0A - E93E907C8DF5599FF5AB9CFE4D49F43BF8A41F55F447279927AFF349FF46C5E3 - 2E47599DDE110B7CD027AD8ECA7A9BCE36146A79206DDAEFDFE7837E22C6B45B - A98395F02114E71A8038C406258FA6F5A90DC628E58B213FA5D02957EAC60F7D - 017F3D019AFB350FF40EE20151457FBD0FEB903AE8E314E7B917A4BA2F16F133 - 27F590876892716A0AB5C02C5E1EFA86A8A8FCB98704A3AC7FDEE933180C0623 - BCA03599CDFDF61AF0802B44FCCC9DFA8E794B72BAE4453E69D319C6551EDE75 - B41E2EF041BFC4458FBCC01EED67BBB026368506F03E89E7BF2DE2E7C9EB2969 - 0A359F34DCA07E5771EE5E6B6B9774392EFEB4B2E8A6D5EF389FFBBCBEF63A24 - 7946F26F857F49FE28795CF243C36B30A7B5DF579ABE535E8E25C94B65F58987 - 254F39D485CADF258FFAA49FE04728EBF792BFB9E4E3A8C535309D3DB85BF3E6 - 4F07F03E2816E79EC53185C4D93ADA7B7E2549BAA6C2CC7D0B1D455A5B767749 - 778992E66583FA8DB5F997623D2344FC9E49AED207162A69C61A6EDB5969F8BD - E744E5EE3B3981E27CD3B47A70E2029FE7663AD7FFB888DF71DA8BF8DB56D47D - 2FC160540F4402D26D82F7CC439233256FC3FC68233FB9D0FC0C6B8013921F4B - 4EF1D177A8E800DD2D92A324EF92FC14EBA2CB2DE8D33AF845C91B5017E4C7D6 - 49FE2AD9C3823ED5714FF891087CC01B589B76B3DC0FAFC51A8BEA7F8E61BFE5 - C577AF15F1BD16F2BCCD2C8FC77C78C0D996CBAD969FFAFF655817D806DD27A7 - F32874CFBE5100FABD3107BD24D93200FDE622BE1FA8C700AA2A2EB6F4376E63 - 2D93BBEB9B45E5CFA427B433F9D645AC927950B533D5CF340FBA7665F4D3CD83 - 93B6097AC9835FDA5EF310B47ED0F51F86FE1786F11786F9270CF36F18DE3F8C - F0211771A861227EF6ADA5C575700DF83F3AF3B607FE8BEE9FF5B5E441C8033E - 29E2B1B7FB25A78AF85EE012431E9CCE74D1B79446C0D7D3DDB68192D788F85E - 27F94FFACED65CB4432368AF11F1FB973DB03EAF83E7D19E542FFCDC4B1B5D05 - 5FB91B1E8BE28CFBA0D1026B6EFAA6D564E4730CE201255897538CF479C92E78 - 1E9D8BA7EFD2CCF2B056CFC1DFEF477AEA5BF325BF907C41B28DE4ADC8D354D4 - CF11C9EFD01674EE7F3CF23B5289D7D09DB5C5F0EDA97C05EDEDD23E6B2B25E6 - B1D6417F92889F4DA5582CC55FE91B5B74269362F565689F1C78C452A4CB49A1 - DF1EF10D8A2127EE14D2BEEF139AFE769433827423E1C51FC69C4FDFBA5A0D9F - 588CB6BCC7C3F8A0FD839568FFC4BBA3359E45FA6DA15F8EF6A9853445E803F3 - 911F3A1BB90DF121CA0B7D83A7BB87BE97074FBF17FEAE07FAC361F4C53ED0A7 - 18D40ECC3F8588C551F9EFC3F8E98336A2EF30ED44DFF072473382B1538AB9A5 - 0CCFD9823E49B10E3A037D10319F6DCA3CB40A638740FB40745699F6E1D62B63 - C10BB251579350C7C3307E47603CDC81B2AF401DCD405FB84254DC85CCC2DF1E - 419C22D373A24EFD25D1FF47E1F76E7D6A3AC685E9FBF805A89BDE29D25D2FE2 - 7B926D0CEBE7A17DEBA648571B63D7E6F700C2B4FE32B9FECC04B180F3100B38 - 0F99FAAF20BDAF9FFA5EF35055F56DF7C358C063200CE32FC8F927E8F997FD3F - 83911EC81F36C6FA52F52BB5E0A3693C3713EE77E173902E57599747F0EFFA22 - F599A8BEF0F9CBE12513771DFBC183922F7C065E7A2AFC4E96A2D3177180F1A2 - E28C2C79FEA1F029A9F6C807C16BD399869FE0A1A93CB720BEB10E9EEC4BFC7E - B5F2CC08D6FCE4C54EC083D6858FA778C401F8F564A07AED047FF109F43A20AE - 43DEBC233C69143AA7903651077510933889180495E76AF8C74DA84F2FE80CDF - B851F1947A3B53FBD059D3854AACA726E23154FE33888D511D7D83366DEA51BF - 15FC6C99703F57417750E98CE932F45981BAA376A2B3B8BF48FE091E421C2295 - 178A208FC5F0ED6F0AF7336D0351C76AB9C89B7F8D722F82EEBFF0CACD3D94BB - 2B6218147FF85924FF6E797FF481843E796FBA87FA8FE463D0A358C60F4A3922 - 29E28A73D177B6C0E39F46FC833CEF708D14233A86D8CE28F8DCF9A8EFE97866 - 17C4324E2366996CAF7E20E2253B308EC722C6B10CB184CF359E84D61FC8EF10 - D4F9B7A2E2AC7196A8B81B7D1CEDE31683EC8E38CD00CC7DED103FA2313B1875 - 3BCB85A3316668FC4F442C4428F3CF60A4EB278239AF713EAFA532DD7F32A91D - 0B583B16B0762C606D930C523BECFA41D77F18FA5F18C65F18E69F30CCBFECE5 - 198CEA07DAB39B6398E9EC0352FAB38639270D7DF262330D967DA6B0733FC334 - 4C953F53986AFB74900DBF1D3558FE289E995D0DDA3AD33E71D632C3567E6EFF - 60DB9FC16030180C0683C16070FC89E34F1C7FE2F813C71F38FEC4EDCFF12706 - 83C16030180C068351D540DF989962983DD3F482FF19663A9E97CEBBD2FFAB5E - 6288F34466676823869829661862A630D5F6E980EEA8D13DB07106DB7F1C9E59 - D372BBA7D30F6658A65F6D9D699F28B14C5B6DEEB52F54F7F6CFB1CC50E07F7B - F54674 + 4C7A0A0000001000000010000000D90300000000000078DAED9AEB4B145118C6 + 77575D3745BBA1959154BA84A56592D98D0AA220A80F29DDCBB2302FA4D03D2A + A3AB9154DA05CC2222A1A2E80A417401A53B5B7D32128CBEF4298220A83FA0E7 + D0B3701866C63367B6B5705EF831EC719E3967CE9CF73DEF7BD0E78BB915814A + 52A4A117BA08A9ECE7FA765E3BC165B01C2469E8659A81DFC1F81340189C97DA + 8B35DE7F8CD4BE5A435F20B5AF70A04F0685E0AAD49EE762FE0E6ACCFF73700D + 94733E3D8BAF35F03BCCD7D4DF032F40AA8B318434754BB9A6066968878337E0 + 7E2F3E6F65EB396F559A63BF497DB6867602B59734FBDE417D998636113CE637 + 4FD7D0CF61DFC73DD78BBBD5839986F5BE1DCC50D43FA2BF05A4B667A04251DF + 01AA0D7A27B9C0BFA0DF2CED53E90EF54F4093A45FE0502F7CE6153802F682EB + 0EF503C13EEEB7621C59A011CC8BC3DA6B35C9178CB4FE45BD67B135BF42BE6D + 6622BFBCC0752CBED91DEE09AA7BCF43F01AEC67DC69E75E94A5A0CF649F270D + 3140A56E13BAB7E03BF8057E802FE083610D16D9E805EFC027F015FCE4B3BE81 + F7367A2B0B329E09DD1285FBA37546BD212688B6950A7A11B71EF0DB1D039B58 + 333D653EA562D9D47490168EAB3F59126BAF10D7B4134B609C1375EF477E4B27 + 6B7928D80546D1173F731D39B561E0369FA553B7AD03A7C000CD395CC6BA37E0 + D05FE49A3953CA85820ADA169BBFB7D83C23AA8DD8E82316CF90B52A189FE156 + EF76FCB1983F9FC2370AC6D17727B1762A5058FB41D66B22EF1E0F66315F6BE4 + B5803E99225D659B0E6A402D3804CE809DCC051B78DEB3182CE235D3A017FBC3 + 36309BDA5BFC5DCF3DB49A35C00DB015A419F41BC11E500A2E527F94E735A2FF + 0D6037BF7FB9C9FB17B25DF473009CA3DF8B3ED7704EAAF8EC628B3C6304C805 + A3390E113B4AD8EE67FEBA4A710F1279C25843DC116DE35CC422D5F5EBD3F49F + 884BFF75AB773BFE78CC5FBCFCBFAF4CC499C1CC19C43A1DC233B7007388E8FB + A758E847B27EAFA5AF74B20614EDF9602D7392C336F9BEC84D4FF0BE0C709AB9 + 7B1ACF0116829716FA14F6D12CE53C15F4DD69E02EEBE3B316EF3E155CE13A99 + CB7C57C4912D7CA732B637999C4526307E4C061379DE51CA9C57C4CC299C073F + DF215563FF52C91D222EB5AAC452EF76FCB198BFFEE2E35626F6BA1E454A2C7C + 57D45DE15EC8F6599F85D729F45D67A24B664E92A3D07F0EEF4D96F43D9A442D + AC49ACFAF7CCB3FFDD12996FA860769E21F6DE6E059FE9E6BD6696A1E0B31916 + 5A5127B429F4DFC67B8DDA5C077123D7F08CBE8E5F759A78E699677F4C9C4B74 + 2962768611A04FE6F742D8E63CB346A1EF1A135D88F1284FA1FF3CDE2BFF3F46 + 972651CBD72456FD6BDB6F31F08DBA } end object TimerHideTextMore: TTimer diff --git a/lazpaint/lazpainttype.pas b/lazpaint/lazpainttype.pas index f88c3ebe..aa5be346 100644 --- a/lazpaint/lazpainttype.pas +++ b/lazpaint/lazpainttype.pas @@ -271,6 +271,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider) procedure ColorToFChooseColor; virtual; abstract; procedure ExitColorEditor; virtual; abstract; function ColorEditorActive: boolean; virtual; abstract; + procedure FChooseColorSimpleRedraw; virtual; abstract; function GetColor(ATarget: TColorTarget): TBGRAPixel; procedure SetColor(ATarget: TColorTarget; AColor: TBGRAPixel); function ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string; @@ -313,6 +314,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider) procedure Wait(ACheckActive: TCheckFunction; ADelayMs: integer); virtual; abstract; procedure AddColorToPalette(AColor: TBGRAPixel); virtual; abstract; procedure RemoveColorFromPalette(AColor: TBGRAPixel); virtual; abstract; + function GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; virtual; abstract; property BlackAndWhite: boolean read FBlackAndWhite write SetBlackAndWhite; @@ -343,6 +345,8 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider) procedure ImageListWindowVisibleKeyDown(var Key: Word; Shift: TShiftState); virtual; abstract; procedure MoveImageListWindowTo(X,Y: integer); virtual; abstract; + procedure SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState); virtual; abstract; + procedure SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState); virtual; abstract; property ImageListWindowWidth: integer read GetImageListWindowWidth write SetImageListWindowWidth; property ImageListWindowHeight: integer read GetImageListWindowHeight write SetImageListWindowHeight; property ImageListWindowVisible: boolean read GetImageListWindowVisible write SetImageListWindowVisible; diff --git a/lazpaint/uchoosecolor.lfm b/lazpaint/uchoosecolor.lfm index 1a5cb384..aab7e14b 100644 --- a/lazpaint/uchoosecolor.lfm +++ b/lazpaint/uchoosecolor.lfm @@ -1,27 +1,28 @@ object FChooseColor: TFChooseColor Left = 417 - Height = 297 + Height = 198 Top = 234 - Width = 396 + Width = 264 BorderIcons = [biSystemMenu] BorderStyle = bsSizeToolWin Caption = 'Color' - ClientHeight = 297 - ClientWidth = 396 - DesignTimePPI = 144 - Font.Height = -18 + ClientHeight = 198 + ClientWidth = 264 + Font.Height = -12 FormStyle = fsStayOnTop OnCreate = FormCreate OnDeactivate = FormDeactivate OnDestroy = FormDestroy + OnKeyDown = FormKeyDown + OnKeyUp = FormKeyUp OnShow = FormShow ShowInTaskBar = stNever - LCLVersion = '2.0.2.0' + LCLVersion = '2.2.6.0' object ChooseColorControl: TPanel Left = 0 - Height = 297 + Height = 198 Top = 0 - Width = 396 + Width = 264 Align = alClient BevelOuter = bvNone TabOrder = 0 diff --git a/lazpaint/uchoosecolor.pas b/lazpaint/uchoosecolor.pas index 144be905..8490d97e 100644 --- a/lazpaint/uchoosecolor.pas +++ b/lazpaint/uchoosecolor.pas @@ -19,6 +19,8 @@ TFChooseColor = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDeactivate(Sender: TObject); procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); private function GetColorTarget: TColorTarget; @@ -37,6 +39,7 @@ TFChooseColor = class(TForm) function GetCurrentColor: TBGRAPixel; procedure AdjustControlHeight; procedure HideEditor; + procedure SimpleRedraw; property DarkTheme: boolean read GetDarkTheme write SetDarkTheme; property LazPaintInstance: TLazPaintCustomInstance read GetLazPaintInstance write SetLazPaintInstance; property EditorVisible: boolean read GetEditorVisible; @@ -69,6 +72,18 @@ procedure TFChooseColor.FormDestroy(Sender: TObject); FreeAndNil(FInterface); end; +procedure TFChooseColor.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if not EditorVisible and Assigned(LazPaintInstance) then + LazPaintInstance.SendKeyDownEventToMainForm(Key, Shift); +end; + +procedure TFChooseColor.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if not EditorVisible and Assigned(LazPaintInstance) then + LazPaintInstance.SendKeyUpEventToMainForm(Key, Shift); +end; + procedure TFChooseColor.FormShow(Sender: TObject); begin self.EnsureVisible(False); @@ -100,6 +115,11 @@ procedure TFChooseColor.HideEditor; FInterface.HideEditor; end; +procedure TFChooseColor.SimpleRedraw; +begin + if Assigned(FInterface) then FInterface.SimpleRedraw; +end; + procedure TFChooseColor.SetDarkTheme(AValue: boolean); begin if Assigned(FInterface) then diff --git a/lazpaint/umainformlayout.pas b/lazpaint/umainformlayout.pas index 3b0ae3ae..b5f7008c 100644 --- a/lazpaint/umainformlayout.pas +++ b/lazpaint/umainformlayout.pas @@ -126,6 +126,7 @@ TMainFormLayout = class(TCustomMainFormLayout) property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance; property ToolboxPopup: TPopupMenu read GetPopupToolbox write SetPopupToolbox; property PaletteVisible: boolean read GetPaletteVisible write SetPaletteVisible; + property PaletteToolbar: TPaletteToolbar read FPaletteToolbar; property StatusBarVisible: boolean read GetStatusBarVisible write SetStatusBarVisible; property StatusText: string read GetStatusText write SetStatusText; property DefaultToolboxDocking: TToolWindowDocking read GetDefaultToolboxDocking; @@ -260,15 +261,21 @@ destructor TMainFormLayout.Destroy; function TMainFormLayout.CatchToolKeyDown(var AKey: Word): boolean; begin if Assigned(FImageView) then - result := FImageView.CatchToolKeyDown(AKey) - else result := false; + begin + result := FImageView.CatchToolKeyDown(AKey); + if not result and Assigned(FPaletteToolbar) then + result := FPaletteToolbar.CatchToolKeyDown(AKey); + end else result := false; end; function TMainFormLayout.CatchToolKeyUp(var AKey: Word): boolean; begin if Assigned(FImageView) then - result := FImageView.CatchToolKeyUp(AKey) - else result := false; + begin + result := FImageView.CatchToolKeyUp(AKey); + if not result and Assigned(FPaletteToolbar) then + result := FPaletteToolbar.CatchToolKeyUp(AKey); + end else result := false; end; function TMainFormLayout.CatchToolKeyPress(var AKey: TUTF8Char): boolean; diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas index 3a41a5b0..96578e60 100644 --- a/lazpaint/upalettetoolbar.pas +++ b/lazpaint/upalettetoolbar.pas @@ -70,6 +70,7 @@ TPaletteToolbar = class procedure SetVisible(AValue: boolean); procedure TryLoadPaletteFrom(AFilename: string); procedure TrySavePaletteTo(AFilename: string); + procedure DoPickColor(Shift: TShiftState; AColor: TBGRAPixel); protected procedure PickColor(Shift: TShiftState; X, Y: Integer); procedure PaletteChanged; @@ -85,6 +86,9 @@ TPaletteToolbar = class procedure ApplyTheme; procedure ComputeMenuButtonGlyph; property PanelPalette: TBGRAVirtualScreen read GetPanelPalette; + protected + FColorsBindToKey: array[0..9] of TBGRAPixel; + FSnapPressed, FAltPressed: boolean; public constructor Create; destructor Destroy; override; @@ -92,6 +96,9 @@ TPaletteToolbar = class procedure AddColor(AColor: TBGRAPixel); procedure RemoveColor(AColor: TBGRAPixel); procedure SetBounds(ALeft,ATop,AWidth,AHeight: integer); + function CatchToolKeyDown(var AKey: Word): boolean; + function CatchToolKeyUp(var AKey: Word): boolean; + function GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; property Container: TWinControl read FContainer write SetContainer; property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance; property Visible: boolean read FVisible write SetVisible; @@ -106,7 +113,8 @@ implementation uses LCScaleDPI, Graphics, Forms, UGraph, UResourceStrings, BGRAColorQuantization, ULayerAction, UCursors, UFileSystem, - udarktheme, UTool, LCVectorialFill, math; + udarktheme, UTool, LCVectorialFill, math, + LCLType; { TPaletteToolbar } @@ -311,6 +319,57 @@ procedure TPaletteToolbar.ComputeMenuButtonGlyph; glyphBmp.Free; end; +function TPaletteToolbar.CatchToolKeyDown(var AKey: Word): boolean; +var colorIndex: integer; + c: TBGRAPixel; +begin + if AKey = VK_MENU then FAltPressed := True + else if (AKey = VK_SNAP) or (AKey = VK_SNAP2) then FSnapPressed := True; + + colorIndex := -1; + if AKey in [VK_0..VK_9] then colorIndex := AKey - VK_0 + {else if AKey in [VK_NUMPAD0..VK_NUMPAD9] then colorIndex := AKey - VK_NUMPAD0}; + + if colorIndex <> -1 then + begin + if FSnapPressed then + begin + c := FLazPaintInstance.GetColor(FLazPaintInstance.ChooseColorTarget); + FColorsBindToKey[colorIndex] := c; + PaletteChanged; + FLazPaintInstance.FChooseColorSimpleRedraw; + end else + begin + c := FColorsBindToKey[colorIndex]; + if c <> BGRAPixelTransparent then + begin + if FAltPressed then DoPickColor([ssRight], c) + else DoPickColor([ssLeft], c); + end; + end; + Result := True; + end else Result := False; +end; + +function TPaletteToolbar.CatchToolKeyUp(var AKey: Word): boolean; +begin + if AKey = VK_MENU then FAltPressed := False + else if (AKey = VK_SNAP) or (AKey = VK_SNAP2) then FSnapPressed := False; + Result := False; +end; + +function TPaletteToolbar.GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; +var i: Integer; +begin + for i := 0 to High(FColorsBindToKey) do + if FColorsBindToKey[i] = AColor then + begin + Result := i.ToString; + exit; + end; + Result := ''; +end; + procedure TPaletteToolbar.DoClearPalette(Sender: TObject); begin FColors.Clear; @@ -493,6 +552,7 @@ procedure TPaletteToolbar.MakePalette(ACount: integer); end; function TPaletteToolbar.GetPanelPalette: TBGRAVirtualScreen; +var i: integer; begin if not Assigned(FPanelPalette) then begin @@ -518,6 +578,9 @@ function TPaletteToolbar.GetPanelPalette: TBGRAVirtualScreen; FTransparentPalette:= false; FMergePalette:= false; + for i := 0 to 9 do + FColorsBindToKey[i] := BGRAPixelTransparent; + FMenuButton := TBCButton.Create(FPanelPalette); FMenuButton.Cursor := crArrow; DarkThemeInstance.Apply(FMenuButton, DarkTheme); @@ -641,10 +704,7 @@ procedure TPaletteToolbar.TrySavePaletteTo(AFilename: string); end; end; -procedure TPaletteToolbar.PickColor(Shift: TShiftState; X, Y: Integer); -var idx: integer; - c : TBGRAPixel; - +procedure TPaletteToolbar.DoPickColor(Shift: TShiftState; AColor: TBGRAPixel); procedure NeedGradient(AFill: TVectorialFill); begin if AFill = LazPaintInstance.ToolManager.ForeFill then @@ -659,8 +719,8 @@ procedure TPaletteToolbar.PickColor(Shift: TShiftState; X, Y: Integer); begin NeedGradient(AFill); if not (AFill.FillType = vftGradient) then exit; - if not FTransparentPalette then c.alpha := AFill.Gradient.StartColor.alpha; - AFill.Gradient.StartColor := c; + if not FTransparentPalette then AColor.alpha := AFill.Gradient.StartColor.alpha; + AFill.Gradient.StartColor := AColor; if AFill = LazPaintInstance.ToolManager.ForeFill then LazPaintInstance.ChooseColorTarget := ctForeColorStartGrad else if AFill = LazPaintInstance.ToolManager.BackFill then @@ -673,8 +733,8 @@ procedure TPaletteToolbar.PickColor(Shift: TShiftState; X, Y: Integer); begin NeedGradient(AFill); if not (AFill.FillType = vftGradient) then exit; - if not FTransparentPalette then c.alpha := AFill.Gradient.EndColor.alpha; - AFill.Gradient.EndColor := c; + if not FTransparentPalette then AColor.alpha := AFill.Gradient.EndColor.alpha; + AFill.Gradient.EndColor := AColor; if AFill = LazPaintInstance.ToolManager.ForeFill then LazPaintInstance.ChooseColorTarget := ctForeColorEndGrad else if AFill = LazPaintInstance.ToolManager.BackFill then @@ -692,44 +752,50 @@ procedure TPaletteToolbar.PickColor(Shift: TShiftState; X, Y: Integer); result := LazPaintInstance.ToolManager.ForeFill; end; end; +begin + if (ssLeft in Shift) and not (ssRight in Shift) then + begin + if ssSnap in Shift then + ChangeStartColor(GetSelectedFill) + else + begin + if not FTransparentPalette then AColor.alpha := LazPaintInstance.ToolManager.ForeColor.alpha; + LazPaintInstance.ToolManager.ForeColor := AColor; + LazPaintInstance.ChooseColorTarget:= ctForeColorSolid; + end; + end else + if not (ssLeft in Shift) and (ssRight in Shift) then + begin + if ssSnap in Shift then + ChangeEndColor(GetSelectedFill) + else + begin + if LazPaintInstance.ToolManager.GetCurrentToolType = ptText then + begin + if not FTransparentPalette then AColor.alpha := LazPaintInstance.ToolManager.OutlineColor.alpha; + LazPaintInstance.ToolManager.OutlineColor := AColor; + LazPaintInstance.ChooseColorTarget:= ctOutlineColorSolid; + end else + begin + if not FTransparentPalette then AColor.alpha := LazPaintInstance.ToolManager.BackColor.alpha; + LazPaintInstance.ToolManager.BackColor := AColor; + LazPaintInstance.ChooseColorTarget:= ctBackColorSolid; + end; + end; + end else + exit; +end; +procedure TPaletteToolbar.PickColor(Shift: TShiftState; X, Y: Integer); +var idx: integer; + c : TBGRAPixel; begin if PtInRect(Point(X,Y),FPaletteColorRect) then begin idx := (Y-FPaletteColorRect.Top) div FPaletteColorItemHeight + FScrollPos; if (idx < 0) or (idx >= FColors.Count) then exit; c := FColors.Color[idx]; - if (ssLeft in Shift) and not (ssRight in Shift) then - begin - if ssSnap in Shift then - ChangeStartColor(GetSelectedFill) - else - begin - if not FTransparentPalette then c.alpha := LazPaintInstance.ToolManager.ForeColor.alpha; - LazPaintInstance.ToolManager.ForeColor := c; - LazPaintInstance.ChooseColorTarget:= ctForeColorSolid; - end; - end else - if not (ssLeft in Shift) and (ssRight in Shift) then - begin - if ssSnap in Shift then - ChangeEndColor(GetSelectedFill) - else - begin - if LazPaintInstance.ToolManager.GetCurrentToolType = ptText then - begin - if not FTransparentPalette then c.alpha := LazPaintInstance.ToolManager.OutlineColor.alpha; - LazPaintInstance.ToolManager.OutlineColor := c; - LazPaintInstance.ChooseColorTarget:= ctOutlineColorSolid; - end else - begin - if not FTransparentPalette then c.alpha := LazPaintInstance.ToolManager.BackColor.alpha; - LazPaintInstance.ToolManager.BackColor := c; - LazPaintInstance.ChooseColorTarget:= ctBackColorSolid; - end; - end; - end else - exit; + DoPickColor(Shift, c); end; end; @@ -744,6 +810,7 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); c: TBGRAPixel; nbVisible, maxScroll, availHeight, minItemHeight, maxItemHeight: integer; clInterm, cSign: TBGRAPixel; + digit: string; begin FCanvasScale := (Sender as TControl).GetCanvasScaleFactor; TVolatileScrollBar.InitDPI(FCanvasScale); @@ -785,6 +852,8 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); FPaletteColorRect := rect(x,y,x+w,y); h := FPaletteColorItemHeight+1; nbVisible := (availHeight+h-2) div (h-1); + Bitmap.FontHeight := DoScaleX(12, OriginalDPI); + Bitmap.FontAntialias := True; for i := FScrollPos to FScrollPos+nbVisible-1 do if (i >= 0) and (i < FColors.Count) then begin @@ -804,15 +873,25 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); begin Bitmap.Rectangle(x,y,x+w,y+h,clInterm,c,dmSet); end; + if GetLightness(c)/65535 > 0.5 then + cSign := BGRABlack else cSign := BGRAWhite; if FColors.Color[i] = FLastAddedColor then begin - if GetLightness(c)/65535 > 0.5 then - cSign := BGRABlack else cSign := BGRAWhite; Bitmap.DrawPolyLineAntialias( Bitmap.ComputeOpenedSpline([PointF(x+(w-aw)*1 div 5, y+h div 4), PointF(x+(w-aw)*2 div 5, y+h*5 div 6), PointF(x+(w-aw)*3 div 5, y+h div 4), PointF(x+(w-aw)*4 div 5, y+h div 5)], ssEasyBezier), cSign, DoScaleX(15, OriginalDPI)/10); end; + digit := GetDigitFromColorsBindToKey(FColors.Color[i]); + if digit <> '' then + begin + if FTransparentPalette then + Bitmap.TextOut(x+w-aw-Bitmap.TextSize(digit).cx-DoScaleX(2, OriginalDPI), + y+h-Bitmap.TextSize(digit).cy, digit, cSign, taLeftJustify) + else + Bitmap.TextOut(x+w-Bitmap.TextSize(digit).cx-DoScaleX(2, OriginalDPI), + y+h-Bitmap.TextSize(digit).cy, digit, cSign, taLeftJustify); + end; y += h-1; end; FPaletteColorRect.Bottom := y; From 138ba100c4a422cbad3fe575c0e4e6afb192894d Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sat, 30 Sep 2023 09:59:52 +0200 Subject: [PATCH 44/70] disable keyboard input for hidden updown --- lazpaint/maintoolbar.inc | 5 +++++ lazpaintcontrols/lcvectorialfillcontrol.pas | 13 +++++++++++ lazpaintcontrols/lcvectorialfillinterface.pas | 22 +++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/lazpaint/maintoolbar.inc b/lazpaint/maintoolbar.inc index 16095102..54410309 100644 --- a/lazpaint/maintoolbar.inc +++ b/lazpaint/maintoolbar.inc @@ -7,6 +7,7 @@ procedure TFMain.CreateToolbarElements; lbl: TLabel; pnl: TPanel; mouseMove: TMouseMoveEvent; mouseClick: TNotifyEvent; AIsTarget: boolean); begin vf.PopupMenu := nil; + vf.AllowKeyInput:= false; vf.VerticalPadding:= DoScaleY(6, OriginalDPI); vf.OnChooseColor := @VectorialFill_ChooseColor; vf.OnTextureClick := @VectorialFill_TextureClick; @@ -821,12 +822,15 @@ begin VectorialFill_Pen.Height := min(VectorialFill_Pen.ToolIconSize + VectorialFill_Pen.VerticalPadding, Panel_SwapColor.ClientHeight - VectorialFill_Pen.Top - 1); VectorialFill_Pen.Tag := 0; + VectorialFill_Pen.AllowKeyInput:= false; VectorialFill_Back.Height := min(VectorialFill_Back.ToolIconSize + VectorialFill_Back.VerticalPadding, Panel_SwapColor.ClientHeight - VectorialFill_Back.Top - 1); VectorialFill_Back.Tag := 0; + VectorialFill_Back.AllowKeyInput:= false; VectorialFill_Outline.Height := min(VectorialFill_Outline.ToolIconSize + VectorialFill_Outline.VerticalPadding, Panel_SwapColor.ClientHeight - VectorialFill_Outline.Top - 1); VectorialFill_Outline.Tag := 0; + VectorialFill_Outline.AllowKeyInput:= false; Panel_PenFill.Height := Panel_SwapColor.Height; Panel_BackFill.Height := Panel_SwapColor.Height; Panel_OutlineFill.Height := Panel_SwapColor.Height; @@ -1612,6 +1616,7 @@ begin AFillControl.Height := AFillControl.PreferredSize.cy; APanel.Height := AFillControl.Top + AFillControl.Height + DoScaleY(3, OriginalDPI); AFillControl.Tag := 1; + AFillControl.AllowKeyInput:= true; HideFill(3000, true); end; diff --git a/lazpaintcontrols/lcvectorialfillcontrol.pas b/lazpaintcontrols/lcvectorialfillcontrol.pas index d4d62cb4..ec4cfa09 100644 --- a/lazpaintcontrols/lcvectorialfillcontrol.pas +++ b/lazpaintcontrols/lcvectorialfillcontrol.pas @@ -24,6 +24,7 @@ interface TLCVectorialFillControl = class(TWinControl) private function GetAllowedFillTypes: TVectorialFillTypes; + function GetAllowKeyInput: boolean; function GetAverageColor: TBGRAPixel; function GetCanAdjustToShape: boolean; function GetCanEditGradTexPoints: boolean; @@ -51,6 +52,7 @@ TLCVectorialFillControl = class(TWinControl) procedure InterfaceMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SetAllowedFillTypes(AValue: TVectorialFillTypes); + procedure SetAllowKeyInput(AValue: boolean); procedure SetCanAdjustToShape(AValue: boolean); procedure SetCanEditGradTexPoints(AValue: boolean); procedure SetEditingGradTexPoints(AValue: boolean); @@ -112,6 +114,7 @@ TLCVectorialFillControl = class(TWinControl) property TextureOpacity: byte read GetTexOpacity write SetTextureOpacity; property CanAdjustToShape: boolean read GetCanAdjustToShape write SetCanAdjustToShape; property PreferredSize: TSize read GetPreferredSizeAsSize; + property AllowKeyInput: boolean read GetAllowKeyInput write SetAllowKeyInput; published property AutoSize; property Align; @@ -167,6 +170,11 @@ function TLCVectorialFillControl.GetAllowedFillTypes: TVectorialFillTypes; result := FInterface.AllowedFillTypes; end; +function TLCVectorialFillControl.GetAllowKeyInput: boolean; +begin + result := FInterface.AllowKeyInput; +end; + function TLCVectorialFillControl.GetAverageColor: TBGRAPixel; begin result := FInterface.AverageColor; @@ -293,6 +301,11 @@ procedure TLCVectorialFillControl.SetAllowedFillTypes( FInterface.AllowedFillTypes:= AValue; end; +procedure TLCVectorialFillControl.SetAllowKeyInput(AValue: boolean); +begin + FInterface.AllowKeyInput := AValue; +end; + procedure TLCVectorialFillControl.SetCanAdjustToShape(AValue: boolean); begin FInterface.CanAdjustToShape := AValue; diff --git a/lazpaintcontrols/lcvectorialfillinterface.pas b/lazpaintcontrols/lcvectorialfillinterface.pas index ab47a209..0237f5b2 100644 --- a/lazpaintcontrols/lcvectorialfillinterface.pas +++ b/lazpaintcontrols/lcvectorialfillinterface.pas @@ -25,6 +25,7 @@ function TextureRepetitionToStr(AValue: TTextureRepetition): string; TVectorialFillInterface = class(TComponent) private + FAllowKeyInput: boolean; FCanEditGradTexPoints: boolean; FIsTarget: boolean; FOnMouseDown: TMouseEvent; @@ -36,6 +37,7 @@ TVectorialFillInterface = class(TComponent) function GetEditingGradTexPoints: boolean; procedure Preview_MouseUp(Sender: TObject; Button: TMouseButton; {%H-}Shift: TShiftState; X, {%H-}Y: Integer); + procedure SetAllowKeyInput(AValue: boolean); procedure SetCanEditGradTexPoints(AValue: boolean); procedure SetEditingGradTexPoints(AValue: boolean); procedure SetIsTarget(AValue: boolean); @@ -216,6 +218,7 @@ TVectorialFillInterface = class(TComponent) property VerticalPadding: integer read FVerticalPadding write SetVerticalPadding; property PreferredSize: TSize read GetPreferredSize; property AllowedFillTypes: TVectorialFillTypes read FAllowedFillTypes write SetAllowedFillTypes; + property AllowKeyInput: boolean read FAllowKeyInput write SetAllowKeyInput; end; implementation @@ -675,6 +678,7 @@ procedure TVectorialFillInterface.CreateSolidColorInterface; FUpDownSolidAlpha.Increment:= 15; FUpDownSolidAlpha.OnChange:=@UpDownSolidAlphaChange; FUpDownSolidAlpha.Hint := rsOpacity; + FUpDownSolidAlpha.Enabled:= FAllowKeyInput; AddToolbarControl(FToolbar, FUpDownSolidAlpha); AttachMouseEvent(FUpDownSolidAlpha); end; @@ -707,6 +711,7 @@ procedure TVectorialFillInterface.CreateGradientInterface; FUpDownStartAlpha.Increment:= 15; FUpDownStartAlpha.OnChange:=@UpDownStartAlphaChange; FUpDownStartAlpha.Hint := rsStartOpacity; + FUpDownStartAlpha.Enabled:= FAllowKeyInput; AddToolbarControl(FToolbar, FUpDownStartAlpha); AttachMouseEvent(FUpDownStartAlpha); FButtonSwapColor := AddToolbarButton(FToolbar, rsSwapColors, 23, @ButtonSwapColorClick); @@ -725,6 +730,7 @@ procedure TVectorialFillInterface.CreateGradientInterface; FUpDownEndAlpha.Increment:= 15; FUpDownEndAlpha.OnChange:=@UpDownEndAlphaChange; FUpDownEndAlpha.Hint := rsEndOpacity; + FUpDownEndAlpha.Enabled:= FAllowKeyInput; AddToolbarControl(FToolbar, FUpDownEndAlpha); AttachMouseEvent(FUpDownEndAlpha); @@ -767,6 +773,7 @@ procedure TVectorialFillInterface.CreateTextureInterface; FUpDownTexAlpha.Increment:= 15; FUpDownTexAlpha.OnChange:=@UpDownTexAlphaChange; FUpDownTexAlpha.Hint := rsOpacity; + FUpDownTexAlpha.Enabled:= FAllowKeyInput; AddToolbarControl(FToolbar, FUpDownTexAlpha); AttachMouseEvent(FUpDownTexAlpha); FButtonLoadTexture := AddToolbarButton(FToolbar, rsLoadTexture+'...', 22, @ButtonLoadTextureClick); @@ -819,6 +826,7 @@ procedure TVectorialFillInterface.Init(AImageListWidth, begin FContainer := nil; + FAllowKeyInput:= true; FAllowedFillTypes := [vftNone, vftSolid, vftGradient, vftTexture]; FFillType:= vftSolid; FSolidColor:= BGRAWhite; @@ -1146,6 +1154,20 @@ procedure TVectorialFillInterface.Preview_MouseUp(Sender: TObject; end; end; +procedure TVectorialFillInterface.SetAllowKeyInput(AValue: boolean); +begin + if FAllowKeyInput=AValue then Exit; + FAllowKeyInput:=AValue; + if Assigned(FUpDownStartAlpha) then + FUpDownStartAlpha.Enabled:= AValue; + if Assigned(FUpDownEndAlpha) then + FUpDownEndAlpha.Enabled:= AValue; + if Assigned(FUpDownSolidAlpha) then + FUpDownSolidAlpha.Enabled:= AValue; + if Assigned(FUpDownTexAlpha) then + FUpDownTexAlpha.Enabled:= AValue; +end; + procedure TVectorialFillInterface.EditGradTextPointsClick(Sender: TObject); begin if Assigned(FOnEditGradTexPoints) then FOnEditGradTexPoints(self); From 898666767959c851b72cbb9a026096052f4d8650 Mon Sep 17 00:00:00 2001 From: Lulu Date: Sat, 30 Sep 2023 16:41:38 +0200 Subject: [PATCH 45/70] rename methods to better express what they do --- lazpaint/dialog/uchoosecolorinterface.pas | 2 +- lazpaint/lazpaintinstance.pas | 20 +++++++++++++------- lazpaint/lazpainttype.pas | 9 +++++---- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/lazpaint/dialog/uchoosecolorinterface.pas b/lazpaint/dialog/uchoosecolorinterface.pas index 4aea96bc..23fb6798 100644 --- a/lazpaint/dialog/uchoosecolorinterface.pas +++ b/lazpaint/dialog/uchoosecolorinterface.pas @@ -302,7 +302,7 @@ procedure TChooseColorInterface.vsColorViewRedraw(Sender: TObject; Bitmap.RoundRectAntialias(Left, Top, Right - 1, Bottom - 1, previewSize/6, previewSize/6, BGRA(0,0,0,192), bmpCursorWidth, c, []); c := GetCurrentColor; - s := FLazPaintInstance.GetDigitFromColorsBindToKey(c); + s := FLazPaintInstance.GetKeyAssociatedToColor(c); if Length(s) > 0 then begin if GetLightness(c)/65535 > 0.5 then diff --git a/lazpaint/lazpaintinstance.pas b/lazpaint/lazpaintinstance.pas index 35690a9b..0323c50c 100644 --- a/lazpaint/lazpaintinstance.pas +++ b/lazpaint/lazpaintinstance.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, LazPaintType, BGRABitmap, BGRABitmapTypes, BGRALayers, LCVectorialFill, - Menus, Forms, Controls, fgl, + Menus, Forms, Controls, fgl, LCLType, LazPaintMainForm, UMainFormLayout, @@ -240,7 +240,7 @@ TLazPaintInstance = class(TLazPaintCustomInstance) procedure ColorToFChooseColor; override; procedure ExitColorEditor; override; function ColorEditorActive: boolean; override; - procedure FChooseColorSimpleRedraw; override; + procedure NotifyColorBinding; override; function ShowSaveOptionDlg({%H-}AParameters: TVariableSet; AOutputFilenameUTF8: string; ASkipOptions: boolean; AExport: boolean): boolean; override; function ShowColorIntensityDlg(AParameters: TVariableSet): TScriptResult; override; @@ -290,15 +290,16 @@ TLazPaintInstance = class(TLazPaintCustomInstance) procedure UpdateEditPicture(ADelayed: boolean); override; procedure AddColorToPalette(AColor: TBGRAPixel); override; procedure RemoveColorFromPalette(AColor: TBGRAPixel); override; - function GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; override; + function GetKeyAssociatedToColor(const AColor: TBGRAPixel): string; override; property Initialized: boolean read GetInitialized; procedure SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState); override; procedure SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState); override; + procedure SendUTF8KeyPressEventToMainForm(var UTF8Key: TUTF8Char); override; end; implementation -uses LCLType, Types, Dialogs, FileUtil, StdCtrls, LCLIntf, BGRAUTF8, UTranslation, +uses Types, Dialogs, FileUtil, StdCtrls, LCLIntf, BGRAUTF8, UTranslation, URadialBlur, UMotionBlur, UEmboss, UTwirl, UWaveDisplacement, unewimage, uresample, UPixelate, unoisefilter, ufilters, @@ -1985,7 +1986,7 @@ function TLazPaintInstance.ColorEditorActive: boolean; else result := false; end; -procedure TLazPaintInstance.FChooseColorSimpleRedraw; +procedure TLazPaintInstance.NotifyColorBinding; begin if Assigned(FChooseColor) then FChooseColor.SimpleRedraw; end; @@ -2204,11 +2205,11 @@ procedure TLazPaintInstance.RemoveColorFromPalette(AColor: TBGRAPixel); if Assigned(FMain) then FMain.Layout.RemoveColorFromPalette(AColor); end; -function TLazPaintInstance.GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; +function TLazPaintInstance.GetKeyAssociatedToColor(const AColor: TBGRAPixel): string; begin if Assigned(FMain) and Assigned(FMain.Layout) and - Assigned(FMain.Layout.PaletteToolbar) then Result := FMain.Layout.PaletteToolbar.GetDigitFromColorsBindToKey(AColor) + Assigned(FMain.Layout.PaletteToolbar) then Result := FMain.Layout.PaletteToolbar.GetKeyAssociatedToColor(AColor) else Result := ''; end; @@ -2222,5 +2223,10 @@ procedure TLazPaintInstance.SendKeyUpEventToMainForm(var Key: Word; Shift: TShif if Assigned(FMain) then FMain.FormKeyUp(FMain, key, Shift); end; +procedure TLazPaintInstance.SendUTF8KeyPressEventToMainForm(var UTF8Key: TUTF8Char); +begin + if Assigned(FMain) then FMain.FormUTF8KeyPress(FMain, UTF8Key); +end; + end. diff --git a/lazpaint/lazpainttype.pas b/lazpaint/lazpainttype.pas index aa5be346..8530a650 100644 --- a/lazpaint/lazpainttype.pas +++ b/lazpaint/lazpainttype.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, Inifiles, BGRABitmap, BGRABitmapTypes, UConfig, UImage, UTool, Forms, BGRALayers, Graphics, Menus, - UScripting, Dialogs, Controls + UScripting, Dialogs, Controls, LCLType {$IFDEF LINUX}, InterfaceBase{$ENDIF}; const @@ -271,7 +271,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider) procedure ColorToFChooseColor; virtual; abstract; procedure ExitColorEditor; virtual; abstract; function ColorEditorActive: boolean; virtual; abstract; - procedure FChooseColorSimpleRedraw; virtual; abstract; + procedure NotifyColorBinding; virtual; abstract; function GetColor(ATarget: TColorTarget): TBGRAPixel; procedure SetColor(ATarget: TColorTarget; AColor: TBGRAPixel); function ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string; @@ -314,7 +314,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider) procedure Wait(ACheckActive: TCheckFunction; ADelayMs: integer); virtual; abstract; procedure AddColorToPalette(AColor: TBGRAPixel); virtual; abstract; procedure RemoveColorFromPalette(AColor: TBGRAPixel); virtual; abstract; - function GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; virtual; abstract; + function GetKeyAssociatedToColor(const AColor: TBGRAPixel): string; virtual; abstract; property BlackAndWhite: boolean read FBlackAndWhite write SetBlackAndWhite; @@ -347,6 +347,7 @@ TLazPaintCustomInstance = class(TInterfacedObject,IConfigProvider) procedure MoveImageListWindowTo(X,Y: integer); virtual; abstract; procedure SendKeyDownEventToMainForm(var Key: Word; Shift: TShiftState); virtual; abstract; procedure SendKeyUpEventToMainForm(var Key: Word; Shift: TShiftState); virtual; abstract; + procedure SendUTF8KeyPressEventToMainForm(var UTF8Key: TUTF8Char); virtual; abstract; property ImageListWindowWidth: integer read GetImageListWindowWidth write SetImageListWindowWidth; property ImageListWindowHeight: integer read GetImageListWindowHeight write SetImageListWindowHeight; property ImageListWindowVisible: boolean read GetImageListWindowVisible write SetImageListWindowVisible; @@ -393,7 +394,7 @@ function CSSToPascalCase(AIdentifier: string): string; implementation -uses LCLType, BGRAUTF8, LCLIntf, FileUtil, UResourceStrings, LCVectorialFill; +uses BGRAUTF8, LCLIntf, FileUtil, UResourceStrings, LCVectorialFill; function LazPaintVersionStr: string; var numbers: TStringList; From de7511cf93f0231a8f6787b7e3018726c1dfa238 Mon Sep 17 00:00:00 2001 From: Lulu Date: Sat, 30 Sep 2023 16:43:54 +0200 Subject: [PATCH 46/70] relay choose color window key press event to main form --- lazpaint/uchoosecolor.lfm | 1 + lazpaint/uchoosecolor.pas | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lazpaint/uchoosecolor.lfm b/lazpaint/uchoosecolor.lfm index aab7e14b..32cd1790 100644 --- a/lazpaint/uchoosecolor.lfm +++ b/lazpaint/uchoosecolor.lfm @@ -16,6 +16,7 @@ object FChooseColor: TFChooseColor OnKeyDown = FormKeyDown OnKeyUp = FormKeyUp OnShow = FormShow + OnUTF8KeyPress = FormUTF8KeyPress ShowInTaskBar = stNever LCLVersion = '2.2.6.0' object ChooseColorControl: TPanel diff --git a/lazpaint/uchoosecolor.pas b/lazpaint/uchoosecolor.pas index 8490d97e..5f570ff8 100644 --- a/lazpaint/uchoosecolor.pas +++ b/lazpaint/uchoosecolor.pas @@ -8,7 +8,7 @@ interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, ExtCtrls, BGRABitmap, BGRABitmapTypes, - LazPaintType, UChooseColorInterface; + LazPaintType, UChooseColorInterface, LCLType; type @@ -22,6 +22,7 @@ TFChooseColor = class(TForm) procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); + procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); private function GetColorTarget: TColorTarget; function GetDarkTheme: boolean; @@ -89,6 +90,12 @@ procedure TFChooseColor.FormShow(Sender: TObject); self.EnsureVisible(False); end; +procedure TFChooseColor.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); +begin + if not EditorVisible and Assigned(LazPaintInstance) then + LazPaintInstance.SendUTF8KeyPressEventToMainForm(UTF8Key); +end; + procedure TFChooseColor.SetCurrentColor(value: TBGRAPixel); begin if Assigned(FInterface) then From 28ce4cb5d68c9cb40c2323c9eb6ac7791cd357a5 Mon Sep 17 00:00:00 2001 From: Lulu Date: Sat, 30 Sep 2023 16:45:25 +0200 Subject: [PATCH 47/70] refactor code to apply requested changes --- lazpaint/upalettetoolbar.pas | 54 ++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas index 96578e60..102224c0 100644 --- a/lazpaint/upalettetoolbar.pas +++ b/lazpaint/upalettetoolbar.pas @@ -86,9 +86,11 @@ TPaletteToolbar = class procedure ApplyTheme; procedure ComputeMenuButtonGlyph; property PanelPalette: TBGRAVirtualScreen read GetPanelPalette; - protected + private FColorsBindToKey: array[0..9] of TBGRAPixel; FSnapPressed, FAltPressed: boolean; + procedure SetColorBindToKey(aIndex: integer; aColor: TBGRAPixel); + function ColorMatch(c1, c2: TBGRAPixel): boolean; public constructor Create; destructor Destroy; override; @@ -98,7 +100,7 @@ TPaletteToolbar = class procedure SetBounds(ALeft,ATop,AWidth,AHeight: integer); function CatchToolKeyDown(var AKey: Word): boolean; function CatchToolKeyUp(var AKey: Word): boolean; - function GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; + function GetKeyAssociatedToColor(const AColor: TBGRAPixel; aForceCheckAlpha: boolean=False): string; property Container: TWinControl read FContainer write SetContainer; property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance; property Visible: boolean read FVisible write SetVisible; @@ -319,6 +321,25 @@ procedure TPaletteToolbar.ComputeMenuButtonGlyph; glyphBmp.Free; end; +procedure TPaletteToolbar.SetColorBindToKey(aIndex: integer; aColor: TBGRAPixel); +var i: integer; +begin + for i := 0 to High(FColorsBindToKey) do + if ColorMatch(FColorsBindToKey[i], aColor) then FColorsBindToKey[i] := BGRAPixelTransparent; + if not FTransparentPalette then aColor.alpha := 255; + FColorsBindToKey[aIndex] := aColor; +end; + +function TPaletteToolbar.ColorMatch(c1, c2: TBGRAPixel): boolean; +begin + if not FTransparentPalette then + begin + c1.alpha := 255; + c2.alpha := 255; + end; + Result := c1 = c2; +end; + function TPaletteToolbar.CatchToolKeyDown(var AKey: Word): boolean; var colorIndex: integer; c: TBGRAPixel; @@ -328,16 +349,16 @@ function TPaletteToolbar.CatchToolKeyDown(var AKey: Word): boolean; colorIndex := -1; if AKey in [VK_0..VK_9] then colorIndex := AKey - VK_0 - {else if AKey in [VK_NUMPAD0..VK_NUMPAD9] then colorIndex := AKey - VK_NUMPAD0}; + else if AKey in [VK_NUMPAD0..VK_NUMPAD9] then colorIndex := AKey - VK_NUMPAD0; if colorIndex <> -1 then begin if FSnapPressed then begin c := FLazPaintInstance.GetColor(FLazPaintInstance.ChooseColorTarget); - FColorsBindToKey[colorIndex] := c; + SetColorBindToKey(colorIndex, c); PaletteChanged; - FLazPaintInstance.FChooseColorSimpleRedraw; + FLazPaintInstance.NotifyColorBinding; end else begin c := FColorsBindToKey[colorIndex]; @@ -358,15 +379,20 @@ function TPaletteToolbar.CatchToolKeyUp(var AKey: Word): boolean; Result := False; end; -function TPaletteToolbar.GetDigitFromColorsBindToKey(const AColor: TBGRAPixel): string; +function TPaletteToolbar.GetKeyAssociatedToColor(const AColor: TBGRAPixel; aForceCheckAlpha: boolean): string; var i: Integer; + flag: boolean; begin for i := 0 to High(FColorsBindToKey) do - if FColorsBindToKey[i] = AColor then + begin + if aForceCheckAlpha then flag := FColorsBindToKey[i] = AColor + else flag := ColorMatch(FColorsBindToKey[i], AColor); + if flag then begin Result := i.ToString; exit; end; + end; Result := ''; end; @@ -810,7 +836,7 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); c: TBGRAPixel; nbVisible, maxScroll, availHeight, minItemHeight, maxItemHeight: integer; clInterm, cSign: TBGRAPixel; - digit: string; + strKey: string; begin FCanvasScale := (Sender as TControl).GetCanvasScaleFactor; TVolatileScrollBar.InitDPI(FCanvasScale); @@ -882,15 +908,15 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); PointF(x+(w-aw)*3 div 5, y+h div 4), PointF(x+(w-aw)*4 div 5, y+h div 5)], ssEasyBezier), cSign, DoScaleX(15, OriginalDPI)/10); end; - digit := GetDigitFromColorsBindToKey(FColors.Color[i]); - if digit <> '' then + strKey := GetKeyAssociatedToColor(FColors.Color[i], True); + if strKey <> '' then begin if FTransparentPalette then - Bitmap.TextOut(x+w-aw-Bitmap.TextSize(digit).cx-DoScaleX(2, OriginalDPI), - y+h-Bitmap.TextSize(digit).cy, digit, cSign, taLeftJustify) + Bitmap.TextOut(x+w-aw-Bitmap.TextSize(strKey).cx-DoScaleX(2, OriginalDPI), + y+h-Bitmap.TextSize(strKey).cy, strKey, cSign, taLeftJustify) else - Bitmap.TextOut(x+w-Bitmap.TextSize(digit).cx-DoScaleX(2, OriginalDPI), - y+h-Bitmap.TextSize(digit).cy, digit, cSign, taLeftJustify); + Bitmap.TextOut(x+w-Bitmap.TextSize(strKey).cx-DoScaleX(2, OriginalDPI), + y+h-Bitmap.TextSize(strKey).cy, strKey, cSign, taLeftJustify); end; y += h-1; end; From c05ab64bf339785cfb771822f3d72fc12dae9194 Mon Sep 17 00:00:00 2001 From: Lulu Date: Thu, 5 Oct 2023 20:55:33 +0200 Subject: [PATCH 48/70] increase the digit font height --- lazpaint/dialog/uchoosecolorinterface.pas | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lazpaint/dialog/uchoosecolorinterface.pas b/lazpaint/dialog/uchoosecolorinterface.pas index 23fb6798..8f6a20e8 100644 --- a/lazpaint/dialog/uchoosecolorinterface.pas +++ b/lazpaint/dialog/uchoosecolorinterface.pas @@ -307,10 +307,8 @@ procedure TChooseColorInterface.vsColorViewRedraw(Sender: TObject; begin if GetLightness(c)/65535 > 0.5 then cDigit := BGRABlack else cDigit := BGRAWhite; - Bitmap.FontHeight := Round(Height*2/3); - Bitmap.TextOut(CenterPoint.x, - CenterPoint.y-Bitmap.TextSize(s).cy div 2, - s, cDigit, taCenter); + Bitmap.FontFullHeight := Height; + Bitmap.TextOut(CenterPoint.x, CenterPoint.y-Height div 2, s, cDigit, taCenter); end; end; end; From 92a80c98ce3c35c4fc819eba71475f764e1ca9f5 Mon Sep 17 00:00:00 2001 From: Lulu Date: Thu, 5 Oct 2023 20:58:26 +0200 Subject: [PATCH 49/70] remove focus on SpinEdit on mouse activity --- lazpaint/lazpaintmainform.lfm | 1 + lazpaint/lazpaintmainform.pas | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lazpaint/lazpaintmainform.lfm b/lazpaint/lazpaintmainform.lfm index 433b33b4..46da77b6 100644 --- a/lazpaint/lazpaintmainform.lfm +++ b/lazpaint/lazpaintmainform.lfm @@ -35,6 +35,7 @@ object FMain: TFMain ParentColor = False ParentFont = False TabOrder = 8 + OnClick = Panel_ToolbarBackgroundClick end object Panel_File: TPanel Left = 48 diff --git a/lazpaint/lazpaintmainform.pas b/lazpaint/lazpaintmainform.pas index 67ca2c7b..2aa8421d 100644 --- a/lazpaint/lazpaintmainform.pas +++ b/lazpaint/lazpaintmainform.pas @@ -522,6 +522,7 @@ TFMain = class(TForm) {%H-}Y: Integer); procedure Panel_TextMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer); + procedure Panel_ToolbarBackgroundClick(Sender: TObject); procedure PopupToolbarPopup(Sender: TObject); procedure PopupToolboxPopup(Sender: TObject); procedure SelectionHorizontalFlipUpdate(Sender: TObject); @@ -783,7 +784,7 @@ TFMain = class(TForm) procedure UpdateFloodfillToolbar; procedure UpdatePerspectiveToolbar; function ShowOpenBrushDialog: boolean; - function TextSpinEditFocused: boolean; + function SpinEditFocused: boolean; procedure UpdateBrush; procedure UpdateBrushList; function CatchToolKeyDown(var AKey: Word): boolean; @@ -1870,7 +1871,7 @@ procedure TFMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) else if (Key = VK_SNAP) or (Key = VK_SNAP2) then snapPressed:= true else if Key = VK_SHIFT then shiftPressed:= true; if Zoom.EditingZoom or EditingColors then exit; - if not ((CurrentTool = ptText) and TextSpinEditFocused and (Key = VK_BACK)) and CatchToolKeyDown(Key) then + if not ((CurrentTool = ptText) and SpinEditFocused and (Key = VK_BACK)) and CatchToolKeyDown(Key) then begin PaintPictureLater; end else @@ -2323,7 +2324,7 @@ procedure TFMain.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); toolProcessKey:= true; if (CurrentTool in[ptText,ptEditShape]) and ((UTF8Key = #8) or ((length(UTF8Key)=1) and (UTF8Key[1] in['-','0'..'9']))) then begin - if TextSpinEditFocused then + if SpinEditFocused then toolProcessKey:= false; end; if toolProcessKey and CatchToolKeyPress(UTF8Key) then @@ -4378,7 +4379,7 @@ procedure TFMain.PictureMouseMove(Sender: TObject; APosition: TPointF); else exit; end; - if (CurrentTool in[ptText,ptEditShape]) and TextSpinEditFocused then Layout.FocusImage; + if SpinEditFocused then Layout.FocusImage; end; procedure TFMain.PictureOnPaint(Sender: TObject); From 44e09e7639f001119efabb2cd492cb6994255728 Mon Sep 17 00:00:00 2001 From: Lulu Date: Thu, 5 Oct 2023 20:59:11 +0200 Subject: [PATCH 50/70] refactor to avoid keyboard conflicts --- lazpaint/maintoolbar.inc | 19 ++++--- lazpaint/upalettetoolbar.pas | 97 +++++++++++++++++++----------------- 2 files changed, 64 insertions(+), 52 deletions(-) diff --git a/lazpaint/maintoolbar.inc b/lazpaint/maintoolbar.inc index 54410309..eb40743b 100644 --- a/lazpaint/maintoolbar.inc +++ b/lazpaint/maintoolbar.inc @@ -658,11 +658,13 @@ begin end; end; -function TFMain.TextSpinEditFocused: boolean; +function TFMain.SpinEditFocused: boolean; +var ctrl: TWinControl; begin - result := SpinEdit_TextSize.Focused or SpinEdit_TextBlur.Focused or SpinEdit_TextShadowX.Focused or - SpinEdit_TextShadowY.Focused or SpinEdit_ShapeAltitude.Focused or - SpinEdit_TextOutlineWidth.Focused; + ctrl := Screen.ActiveControl; + if Assigned(ctrl) and (ctrl is TBCTrackBarUpDown) then + Result := (ctrl as TBCTrackBarUpDown).Focused + else Result := False; end; procedure TFMain.UpdateBrush; @@ -696,14 +698,14 @@ end; function TFMain.CatchToolKeyDown(var AKey: Word): boolean; begin - if Assigned(FLayout) then + if Assigned(FLayout) and not SpinEditFocused and (CurrentTool <> ptText) then result := FLayout.CatchToolKeyDown(AKey) else result := false; end; function TFMain.CatchToolKeyUp(var AKey: Word): boolean; begin - if Assigned(FLayout) then + if Assigned(FLayout) and not SpinEditFocused and (CurrentTool <> ptText) then result := FLayout.CatchToolKeyUp(AKey) else result := false; end; @@ -1696,6 +1698,11 @@ begin ShowTextMore; end; +procedure TFMain.Panel_ToolbarBackgroundClick(Sender: TObject); +begin + Layout.FocusImage; +end; + procedure TFMain.PopupToolbarPopup(Sender: TObject); begin MenuFileToolbar.Checked := Config.DefaultFileToolbarVisible; diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas index 102224c0..1755eb44 100644 --- a/lazpaint/upalettetoolbar.pas +++ b/lazpaint/upalettetoolbar.pas @@ -10,10 +10,11 @@ interface BGRAVirtualScreen, BGRABitmap, LazPaintType, UVolatileScrollBar, BGRAPalette, BCButton, Menus, - Dialogs, BGRABitmapTypes; + Dialogs, BGRABitmapTypes, fgl; type TPaletteVisibilityChangedByUserHandler = procedure(Sender:TObject) of object; + TBGRAPixelBinding = specialize TFPGMap; { TPaletteToolbar } @@ -87,10 +88,10 @@ TPaletteToolbar = class procedure ComputeMenuButtonGlyph; property PanelPalette: TBGRAVirtualScreen read GetPanelPalette; private - FColorsBindToKey: array[0..9] of TBGRAPixel; + FColorsBindToKey: TBGRAPixelBinding; FSnapPressed, FAltPressed: boolean; - procedure SetColorBindToKey(aIndex: integer; aColor: TBGRAPixel); - function ColorMatch(c1, c2: TBGRAPixel): boolean; + procedure ToggleBindColorToKey(aColor: TBGRAPixel; aDigit: integer); + function TryToGetColorBindedToKey(aDigit: integer; out aColor: TBGRAPixel): boolean; public constructor Create; destructor Destroy; override; @@ -100,7 +101,7 @@ TPaletteToolbar = class procedure SetBounds(ALeft,ATop,AWidth,AHeight: integer); function CatchToolKeyDown(var AKey: Word): boolean; function CatchToolKeyUp(var AKey: Word): boolean; - function GetKeyAssociatedToColor(const AColor: TBGRAPixel; aForceCheckAlpha: boolean=False): string; + function GetKeyAssociatedToColor(const AColor: TBGRAPixel): string; property Container: TWinControl read FContainer write SetContainer; property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance; property Visible: boolean read FVisible write SetVisible; @@ -321,48 +322,57 @@ procedure TPaletteToolbar.ComputeMenuButtonGlyph; glyphBmp.Free; end; -procedure TPaletteToolbar.SetColorBindToKey(aIndex: integer; aColor: TBGRAPixel); -var i: integer; +procedure TPaletteToolbar.ToggleBindColorToKey(aColor: TBGRAPixel; aDigit: integer); +var c: TBGRAPixel; + procedure RemoveBinding; + var idx: integer; + begin + idx := FColorsBindToKey.IndexOf(aDigit); + if idx <> -1 then FColorsBindToKey.Delete(idx); + idx := FColorsBindToKey.IndexOfData(aColor); + if idx <> -1 then FColorsBindToKey.Delete(idx); + end; begin - for i := 0 to High(FColorsBindToKey) do - if ColorMatch(FColorsBindToKey[i], aColor) then FColorsBindToKey[i] := BGRAPixelTransparent; if not FTransparentPalette then aColor.alpha := 255; - FColorsBindToKey[aIndex] := aColor; -end; -function TPaletteToolbar.ColorMatch(c1, c2: TBGRAPixel): boolean; -begin - if not FTransparentPalette then + if FColorsBindToKey.TryGetData(aDigit, c) then begin - c1.alpha := 255; - c2.alpha := 255; + RemoveBinding; + if aColor <> c then FColorsBindToKey.Add(aDigit, aColor); + end else + begin + RemoveBinding; + FColorsBindToKey.Add(aDigit, aColor); end; - Result := c1 = c2; +end; + +function TPaletteToolbar.TryToGetColorBindedToKey(aDigit: integer; out aColor: TBGRAPixel): boolean; +begin + Result := FColorsBindToKey.TryGetData(aDigit, aColor); end; function TPaletteToolbar.CatchToolKeyDown(var AKey: Word): boolean; -var colorIndex: integer; +var digit: integer; c: TBGRAPixel; begin if AKey = VK_MENU then FAltPressed := True else if (AKey = VK_SNAP) or (AKey = VK_SNAP2) then FSnapPressed := True; - colorIndex := -1; - if AKey in [VK_0..VK_9] then colorIndex := AKey - VK_0 - else if AKey in [VK_NUMPAD0..VK_NUMPAD9] then colorIndex := AKey - VK_NUMPAD0; + digit := -1; + if AKey in [VK_0..VK_9] then digit := AKey - VK_0 + else if AKey in [VK_NUMPAD0..VK_NUMPAD9] then digit := AKey - VK_NUMPAD0; - if colorIndex <> -1 then + if digit <> -1 then begin if FSnapPressed then begin c := FLazPaintInstance.GetColor(FLazPaintInstance.ChooseColorTarget); - SetColorBindToKey(colorIndex, c); + ToggleBindColorToKey(c, digit); PaletteChanged; FLazPaintInstance.NotifyColorBinding; end else begin - c := FColorsBindToKey[colorIndex]; - if c <> BGRAPixelTransparent then + if TryToGetColorBindedToKey(digit, c) then begin if FAltPressed then DoPickColor([ssRight], c) else DoPickColor([ssLeft], c); @@ -379,21 +389,17 @@ function TPaletteToolbar.CatchToolKeyUp(var AKey: Word): boolean; Result := False; end; -function TPaletteToolbar.GetKeyAssociatedToColor(const AColor: TBGRAPixel; aForceCheckAlpha: boolean): string; -var i: Integer; - flag: boolean; +function TPaletteToolbar.GetKeyAssociatedToColor(const AColor: TBGRAPixel): string; +var idx: Integer; + c: TBGRAPixel; begin - for i := 0 to High(FColorsBindToKey) do - begin - if aForceCheckAlpha then flag := FColorsBindToKey[i] = AColor - else flag := ColorMatch(FColorsBindToKey[i], AColor); - if flag then - begin - Result := i.ToString; - exit; - end; - end; - Result := ''; + c := AColor; + if not FTransparentPalette and (c.alpha <> 0) then c.alpha := 255; + idx := FColorsBindToKey.IndexOfData(c); + if idx <> -1 then + Result := FColorsBindToKey.Keys[idx].ToString + else + Result := ''; end; procedure TPaletteToolbar.DoClearPalette(Sender: TObject); @@ -578,7 +584,6 @@ procedure TPaletteToolbar.MakePalette(ACount: integer); end; function TPaletteToolbar.GetPanelPalette: TBGRAVirtualScreen; -var i: integer; begin if not Assigned(FPanelPalette) then begin @@ -604,9 +609,6 @@ function TPaletteToolbar.GetPanelPalette: TBGRAVirtualScreen; FTransparentPalette:= false; FMergePalette:= false; - for i := 0 to 9 do - FColorsBindToKey[i] := BGRAPixelTransparent; - FMenuButton := TBCButton.Create(FPanelPalette); FMenuButton.Cursor := crArrow; DarkThemeInstance.Apply(FMenuButton, DarkTheme); @@ -878,7 +880,7 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); FPaletteColorRect := rect(x,y,x+w,y); h := FPaletteColorItemHeight+1; nbVisible := (availHeight+h-2) div (h-1); - Bitmap.FontHeight := DoScaleX(12, OriginalDPI); + Bitmap.FontFullHeight := Round(h*2/3); Bitmap.FontAntialias := True; for i := FScrollPos to FScrollPos+nbVisible-1 do if (i >= 0) and (i < FColors.Count) then @@ -899,7 +901,7 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); begin Bitmap.Rectangle(x,y,x+w,y+h,clInterm,c,dmSet); end; - if GetLightness(c)/65535 > 0.5 then + if (GetLightness(c)/65535 > 0.5) or (FColors.Color[i].alpha = 0) then cSign := BGRABlack else cSign := BGRAWhite; if FColors.Color[i] = FLastAddedColor then begin @@ -908,7 +910,7 @@ procedure TPaletteToolbar.RepaintPalette(Sender: TObject; Bitmap: TBGRABitmap); PointF(x+(w-aw)*3 div 5, y+h div 4), PointF(x+(w-aw)*4 div 5, y+h div 5)], ssEasyBezier), cSign, DoScaleX(15, OriginalDPI)/10); end; - strKey := GetKeyAssociatedToColor(FColors.Color[i], True); + strKey := GetKeyAssociatedToColor(FColors.Color[i]); if strKey <> '' then begin if FTransparentPalette then @@ -959,6 +961,8 @@ constructor TPaletteToolbar.Create; begin FPanelPalette := nil; FLastAddedColor := BGRAPixelTransparent; + FColorsBindToKey := TBGRAPixelBinding.Create; + FColorsBindToKey.Duplicates := dupError; end; destructor TPaletteToolbar.Destroy; @@ -967,6 +971,7 @@ destructor TPaletteToolbar.Destroy; FreeAndNil(FScrollbar); FreeAndNil(FPanelPalette); FreeAndNil(FColors); + FreeAndNil(FColorsBindToKey); inherited Destroy; end; From 406cccb9c8249ae684a779b1e291933d22db04bc Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sat, 7 Oct 2023 16:12:30 +0200 Subject: [PATCH 51/70] eat key event, slight name adjustment --- lazpaint/upalettetoolbar.pas | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas index 1755eb44..510478e3 100644 --- a/lazpaint/upalettetoolbar.pas +++ b/lazpaint/upalettetoolbar.pas @@ -91,7 +91,7 @@ TPaletteToolbar = class FColorsBindToKey: TBGRAPixelBinding; FSnapPressed, FAltPressed: boolean; procedure ToggleBindColorToKey(aColor: TBGRAPixel; aDigit: integer); - function TryToGetColorBindedToKey(aDigit: integer; out aColor: TBGRAPixel): boolean; + function TryToGetColorBoundToKey(aDigit: integer; out aColor: TBGRAPixel): boolean; public constructor Create; destructor Destroy; override; @@ -346,7 +346,7 @@ procedure TPaletteToolbar.ToggleBindColorToKey(aColor: TBGRAPixel; aDigit: integ end; end; -function TPaletteToolbar.TryToGetColorBindedToKey(aDigit: integer; out aColor: TBGRAPixel): boolean; +function TPaletteToolbar.TryToGetColorBoundToKey(aDigit: integer; out aColor: TBGRAPixel): boolean; begin Result := FColorsBindToKey.TryGetData(aDigit, aColor); end; @@ -372,13 +372,14 @@ function TPaletteToolbar.CatchToolKeyDown(var AKey: Word): boolean; FLazPaintInstance.NotifyColorBinding; end else begin - if TryToGetColorBindedToKey(digit, c) then + if TryToGetColorBoundToKey(digit, c) then begin if FAltPressed then DoPickColor([ssRight], c) else DoPickColor([ssLeft], c); end; end; Result := True; + AKey := 0; // prevent further key event end else Result := False; end; From 9d7039700eef56a290bc3f129a745e534a5eda15 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sat, 7 Oct 2023 18:25:39 +0200 Subject: [PATCH 52/70] fix script code --- resources/scripts/channels_split_hsl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/scripts/channels_split_hsl.py b/resources/scripts/channels_split_hsl.py index aa24a3a5..d7484df6 100644 --- a/resources/scripts/channels_split_hsl.py +++ b/resources/scripts/channels_split_hsl.py @@ -2,7 +2,7 @@ # (fr) Canaux > Séparer TSL from lazpaint import image, dialog, layer, filters -translation = dialog.translate_dict(["Layer already split", "Hue", "Saturation", "Lightness", "Alpha": "Alpha"]) +translation = dialog.translate_dict(["Layer already split", "Hue", "Saturation", "Lightness", "Alpha"]) # check if it is a channel if layer.get_registry("split-channel") is not None: From 331d90317d46ad3727d661b941038dbf4e2a7e00 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sat, 7 Oct 2023 18:33:13 +0200 Subject: [PATCH 53/70] safe way to access Python version --- resources/scripts/display_version.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/scripts/display_version.py b/resources/scripts/display_version.py index 33cf34db..e6aacdcc 100644 --- a/resources/scripts/display_version.py +++ b/resources/scripts/display_version.py @@ -2,10 +2,10 @@ # (fr) Version from lazpaint import command, dialog -import sys +import platform lazpaint_version = command.get_version() -python_version = sys.version_info +python_version = platform.python_version() -dialog.show_message("Python " + str(python_version[0]) + "." + str(python_version[1]) + "." + str(python_version[2]) + ", " + "LazPaint " + str(lazpaint_version[0]) + "." + str(lazpaint_version[1]) + "." + str(lazpaint_version[2]) ) +dialog.show_message("Python " + python_version + ", " + "LazPaint " + str(lazpaint_version[0]) + "." + str(lazpaint_version[1]) + "." + str(lazpaint_version[2]) ) From 0001c7254e33641af9422f5de2e33fb69865b240 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sat, 7 Oct 2023 18:33:30 +0200 Subject: [PATCH 54/70] basic safety check for Python scripts --- lazpaint/upython.pas | 87 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/lazpaint/upython.pas b/lazpaint/upython.pas index fb229078..1d5ff3e3 100644 --- a/lazpaint/upython.pas +++ b/lazpaint/upython.pas @@ -48,6 +48,7 @@ TPythonScript = class function GetPythonVersion(APythonBin: string = DefaultPythonBin): string; function GetScriptTitle(AFilename: string): string; +function CheckPythonScriptSafe(AFilename: string): boolean; var CustomScriptDirectory: string; @@ -163,6 +164,90 @@ function GetScriptTitle(AFilename: string): string; end; end; +function CheckPythonScriptSafe(AFilename: string): boolean; + function binarySearch(x: string; a: array of string): integer; + var L, R, M: integer; // left, right, middle + begin + if Length(a)=0 then Exit(-1); + L := Low (a); + R := High(a); + while (L <= R) do begin + M := (L + R) div 2; + if (x = a[M]) then Exit(M); // found x in a + if (x > a[M]) + then L := Succ(M) + else R := Pred(M); + end; + Exit(-1) // did not found x in a + end; + + function idOk(AId: string): boolean; + const forbidden: array[0..30] of string = + ('__import__', + 'ast', + 'builtins', + 'code', + 'codecs', + 'compile', + 'ctypes', + 'eval', + 'exec', + 'ftplib', + 'gc', + 'getattr', + 'globals', + 'io', + 'locals', + 'multiprocessing', + 'os', + 'pathlib', + 'poplib', + 'pty', + 'runpy', + 'shutil', + 'smtplib', + 'socket', + 'subprocess', + 'sys', + 'telnetlib', + 'tempfile', + 'threading', + 'wsgiref', + 'xmlrpc'); + begin + exit(binarySearch(AId, forbidden) = -1); + end; + +var + t: textfile; + s: string; + startId, i: integer; +begin + assignFile(t, AFilename); + reset(t); + while not eof(t) do + begin + startId := -1; + readln(t, s); + for i := 1 to length(s) do + begin + if (startId = -1) and (s[i] in['A'..'Z','a'..'z','_']) then + begin + startId := i; + end else + if (startId <> -1) and not (s[i] in['A'..'Z','a'..'z','_','0'..'9']) then + begin + if not idOk(copy(s, startId, i-startId)) then exit(false); + startId := -1; + end; + end; + if (startId <> -1) and not idOk(copy(s, startId, length(s)-startId+1)) then + exit(false); + end; + closefile(t); + exit(true); +end; + { TPythonScript } procedure TPythonScript.PythonOutput(ALine: RawByteString); @@ -286,6 +371,8 @@ function TPythonScript.GetPythonVersionMajor: integer; procedure TPythonScript.Run(AScriptFilename: UTF8String; APythonVersion: integer); begin + if not CheckPythonScriptSafe(AScriptFilename) then + raise exception.Create('The script file does not seem to be safe'); FLinePrefix := ''; if PythonVersionMajor <> APythonVersion then raise exception.Create( From 738598df91bd89cc829eb57364445ed8b8856252 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sat, 7 Oct 2023 18:53:08 +0200 Subject: [PATCH 55/70] restore starting tab for scripting --- lazpaint/dialog/filter/ufilterfunction.pas | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lazpaint/dialog/filter/ufilterfunction.pas b/lazpaint/dialog/filter/ufilterfunction.pas index b0de4cdd..fa71b26e 100644 --- a/lazpaint/dialog/filter/ufilterfunction.pas +++ b/lazpaint/dialog/filter/ufilterfunction.pas @@ -239,6 +239,8 @@ procedure TFFilterFunction.FormCreate(Sender: TObject); FComputedImage := nil; StatsNotComputed(low(FStats), high(FStats)); + + PageControl_Color.ActivePage := TabSheet_RGB; end; procedure TFFilterFunction.FormDestroy(Sender: TObject); @@ -808,6 +810,8 @@ procedure TFFilterFunction.InitParams; if IsDefined('b') then Edit_Lightness.Text := Strings['b']; if IsDefined('GammaCorrection') then CheckBox_Gamma.Checked:= Booleans['GammaCorrection']; if IsDefined('CorrectedHue') then CheckBox_GSBA.Checked:= Booleans['CorrectedHue']; + if IsDefined('Red') or IsDefined('Green') or IsDefined('Blue') then + PageControl_Color.ActivePage := TabSheet_RGB else if IsDefined('Hue') or IsDefined('Saturation') or IsDefined('Lightness') then PageControl_Color.ActivePage := TabSheet_HSL else if IsDefined('L') or IsDefined('a') or IsDefined('b') then From c0a9ead2c53003bd2017f1279c0356eae51689a6 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sat, 7 Oct 2023 23:19:49 +0200 Subject: [PATCH 56/70] improve safety for Python scripts --- lazpaint/lazpaintinstance.pas | 8 ++ lazpaint/upython.pas | 197 +++++++++++++++++++++++++++++----- 2 files changed, 178 insertions(+), 27 deletions(-) diff --git a/lazpaint/lazpaintinstance.pas b/lazpaint/lazpaintinstance.pas index 0323c50c..ae6672b6 100644 --- a/lazpaint/lazpaintinstance.pas +++ b/lazpaint/lazpaintinstance.pas @@ -73,6 +73,7 @@ TLazPaintInstance = class(TLazPaintCustomInstance) procedure PythonScriptCommand({%H-}ASender: TObject; ACommand, AParam: UTF8String; out AResult: UTF8String); procedure PythonBusy({%H-}Sender: TObject); + procedure PythonWarning({%H-}Sender: TObject; AMessage: UTF8String; out AProceed: boolean); function ScriptShowMessage(AVars: TVariableSet): TScriptResult; function ScriptInputBox(AVars: TVariableSet): TScriptResult; procedure ToolQueryColorTarget({%H-}sender: TToolManager; ATarget: TVectorialFill); @@ -1028,6 +1029,12 @@ procedure TLazPaintInstance.PythonBusy(Sender: TObject); Application.ProcessMessages; end; +procedure TLazPaintInstance.PythonWarning(Sender: TObject; + AMessage: UTF8String; out AProceed: boolean); +begin + AProceed := QuestionDlg(rsScript, AMessage, mtWarning, [mrOk,rsOkay, mrCancel,rsCancel],'') = mrOK; +end; + function TLazPaintInstance.GetShowSelectionNormal: boolean; begin if FMain <> nil then result := fmain.ShowSelectionNormal @@ -1893,6 +1900,7 @@ function TLazPaintInstance.RunScript(AFilename: string; ACaption: string): boole else FScriptName := AFilename; p.OnCommand:=@PythonScriptCommand; p.OnBusy := @PythonBusy; + p.OnWarning:= @PythonWarning; p.Run(AFilename); if p.ErrorText<>'' then begin diff --git a/lazpaint/upython.pas b/lazpaint/upython.pas index 1d5ff3e3..8dc658bb 100644 --- a/lazpaint/upython.pas +++ b/lazpaint/upython.pas @@ -14,17 +14,19 @@ interface type TReceiveLineEvent = procedure(ASender: TObject; ALine: UTF8String) of object; TCommandEvent = procedure(ASender: TObject; ACommand, AParam: UTF8String; out AResult: UTF8String) of object; + TWarningEvent = procedure(ASender: TObject; AMessage: UTF8String; out AProceed: boolean) of object; { TPythonScript } TPythonScript = class private - FOnBusy: TNotifyEvent; FPythonBin: string; FPythonVersion: string; FLinePrefix: RawByteString; FOnCommand: TCommandEvent; FOnError: TReceiveLineEvent; + FOnBusy: TNotifyEvent; + FOnWarning: TWarningEvent; FOnOutputLine: TReceiveLineEvent; FPythonSend: TSendLineMethod; FErrorText: UTF8String; @@ -41,6 +43,7 @@ TPythonScript = class property OnError: TReceiveLineEvent read FOnError write FOnError; property OnCommand: TCommandEvent read FOnCommand write FOnCommand; property OnBusy: TNotifyEvent read FOnBusy write FOnBusy; + property OnWarning: TWarningEvent read FOnWarning write FOnWarning; property PythonVersion: string read FPythonVersion; property PythonVersionMajor: integer read GetPythonVersionMajor; property ErrorText: UTF8String read FErrorText; @@ -48,7 +51,7 @@ TPythonScript = class function GetPythonVersion(APythonBin: string = DefaultPythonBin): string; function GetScriptTitle(AFilename: string): string; -function CheckPythonScriptSafe(AFilename: string): boolean; +function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringList): boolean; var CustomScriptDirectory: string; @@ -164,7 +167,7 @@ function GetScriptTitle(AFilename: string): string; end; end; -function CheckPythonScriptSafe(AFilename: string): boolean; +function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringList): boolean; function binarySearch(x: string; a: array of string): integer; var L, R, M: integer; // left, right, middle begin @@ -181,23 +184,34 @@ function CheckPythonScriptSafe(AFilename: string): boolean; Exit(-1) // did not found x in a end; - function idOk(AId: string): boolean; - const forbidden: array[0..30] of string = + function idOk(AId: string; var isImport: integer): boolean; + const forbidden: array[0..6] of string = ('__import__', - 'ast', + 'compile', + 'eval', + 'exec', + 'getattr', + 'globals', + 'locals'); + begin + if AId = 'import' then inc(isImport); + exit(binarySearch(AId, forbidden) = -1); + end; + + const StartIdentifier = ['A'..'Z','a'..'z','_']; + const ContinueIdentifier = ['A'..'Z','a'..'z','_','0'..'9']; + const WhiteSpace = [' ', #9]; + + function importOk(const s: string; isImport: integer; previousBackslash: boolean): boolean; + const forbiddenModules: array[0..23] of string = + ('ast', 'builtins', 'code', 'codecs', - 'compile', 'ctypes', - 'eval', - 'exec', 'ftplib', 'gc', - 'getattr', - 'globals', 'io', - 'locals', 'multiprocessing', 'os', 'pathlib', @@ -214,35 +228,146 @@ function CheckPythonScriptSafe(AFilename: string): boolean; 'threading', 'wsgiref', 'xmlrpc'); + + const safeModules: array[0..10] of string = + ('PIL', + 'calendar', + 'datetime', + 'decimal', + 'fractions', + 'lazpaint', + 'math', + 'platform', + 'statistics', + 'time', + 'tkinter'); + + procedure SkipSpaces(var idx: integer); begin - exit(binarySearch(AId, forbidden) = -1); + while (idx <= length(s)) and (s[idx] in WhiteSpace) do inc(idx); end; -var - t: textfile; - s: string; - startId, i: integer; -begin - assignFile(t, AFilename); - reset(t); - while not eof(t) do + function GetId(var idx: integer): string; + var idxEnd: integer; + begin + if (idx > length(s)) or not (s[idx] in StartIdentifier) then exit(''); + idxEnd := idx+1; + while (idxEnd <= length(s)) and (s[idxEnd] in ContinueIdentifier) do inc(idxEnd); + result := copy(s, idx, idxEnd-idx); + idx := idxEnd; + end; + + var idx: integer; + importAfter: boolean; + moduleName, subId: string; + begin + if isImport <> 1 then exit(false); // syntax error + + if s.StartsWith('from ') then + begin + idx := length('from ') + 1; + importAfter := true; + end else + if s.StartsWith('import ') then + begin + if previousBackslash then exit(false); // could be an exploit + idx := length('import ') + 1; + importAfter := false; + end + else + exit(false); // syntax error + + SkipSpaces(idx); + moduleName := GetId(idx); + if moduleName = '' then exit(false); // syntax error + // check if module is allowed + if binarySearch(moduleName, forbiddenModules) <> -1 then exit(false); + if binarySearch(moduleName, safeModules) = -1 then + begin + if AUnsafeModules = nil then + AUnsafeModules := TStringList.Create; + if AUnsafeModules.IndexOf(moduleName) = -1 then + AUnsafeModules.Add(moduleName); + end; + + SkipSpaces(idx); + // submodule + while (idx <= length(s)) and (s[idx] = '.') do + begin + inc(idx); + SkipSpaces(idx); + subId := GetId(idx); + if subId = '' then exit(false); // syntax error + SkipSpaces(idx); + end; + + if importAfter then + begin + subId := GetId(idx); + if subId <> 'import' then exit(false); // syntax error + end else + begin + if (idx > length(s)) or (s[idx] = '#') then exit(true); + + subId := GetId(idx); + if subId = 'as' then + begin + SkipSpaces(idx); + subId := GetId(idx); + if subId = '' then exit(false); // syntax error + + if (idx <= length(s)) and (s[idx] <> '#') then // expect end of line + exit(false); // syntax error + end; + end; + + exit(true); + end; + + function lineOk(const s: string; previousBackslash: boolean): boolean; + var + startId, i: integer; + isImport: integer; begin startId := -1; - readln(t, s); + isImport := 0; + for i := 1 to length(s) do begin - if (startId = -1) and (s[i] in['A'..'Z','a'..'z','_']) then + // check identifier boundaries + if (startId = -1) and (s[i] in StartIdentifier) then begin startId := i; end else - if (startId <> -1) and not (s[i] in['A'..'Z','a'..'z','_','0'..'9']) then + if (startId <> -1) and not (s[i] in ContinueIdentifier) then begin - if not idOk(copy(s, startId, i-startId)) then exit(false); + if not idOk(copy(s, startId, i-startId), isImport) then exit(false); startId := -1; end; end; - if (startId <> -1) and not idOk(copy(s, startId, length(s)-startId+1)) then + if (startId <> -1) and not idOk(copy(s, startId, length(s)-startId+1), isImport) then exit(false); + + if (isImport > 0) and not importOk(s, isImport, previousBackslash) then exit(false); + + exit(true); + end; + +var + t: textfile; + s: string; + previousBackslash: boolean; +begin + AUnsafeModules := nil; + assignFile(t, AFilename); + reset(t); + previousBackslash := false; + while not eof(t) do + begin + readln(t, s); + s := trim(s); + if not lineOk(s, previousBackslash) then exit(false); + previousBackslash := s.EndsWith('\'); end; closefile(t); exit(true); @@ -370,9 +495,27 @@ function TPythonScript.GetPythonVersionMajor: integer; procedure TPythonScript.Run(AScriptFilename: UTF8String; APythonVersion: integer); +var + unsafeModules: TStringList; + proceed: boolean; begin - if not CheckPythonScriptSafe(AScriptFilename) then + if not CheckPythonScriptSafe(AScriptFilename, unsafeModules) then + begin + unsafeModules.Free; raise exception.Create('The script file does not seem to be safe'); + end; + if Assigned(unsafeModules) then + begin + proceed := true; + if Assigned(OnWarning) then + begin + OnWarning(self, 'Are you sure you would like to run this script? ' + + 'The following modules used by this script may be unsafe: '+ + unsafeModules.CommaText, proceed); + end; + unsafeModules.Free; + if not proceed then exit; + end; FLinePrefix := ''; if PythonVersionMajor <> APythonVersion then raise exception.Create( From 0ff4d552d2c3869eb81f42a8fa7319c93b136e61 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sun, 8 Oct 2023 07:04:16 +0200 Subject: [PATCH 57/70] avoid os and sys dependency, check module relative path --- lazpaint/upython.pas | 345 ++++++++++++++++++-------- resources/scripts/lazpaint/command.py | 7 - resources/scripts/lazpaint/image.py | 3 +- 3 files changed, 236 insertions(+), 119 deletions(-) diff --git a/lazpaint/upython.pas b/lazpaint/upython.pas index 8dc658bb..ea4f252f 100644 --- a/lazpaint/upython.pas +++ b/lazpaint/upython.pas @@ -35,6 +35,7 @@ TPythonScript = class procedure PythonError(ALine: RawByteString); procedure PythonOutput(ALine: RawByteString); procedure PythonBusy(var {%H-}ASleep: boolean); + function CheckScriptAndDependencySafe(AFilename: UTF8String; APythonVersion: integer): boolean; public constructor Create(APythonBin: string = DefaultPythonBin); procedure Run(AScriptFilename: UTF8String; APythonVersion: integer = 3); @@ -51,7 +52,7 @@ TPythonScript = class function GetPythonVersion(APythonBin: string = DefaultPythonBin): string; function GetScriptTitle(AFilename: string): string; -function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringList): boolean; +function CheckPythonScriptSafe(AFilename: string; out ASafeModules, AUnsafeModules: TStringList): boolean; var CustomScriptDirectory: string; @@ -167,7 +168,7 @@ function GetScriptTitle(AFilename: string): string; end; end; -function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringList): boolean; +function CheckPythonScriptSafe(AFilename: string; out ASafeModules, AUnsafeModules: TStringList): boolean; function binarySearch(x: string; a: array of string): integer; var L, R, M: integer; // left, right, middle begin @@ -184,7 +185,7 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis Exit(-1) // did not found x in a end; - function idOk(AId: string; var isImport: integer): boolean; + function idOk(AId: string; var importCount: integer): boolean; const forbidden: array[0..6] of string = ('__import__', 'compile', @@ -194,7 +195,7 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis 'globals', 'locals'); begin - if AId = 'import' then inc(isImport); + if AId = 'import' then inc(importCount); exit(binarySearch(AId, forbidden) = -1); end; @@ -202,45 +203,61 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis const ContinueIdentifier = ['A'..'Z','a'..'z','_','0'..'9']; const WhiteSpace = [' ', #9]; - function importOk(const s: string; isImport: integer; previousBackslash: boolean): boolean; - const forbiddenModules: array[0..23] of string = - ('ast', - 'builtins', - 'code', - 'codecs', - 'ctypes', - 'ftplib', - 'gc', - 'io', - 'multiprocessing', - 'os', - 'pathlib', - 'poplib', - 'pty', - 'runpy', - 'shutil', - 'smtplib', - 'socket', - 'subprocess', - 'sys', - 'telnetlib', - 'tempfile', - 'threading', - 'wsgiref', - 'xmlrpc'); - - const safeModules: array[0..10] of string = - ('PIL', - 'calendar', - 'datetime', - 'decimal', - 'fractions', + function importOk(const s: string; importCount: integer; previousBackslash: boolean): boolean; + const ForbiddenModules: array[0..22] of string = + ('builtins', // Provides direct access to all built-in identifiers of Python. + 'code', // Facilities to implement interactive Python interpreters. + 'codecs', // Core support for encoding and decoding text and binary data. + 'ctypes', // Create and manipulate C-compatible data types in Python, and call functions in dynamic link libraries/shared libraries. + 'ftplib', // Interface to the FTP protocol. + 'gc', // Interface to the garbage collection facility for reference cycles. + 'io', // Core tools for working with streams (core I/O operations). + 'multiprocessing', // Process-based parallelism. + 'os', // Interface to the operating system, including file and process operations. + 'pathlib', // Object-oriented filesystem paths. + 'poplib', // Client-side support for the POP3 protocol. + 'pty', // Operations for handling the pseudo-terminal concept. + 'runpy', // Locating and running Python programs using various modes of the `__main__` module. + 'shutil', // High-level file operations, including copying and deletion. + 'smtplib', // Client-side objects for the SMTP and ESMTP protocols. + 'socket', // Low-level networking operations. + 'subprocess', // Spawn additional processes, connect to their input/output/error pipes, and obtain their return codes. + 'sys', // Access and set variables used or maintained by the Python interpreter. + 'telnetlib', // Client-side support for the Telnet protocol. + 'tempfile', // Generate temporary files and directories. + 'threading', // Higher-level threading interfaces on top of the lower-level `_thread` module. + 'wsgiref', // WSGI utility functions and reference implementation. + 'xmlrpc' // XML-RPC server and client modules. + ); + + const SafeModules: array[0..26] of string = + ('PIL', // Python Imaging Library, for image processing. + 'array', // Basic mutable array operations. + 'ast', // Abstract Syntax Trees + 'bisect', // Algorithms for manipulating sorted lists. + 'calendar', // Functions for working with calendars and dates. + 'collections', // Container datatypes like namedtuples and defaultdict. + 'colorsys', // Color system conversions. + 'copy', // Shallow and deep copy operations. + 'csv', // Reading and writing CSV files. + 'datetime', // Basic date and time types. + 'decimal', // Fixed and floating point arithmetic using decimal notation. + 'enum', // Enumerations in Python. + 'fractions', // Rational numbers. + 'functools', // Higher-order functions and operations on callable objects. + 'hashlib', // Secure hash and message digest algorithms. + 'itertools', // Functions for creating iterators for efficient looping. + 'json', // Encoding and decoding JSON format. 'lazpaint', - 'math', - 'platform', - 'statistics', - 'time', - 'tkinter'); + 'math', // Mathematical functions. + 'platform', // Access to platform-specific attributes and functions. + 'queue', // A multi-producer, multi-consumer queue. + 'random', // Generate pseudo-random numbers. + 'statistics', // Mathematical statistics functions. + 'string', // Common string operations. + 'time', // Time-related functions. + 'tkinter', // Standard GUI library for Python. + 'uuid'); // UUID objects procedure SkipSpaces(var idx: integer); begin @@ -257,39 +274,33 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis idx := idxEnd; end; - var idx: integer; - importAfter: boolean; - moduleName, subId: string; + function SkipAs(var idx: integer): boolean; + var + subId: String; begin - if isImport <> 1 then exit(false); // syntax error - - if s.StartsWith('from ') then - begin - idx := length('from ') + 1; - importAfter := true; - end else - if s.StartsWith('import ') then - begin - if previousBackslash then exit(false); // could be an exploit - idx := length('import ') + 1; - importAfter := false; - end - else - exit(false); // syntax error - SkipSpaces(idx); - moduleName := GetId(idx); - if moduleName = '' then exit(false); // syntax error - // check if module is allowed - if binarySearch(moduleName, forbiddenModules) <> -1 then exit(false); - if binarySearch(moduleName, safeModules) = -1 then + if (idx > length(s)) or (s[idx] = '#') then exit(true); + subId := GetId(idx); + if subId = 'as' then begin - if AUnsafeModules = nil then - AUnsafeModules := TStringList.Create; - if AUnsafeModules.IndexOf(moduleName) = -1 then - AUnsafeModules.Add(moduleName); + SkipSpaces(idx); + subId := GetId(idx); + if subId = '' then exit(false); // syntax error end; + exit(true); + end; + function ParseModuleName(var idx: integer; out AModuleName: string; out AIsSafe: boolean): boolean; + var + subId: String; + begin + SkipSpaces(idx); + AIsSafe := false; + AModuleName := GetId(idx); + if AModuleName = '' then exit(false); // syntax error + // check if module is allowed + if binarySearch(AModuleName, ForbiddenModules) <> -1 then exit(false); + AIsSafe := binarySearch(AModuleName, SafeModules) <> -1; SkipSpaces(idx); // submodule while (idx <= length(s)) and (s[idx] = '.') do @@ -298,28 +309,82 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis SkipSpaces(idx); subId := GetId(idx); if subId = '' then exit(false); // syntax error + AModuleName += '.' + subId; SkipSpaces(idx); end; + exit(true); + end; + + procedure AddModule(AModuleName: string; AIsSafe: boolean); + begin + if not AIsSafe then + begin + if AUnsafeModules = nil then + AUnsafeModules := TStringList.Create; + if AUnsafeModules.IndexOf(AModuleName) = -1 then + AUnsafeModules.Add(AModuleName); + end else + begin + if ASafeModules = nil then + ASafeModules := TStringList.Create; + if ASafeModules.IndexOf(AModuleName) = -1 then + ASafeModules.Add(AModuleName); + end; + end; - if importAfter then + var idx: integer; + fromClause: boolean; + moduleName, subId: string; + isSafe: boolean; + begin + if importCount <> 1 then exit(false); // syntax error + + if s.StartsWith('from ') then begin - subId := GetId(idx); - if subId <> 'import' then exit(false); // syntax error + idx := length('from ') + 1; + fromClause := true; end else + if s.StartsWith('import ') then begin - if (idx > length(s)) or (s[idx] = '#') then exit(true); + if previousBackslash then exit(false); // could be an exploit + idx := length('import ') + 1; + fromClause := false; + end + else + exit(false); // syntax error + if not ParseModuleName(idx, moduleName, isSafe) then exit(false); + + if fromClause then + begin subId := GetId(idx); - if subId = 'as' then - begin + if subId <> 'import' then exit(false); // syntax error + repeat SkipSpaces(idx); subId := GetId(idx); if subId = '' then exit(false); // syntax error - - if (idx <= length(s)) and (s[idx] <> '#') then // expect end of line - exit(false); // syntax error - end; + AddModule(moduleName+'.'+subId, isSafe); + if not SkipAs(idx) then exit(false); + SkipSpaces(idx); + if (idx <= length(s)) and (s[idx] = ',') then inc(idx) + else break; + until false; + end else + begin + repeat + AddModule(moduleName, isSafe); + if not SkipAs(idx) then exit(false); + SkipSpaces(idx); + if (idx <= length(s)) and (s[idx] = ',') then + begin + inc(idx); + if not ParseModuleName(idx, moduleName, isSafe) then exit(false); + end + else break; + until false; end; + if (idx <= length(s)) and (s[idx] <> '#') then // expect end of line + exit(false); // syntax error exit(true); end; @@ -327,10 +392,10 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis function lineOk(const s: string; previousBackslash: boolean): boolean; var startId, i: integer; - isImport: integer; + importCount: integer; begin startId := -1; - isImport := 0; + importCount := 0; for i := 1 to length(s) do begin @@ -341,14 +406,14 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis end else if (startId <> -1) and not (s[i] in ContinueIdentifier) then begin - if not idOk(copy(s, startId, i-startId), isImport) then exit(false); + if not idOk(copy(s, startId, i-startId), importCount) then exit(false); startId := -1; end; end; - if (startId <> -1) and not idOk(copy(s, startId, length(s)-startId+1), isImport) then + if (startId <> -1) and not idOk(copy(s, startId, length(s)-startId+1), importCount) then exit(false); - if (isImport > 0) and not importOk(s, isImport, previousBackslash) then exit(false); + if (importCount > 0) and not importOk(s, importCount, previousBackslash) then exit(false); exit(true); end; @@ -358,6 +423,7 @@ function CheckPythonScriptSafe(AFilename: string; out AUnsafeModules: TStringLis s: string; previousBackslash: boolean; begin + ASafeModules := nil; AUnsafeModules := nil; assignFile(t, AFilename); reset(t); @@ -467,6 +533,88 @@ procedure TPythonScript.PythonBusy(var ASleep: boolean); if Assigned(FOnBusy) then FOnBusy(self); end; +function TPythonScript.CheckScriptAndDependencySafe(AFilename: UTF8String; APythonVersion: integer): boolean; +var + filesToCheck: TStringList; + + procedure AddModuleToCheck(AModuleName: UTF8String; ABasePath: UTF8String); + var fullPath, moduleFilename: string; + begin + fullPath := ConcatPaths([ABasePath, StringReplace(AModuleName, '.', PathDelim, [rfReplaceAll])]); + moduleFilename := fullPath+'.py'; + if (filesToCheck.IndexOf(moduleFilename) = -1) and FileExists(moduleFilename) then + filesToCheck.Add(moduleFilename) else + begin + moduleFilename := fullPath+'\__init__.py'; + if (filesToCheck.IndexOf(moduleFilename) = -1) and FileExists(moduleFilename) then + filesToCheck.Add(moduleFilename); + end; + end; + +var + safeModules, unsafeModules, allUnsafeModules: TStringList; + proceed: boolean; + curFile, i: integer; + curPath: string; + +begin + allUnsafeModules := TStringList.Create; + allUnsafeModules.Sorted := true; + allUnsafeModules.Duplicates:= dupIgnore; + filesToCheck := TStringList.Create; + filesToCheck.Add(AFilename); + curFile := 0; + curPath := ExtractFilePath(AFilename); + while curFile < filesToCheck.Count do + begin + if not CheckPythonScriptSafe(filesToCheck[curFile], safeModules, unsafeModules) then + begin + safeModules.Free; + unsafeModules.Free; + raise exception.Create('The script file does not seem to be safe: ' + + filesToCheck[curFile]); + end; + if Assigned(unsafeModules) then + begin + for i := 0 to unsafeModules.Count-1 do + begin + AddModuleToCheck(unsafeModules[i], curPath); + allUnsafeModules.Add(unsafeModules[i]); + end; + end; + if Assigned(safeModules) then + begin + for i := 0 to safeModules.Count-1 do + AddModuleToCheck(safeModules[i], curPath); + end; + safeModules.Free; + unsafeModules.Free; + inc(curFile); + end; + filesToCheck.Free; + + if allUnsafeModules.Count > 0 then + begin + proceed := true; + if Assigned(OnWarning) then + begin + OnWarning(self, 'Are you sure you would like to run this script? ' + + 'The following modules used by this script may be unsafe: '+ + allUnsafeModules.CommaText, proceed); + end; + allUnsafeModules.Free; + if not proceed then exit(false); + end else + allUnsafeModules.Free; + + if PythonVersionMajor <> APythonVersion then + raise exception.Create( + StringReplace( StringReplace(rsPythonUnexpectedVersion, + '%1',inttostr(APythonVersion),[]), + '%2',inttostr(PythonVersionMajor),[]) + #9 + rsDownload + #9 + 'https://www.python.org'); + exit(true); +end; + constructor TPythonScript.Create(APythonBin: string); begin FPythonBin := APythonBin; @@ -495,35 +643,12 @@ function TPythonScript.GetPythonVersionMajor: integer; procedure TPythonScript.Run(AScriptFilename: UTF8String; APythonVersion: integer); -var - unsafeModules: TStringList; - proceed: boolean; begin - if not CheckPythonScriptSafe(AScriptFilename, unsafeModules) then - begin - unsafeModules.Free; - raise exception.Create('The script file does not seem to be safe'); - end; - if Assigned(unsafeModules) then - begin - proceed := true; - if Assigned(OnWarning) then - begin - OnWarning(self, 'Are you sure you would like to run this script? ' + - 'The following modules used by this script may be unsafe: '+ - unsafeModules.CommaText, proceed); - end; - unsafeModules.Free; - if not proceed then exit; - end; + if not CheckScriptAndDependencySafe(AScriptFilename, APythonVersion) then exit; FLinePrefix := ''; - if PythonVersionMajor <> APythonVersion then - raise exception.Create( - StringReplace( StringReplace(rsPythonUnexpectedVersion, - '%1',inttostr(APythonVersion),[]), - '%2',inttostr(PythonVersionMajor),[]) + #9 + rsDownload + #9 + 'https://www.python.org'); FFirstOutput:= true; AutomationEnvironment.Values['PYTHONPATH'] := DefaultScriptDirectory; + AutomationEnvironment.Values['PYTHONIOENCODING'] := 'utf-8'; try RunProcessAutomation(FPythonBin, ['-u', AScriptFilename], FPythonSend, @PythonOutput, @PythonError, @PythonBusy); finally diff --git a/resources/scripts/lazpaint/command.py b/resources/scripts/lazpaint/command.py index b986243b..029e73bf 100644 --- a/resources/scripts/lazpaint/command.py +++ b/resources/scripts/lazpaint/command.py @@ -6,13 +6,6 @@ if input('') != chr(27) + 'LazPaint': print("Needs to be run from LazPaint.") exit() - -import sys -if sys.platform == "win32": - import io - sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8') - sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8') - sys.stdin = io.TextIOWrapper(sys.stdin.detach(), encoding = 'utf-8') def parse_str(text: str): if text[:1] == "#": diff --git a/resources/scripts/lazpaint/image.py b/resources/scripts/lazpaint/image.py index a79e1b85..a7cf463b 100644 --- a/resources/scripts/lazpaint/image.py +++ b/resources/scripts/lazpaint/image.py @@ -1,5 +1,4 @@ from lazpaint import command, dialog, colors, layer -import os if __name__ == "__main__": dialog.show_message("Library to act on the whole image.") @@ -105,7 +104,7 @@ def export(file_name=None, validate=False, overwrite=False, skip_options=False) return command.send("FileSaveAs?", FileName=file_name, Validate=validate, Overwrite=overwrite, SkipOptions=skip_options, Export=True) def change_file_extension(file_name: str, new_extension: str) -> str: - base, ext = os.path.splitext(file_name) + base = file_name.rsplit('.', 1)[0] if len(new_extension) > 0 and new_extension[0:1] != ".": new_extension = "." + new_extension return base + new_extension From befe7fb3a53487215e4577ab854c2e82d64118d2 Mon Sep 17 00:00:00 2001 From: Lulu Date: Sun, 8 Oct 2023 14:23:32 +0200 Subject: [PATCH 58/70] fix: the function return the right value --- lazpaint/uscripting.pas | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lazpaint/uscripting.pas b/lazpaint/uscripting.pas index 9463b3c4..49857d80 100644 --- a/lazpaint/uscripting.pas +++ b/lazpaint/uscripting.pas @@ -458,37 +458,37 @@ function TVariableSet.GetVarName(AIndex: integer): string; for i := 0 to FNbScalars-1 do if FScalars[i].name <> '' then begin - if AIndex = 0 then exit(FScalars[AIndex].name) + if AIndex = 0 then exit(FScalars[i].name) else dec(AIndex); end; for i := 0 to FNbStrings-1 do if FStrings[i].name <> '' then begin - if AIndex = 0 then exit(FStrings[AIndex].name) + if AIndex = 0 then exit(FStrings[i].name) else dec(AIndex); end; for i := 0 to FNbBoolLists-1 do if FBoolLists[i].name <> '' then begin - if AIndex = 0 then exit(FBoolLists[AIndex].name) + if AIndex = 0 then exit(FBoolLists[i].name) else dec(AIndex); end; for i := 0 to FNbScalarLists-1 do if FScalarLists[i].name <> '' then begin - if AIndex = 0 then exit(FScalarLists[AIndex].name) + if AIndex = 0 then exit(FScalarLists[i].name) else dec(AIndex); end; for i := 0 to FNbStrLists-1 do if FStrLists[i].name <> '' then begin - if AIndex = 0 then exit(FStrLists[AIndex].name) + if AIndex = 0 then exit(FStrLists[i].name) else dec(AIndex); end; for i := 0 to FNbSubsets-1 do if FSubsets[i].name <> '' then begin - if AIndex = 0 then exit(FSubsets[AIndex].name) + if AIndex = 0 then exit(FSubsets[i].name) else dec(AIndex); end; From 417790fc139f16dbd42a486ecb114382c3acb239 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Sun, 8 Oct 2023 20:00:45 +0200 Subject: [PATCH 59/70] #568 return value according to index --- lazpaint/uscripting.pas | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lazpaint/uscripting.pas b/lazpaint/uscripting.pas index 9463b3c4..49857d80 100644 --- a/lazpaint/uscripting.pas +++ b/lazpaint/uscripting.pas @@ -458,37 +458,37 @@ function TVariableSet.GetVarName(AIndex: integer): string; for i := 0 to FNbScalars-1 do if FScalars[i].name <> '' then begin - if AIndex = 0 then exit(FScalars[AIndex].name) + if AIndex = 0 then exit(FScalars[i].name) else dec(AIndex); end; for i := 0 to FNbStrings-1 do if FStrings[i].name <> '' then begin - if AIndex = 0 then exit(FStrings[AIndex].name) + if AIndex = 0 then exit(FStrings[i].name) else dec(AIndex); end; for i := 0 to FNbBoolLists-1 do if FBoolLists[i].name <> '' then begin - if AIndex = 0 then exit(FBoolLists[AIndex].name) + if AIndex = 0 then exit(FBoolLists[i].name) else dec(AIndex); end; for i := 0 to FNbScalarLists-1 do if FScalarLists[i].name <> '' then begin - if AIndex = 0 then exit(FScalarLists[AIndex].name) + if AIndex = 0 then exit(FScalarLists[i].name) else dec(AIndex); end; for i := 0 to FNbStrLists-1 do if FStrLists[i].name <> '' then begin - if AIndex = 0 then exit(FStrLists[AIndex].name) + if AIndex = 0 then exit(FStrLists[i].name) else dec(AIndex); end; for i := 0 to FNbSubsets-1 do if FSubsets[i].name <> '' then begin - if AIndex = 0 then exit(FSubsets[AIndex].name) + if AIndex = 0 then exit(FSubsets[i].name) else dec(AIndex); end; From fcb54154cb64b80f5361f4212e8a67fdcaaa1fce Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Mon, 9 Oct 2023 08:21:22 +0200 Subject: [PATCH 60/70] fix Python version on macOS --- lazpaint/lazpaintinstance.pas | 3 +-- lazpaint/uprocessauto.pas | 10 ++++++---- lazpaint/upython.pas | 18 ++++++++++++++---- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/lazpaint/lazpaintinstance.pas b/lazpaint/lazpaintinstance.pas index ae6672b6..e9d0b5e0 100644 --- a/lazpaint/lazpaintinstance.pas +++ b/lazpaint/lazpaintinstance.pas @@ -1901,8 +1901,7 @@ function TLazPaintInstance.RunScript(AFilename: string; ACaption: string): boole p.OnCommand:=@PythonScriptCommand; p.OnBusy := @PythonBusy; p.OnWarning:= @PythonWarning; - p.Run(AFilename); - if p.ErrorText<>'' then + if not p.Run(AFilename) and (p.ErrorText<>'') then begin fError := TForm.Create(nil); try diff --git a/lazpaint/uprocessauto.pas b/lazpaint/uprocessauto.pas index e74e59da..51c678dd 100644 --- a/lazpaint/uprocessauto.pas +++ b/lazpaint/uprocessauto.pas @@ -24,11 +24,11 @@ interface var AutomationEnvironment: TStringList; -procedure RunProcessAutomation(AExecutable: string; AParameters: array of string; +function RunProcessAutomation(AExecutable: string; AParameters: array of string; out ASendLine: TSendLineMethod; AOnReceiveOutput: TReceiveLineEvent; AOnReceiveError: TReceiveLineEvent; - AOnBusy: TBusyEvent); + AOnBusy: TBusyEvent): integer; implementation @@ -45,11 +45,11 @@ TAutomatedProcess = class(TProcess) procedure SendLine(const ALine: RawByteString); end; -procedure RunProcessAutomation(AExecutable: string; AParameters: array of string; +function RunProcessAutomation(AExecutable: string; AParameters: array of string; out ASendLine: TSendLineMethod; AOnReceiveOutput: TReceiveLineEvent; AOnReceiveError: TReceiveLineEvent; - AOnBusy: TBusyEvent); + AOnBusy: TBusyEvent): integer; type TReceiveBuffer = record @@ -120,6 +120,7 @@ TReceiveBuffer = record i: integer; shouldSleep: Boolean; begin + result := 0; p := TAutomatedProcess.Create(nil); ASendLine := @p.SendLine; try @@ -145,6 +146,7 @@ TReceiveBuffer = record end; Receive(p.Output, Output); Receive(p.Stderr, Error); + result := p.ExitCode; finally p.Free; end; diff --git a/lazpaint/upython.pas b/lazpaint/upython.pas index ea4f252f..6177c143 100644 --- a/lazpaint/upython.pas +++ b/lazpaint/upython.pas @@ -10,6 +10,9 @@ interface const DefaultPythonBin = {$IFDEF WINDOWS}'pyw'{$ELSE}'python3'{$ENDIF}; + {$IFDEF DARWIN} + UserPythonBin = '/usr/local/bin/python3'; + {$ENDIF} type TReceiveLineEvent = procedure(ASender: TObject; ALine: UTF8String) of object; @@ -38,7 +41,7 @@ TPythonScript = class function CheckScriptAndDependencySafe(AFilename: UTF8String; APythonVersion: integer): boolean; public constructor Create(APythonBin: string = DefaultPythonBin); - procedure Run(AScriptFilename: UTF8String; APythonVersion: integer = 3); + function Run(AScriptFilename: UTF8String; APythonVersion: integer = 3): boolean; class function DefaultScriptDirectory: string; property OnOutputLine: TReceiveLineEvent read FOnOutputLine write FOnOutputLine; property OnError: TReceiveLineEvent read FOnError write FOnError; @@ -618,6 +621,10 @@ function TPythonScript.CheckScriptAndDependencySafe(AFilename: UTF8String; APyth constructor TPythonScript.Create(APythonBin: string); begin FPythonBin := APythonBin; + {$IFDEF DARWIN} + if (FPythonBin = 'python3') and FileExists(UserPythonBin) then + FPythonBin:= UserPythonBin; + {$ENDIF} FPythonVersion:= GetPythonVersion(FPythonBin); end; @@ -641,20 +648,23 @@ function TPythonScript.GetPythonVersionMajor: integer; val(copy(PythonVersion,1,posDot-1), result, errPos); end; -procedure TPythonScript.Run(AScriptFilename: UTF8String; - APythonVersion: integer); +function TPythonScript.Run(AScriptFilename: UTF8String; + APythonVersion: integer): boolean; +var exitCode: integer; begin + result := false; if not CheckScriptAndDependencySafe(AScriptFilename, APythonVersion) then exit; FLinePrefix := ''; FFirstOutput:= true; AutomationEnvironment.Values['PYTHONPATH'] := DefaultScriptDirectory; AutomationEnvironment.Values['PYTHONIOENCODING'] := 'utf-8'; try - RunProcessAutomation(FPythonBin, ['-u', AScriptFilename], FPythonSend, @PythonOutput, @PythonError, @PythonBusy); + exitCode := RunProcessAutomation(FPythonBin, ['-u', AScriptFilename], FPythonSend, @PythonOutput, @PythonError, @PythonBusy); finally AutomationEnvironment.Clear; end; FPythonSend := nil; + result := exitCode = 0; end; class function TPythonScript.DefaultScriptDirectory: string; From bfcac95ba80704a562fbb76bdf7c334962f5c2c4 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Mon, 9 Oct 2023 08:25:44 +0200 Subject: [PATCH 61/70] explicit tkinter import --- resources/scripts/layerfx_innerlight.py | 2 +- resources/scripts/layerfx_innershadow.py | 2 +- resources/scripts/layerfx_shadow.py | 2 +- resources/scripts/layerfx_stroke.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/scripts/layerfx_innerlight.py b/resources/scripts/layerfx_innerlight.py index 200444ec..c9fe18bf 100644 --- a/resources/scripts/layerfx_innerlight.py +++ b/resources/scripts/layerfx_innerlight.py @@ -3,7 +3,7 @@ from lazpaint import dialog try: - from tkinter import * + from tkinter import Tk, Frame, Label, Scale, HORIZONTAL, Button, RIGHT, W, E except ImportError: dialog.show_message("Please install tkinter. On Debian distributions, use the command: apt install python3-tk") exit() diff --git a/resources/scripts/layerfx_innershadow.py b/resources/scripts/layerfx_innershadow.py index 477839d0..0c5e6b1b 100644 --- a/resources/scripts/layerfx_innershadow.py +++ b/resources/scripts/layerfx_innershadow.py @@ -3,7 +3,7 @@ from lazpaint import dialog try: - from tkinter import * + from tkinter import Tk, Frame, Label, Scale, HORIZONTAL, Button, RIGHT, W, E except ImportError: dialog.show_message("Please install tkinter. On Debian distributions, use the command: apt install python3-tk") exit() diff --git a/resources/scripts/layerfx_shadow.py b/resources/scripts/layerfx_shadow.py index 0bb97a03..667531ed 100644 --- a/resources/scripts/layerfx_shadow.py +++ b/resources/scripts/layerfx_shadow.py @@ -5,7 +5,7 @@ from lazpaint import dialog try: - from tkinter import * + from tkinter import Tk, Frame, Label, Scale, HORIZONTAL, Button, RIGHT, W, E except ImportError: dialog.show_message("Please install tkinter. On Debian distributions, use the command: apt install python3-tk") exit() diff --git a/resources/scripts/layerfx_stroke.py b/resources/scripts/layerfx_stroke.py index e9870cd9..f6d71e4a 100644 --- a/resources/scripts/layerfx_stroke.py +++ b/resources/scripts/layerfx_stroke.py @@ -3,7 +3,7 @@ from lazpaint import dialog try: - from tkinter import * + from tkinter import Tk, Frame, Label, Scale, HORIZONTAL, Button, RIGHT, W, E except ImportError: dialog.show_message("Please install tkinter. On Debian distributions, use the command: apt install python3-tk") exit() From f46e0bb8ea10a1ec5072e7b499c37f927be78d6a Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Mon, 9 Oct 2023 08:37:17 +0200 Subject: [PATCH 62/70] avoid superfluous path delim --- lazpaint/umenu.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lazpaint/umenu.pas b/lazpaint/umenu.pas index a87631ff..99471f18 100644 --- a/lazpaint/umenu.pas +++ b/lazpaint/umenu.pas @@ -305,7 +305,7 @@ procedure TMainFormMenu.AddInstalledScripts(AMenu: TMenuItem; AIndex: integer); items.Sorted := true; try repeat - fullname := path+PathDelim+searchRec.Name; + fullname := ConcatPaths([path, searchRec.Name]); if FileExistsUTF8(fullname) then begin title := GetScriptTitle(fullname); From 9ff344928adda1c03832809a67115906b0aaffca Mon Sep 17 00:00:00 2001 From: Lulu Date: Tue, 10 Oct 2023 08:48:31 +0200 Subject: [PATCH 63/70] add methods to save/load key-color association from config file --- lazpaint/uconfig.pas | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lazpaint/uconfig.pas b/lazpaint/uconfig.pas index 1bc6bb33..e6eb8d51 100644 --- a/lazpaint/uconfig.pas +++ b/lazpaint/uconfig.pas @@ -269,6 +269,10 @@ TLazPaintConfig = class function DefaultTransformSelectionAnswer: TModalResult; procedure SetDefaultTransformSelectionAnswer(value: TModalResult); + //palette + function DefaultColorsBoundToKeys: string; + procedure SetDefaultColorsBoundToKeys(value: string); + //radial blur config function DefaultBlurRadius: single; procedure SetDefaultBlurRadius(value: single); @@ -1164,6 +1168,16 @@ procedure TLazPaintConfig.SetDefaultTransformSelectionAnswer(value: TModalResult iniOptions.WriteInteger('Tool','TransformSelectionAnswer', value); end; +function TLazPaintConfig.DefaultColorsBoundToKeys: string; +begin + result := iniOptions.ReadString('Palette','ColorsBoundToKeys',''); +end; + +procedure TLazPaintConfig.SetDefaultColorsBoundToKeys(value: string); +begin + iniOptions.WriteString('Palette','ColorsBoundToKeys',value); +end; + function TLazPaintConfig.DefaultBlurRadius: single; begin result := iniOptions.ReadFloat('Filter','BlurRadius',5); From 2a154d2e6d8a92d49d1c7fe54b6b997eac21b756 Mon Sep 17 00:00:00 2001 From: Lulu Date: Tue, 10 Oct 2023 08:50:17 +0200 Subject: [PATCH 64/70] refactor code to load/save color-key association to config file --- lazpaint/upalettetoolbar.pas | 67 ++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas index 510478e3..c486457f 100644 --- a/lazpaint/upalettetoolbar.pas +++ b/lazpaint/upalettetoolbar.pas @@ -14,7 +14,15 @@ interface type TPaletteVisibilityChangedByUserHandler = procedure(Sender:TObject) of object; - TBGRAPixelBinding = specialize TFPGMap; + + { TBGRAPixelBinding } + + TBGRAPixelBinding = class(specialize TFPGMap) + private const FKeyPrefix = 'VK_'; + public + function SaveContentToString: string; + procedure LoadContentFromString(const aContent: string; FTransparentPalette: boolean); + end; { TPaletteToolbar } @@ -116,9 +124,61 @@ implementation uses LCScaleDPI, Graphics, Forms, UGraph, UResourceStrings, BGRAColorQuantization, ULayerAction, UCursors, UFileSystem, - udarktheme, UTool, LCVectorialFill, math, + udarktheme, UScripting, UScriptType, UTool, LCVectorialFill, math, LCLType; +{ TBGRAPixelBinding } + +function TBGRAPixelBinding.SaveContentToString: string; +var vars: TVariableSet; + i: integer; +begin + Result := ''; + vars := TVariableSet.Create(''); + for i:=0 to Count-1 do + vars.Strings[FKeyPrefix+Keys[i].ToString] := BGRAToStr(Data[i]); + result := vars.VariablesAsString; + vars.Free; +end; + +procedure TBGRAPixelBinding.LoadContentFromString(const aContent: string; FTransparentPalette: boolean); +var vars: TVariableSet; + varName, strDigit: string; + colorValue: TBGRAPixel; + i, digit: Integer; + v: TScriptVariableReference; + missingValues, err: boolean; +begin + if aContent = '' then exit; + vars := TVariableSet.Create(''); + try + if vars.LoadFromVariablesAsString(aContent) = [] then + begin + Clear; + for i:=0 to vars.Count-1 do + begin + varName := vars.VariableName[i]; + v := vars.GetVariable(varName); + if (Pos(FKeyPrefix,varName) = 1) and (Length(varName) > Length(FKeyPrefix)) and (v.variableType = svtString) then + begin + strDigit := Copy(varName, Length(FKeyPrefix)+1, Length(varName)-Length(FKeyPrefix)); + if TryStrToInt(strDigit, digit) and (digit in [0..9]) then + begin + TryStrToBGRA(vars.Strings[varName], colorValue, missingValues, err); + if not missingValues and not err then + begin + if not FTransparentPalette then colorValue.alpha := 255; + AddOrSetData(digit, colorValue); + end; + end; + end; + end; + end; + finally + vars.Free; + end; +end; + { TPaletteToolbar } procedure TPaletteToolbar.SetContainer(AValue: TWinControl); @@ -344,6 +404,8 @@ procedure TPaletteToolbar.ToggleBindColorToKey(aColor: TBGRAPixel; aDigit: integ RemoveBinding; FColorsBindToKey.Add(aDigit, aColor); end; + + LazPaintInstance.Config.SetDefaultColorsBoundToKeys(FColorsBindToKey.SaveContentToString); end; function TPaletteToolbar.TryToGetColorBoundToKey(aDigit: integer; out aColor: TBGRAPixel): boolean; @@ -665,6 +727,7 @@ procedure TPaletteToolbar.SetLazPaintInstance(AValue: TLazPaintCustomInstance); FVisible := FLazPaintInstance.Config.DefaultPaletteToolbarVisible; PanelPalette.Visible := FVisible; FillPaletteWithDefault; + FColorsBindToKey.LoadContentFromString(FLazPaintInstance.Config.DefaultColorsBoundToKeys, FTransparentPalette); end else begin FColors.Clear; From f19b95f0552587e954acad466b7170adcb481171 Mon Sep 17 00:00:00 2001 From: Lulu Date: Wed, 11 Oct 2023 20:30:13 +0200 Subject: [PATCH 65/70] refactor using existing capabilities --- lazpaint/upalettetoolbar.pas | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/lazpaint/upalettetoolbar.pas b/lazpaint/upalettetoolbar.pas index c486457f..73563879 100644 --- a/lazpaint/upalettetoolbar.pas +++ b/lazpaint/upalettetoolbar.pas @@ -136,7 +136,7 @@ function TBGRAPixelBinding.SaveContentToString: string; Result := ''; vars := TVariableSet.Create(''); for i:=0 to Count-1 do - vars.Strings[FKeyPrefix+Keys[i].ToString] := BGRAToStr(Data[i]); + vars.Pixels[FKeyPrefix+Keys[i].ToString] := Data[i]; result := vars.VariablesAsString; vars.Free; end; @@ -144,10 +144,8 @@ function TBGRAPixelBinding.SaveContentToString: string; procedure TBGRAPixelBinding.LoadContentFromString(const aContent: string; FTransparentPalette: boolean); var vars: TVariableSet; varName, strDigit: string; - colorValue: TBGRAPixel; i, digit: Integer; v: TScriptVariableReference; - missingValues, err: boolean; begin if aContent = '' then exit; vars := TVariableSet.Create(''); @@ -159,18 +157,11 @@ procedure TBGRAPixelBinding.LoadContentFromString(const aContent: string; FTrans begin varName := vars.VariableName[i]; v := vars.GetVariable(varName); - if (Pos(FKeyPrefix,varName) = 1) and (Length(varName) > Length(FKeyPrefix)) and (v.variableType = svtString) then + if varName.StartsWith(FKeyPrefix) and (Length(varName) > Length(FKeyPrefix)) and (v.variableType = svtPixel) then begin strDigit := Copy(varName, Length(FKeyPrefix)+1, Length(varName)-Length(FKeyPrefix)); if TryStrToInt(strDigit, digit) and (digit in [0..9]) then - begin - TryStrToBGRA(vars.Strings[varName], colorValue, missingValues, err); - if not missingValues and not err then - begin - if not FTransparentPalette then colorValue.alpha := 255; - AddOrSetData(digit, colorValue); - end; - end; + AddOrSetData(digit, vars.Pixels[varName]); end; end; end; From 31746f88ff9687c05f48f7e1dbe83d18b2c96224 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Fri, 3 Nov 2023 06:46:43 +0100 Subject: [PATCH 66/70] relative URL, jQuery not necessary --- web/config.toml | 3 ++- web/layouts/_default/baseof.html | 4 +--- web/layouts/index.html | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/web/config.toml b/web/config.toml index 18f9f518..7bf752ed 100644 --- a/web/config.toml +++ b/web/config.toml @@ -1,7 +1,8 @@ baseURL = "https://lazpaint.github.io/" +relativeURL = true defaultContentLanguage = "en" title = "download_lazpaint" -disableKinds = ["taxonomyTerm"] +disableKinds = ["taxonomy"] [params] repo = "https://github.com/bgrabitmap/lazpaint/releases/download/" diff --git a/web/layouts/_default/baseof.html b/web/layouts/_default/baseof.html index 8fec50a8..9824ad94 100644 --- a/web/layouts/_default/baseof.html +++ b/web/layouts/_default/baseof.html @@ -1,7 +1,5 @@ {{ partial "header.html" . }}
{{ block "main" . }}{{ end }}
- {{ block "dynamic" . }}{{ end }} + {{ block "dynamic" . }}{{ end }} {{ partial "footer.html" . }} \ No newline at end of file diff --git a/web/layouts/index.html b/web/layouts/index.html index a4c971a4..c14b34a3 100644 --- a/web/layouts/index.html +++ b/web/layouts/index.html @@ -69,9 +69,9 @@

MacOS

if (OSName != "unknown") { - osHint = $('#os-hint'); - osHint.text(osHint.text().replace("%s", OSName)); - osHint.css("visibility", "visible"); + osHint = document.getElementById("os-hint"); + osHint.innerHTML = osHint.innerHTML.replace("%s", OSName); + osHint.style.visibility = "visible"; } {{- end }} From a2cae2aecb9e4aaa6e79fe2dfb30f954d6be0eb9 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Fri, 3 Nov 2023 06:53:05 +0100 Subject: [PATCH 67/70] typo --- web/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/config.toml b/web/config.toml index 7bf752ed..728be607 100644 --- a/web/config.toml +++ b/web/config.toml @@ -1,5 +1,5 @@ baseURL = "https://lazpaint.github.io/" -relativeURL = true +relativeURLs = true defaultContentLanguage = "en" title = "download_lazpaint" disableKinds = ["taxonomy"] From 9a82ad35ccca64f48ffb5c5b1292de339535ce40 Mon Sep 17 00:00:00 2001 From: Johann ELSASS Date: Fri, 3 Nov 2023 09:34:15 +0100 Subject: [PATCH 68/70] replace bootstrap by picnic, highlight os download --- web/layouts/index.html | 68 ++++++++----- web/layouts/page/last.html | 9 +- web/layouts/partials/header.html | 30 +++--- web/layouts/partials/nav.html | 12 +-- web/static/css/bootstrap.min.css | 7 -- web/static/css/bootstrap.min.css.map | 1 - web/static/css/picnic.min.css | 1 + web/static/css/style.css | 147 +++++++++++++++++++++------ 8 files changed, 187 insertions(+), 88 deletions(-) delete mode 100644 web/static/css/bootstrap.min.css delete mode 100644 web/static/css/bootstrap.min.css.map create mode 100644 web/static/css/picnic.min.css diff --git a/web/layouts/index.html b/web/layouts/index.html index c14b34a3..a036575b 100644 --- a/web/layouts/index.html +++ b/web/layouts/index.html @@ -15,53 +15,65 @@ {{ $link_macos32_dmg := printf "%s_macos32.dmg" $prefix -}} {{ $link_macos64_dmg := printf "%s_macos64.dmg" $prefix -}} {{ $link_macos_brew := "https://formulae.brew.sh/cask/lazpaint" }} -
-
-

{{ printf (i18n "download_version") .Site.Params.version}}

-

{{ i18n "donate" }}

- +
+
+

{{ printf (i18n "download_version") .Site.Params.version}}

+

{{ i18n "donate" }}

+ +
+ + + +
+
{{- end }} {{ define "dynamic" }} {{- end }} diff --git a/web/layouts/page/last.html b/web/layouts/page/last.html index d38b6ff9..3dd3cb1c 100644 --- a/web/layouts/page/last.html +++ b/web/layouts/page/last.html @@ -6,10 +6,11 @@ {{ $text := replace $text "\n-" "\n•" -}} {{ $text := trim $text "\n\r\t " -}}
-
-
-

{{ $last.name }}
GitHub

-
{{ $text }}
+
+
+

{{ $last.name }}

+ +
{{ $text }}
diff --git a/web/layouts/partials/header.html b/web/layouts/partials/header.html index c85593f3..d88a0cdd 100644 --- a/web/layouts/partials/header.html +++ b/web/layouts/partials/header.html @@ -21,7 +21,7 @@ - {{ $css := "css/bootstrap.min.css" | relURL -}} + {{ $css := "css/picnic.min.css" | relURL -}} {{ $css := "css/style.css" | relURL -}} @@ -29,22 +29,22 @@ {{ i18n .Title }} -
- {{- $this := . -}} - {{- range $.Site.Home.AllTranslations -}} +
+
+ {{- $this := . -}} + {{- range $.Site.Home.AllTranslations -}} {{- if eq $this.Site.Language .Language }} - {{ .Language }} + {{ .Language }} {{- else }} - {{ .Language }} + {{ .Language }} {{- end -}} - {{- end }} -
-
-
- {{ $img := "img/lazpaint_icon.png" | relURL -}} - -

LazPaint

-

{{ i18n "app_description" }}

+ {{- end }} +
+
+ {{ $img := "img/lazpaint_icon.png" | relURL -}} + +

LazPaint

+

{{ i18n "app_description" }}

+
{{ partial "nav.html" . }} -
\ No newline at end of file diff --git a/web/layouts/partials/nav.html b/web/layouts/partials/nav.html index 3b0daa08..76b3200c 100644 --- a/web/layouts/partials/nav.html +++ b/web/layouts/partials/nav.html @@ -1,5 +1,4 @@ - \ No newline at end of file diff --git a/web/static/css/bootstrap.min.css b/web/static/css/bootstrap.min.css deleted file mode 100644 index 92e3fe87..00000000 --- a/web/static/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/web/static/css/bootstrap.min.css.map b/web/static/css/bootstrap.min.css.map deleted file mode 100644 index 1e9cb78a..00000000 --- a/web/static/css/bootstrap.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-align: center;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: stretch;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: -ms-flexbox;\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n -webkit-transform: translateX(0.75rem);\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n -ms-flex-direction: column;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group > .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n -webkit-column-count: 3;\n -moz-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n -moz-column-gap: 1.25rem;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: progress-bar-stripes 1s linear infinite;\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -50px);\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: none;\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: -ms-flexbox;\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n -ms-touch-action: pan-y;\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n -webkit-transform: none;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: spinner-border .75s linear infinite;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: spinner-grow .75s linear infinite;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all ``s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on `s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on ` receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `