higale 1 Minggu lalu
induk
melakukan
50c3ac76c9
47 mengubah file dengan 19294 tambahan dan 1 penghapusan
  1. 24 0
      .gitignore
  2. 94 0
      DocWinList.pas
  3. 7 0
      Entitlement.TemplateOSX.xml
  4. 282 0
      FormAbout.fmx
  5. 93 0
      FormAbout.pas
  6. 1995 0
      FormDocument.fmx
  7. 1197 0
      FormDocument.pas
  8. 52 0
      FormLogger.fmx
  9. 53 0
      FormLogger.pas
  10. 6907 0
      FormMain.fmx
  11. 657 0
      FormMain.pas
  12. 590 0
      JSONTreeView.pas
  13. 133 0
      JsonDocument.pas
  14. 291 0
      MacOpenFileDelegate.pas
  15. 166 0
      Pub.pas
  16. 35 1
      README.md
  17. 20 0
      data_const.pas
  18. TEMPAT SAMPAH
      galeJSON.Artwork/Windows/AppIcon.icns
  19. TEMPAT SAMPAH
      galeJSON.Artwork/Windows/AppIcon.ico
  20. TEMPAT SAMPAH
      galeJSON.Artwork/Windows/Uwp_150.png
  21. TEMPAT SAMPAH
      galeJSON.Artwork/Windows/Uwp_44.png
  22. TEMPAT SAMPAH
      galeJSON.Artwork/macOS/AppIcon.icns
  23. TEMPAT SAMPAH
      galeJSON.Artwork/macOS/AppIcon.ico
  24. 173 0
      galeJSON.deployproj
  25. 41 0
      galeJSON.dpr
  26. 1336 0
      galeJSON.dproj
  27. TEMPAT SAMPAH
      galeJSON.res
  28. TEMPAT SAMPAH
      galeJSON_Icon.ico
  29. 0 0
      image/json.svg
  30. TEMPAT SAMPAH
      image/json_1024.png
  31. TEMPAT SAMPAH
      image/json_16.png
  32. TEMPAT SAMPAH
      image/json_24.png
  33. TEMPAT SAMPAH
      image/json_32.png
  34. TEMPAT SAMPAH
      image/json_48.png
  35. 13 0
      info.plist.TemplateOSX.xml
  36. 386 0
      lang.json
  37. 528 0
      utils/FMXTrayIcon.pas
  38. 199 0
      utils/LineNumbersMemoFMX.pas
  39. 448 0
      utils/Logger.pas
  40. 145 0
      utils/SaveDialogsEnhanced.pas
  41. 333 0
      utils/WinSizeUtil.pas
  42. 468 0
      utils/fmFontDialog.fmx
  43. 424 0
      utils/fmFontDialog.pas
  44. 586 0
      utils/galeNotice.pas
  45. 293 0
      utils/jsonhelper.pas
  46. 124 0
      utils/memo_json_auto.pas
  47. 1201 0
      utils/rjson.pas

+ 24 - 0
.gitignore

@@ -0,0 +1,24 @@
+# Delphi/Embarcadero
+*.~*
+*.identcache
+*.local
+*.stat
+*.tvsconfig
+*.dproj.deployproj
+*.dproj.opendb
+*.dproj.ota
+
+# macOS
+.DS_Store
+
+# VSCode
+.vscode/
+
+# History/Backup
+__history/
+__recovery/
+
+# Output
+Win32/
+Win64/
+OSX64/

+ 94 - 0
DocWinList.pas

@@ -0,0 +1,94 @@
+unit DocWinList;
+
+interface
+
+uses
+  FormDocument,
+  System.Generics.Collections, FMX.Forms, System.SysUtils, System.Types,
+  System.UITypes, System.Classes;
+
+type
+  TDocumentWindowList = class(TObjectList<TfmDocument>)
+  private
+    function GetNumOfVisible: Integer;
+    function GetActiveWindow: TfmDocument;
+    function GetLastActive: TfmDocument;
+  public
+    property NumOfVisible: Integer read GetNumOfVisible;
+    property ActiveWindow: TfmDocument read GetActiveWindow;
+    property LastActive: TfmDocument read GetLastActive;
+  public
+    function Add(const Value: TfmDocument): NativeInt;
+    function Remove(const Value: TfmDocument): NativeInt;
+    procedure ShowAll;
+    function HasActiveWindow: Boolean;
+    function GetWindowByFilename(const AFilename: string): TfmDocument;
+  end;
+
+implementation
+
+function TDocumentWindowList.Add(const Value: TfmDocument): NativeInt;
+begin
+  Result := inherited;
+end;
+
+function TDocumentWindowList.Remove(const Value: TfmDocument): NativeInt;
+begin
+  Result := inherited;
+  if Count <= 0 then
+    Application.MainForm.Close;
+end;
+
+procedure TDocumentWindowList.ShowAll;
+begin
+  for var item in self do
+  begin
+    if not item.Visible then
+    begin
+      item.Show;
+    end;
+  end;
+end;
+
+function TDocumentWindowList.GetNumOfVisible: Integer;
+begin
+  Result := 0;
+  for var item in self do
+  begin
+    if item.Visible then
+    begin
+      Inc(Result);
+    end;
+  end;
+end;
+
+function TDocumentWindowList.GetActiveWindow: TfmDocument;
+begin
+  for var item in self do
+    if item.Active then
+      Exit(item);
+  Exit(nil);
+end;
+
+function TDocumentWindowList.GetLastActive: TfmDocument;
+begin
+  if Count > 0 then
+    Result := First
+  else
+    Result := nil;
+end;
+
+function TDocumentWindowList.GetWindowByFilename(const AFilename: string): TfmDocument;
+begin
+  for var item in self do
+    if item.lblFilename.Text.ToLower = AFilename.ToLower then
+      Exit(item);
+  Result := nil;
+end;
+
+function TDocumentWindowList.HasActiveWindow: Boolean;
+begin
+  Result := GetActiveWindow <> nil;
+end;
+
+end.

+ 7 - 0
Entitlement.TemplateOSX.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<%appSandboxKeys%>
+</dict>
+</plist>

+ 282 - 0
FormAbout.fmx

@@ -0,0 +1,282 @@
+object fmAbout: TfmAbout
+  Left = 0
+  Top = 0
+  BorderStyle = None
+  Caption = #20851#20110'...'
+  ClientHeight = 240
+  ClientWidth = 400
+  Position = ScreenCenter
+  StyleBook = fmMain.StyleBookBlack
+  Transparency = True
+  FormFactor.Width = 320
+  FormFactor.Height = 480
+  FormFactor.Devices = [Desktop]
+  OnCreate = FormCreate
+  OnClose = FormClose
+  OnDeactivate = FormDeactivate
+  DesignerMasterStyle = 0
+  object Panel1: TPanel
+    Align = Client
+    Margins.Left = 10.000000000000000000
+    Margins.Top = 10.000000000000000000
+    Margins.Right = 10.000000000000000000
+    Margins.Bottom = 10.000000000000000000
+    Size.Width = 380.000000000000000000
+    Size.Height = 220.000000000000000000
+    Size.PlatformDefault = False
+    StyleLookup = 'panelstyle_radius'
+    TabOrder = 0
+    OnMouseDown = Panel1MouseDown
+    object btnOK: TButton
+      CanFocus = False
+      Position.X = 153.000000000000000000
+      Position.Y = 176.000000000000000000
+      TabOrder = 0
+      Text = #30830#23450
+      TextSettings.Trimming = None
+      OnClick = btnOKClick
+    end
+    object ShadowEffect1: TShadowEffect
+      Distance = 3.000000000000000000
+      Direction = 45.000000000000000000
+      Softness = 0.300000011920929000
+      Opacity = 0.300000011920929000
+      ShadowColor = claGray
+    end
+    object imgLogo: TImage
+      MultiResBitmap.Height = 24
+      MultiResBitmap.Width = 24
+      MultiResBitmap.LoadSize = 2
+      MultiResBitmap = <
+        item
+          Width = 32
+          Height = 32
+          PNG = {
+            89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+            F40000000473424954080808087C0864880000081A494441545885B596699015
+            D515C77FE7F6F2D679F386611B06D99440466B34208845492462B0B414AA3489
+            2491184A54486930984252F94025224C120C89025A5A062D131554A4CA445153
+            4ADC4004470324941890C561322333EFF1B67EBDDC7CE8C7F06684A1B29D4FDD
+            7DBAFBFCEE3DCBFF0A7DACF9EE1317B88DE5556D47E462415B7DFD67B3C6B422
+            15557ED9D5F7BCFF93F4C3677B5FAA6FC6CDCB0F2B0F710F9C375CEC6F5C1821
+            6681EEF3B2A14010DC40D3D704D8B0ABCCDF8EF9A46382D62CD8B934FD507F00
+            66F54D7C8273A7FB39F6EA59299A1A8DB3C19FD6B61FF47973BF473A2688B06E
+            F28A6EDEEB074255DFE43BD5888684E2BC21A70FBEFE5D87ABD76499FFFB1C5F
+            5C7F68255763577D1E08EB26AEEC5E7026805E3B20E8921708D9926660F25476
+            36EE2A73D7B379BC00BA8B9AEB2FB211A0ECC1035B4B6CFDD8A52D13601BE006
+            30BCAED7BA10583BB125233B97D4AEED17804ACAABD37BEB93791ED95264E135
+            315A66C789D982A1A03D1B30EDFE2CFB3B03BE3AD6A4B9D1A0E38466779B4FDC
+            169211F0832A08ADD74C6AC9B0A30F445F00002295A7776C0883BFBCB496994D
+            6143ACD85264E9CC182DAF14199E56EC5B96EEF9CEF561EBC72ED73E7482BA98
+            30B84611685DFDDF359356640B3B96A6D69F7CD67BAF2A561B13767FE6F3E0CB
+            45B6FD3CCDCC268B6C4933656586C7DE7108348CAA373015FCEAB5226F7FE201
+            60193063BCC5E373930CAE51644B1AC70B53E5FA952D96604EBF3B605452BFFA
+            F512CB6E4870C928933FEF73F9D36E974F8F07BCBA288512B8737A94F31B0C36
+            7E5066C7C122CFB71ADC3D234A43ADE29B136C6635DBEC6BF7311428816C49B3
+            68639E8CA3DBFB051009096C03C60C50ACDFE6E0B89AA60683F9D3228C1978AA
+            C4AF186F71C5F83035B73F9567E1D37936DD56D393C6E63EADAC045CAF77037D
+            01C00B349E0F0BA74559F25C9E6F4F8970F39428D37F9DE5DA669B6D075C36EE
+            2A73C96893842D648A9AD6231ECFED7458FCF5D8E9320A405741A32B10FD0240
+            B85D170C33F8E31D2900163C9D27D0B0705A84CF32011B7639ACDFEE602A8898
+            C2901AE1A7D7C4F9E1F4E81901CCD3565B1F000D5D0075F15398731FCF11B384
+            AD3F0A61C60C34F8FC970368CF0628250C88876D7936AB890A02F89518274D46
+            2ECF378C30CAF34B4A629EC7D5A641F3858D26B6014733012FED71993F3542CC
+            160A8E4604D27121610B5A83E369F2E57002EA338D47C201D57AC4C3F5D96D99
+            BC181DE8170FBD187D4426ACECFEBB298CD31A9482E379CDE1AE809AA8908C08
+            8392C29E369F7C418311068F9861F000C81434AEAB4155F9088750B61802A7A2
+            8269C0883A45C98582ABA94D0838B24F26AFECD23EE1F668206187D7651F8E65
+            7D3C1FBE728E497D52389ED71C3A1E609A902B69DAB301170C33694C2B728EE6
+            C3231E5A8792EC6B885B821FC0B11301F509C1F5216A826508794723B6C60C90
+            9C40D2F1C2EADF746B0DF509A17979869825ACB929C9E5634F95CA9AAD25EEDA
+            906750AD62E5EC04F3A7467A7CDB0E782C7E3ECFAE4F7DAE6CB2786A5E123F80
+            398FE5D87ED04503BF989DE0C68B6D6E5A9F63E7212FA72A0B47136AC0D09422
+            6E0B9FE703965F17E7F2B1260F6E2D31F3B7591E78A3C4D1EE00DF87FBAF0F83
+            EF6DF359B421CFE68FCA4C196DF2EC2D35442C289435095B484585D537C4C394
+            1434A958583FA6023F40F7D4AF005299587E00861246D787EEBD6D3EAFBCE770
+            E71339D6BDE5306BA2CDB726DAECEFF099BA2AC36F5E2F317BCD09367F54A6A1
+            5631774A84235DA11275E43463071B2CBF2E8ED71150F6F4C98EC390336881A1
+            4267CBAB2500D6DE9860C77D75CCB92C4A77A7CF84E1614A9ED95926EF682E3D
+            D724951036B59601681E66F628EAFA6D259EFBB0CCC26951868C3239D0794A22
+            03AA0044C0F34F49E8C87AC5A6D632731ECBF1D67E978B4798FCE1FB49665C64
+            D3960D5FF282B073B406C3901EC1A9B6A829CCFB5D0E8027E7257B0E8127278D
+            3255A8547BDB7CBA8B9A64347429150EA4A7DF2E71D9BD19E6547EF2B3EBE2EC
+            3E16469AD56CA3B5F0C1619FAEE37E8F64B71EF17A46EE39758A6CBBCFBD2F15
+            9931CE62C165D15E046677513366A0E26BE3628C1F6210B7E0AD4F3CF61CF658
+            F79D246D9980CDAD2E83AB4E487FF9ABCB7B9F7A4C1E69B2F9F61A1E7DB3C415
+            5FB6987B4984B66CC013DB1D268F322BE914A2830DEEDB52646693C5A49195E7
+            1216BD992D69A29670FFF57100FED1E9B3E485020517CE1D64F0DDC9117E7C65
+            2832BB0E7BDCF3428141B5C2CD4FE4587D4382AB9A2CAEAAACFC83C31E3F78A6
+            80E341D20E81CBBE261E01DB10166DCCB3E58E14C988A011444026ACE87600FB
+            C2E106B6216C3FE8D1990B185AABF07D38BFC160484AD1910B78E7138FB20F23
+            EA1547BB021C4F73E96893A129455741F3EE010FD7D70C4B2B84B0A5F38EA623
+            A78959F0CF9C6674BD221911DA4F681C579765724BB7F603F82C13A081BA9890
+            A9B462BEACC9E535F81A0CA12621C46C21082ADAEE6BBAF21ADCD09F4A0A514B
+            40831B68BA729A882DE1111D386780A2BBA0713C4D7D52B095C27402EBB68872
+            9634A68DA817E8B465109FFE250BEBB442FD9F9BEBC18E431E8988146A63AA5B
+            443BA5B26EE9A9ACCB9769F328DD8F0E4ACAF7DE5E5CFBBF8D5EB1A9AB3274E4
+            F4E38DA46F79639978503507DE58269E610414CBFF97D800945C308C8093C17B
+            0100D4F9465B67DE67F5EB251CAF1F71FF37CDF134AB5F2BD1510CA81B60B455
+            FB7A9DD09A96E5865A11EF60B61044CE1B641031FB1CE0FE0B808F8FFBD48A72
+            DC7673D4DEB5C963A7050038FFBE134D29DC55C78A3229D0DAFE5F002891F2D0
+            117A47F67D6BF19E876BF656FBFE052B1D8306B059B3120000000049454E44AE
+            426082}
+          FileName = 'C:\Data\Dev\svn\gsJSON\image\json_32.png'
+        end
+        item
+          Scale = 1.500000000000000000
+          Width = 48
+          Height = 48
+          PNG = {
+            89504E470D0A1A0A0000000D49484452000000300000003008060000005702F9
+            870000000473424954080808087C08648800000D73494441546881C599799454
+            D59DC73FF7BE575B5757577775B377D3ACA2A8A02C82828A5BC6A8A36626C689
+            8A9A3128D1839ED19C808E73C44C66EC3651992C8EC60515C5931309EEE6C46D
+            820A51C4207A501B6C1459A4B7EADAABDE72EFFCF1AAABBAA081C6A3F83BA7FB
+            74BF7BDFBDBFEFFD6DDFDF7D8203C89C873A4FB3BBFD37588E3AC155541F68EE
+            A18ACF10181240D8CA61D1867F8FAEFC2AEB88FD0D4CBE3EB5A8FE18FBD75BDB
+            C19410F2EF77EA5792904F10304169008DD2FAB2F76E8E3D71A8EB0CA8D5B45F
+            F54EF76BDEFDAC5B71C6241FD7CC0D120B7F7D0004F0BB3579566FB419552BFA
+            3D17F3D72F893E7E286B99033ED5E2F6CE8CCBE4E1068F5FF9B57A4E49864725
+            E982A6FF196AF48A992D3DAC5F121B340839D04343E9A91D09CD79C7FA07AD90
+            D2B069874B77460F6A7EC1D69803ECAE912B66B426E60F76DF0101680D528252
+            0757E6EF5F38DCFA6C9653EF4E72D2AF125CF2706A501BFB0CC17E97D7FAB119
+            2DF1CB07B3CE7E5C0857008EDAFF8B9FEC71B9FBD53CCBD715B0938A49E34C32
+            39456D5565ACECEA55BCD5EEB0B5D365475C91CC6B0C09BB138AA6BA03C59578
+            74466B42BFBB38BAE2D0011C447EFBD73C4B5FC8D1FD85C3EC697E7E7272986D
+            DD2EDD191FFF757E15E0B9D4D2E7B33CBEDE62DB6E070A8001840491A0A03624
+            688A492CE7001B69FDD8F4D6B8DCB0B8EED1AF0DC04F9ECC70DF8B39823149EB
+            8FAAB9E1F41001132C57E337CA277AD3AA0CCB56661832D1C745B3824C1E2169
+            8E1900ACD96AF3DE175EBCD48604EE012C2DB478647A6B9CFD81382400373C95
+            E1BE67B24C3EDAC703975673D2B8F2EB6BDB1D9239CDF953FC6CDAE9F2BF6BF2
+            5C7B71986B4F0972F408A334EFA3DD2E73C79B047D8253EF49F26542333C7A70
+            1033EF488AF537D73CB2F7D880413C90ACDA68F1EB5559A61CEBE795EB6B2A94
+            7FFE038BD316C779EE030B80355B6C0A09CD9D175655280F307EA8C1C4A1064D
+            7592D60BABD8997069EF5238AEE776AEAAFCD1DA4BB45AA8E5F396EAE0DE7A0D
+            CA02394B73CBD359C243242F5C176144B48CFB972FE7F9D9EA0C8D937CB45C18
+            06E0E40926C71FE963EC7FF4326DB4C93F1EEBE3DC63FC8CA997F8FBE1B9689A
+            9F48B08696BFE468EF72B15D3004A5D220804840505B25B05D522976EF73E083
+            02F0F2C7366D6D362B6FACA1B1D65BC355F0A31569762714D501C192EF86A82F
+            56EBA98D26EB9744B9F7AF799EDD64D1FA728E9FBF94E3A4B1260F5C1AA6A1BA
+            ACC7D9937D9C3DD9C7C61D0EBD598D94A254DA8480673659AC5C5F6064545AFE
+            1A779FC47B4000A2B8D2FF6D713872928F1FCE0800B069A7CBD54FA4B9F48400
+            211F7CD6ADB8EE944AEB1A0216CD0BB2685E10DB8575DB6CEE7925CF29F72459
+            F5E30847EDE55AC7350EACCA964E97784633323AB08E838A0109C4AA258E8265
+            AFE599FF488A9F9E1562D1BC204B9EC9F1E45511B67478BE3C90F80C3865828F
+            D50B2374261477BD9A1BCCB60024721AFF018EF98016D045832D3A2DC873BF49
+            12FDB71E668F33F9C355118E1C6EF0AF8F679835C62499537CB853D114933CF6
+            B70297CFF6130D495CA5C9D9D099527CF4A5CBEAF72DBA129AD327F9060DE060
+            32A818688E495EBC36C2DA7687F9B33C377AFB3387E52F66B9E094203D19CD95
+            270698FDCB046F6F757871B3978D5C059982E6CBA422D1ADC08185E785B86466
+            E0F00200183FC460FC10CF6FB336FCC36F92CC39CECFEDE75531B5D140293866
+            84C1AE84A66D8F8BD2601A100D4A8E1E6170C4717EBE3BD9CF0FA60F9E207E65
+            005AA01DE5351D7BCBDA76874B1E4871FE143F8F5D51A6DA52C283975553B035
+            3B131AC7D5F84D417DD8A30E5F55AAFCA28F93E975C9C6C2A0000850211F74A6
+            153B7ACB81F9C65687AB1E4D33AC46D0FABD2AE2594DC62A67B6800175559271
+            0D65855D05A982266B691C170647B6CBD2915284BC90D12C15FB64090130E78E
+            DEFFB61073B550C5DC26A60301ADA9A0BCDD1945C010343778242C953F54750E
+            5DA428A57347C0BB1AAD10528562EEBA3716D42D16535B12CB03425FA9A0E278
+            A48082E391B43E09985E1F6B399077BE79E501FC46FFDEB99F7E3E4DBE47FE41
+            CC6A896B0751D11C4BE19DAEADBC8214095656C7544193CC691CE59930E81344
+            43951B89E2AF4C4193CC7B73FBD68A0405E8F2794901194B532852EBB05F10F4
+            5122785280E5526C413D7A610232AC315D445E4045197515C4C212537A0AE56C
+            8D9490B3E0B31E97F10D06C74D34A9F20B5CA5E94C69B6C7158EF23633A507F2
+            8BB8626CBDC189E30CC27E41DE86AD9D2E6D7B5C46D64AA2412F401D05D190C0
+            27BD63FA32A9D0DA03A1B4371E30BD8C069E3EAE029D133913B0E907C055D095
+            512C9F5FCDECB1269FF7282E7938453CEBBDF8B3B3425C3E2B40535D65117FEC
+            6F05163F93A53926E94869F28E66C977425C3A33C0E85879EEEE84E2C9770BDC
+            F35A9EBC0D43AB05DB7B14CBBE1FE6FCA95EB43EB9DEE286A7321C3DDC0BC95D
+            BD8A738FF5F33F1779CDD2C295195E6FB3191195CE8059A8CF0261BF606844A2
+            34EC4A285A2FAC62D1BCB2B136EE70089882A3861BCC3BC287AB209ED5E46CCD
+            8A2BAB39A35FC555CA4BB523A2921BCF08317DB4C925CBD324F2650B848B774F
+            3F9E13E0CF9B2D5EF9D8E6A8E146C9027DE37EB3DCEE0E0840167D17BC5848E5
+            35131A0CAE3BD553BEADC3E5F247D36CEF51F84DC1EC3126236B25A36A256D7B
+            1C965D142E29FFF63687FFFC738E785A31BC56D272411513871A9C3AD1C792EF
+            8458F27496704090B32BA3F4EEEF87997D678278CEEBA1FBF7E7AE2A13CD4191
+            39CB85FA6A41D1454917346F7FE610CF6A22018F69FEF1BD02394B33A3D9C782
+            391ED0AD9D2E17DC9FE2F54F6CF6A4354F6FB4F89787D3A5F47BF5DC20470D37
+            48F44BC71D2985AB60749DE4F673AB68EF74D17BD541D1EFFF4101A80E08DA3A
+            5CF624BD8DA635996C5852CB39C7F8E84C6BF2368C8C4A3AD28AD38E28BBCDFD
+            6F16886735534619D4550966369B7CB0D361F5FB1E570A9830738C8995291FEF
+            9B9F3ADCF56A1E800573039C79A48F8E0E77DF3B247D0800423ECF956E5C9529
+            3D9BD664B06A4184A716543367BC495B878BA3604C7D79C94FF6B80C8994A800
+            0A8F1A7CB8CB2DCD69A816DE405186D5486E7B3ECBA79DDE9C6517558380643F
+            2B1DD4029A3295A6F877734CF2D2668BEFFD3EC5EB6D76696CEE781F7FBA3AC2
+            F953FCA4BA55C5CD049A92DBF5AD2385C0EE5F95F62A50752141DED6DCF0C72C
+            00470C952C3C2BC4968E3268D1EFB57D0008018E0B6E118129C190DEADC18421
+            06EBDA1D2E7E28CD05F7A558DB5EBED4F9ED0FC284AA05DBE3E58D1AEB243D19
+            5DBC46074342D65234D596BBB1AEB4AED0C2513071A8C10B1F5AAC78C7E36EBF
+            38AF8A338FF4950A5BFFB22BFB94CCDB9AAEB4269ED5B89AD2261A8F4E1812B6
+            F728C27E4163ADE48DAD3673EE4CB06AA3E7CF91A060FA781FAF7C5CB6CE15B3
+            03580EECECF58ADC960E455D58F2CFC77B94BAE068DEF9DC2110AE3C470134D7
+            4B6E7926CBEE84A23E2CB8F5EC50C5215700C85A9A91B59263461A24729A8573
+            038C1FE22DBA79B757399BEB0D969E1BA23926D91E570801D2F0ACD52701035E
+            6FB3797FA7F770D6189387E68709FB055D2945539DE491F9D534170BDBEFDF2C
+            F0F1972E357BD16DA5A13E2C49E43437FDC973A5A04F942CD95F4C808EB46666
+            B3E4C1CBAA69EF528C6B28CFBC774D1E0DB82E2C3C39C8C29383BCF6894D6FCE
+            CB2E138A4DCE731F587CB8CB655844B2E089342F2FAA211A12CC3F21C08553FD
+            6CEB541C3BCA289DDEBA6D0E77FC25C7E898A433ADF115BD2A600A349E2B4D1A
+            66F0D47B16174CB1B8B85F2364C832E7927D0FBAD29E83F5299FC8697EBA2ACB
+            DA768789430DBA328AB662209D3EC9C73F1DE767C2100357C1CAF51637AECA12
+            0D09C635186CEB529CF3BB242F7FE4B953242098D2E8299FB5340FBE55E0870F
+            A70818826891D80D2452C0E898E49667B37CDE534E55024AEF88192DBD495711
+            0138BEC9646CBD246B69DEF8D461F36E97B1F512D3F036964230B5D1604C4CE2
+            3705899C66E30E870DDB5DEAAB050D6181ED7AB7105F14C9DDECB126478F3008
+            F904F1AC66C376878D3B1C864624F5C5F9960B8DB5929AA097813EEF51A53EC0
+            94B027A519552B4B77523B7BBD5B6E9F414ACC68E975A4C07095375070351241
+            5D5810AB12A5942A855781E3594DC1D1C56F08829AA0D7364A51C9D9A5005B79
+            96CD14406B8D213DDA1DAB1220CAA9DA94D09DF1BA36BF2918522DD0FDE876FF
+            71F0E223E40757638B19ADF1145AECF31D69A086E6DB90FD3534426AB4232DD3
+            727CD7854CEB51575786B8D21E7229F622228759F6B66C9F0821B05C7DBD0038
+            B1B5EB0407DF0CE52A13038416B77DDEE3C6AE991BE49A93F7B9103EACF2E05B
+            05EE5D93A3396624D17AA996B8A6D06EC132FFBEF1D69AB526C0BAC50DEF00EF
+            F4BD34A3A57751CE263634520E9C6F4B864524392F9925DFBDB9EE9EBDC7F7A7
+            5D5050C987BE2D51946EDB83D3EFD7FBDC490E084048A8F20936ED3CD007ACC3
+            239B773B047D022170365CCD3E0A0D0840E5C5A6C621829736DBDCBB264FDE3E
+            FCA628389A07DE2AF0ECFB164DF512D7E6438418DCF7014399B799C23AA7BE5A
+            F2F31773ACDE68EDF3F9F49B96444EF3C12E9786902418D0885AE3F681E6ED57
+            AB237E91BE7158C0BA2BA7243D697DD8EB81DFF08A69B04ED1FDBE79F3C7F7D6
+            B40C34EF80C73AF78EAE33B3AE7993E1D353F500C5EE1B968C566C0A8E52CBDE
+            BA22F6D2FE26FD3F3398E5FDB240EB900000000049454E44AE426082}
+          FileName = 'C:\Data\Dev\svn\gsJSON\image\json_48.png'
+        end>
+      Position.X = 69.000000000000000000
+      Position.Y = 59.000000000000000000
+      Size.Width = 32.000000000000000000
+      Size.Height = 32.000000000000000000
+      Size.PlatformDefault = False
+    end
+    object Label1: TLabel
+      StyledSettings = [Family, Style, FontColor]
+      Position.X = 134.000000000000000000
+      Position.Y = 37.000000000000000000
+      Size.Width = 203.000000000000000000
+      Size.Height = 29.000000000000000000
+      Size.PlatformDefault = False
+      TextSettings.Font.Size = 18.000000000000000000
+      Text = 'gale JSON'#32534#36753#22120
+      TabOrder = 2
+    end
+    object lblVersion: TLabel
+      Position.X = 134.000000000000000000
+      Position.Y = 74.000000000000000000
+      Size.Width = 147.000000000000000000
+      Size.Height = 17.000000000000000000
+      Size.PlatformDefault = False
+      Text = 'lblVersion'
+      TabOrder = 3
+    end
+    object txtUrl: TText
+      Cursor = crHandPoint
+      Position.X = 134.000000000000000000
+      Position.Y = 104.000000000000000000
+      Size.Width = 188.000000000000000000
+      Size.Height = 25.000000000000000000
+      Size.PlatformDefault = False
+      Text = 'https://github.com/higale'
+      TextSettings.FontColor = xFF1997FE
+      TextSettings.WordWrap = False
+      TextSettings.HorzAlign = Leading
+      OnClick = txtUrlClick
+    end
+  end
+end

+ 93 - 0
FormAbout.pas

@@ -0,0 +1,93 @@
+unit FormAbout;
+
+interface
+
+uses
+{$IFDEF MACOS}
+  Macapi.AppKit, Macapi.Foundation, Macapi.Helpers,
+{$ELSE}
+  Winapi.ShellAPI, Winapi.Windows,
+{$ENDIF}
+  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
+  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Effects, FMX.Objects;
+
+type
+  TfmAbout = class(TForm)
+    Panel1: TPanel;
+    btnOK: TButton;
+    ShadowEffect1: TShadowEffect;
+    imgLogo: TImage;
+    Label1: TLabel;
+    lblVersion: TLabel;
+    txtUrl: TText;
+    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Single);
+    procedure FormDeactivate(Sender: TObject);
+    procedure FormClose(Sender: TObject; var Action: TCloseAction);
+    procedure btnOKClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure txtUrlClick(Sender: TObject);
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+  end;
+
+var
+  fmAbout: TfmAbout;
+
+implementation
+
+{$R *.fmx}
+
+
+uses pub, FormMain;
+
+procedure TfmAbout.btnOKClick(Sender: TObject);
+begin
+  Close;
+end;
+
+procedure TfmAbout.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+  Action := TCloseAction.caFree;
+end;
+
+procedure TfmAbout.FormCreate(Sender: TObject);
+begin
+  StyleBook := g_pub.StyleBook;
+  lblVersion.Text := 'Version: ' + app_version;
+end;
+
+procedure TfmAbout.FormDeactivate(Sender: TObject);
+begin
+  Close;
+end;
+
+procedure TfmAbout.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Single);
+begin
+  StartWindowDrag;
+end;
+
+procedure TfmAbout.txtUrlClick(Sender: TObject);
+{$IFDEF MACOS}
+{$ENDIF}
+begin
+{$IFDEF MACOS}
+  var
+    NSWorkspace: NSWorkspace;
+  var
+    NSURL: NSURL;
+  begin
+    NSWorkspace := TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace);
+    NSURL := TNSURL.Wrap(TNSURL.OCClass.URLWithString(StrToNSStr(txtUrl.Text)));
+    NSWorkspace.openURL(NSURL);
+  end;
+{$ELSE}
+  ShellExecute(0, 'open', PChar(txtUrl.Text), nil, nil, SW_SHOWNORMAL);
+{$ENDIF}
+end;
+
+end.

+ 1995 - 0
FormDocument.fmx

@@ -0,0 +1,1995 @@
+object fmDocument: TfmDocument
+  Left = 0
+  Top = 0
+  Caption = 'gsJSON'
+  ClientHeight = 768
+  ClientWidth = 1024
+  Position = ScreenCenter
+  StyleBook = fmMain.StyleBookBlack
+  Constraints.MinHeight = 600.000000000000000000
+  Constraints.MinWidth = 800.000000000000000000
+  FormFactor.Width = 320
+  FormFactor.Height = 480
+  FormFactor.Devices = [Desktop]
+  ShowFullScreenIcon = True
+  OnActivate = FormActivate
+  OnCreate = FormCreate
+  OnClose = FormClose
+  OnDestroy = FormDestroy
+  OnResize = FormResize
+  DesignerMasterStyle = 0
+  object pmTreeViewItem: TPopupMenu
+    OnPopup = pmTreeViewItemPopup
+    Left = 310
+    Top = 204
+    object miMoveUp: TMenuItem
+      Action = fmMain.actEditMoveUp
+      ImageIndex = -1
+    end
+    object miMoveDown: TMenuItem
+      Action = fmMain.actEditMoveDown
+      ImageIndex = -1
+    end
+  end
+  object pnlSizeBorder: TPanel
+    Align = Client
+    Size.Width = 1024.000000000000000000
+    Size.Height = 768.000000000000000000
+    Size.PlatformDefault = False
+    StyleLookup = 'panelstyle_radius'
+    TabOrder = 6
+    object lytMiddle: TLayout
+      Align = Client
+      Margins.Left = 5.000000000000000000
+      Margins.Right = 5.000000000000000000
+      Size.Width = 1014.000000000000000000
+      Size.Height = 695.000000000000000000
+      Size.PlatformDefault = False
+      TabOrder = 0
+      object rctFooter: TRectangle
+        Align = MostBottom
+        Corners = [BottomLeft, BottomRight]
+        Fill.Color = x20808080
+        HitTest = False
+        Margins.Left = -5.000000000000000000
+        Margins.Right = -5.000000000000000000
+        Position.X = -5.000000000000000000
+        Position.Y = 671.000000000000000000
+        Size.Width = 1024.000000000000000000
+        Size.Height = 24.000000000000000000
+        Size.PlatformDefault = False
+        Stroke.Kind = None
+        object txtMsg: TText
+          Align = Client
+          HitTest = False
+          Size.Width = 856.000000000000000000
+          Size.Height = 24.000000000000000000
+          Size.PlatformDefault = False
+          Text = 'Message'
+          TextSettings.FontColor = xFF258700
+          object aniMsg: TFloatAnimation
+            Enabled = True
+            Delay = 5.000000000000000000
+            Duration = 0.200000002980232200
+            PropertyName = 'Opacity'
+            StartValue = 1.000000000000000000
+            StopValue = 0.000000000000000000
+          end
+        end
+        object rctLinePos: TRectangle
+          Align = Right
+          Fill.Color = x00808080
+          HitTest = False
+          Margins.Right = 5.000000000000000000
+          Position.X = 945.000000000000000000
+          Size.Width = 74.000000000000000000
+          Size.Height = 24.000000000000000000
+          Size.PlatformDefault = False
+          Stroke.Kind = None
+          XRadius = 5.000000000000000000
+          object lblLineAndPos: TLabel
+            Align = Client
+            StyledSettings = [Size, Style, FontColor]
+            Locked = True
+            Size.Width = 71.000000000000000000
+            Size.Height = 24.000000000000000000
+            Size.PlatformDefault = False
+            TextSettings.Font.Family = #23435#20307
+            TextSettings.HorzAlign = Center
+            TextSettings.WordWrap = False
+            Text = '88888: 1234'
+            TabOrder = 0
+          end
+          object TLine
+            Align = Left
+            Locked = True
+            HitTest = False
+            LineType = Right
+            Margins.Top = 3.000000000000000000
+            Margins.Bottom = 3.000000000000000000
+            Position.Y = 3.000000000000000000
+            Size.Width = 3.000000000000000000
+            Size.Height = 18.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Color = x40808080
+          end
+        end
+        object ErrorLight: TCircle
+          Align = Right
+          Fill.Color = claLime
+          Position.X = 915.000000000000000000
+          Size.Width = 30.000000000000000000
+          Size.Height = 24.000000000000000000
+          Size.PlatformDefault = False
+          Stroke.Color = x00808080
+          Stroke.Thickness = 15.000000000000000000
+          ParentShowHint = False
+          ShowHint = True
+          OnClick = ErrorLightClick
+        end
+        object rctIndent: TRectangle
+          Align = Right
+          Fill.Color = x00808080
+          Hint = 'Number of indentation spaces'
+          Position.X = 856.000000000000000000
+          Size.Width = 29.000000000000000000
+          Size.Height = 24.000000000000000000
+          Size.PlatformDefault = False
+          Stroke.Kind = None
+          XRadius = 5.000000000000000000
+          YRadius = 5.000000000000000000
+          OnClick = rctIndentClick
+          object lblIndent: TLabel
+            Align = Client
+            StyledSettings = [Size, Style, FontColor]
+            Locked = True
+            Size.Width = 8.000000000000000000
+            Size.Height = 24.000000000000000000
+            Size.PlatformDefault = False
+            TextSettings.Font.Family = #23435#20307
+            TextSettings.HorzAlign = Center
+            TextSettings.WordWrap = False
+            Text = '4'
+            TabOrder = 0
+          end
+          object TColorAnimation
+            Duration = 0.200000002980232200
+            PropertyName = 'Fill.Color'
+            StartValue = x00808080
+            StopValue = x30808080
+            Trigger = 'IsMouseOver=true'
+            TriggerInverse = 'IsMouseOver=false'
+          end
+          object TLine
+            Align = Right
+            Locked = True
+            LineType = Right
+            Margins.Top = 3.000000000000000000
+            Margins.Bottom = 3.000000000000000000
+            Position.X = 26.000000000000000000
+            Position.Y = 3.000000000000000000
+            Size.Width = 3.000000000000000000
+            Size.Height = 18.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Color = x40808080
+          end
+          object TPath
+            Align = Left
+            Data.Path = {
+              1D0000000000000000000043ABAA2A430100000000006044ABAA2A4301000000
+              00006044000080430100000000000043000080430100000000000043ABAA2A43
+              0300000000000043ABAA2A430000000000000043ABAA4A440100000000006044
+              ABAA4A4401000000000060440000604401000000000000430000604401000000
+              00000043ABAA4A440300000000000043ABAA4A4400000000ABAAEA4356551544
+              0100000000006044565515440100000000006044ABAA2A4401000000ABAAEA43
+              ABAA2A4401000000ABAAEA435655154403000000ABAAEA435655154400000000
+              ABAAEA430200C04301000000000060440200C0430100000000006044ADAAEA43
+              01000000ABAAEA43ADAAEA4301000000ABAAEA430000C04303000000ABAAEA43
+              0200C0430000000056559543565505440100000000000043ABAA2A4401000000
+              000000430000C043010000005655954355550544030000005655954356550544}
+            Fill.Color = claGray
+            Locked = True
+            HitTest = False
+            Margins.Top = 5.000000000000000000
+            Margins.Bottom = 5.000000000000000000
+            Position.Y = 5.000000000000000000
+            Size.Width = 18.000000000000000000
+            Size.Height = 14.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            WrapMode = Fit
+          end
+        end
+        object rctWordWarp: TRectangle
+          Align = Right
+          Fill.Color = x00B13B2B
+          Hint = 'WordWarp'
+          Position.X = 885.000000000000000000
+          Size.Width = 30.000000000000000000
+          Size.Height = 24.000000000000000000
+          Size.PlatformDefault = False
+          Stroke.Kind = None
+          XRadius = 5.000000000000000000
+          YRadius = 5.000000000000000000
+          OnClick = rctWordWarpClick
+          object ColorAnimation13: TColorAnimation
+            Duration = 0.200000002980232200
+            PropertyName = 'Fill.Color'
+            StartValue = x00808080
+            StopValue = x30808080
+            Trigger = 'IsMouseOver=true'
+            TriggerInverse = 'IsMouseOver=false'
+          end
+          object TLine
+            Align = MostRight
+            Locked = True
+            LineType = Right
+            Margins.Top = 3.000000000000000000
+            Margins.Bottom = 3.000000000000000000
+            Position.X = 27.000000000000000000
+            Position.Y = 3.000000000000000000
+            Size.Width = 3.000000000000000000
+            Size.Height = 18.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Color = x40808080
+          end
+          object pathWordWrap: TPath
+            Align = Contents
+            Data.Path = {
+              18000000000000003333B34366662644010000009A9919446666264402000000
+              C8CE2E446666264402000000000040442E3515440200000000004044FFFFFF43
+              0200000000004044A395D54302000000C8CE2E443233B343020000009A991944
+              3233B343010000009A9919433233B343010000009A9919430000804301000000
+              9A99194400008043020000003CF23C4400008043020000009A995944BC4EB943
+              020000009A99594400000044020000009A995944A2582344020000003CF23C44
+              00004044020000009A99194400004044010000003333B3430000404401000000
+              3333B34366662644030000003333B3436666264400000000CDCC4C4333333344
+              01000000CDCCCC430000004401000000CDCCCC436666664403000000CDCC4C43
+              33333344}
+            Fill.Color = claGray
+            HitTest = False
+            Margins.Left = 5.000000000000000000
+            Margins.Top = 5.000000000000000000
+            Margins.Right = 5.000000000000000000
+            Margins.Bottom = 5.000000000000000000
+            Size.Width = 20.000000000000000000
+            Size.Height = 14.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            WrapMode = Fit
+          end
+        end
+      end
+      object lytLeftAndRight: TLayout
+        Align = Client
+        Size.Width = 1014.000000000000000000
+        Size.Height = 671.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 0
+        object rctLeft: TRectangle
+          Align = Client
+          Fill.Kind = None
+          Locked = True
+          Padding.Left = 1.000000000000000000
+          Padding.Top = 1.000000000000000000
+          Padding.Right = 1.000000000000000000
+          Padding.Bottom = 1.000000000000000000
+          Size.Width = 506.000000000000000000
+          Size.Height = 671.000000000000000000
+          Size.PlatformDefault = False
+          Stroke.Color = x80808080
+          object rctLeftToolBar: TRectangle
+            Align = Top
+            Fill.Color = x20808080
+            Position.X = 1.000000000000000000
+            Position.Y = 1.000000000000000000
+            Size.Width = 504.000000000000000000
+            Size.Height = 34.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            object rctBtnCollapseAll: TRectangle
+              Fill.Color = x00B13B2B
+              Hint = #25910#32553#20840#37096#23376#33410#28857
+              Position.X = 2.000000000000000000
+              Position.Y = 2.000000000000000000
+              Size.Width = 35.000000000000000000
+              Size.Height = 30.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Kind = None
+              OnMouseDown = rctBtnCollapseAllMouseDown
+              object ColorAnimation6: TColorAnimation
+                Duration = 0.200000002980232200
+                PropertyName = 'Fill.Color'
+                StartValue = x00808080
+                StopValue = x30808080
+                Trigger = 'IsMouseOver=true'
+                TriggerInverse = 'IsMouseOver=false'
+              end
+              object pathBtnCollapseAll: TPath
+                Align = Center
+                Data.Path = {
+                  1E0000000000000051D94144F6280C4401000000BD9A7843F6280C4401000000
+                  BD9A784315AEE7430100000051D9414415AEE7430100000051D94144F6280C44
+                  0300000051D94144F6280C440000000040815844398E63420200000066666644
+                  398E6342020000001CC77144CDCCCC42020000001CC771448F091E4301000000
+                  1CC771449D7D5844020000001CC771446666664402000000666666441CC77144
+                  020000009C7D58441CC77144010000008F091E431CC7714402000000CDCCCC42
+                  1CC7714402000000398E63426666664402000000398E63429C7D584401000000
+                  398E63428F091E4302000000398E6342CDCCCC4202000000CDCCCC42398E6342
+                  020000008F091E43398E6342010000009D7D5844398E63420300000040815844
+                  398E634200000000408158449D7D584401000000408158448F091E4301000000
+                  8F091E438F091E43010000008F091E439D7D5844010000009D7D58449D7D5844
+                  03000000408158449D7D5844}
+                Fill.Color = xFF0195FE
+                Locked = True
+                HitTest = False
+                Size.Width = 14.000000000000000000
+                Size.Height = 14.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Kind = None
+                WrapMode = Fit
+              end
+            end
+            object rctBtnExpandAll: TRectangle
+              Fill.Color = x00B13B2B
+              Hint = #23637#24320#20840#37096#23376#33410#28857
+              Position.X = 36.000000000000000000
+              Position.Y = 2.000000000000000000
+              Size.Width = 35.000000000000000000
+              Size.Height = 30.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Kind = None
+              OnMouseDown = rctBtnExpandAllMouseDown
+              object ColorAnimation7: TColorAnimation
+                Duration = 0.200000002980232200
+                PropertyName = 'Fill.Color'
+                StartValue = x00808080
+                StopValue = x30808080
+                Trigger = 'IsMouseOver=true'
+                TriggerInverse = 'IsMouseOver=false'
+              end
+              object pathBtnExpandAll: TPath
+                Align = Center
+                Data.Path = {
+                  780000000000000055555543ABAA0A430200000099182C43ACAA0A4302000000
+                  ACAA0A4399182C4302000000ACAA0A435655554301000000ACAA0A4356559543
+                  02000000ACAA0A43FCF0A943020000000B1E2C43ABAABA430200000056555543
+                  ABAABA430100000056558543ABAABA4301000000565585435555354402000000
+                  5655854328A33F4402000000060F96430000484402000000ABAAAA4300004844
+                  0100000056550D44000048440100000056550D44ABAA4A440200000056550D44
+                  7EF85444020000002EB2154456555D44020000000100204456555D4401000000
+                  ACAA4A4456555D4402000000DBF9544455555D440200000055555D44D9F95444
+                  0200000055555D44ABAA4A440100000055555D44565535440200000055555D44
+                  26062B4402000000D9F95444AAAA224402000000AAAA4A44AAAA224401000000
+                  FFFF1F44AAAA224402000000D0B01544ABAA22440200000055550D4426062B44
+                  0200000055550D44565535440100000055550D440100384401000000ABAAAA43
+                  01003844020000009DB8A74302003844020000005555A5435ECE364402000000
+                  5655A54357553544010000005655A543AEAAFA430100000056550D44AEAAFA43
+                  0100000056550D44000000440200000056550D44D34D0A44020000002EB21544
+                  ABAA12440200000001002044ABAA124401000000ACAA4A44ABAA124402000000
+                  DBF95444ABAA12440200000055555D442F4F0A440200000055555D4401000044
+                  0100000055555D445755D5430200000055555D44F7B6C04302000000D9F95444
+                  0000B04302000000AAAA4A440100B04301000000FFFF1F440100B04302000000
+                  D1B015440200B0430200000056550D44F7B6C0430200000055550D445555D543
+                  0100000055550D44AAAADA43010000005455A543AAAADA43010000005455A543
+                  AAAABA43010000000000C043AAAABA43020000005E9ED443AAAABA4302000000
+                  5455E543B4F3A943020000005455E54355559543010000005455E54355555543
+                  020000005455E5439A182C43020000005E9ED443AEAA0A43020000000100C043
+                  ACAA0A430100000055555543ACAA0A430300000055555543ABAA0A4300000000
+                  ABAA4A435555554302000000ABAA4A433C714F43020000003A714F43ACAA4A43
+                  0200000054555543ABAA4A43010000000000C043ABAA4A43020000000DF2C243
+                  ABAA4A43020000005455C5433A714F43020000005455C5435555554301000000
+                  5455C54355559543020000005455C54362479843020000000DF2C243AAAA9A43
+                  020000000000C043AAAA9A430100000055555543AAAA9A43020000003B714F43
+                  AAAA9A4302000000ACAA4A436347984302000000ABAA4A435555954301000000
+                  ABAA4A435555554303000000ABAA4A43555555430000000055551D445555D543
+                  0200000054551D444763D24302000000F8861E44FFFFCF4302000000FFFF1F44
+                  0000D04301000000AAAA4A440000D04302000000B2234C44FFFFCF4302000000
+                  56554D444763D2430200000056554D445555D5430100000056554D4400000044
+                  0200000056554D440879014402000000B1234C44ACAA024402000000AAAA4A44
+                  ACAA024401000000FFFF1F44ACAA024402000000F8861E44ACAA024402000000
+                  54551D44087901440200000054551D44010000440100000054551D445755D543
+                  0300000055551D445555D5430000000055551D44555535440200000054551D44
+                  4EDC334402000000F9861E44AAAA32440200000000002044AAAA324401000000
+                  ABAA4A44AAAA324402000000B2234C44AAAA32440200000056554D444EDC3344
+                  0200000056554D44555535440100000056554D44AAAA4A440200000056554D44
+                  B2234C4402000000B1234C4456554D4402000000AAAA4A4456554D4401000000
+                  FFFF1F4456554D4402000000F8861E4456554D440200000054551D44B2234C44
+                  0200000054551D44ABAA4A440100000054551D44565535440300000055551D44
+                  55553544}
+                Fill.Color = xFF0195FE
+                Locked = True
+                HitTest = False
+                Size.Width = 16.000000000000000000
+                Size.Height = 16.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Kind = None
+                WrapMode = Fit
+              end
+            end
+            object lytLeftToolBar_right: TLayout
+              Align = Right
+              Padding.Top = 2.000000000000000000
+              Padding.Right = 2.000000000000000000
+              Padding.Bottom = 2.000000000000000000
+              Position.X = 297.000000000000000000
+              Size.Width = 207.000000000000000000
+              Size.Height = 34.000000000000000000
+              Size.PlatformDefault = False
+              TabOrder = 0
+              object rctBtnDelete: TRectangle
+                Align = Right
+                Fill.Color = x00B13B2B
+                Position.X = 170.000000000000000000
+                Position.Y = 2.000000000000000000
+                Size.Width = 35.000000000000000000
+                Size.Height = 30.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Kind = None
+                OnClick = rctBtnDeleteClick
+                object ColorAnimation8: TColorAnimation
+                  Duration = 0.200000002980232200
+                  PropertyName = 'Fill.Color'
+                  StartValue = x00808080
+                  StopValue = x30808080
+                  Trigger = 'IsMouseOver=true'
+                  TriggerInverse = 'IsMouseOver=false'
+                end
+                object Path2: TPath
+                  Align = Center
+                  Data.Path = {
+                    6A00000000000000000000429A994D43020000009A9999419A994D4302000000
+                    000000413433434302000000000000419A9935430200000000000041CDCC2843
+                    02000000333393419A991D4302000000000000429A991D430100000000007344
+                    34331F43020000003333764434331F4302000000000079449A99294302000000
+                    0000794434333743020000000000794401004443020000006666764434334F43
+                    020000000000734434334F4301000000000000429A994D430300000000000042
+                    9A994D43000000003333374333338D430200000033333743CDCC864302000000
+                    99994143333381430200000033334F433333814302000000CDCC5C4333338143
+                    020000003333674366668643020000003333674333338D430100000033336743
+                    00007244010000009A994A449A997044010000009A994A44CDCC904302000000
+                    9A994A4467668A430200000034334D44CDCC8443020000009A995044CDCC8443
+                    0200000000005444CDCC8443020000009A99564400008A43020000009A995644
+                    CDCC9043010000009A99564466667C4401000000D0CC384333337E4401000000
+                    D0CC384333338D43030000003333374333338D43000000009A992A44CDCC5944
+                    0200000067662744CDCC5944020000009A99244433335744020000009A992444
+                    CDCC5344010000009A9924440000BA43020000009A9924449A99B34302000000
+                    343327440000AE43020000009A992A440000AE4302000000CDCC2D440000AE43
+                    020000009A9930443333B343020000009A9930440000BA43010000009A993044
+                    CDCC5344020000009A993044000057440200000000002E44CDCC594402000000
+                    9A992A44CDCC5944030000009A992A44CDCC5944000000009A99B743CDCC5944
+                    020000003433B143CDCC5944020000009A99AB4333335744020000009A99AB43
+                    CDCC5344010000009A99AB430000BA43020000009A99AB439A99B34302000000
+                    CDCCB0430000AE43020000009A99B7430000AE43020000006766BE430000AE43
+                    020000009A99C3433333B343020000009A99C3430000BA43010000009A99C343
+                    CDCC5344020000009A99C34300005744020000006766BE43CDCC594402000000
+                    9A99B743CDCC5944030000009A99B743CDCC59440000000033330344CDCC5944
+                    0200000000000044CDCC5944020000006666FA4333335744020000006666FA43
+                    CDCC5344010000006666FA430000BA43020000006666FA439A99B34302000000
+                    9999FF430000AE4302000000333303440000AE4302000000666606440000AE43
+                    02000000333309443333B34302000000333309440000BA430100000033330944
+                    CDCC53440200000033330944000057440200000099990644CDCC594402000000
+                    33330344CDCC59440300000033330344CDCC59440000000000002344CDCC2843
+                    01000000000023440000E84202000000000023440000C84202000000CDCC1F44
+                    6666AE4202000000CDCC1B446666AE42010000003333D1436666AE4202000000
+                    3333C9436666AE4202000000CDCCC2430000C84202000000CDCCC2430000E842
+                    01000000CDCCC24366662243010000003333AB4366662243010000003333AB43
+                    FFFFE742020000003333AB43CDCC9442020000000000BC430000204202000000
+                    3333D1430000204201000000CDCC1B4400002042020000006766264400002042
+                    02000000CDCC2E44CDCC944202000000CDCC2E449A99E94201000000CDCC2E44
+                    9A99294301000000000023449A9929430300000000002344CDCC2843}
+                  Fill.Color = xFFFF1717
+                  Locked = True
+                  HitTest = False
+                  Size.Width = 16.000000000000000000
+                  Size.Height = 16.000000000000000000
+                  Size.PlatformDefault = False
+                  Stroke.Kind = None
+                  WrapMode = Fit
+                end
+              end
+              object rctBtnAddSubItem: TRectangle
+                Align = Right
+                Fill.Color = x00B13B2B
+                Position.X = 126.000000000000000000
+                Position.Y = 2.000000000000000000
+                Size.Width = 35.000000000000000000
+                Size.Height = 30.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Kind = None
+                OnMouseDown = rctBtnAddSubItemMouseDown
+                object ColorAnimation9: TColorAnimation
+                  Duration = 0.200000002980232200
+                  PropertyName = 'Fill.Color'
+                  StartValue = x00808080
+                  StopValue = x30808080
+                  Trigger = 'IsMouseOver=true'
+                  TriggerInverse = 'IsMouseOver=false'
+                end
+                object pathBtnAddSub: TPath
+                  Align = Center
+                  Data.Path = {
+                    2D010000000000005555554355550D4402000000A601674355550D4402000000
+                    5555754341EA10440200000055557543555515440100000055557543AAAA3244
+                    010000000000C043AAAA32440200000029D6C843AAAA3244020000000000D043
+                    963F3644020000000000D043AAAA3A44020000000000D043BE153F4402000000
+                    29D6C843AAAA4244020000000000C043AAAA42440100000055555543AAAA4244
+                    0200000004A94343AAAA42440200000055553543BE153F440200000055553543
+                    AAAA3A44010000005555354355551544020000005555354341EA104402000000
+                    04A9434355550D44020000005555554355550D44030000005555554355550D44
+                    000000000000B04355551544020000000000B04341EA104402000000D829B743
+                    55550D44020000000000C04355550D44010000000000604455550D4402000000
+                    146B644455550D44020000000000684441EA1044020000000000684455551544
+                    0100000000006844000060440200000000006844146B644402000000146B6444
+                    00006844020000000000604400006844010000000000C0430000684402000000
+                    D729B74300006844020000000000B043146B6444020000000000B04300006044
+                    010000000000B04356551544030000000000B04355551544000000000000D043
+                    55551D44010000000000D0430000584401000000000058440000584401000000
+                    0000584455551D44010000000000D04355551D44030000000000D04355551D44
+                    0000000000000043ABAA6A430200000051AC1143ACAA6A430200000000002043
+                    5CFE784302000000000020435655854301000000000020430100904302000000
+                    000020432AD698430200000051AC11430100A04302000000000000430100A043
+                    020000005EA7DC420100A043020000000000C0422AD69843020000000000C042
+                    01009043010000000000C04256558543020000000000C0425AFE784302000000
+                    60A7DC42ABAA6A430200000001000043ACAA6A430300000000000043ABAA6A43
+                    0000000000000043ABAABA430200000051AC1143ABAABA430200000000002043
+                    82D4C1430200000000002043ABAACA4301000000000020435655D54302000000
+                    000020437F2BDE430200000051AC11435655E54302000000000000435655E543
+                    020000005EA7DC425655E543020000000000C0427F2BDE43020000000000C042
+                    5655D543010000000000C042ABAACA43020000000000C04282D4C14302000000
+                    5EA7DC42ABAABA430200000000000043ABAABA430300000000000043ABAABA43
+                    00000000000000430000C0420200000051AC11430000C0420200000000002043
+                    5EA7DC4202000000000020430000004301000000000020435555154302000000
+                    00002043A60127430200000051AC114355553543020000000000004355553543
+                    020000005EA7DC4255553543020000000000C042A6012743020000000000C042
+                    55551543010000000000C04200000043020000000000C0425DA7DC4202000000
+                    5EA7DC420000C04202000000000000430000C04203000000000000430000C042
+                    00000000ABAA2A44ABAA6A4302000000BF152F44ACAA6A4302000000ABAA3244
+                    5CFE784302000000ABAA32445655854301000000ABAA32440100904302000000
+                    ABAA32442AD6984302000000BF152F440100A04302000000ABAA2A440100A043
+                    02000000973F26440100A04302000000ABAA22442AD6984302000000ABAA2244
+                    0100904301000000ABAA22445655854302000000ABAA22445AFE784302000000
+                    973F2644ABAA6A4302000000ABAA2A44ACAA6A4303000000ABAA2A44ABAA6A43
+                    00000000ABAA2A44ABAABA4302000000BF152F44ABAABA4302000000ABAA3244
+                    82D4C14302000000ABAA3244ABAACA4301000000ABAA32445655D54302000000
+                    ABAA32447F2BDE4302000000BF152F445655E54302000000ABAA2A445655E543
+                    02000000973F26445655E54302000000ABAA22447F2BDE4302000000ABAA2244
+                    5655D54301000000ABAA2244ABAACA4302000000ABAA224482D4C14302000000
+                    973F2644ABAABA4302000000ABAA2A44ABAABA4303000000ABAA2A44ABAABA43
+                    00000000ABAA2A440000C04202000000BF152F440000C04202000000ABAA3244
+                    5EA7DC4202000000ABAA32440000004301000000ABAA32445555154302000000
+                    ABAA3244A601274302000000BF152F445555354302000000ABAA2A4455553543
+                    02000000973F26445555354302000000ABAA2244A601274302000000ABAA2244
+                    5555154301000000ABAA22440000004302000000ABAA22445DA7DC4202000000
+                    973F26440000C04202000000ABAA2A440000C04203000000ABAA2A440000C042
+                    0000000055551D445555D5430200000055551D442C7FCC430200000041EA2044
+                    5555C54302000000555525445555C54301000000AAAA2A445555C54302000000
+                    BE152F445555C54302000000AAAA32442C7FCC4302000000AAAA32445555D543
+                    02000000AAAA32447E2BDE4302000000BE152F445555E54302000000AAAA2A44
+                    5555E54301000000555525445555E5430200000041EA20445555E54302000000
+                    55551D447E2BDE430200000055551D445555D5430300000055551D445555D543
+                    000000000000C0425555D543020000000000C0422C7FCC43020000005EA7DC42
+                    5555C54302000000000000435555C54301000000555515435555C54302000000
+                    A60127435555C54302000000555535432C7FCC4302000000555535435555D543
+                    02000000555535437E2BDE4302000000A60127435555E5430200000055551543
+                    5555E54301000000000000435555E543020000005EA7DC425555E54302000000
+                    0000C0427E2BDE43020000000000C0425555D543030000000000C0425555D543
+                    000000000000C04200000043020000000000C0425DA7DC42020000005EA7DC42
+                    0000C04202000000000000430000C04201000000555515430000C04202000000
+                    A60127430000C04202000000555535435EA7DC42020000005555354300000043
+                    020000005555354351AC114302000000A6012743000020430200000055551543
+                    00002043010000000000004300002043020000005EA7DC420000204302000000
+                    0000C04251AC1143020000000000C04200000043030000000000C04200000043
+                    00000000000060430000004302000000000060435DA7DC4202000000AF536E43
+                    0000C04202000000000080430000C04201000000ABAA8A430000C04202000000
+                    D48093430000C04202000000ABAA9A435EA7DC4202000000ABAA9A4300000043
+                    02000000ABAA9A4351AC114302000000D48093430000204302000000ABAA8A43
+                    0000204301000000000080430000204302000000AF536E430000204302000000
+                    0000604351AC1143020000000000604300000043030000000000604300000043
+                    000000005555B54300000043020000005555B5435DA7DC42020000002D7FBC43
+                    0000C042020000005555C5430000C042010000000000D0430000C04202000000
+                    29D6D8430000C042020000000000E0435EA7DC42020000000000E04300000043
+                    020000000000E04351AC11430200000029D6D84300002043020000000000D043
+                    00002043010000005555C54300002043020000002C7FBC430000204302000000
+                    5555B54351AC1143020000005555B54300000043030000005555B54300000043
+                    000000005555B5435555D543020000005555B5432C7FCC43020000002D7FBC43
+                    5555C543020000005555C5435555C543010000000000D0435555C54302000000
+                    29D6D8435555C543020000000000E0432C7FCC43020000000000E0435555D543
+                    020000000000E0437E2BDE430200000029D6D8435555E543020000000000D043
+                    5555E543010000005555C5435555E543020000002C7FBC435555E54302000000
+                    5555B5437E2BDE43020000005555B5435555D543030000005555B5435555D543
+                    00000000ABAAFA430000004302000000ACAAFA435BA7DC420200000042EA0044
+                    FEFFBF4202000000575505440000C04201000000ACAA0A440000C04202000000
+                    C0150F440000C04202000000ACAA12445EA7DC4202000000ACAA124400000043
+                    02000000ACAA124451AC114302000000C0150F440000204302000000ACAA0A44
+                    000020430100000057550544000020430200000043EA00440000204302000000
+                    AEAAFA4351AC114302000000AEAAFA430000004303000000ABAAFA4300000043
+                    00000000000060435555D54302000000000060432C7FCC4302000000AF536E43
+                    5555C54302000000000080435555C54301000000ABAA8A435555C54302000000
+                    D48093435555C54302000000ABAA9A432C7FCC4302000000ABAA9A435555D543
+                    02000000ABAA9A437E2BDE4302000000D48093435555E54302000000ABAA8A43
+                    5555E54301000000000080435555E54302000000AF536E435555E54302000000
+                    000060437E2BDE4302000000000060435555D54303000000000060435555D543
+                    00000000ABAAFA435555D54302000000ACAAFA432C7FCC430200000042EA0044
+                    5455C54302000000575505445555C54301000000ACAA0A445555C54302000000
+                    C0150F445555C54302000000ACAA12442C7FCC4302000000ACAA12445555D543
+                    02000000ACAA12447E2BDE4302000000C0150F445555E54302000000ACAA0A44
+                    5555E54301000000575505445555E5430200000043EA00445555E54302000000
+                    AEAAFA437E2BDE4302000000AEAAFA435555D54303000000ABAAFA435555D543
+                    0000000055551D44000000430200000055551D445DA7DC420200000041EA2044
+                    0000C04202000000555525440000C04201000000AAAA2A440000C04202000000
+                    BE152F440000C04202000000AAAA32445EA7DC4202000000AAAA324400000043
+                    02000000AAAA324451AC114302000000BE152F440000204302000000AAAA2A44
+                    000020430100000055552544000020430200000041EA20440000204302000000
+                    55551D4451AC11430200000055551D44000000430300000055551D4400000043}
+                  Fill.Color = xFF34B500
+                  Locked = True
+                  HitTest = False
+                  Size.Width = 16.000000000000000000
+                  Size.Height = 16.000000000000000000
+                  Size.PlatformDefault = False
+                  Stroke.Kind = None
+                  WrapMode = Fit
+                end
+              end
+              object rctBtnAddItem: TRectangle
+                Align = Right
+                Fill.Color = x00B13B2B
+                Position.X = 91.000000000000000000
+                Position.Y = 2.000000000000000000
+                Size.Width = 35.000000000000000000
+                Size.Height = 30.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Kind = None
+                OnMouseDown = rctBtnAddItemMouseDown
+                object ColorAnimation10: TColorAnimation
+                  Duration = 0.200000002980232200
+                  PropertyName = 'Fill.Color'
+                  StartValue = x00808080
+                  StopValue = x30808080
+                  Trigger = 'IsMouseOver=true'
+                  TriggerInverse = 'IsMouseOver=false'
+                end
+                object pathBtnAddBrother: TPath
+                  Align = Center
+                  Data.Path = {
+                    720000000000000051880844D39FDD430100000060EFEE43D39FDD4301000000
+                    60EFEE43D46022440100000000000000D46022440100000000000000EC517844
+                    0100000000008044EC5178440100000000008044D46022440100000051880844
+                    D46022440100000051880844D39FDD430300000051880844D39FDD4300000000
+                    B8EE6E44EA90334401000000B8EE6E44D421674401000000488A8842D4216744
+                    01000000488A8842EB90334401000000B7EE6E44EB90334403000000B8EE6E44
+                    EA90334400000000CDCC4C438FC2F54101000000F88888438FC2F54101000000
+                    F888884356F1C64201000000CDCC4C4356F1C64201000000CDCC4C438FC2F541
+                    03000000CDCC4C438FC2F541000000003BAAAA438FC2F54101000000CDCCCC43
+                    8FC2F54101000000CDCCCC4356F1C642010000003BAAAA4356F1C64201000000
+                    3BAAAA438FC2F541030000003BAAAA438FC2F541000000005FEFEE438FC2F541
+                    01000000518808448FC2F541010000005188084456F1C6420100000060EFEE43
+                    56F1C6420100000060EFEE438FC2F541030000005FEFEE438FC2F54100000000
+                    9A9919448FC2F54101000000E3AA2A448FC2F54101000000E3AA2A4456F1C642
+                    010000009A99194456F1C642010000009A9919448FC2F541030000009A991944
+                    8FC2F54100000000488A884256F1C64201000000A987084356F1C64201000000
+                    A98708438FC2F54101000000000000008FC2F5410100000000000000A33B2843
+                    01000000488A8842A33B284301000000488A884256F1C64203000000488A8842
+                    56F1C64200000000A9870843D49FDD4301000000488A8842D49FDD4301000000
+                    488A8842083DBB430100000000000000083DBB43010000000000000000000044
+                    01000000A98708430000004401000000A9870843D49FDD4303000000A9870843
+                    D49FDD430000000000000000FCFB6C4301000000488A8842FCFB6C4301000000
+                    488A88422ADE984301000000000000002ADE98430100000000000000FBFB6C43
+                    0300000000000000FCFB6C4300000000CDCC4C43D39FDD4301000000F8888843
+                    D39FDD4301000000F88888430000004401000000CDCC4C430000004401000000
+                    CDCC4C43D49FDD4303000000CDCC4C43D39FDD43000000003BAAAA43D39FDD43
+                    01000000CDCCCC43D39FDD4301000000CDCCCC4300000044010000003BAAAA43
+                    00000044010000003BAAAA43D49FDD43030000003BAAAA43D39FDD4300000000
+                    9A991944D39FDD4301000000E3AA2A44D39FDD4301000000E3AA2A4400000044
+                    010000009A99194400000044010000009A991944D49FDD43030000009A991944
+                    D39FDD430000000084BB3B448FC2F54101000000CDCC4C448FC2F54101000000
+                    CDCC4C4456F1C6420100000084BB3B4456F1C6420100000084BB3B448FC2F541
+                    0300000084BB3B448FC2F5410000000016DE5D448FC2F5410100000016DE5D44
+                    56F1C64201000000B7EE6E4456F1C64201000000B7EE6E44A33B284301000000
+                    00008044A33B284301000000000080448FC2F5410100000016DE5D448FC2F541
+                    0300000016DE5D448FC2F54100000000B7EE6E44D39FDD430100000016DE5D44
+                    D39FDD430100000016DE5D440000004401000000000080440000004401000000
+                    00008044083DBB4301000000B7EE6E44083DBB4301000000B7EE6E44849EDD43
+                    03000000B7EE6E44D39FDD4300000000B7EE6E44FCFB6C430100000000008044
+                    FCFB6C4301000000000080442ADE984301000000B7EE6E442ADE984301000000
+                    B7EE6E44FBFB6C4303000000B7EE6E44FCFB6C430000000084BB3B44D39FDD43
+                    01000000CDCC4C44D39FDD4301000000CDCC4C44000000440100000084BB3B44
+                    000000440100000084BB3B44D49FDD430300000084BB3B44D39FDD43}
+                  Fill.Color = xFF34B500
+                  Locked = True
+                  HitTest = False
+                  Size.Width = 16.000000000000000000
+                  Size.Height = 16.000000000000000000
+                  Size.PlatformDefault = False
+                  Stroke.Kind = None
+                  WrapMode = Fit
+                end
+              end
+              object rctBtnMoveDown: TRectangle
+                Align = Right
+                Fill.Color = x00B13B2B
+                Position.X = 47.000000000000000000
+                Position.Y = 2.000000000000000000
+                Size.Width = 35.000000000000000000
+                Size.Height = 30.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Kind = None
+                OnMouseDown = rctBtnMoveDownMouseDown
+                object ColorAnimation11: TColorAnimation
+                  Duration = 0.200000002980232200
+                  PropertyName = 'Fill.Color'
+                  StartValue = x00808080
+                  StopValue = x30808080
+                  Trigger = 'IsMouseOver=true'
+                  TriggerInverse = 'IsMouseOver=false'
+                end
+                object pathBtnMoveDown: TPath
+                  Align = Center
+                  Data.Path = {
+                    4500000000000000645B9943CFFF244401000000645B9943A09A394301000000
+                    088C7343A09A394301000000088C7343CFFF2444010000009C44AB42CFFF2444
+                    01000000839089439E5F544401000000DF4FE843F0FF244401000000445B9943
+                    E0FF244403000000645B9943CFFF2444000000005C976A447BC45E4401000000
+                    8DE752447BC45E44010000008DE75244ECF94E44010000005C976A44ECF94E44
+                    010000005C976A447BC45E44030000005C976A447BC45E44000000004E024B44
+                    7BC45E44010000006F5233447BC45E44010000006F523344ECF94E4401000000
+                    4E024B44ECF94E44010000004E024B447BC45E44030000004E024B447BC45E44
+                    00000000506D2B447BC45E4401000000A0A21B447BC45E4401000000A0A21B44
+                    AC14474401000000506D2B44AC14474401000000506D2B447BC45E4403000000
+                    506D2B447BC45E44000000005C976A446D7F274401000000CDCC5A446D7F2744
+                    01000000CDCC5A447DCF0F44010000005C976A447DCF0F44010000005C976A44
+                    6D7F2744030000005C976A446D7F2744000000009EE752443D9A1F4401000000
+                    BF373B443D9A1F4401000000BF373B448DCF0F44010000009EE752448DCF0F44
+                    010000009EE752443D9A1F44030000009EE752443D9A1F44000000007F523344
+                    2D9A1F4401000000A0A21B442D9A1F4401000000A0A21B447DCF0F4401000000
+                    7F5233447DCF0F44010000007F5233442D9A1F44030000007F5233442D9A1F44
+                    000000005C976A448B14474401000000CDCC5A448B14474401000000CDCC5A44
+                    AC642F44010000005C976A44AC642F44010000005C976A448B14474403000000
+                    5C976A448B14474400000000506D2B444C2F3F4401000000A0A21B444C2F3F44
+                    01000000A0A21B446D7F274401000000506D2B446D7F274401000000506D2B44
+                    4C2F3F4403000000506D2B444C2F3F4400000000506D2B449EDFC04301000000
+                    506D2B44C5404443010000001FCD5A44C5404443010000001FCD5A449EDFC043
+                    01000000506D2B449EDFC04303000000506D2B449EDFC043000000008FA21B44
+                    DD74E043010000006C976A44DD74E043010000006C976A44C816054301000000
+                    8FA21B44C8160543010000008FA21B44DD74E043030000008FA21B44DD74E043}
+                  Fill.Color = xFF1070FF
+                  Locked = True
+                  HitTest = False
+                  Size.Width = 16.000000000000000000
+                  Size.Height = 16.000000000000000000
+                  Size.PlatformDefault = False
+                  Stroke.Kind = None
+                  WrapMode = Fit
+                end
+              end
+              object rctBtnMoveUp: TRectangle
+                Align = Right
+                Fill.Color = x00B13B2B
+                Position.X = 12.000000000000000000
+                Position.Y = 2.000000000000000000
+                Size.Width = 35.000000000000000000
+                Size.Height = 30.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Kind = None
+                OnMouseDown = rctBtnMoveUpMouseDown
+                object ColorAnimation12: TColorAnimation
+                  Duration = 0.200000002980232200
+                  PropertyName = 'Fill.Color'
+                  StartValue = x00808080
+                  StopValue = x30808080
+                  Trigger = 'IsMouseOver=true'
+                  TriggerInverse = 'IsMouseOver=false'
+                end
+                object pathBtnMoveUp: TPath
+                  Align = Center
+                  Data.Path = {
+                    450000000000000046BE36444CF7B0430100000046BE3644DEFC564401000000
+                    67964744DEFC564401000000679647444DF7B04301000000A0B271444DF7B043
+                    010000007F2A3F44D5CD1743010000004EA20C444DF7B0430100000098BE3644
+                    4DF7B0430300000046BE36444CF7B0430000000010D8644273E8D64201000000
+                    EA461E4373E8D64201000000EA461E43BCD42E430100000012D86442BCD42E43
+                    0100000012D8644272E8D6420300000010D8644273E8D6420000000087F63F43
+                    73E8D64201000000B683924373E8D64201000000B6839243BCD42E4301000000
+                    86F63F43BCD42E430100000086F63F4372E8D6420300000087F63F4373E8D642
+                    00000000645BA34373E8D64201000000A60BC54373E8D64201000000A60BC543
+                    1F85504301000000645BA3431F85504301000000645BA34373E8D64203000000
+                    645BA34373E8D6420000000010D86442B0A2AB43010000008B2CF942B0A2AB43
+                    010000008B2CF942232BDE430100000010D86442232BDE430100000010D86442
+                    B0A2AB430300000010D86442B0A2AB430000000066461E43027BBC4301000000
+                    A6AB8143027BBC4301000000A6AB8143232BDE430100000066461E43232BDE43
+                    0100000066461E43027BBC430300000066461E43027BBC430000000075839243
+                    027BBC4301000000E80BC543027BBC4301000000E80BC543232BDE4301000000
+                    75839243232BDE430100000075839243027BBC430300000075839243027BBC43
+                    0000000010D86442DD845043010000008B2CF942DD845043010000008B2CF942
+                    E1CA9A430100000010D86442E1CA9A430100000010D86442DC84504303000000
+                    10D86442DD84504300000000645BA3438135724301000000A60BC54381357243
+                    01000000A60BC54312A3AB4301000000645BA34312A3AB4301000000645BA343
+                    8035724303000000645BA3438135724300000000645BA343C39D214401000000
+                    645BA343D4255444010000008A2CF942D4255444010000008A2CF942C49D2144
+                    01000000645BA343C49D214403000000645BA343C39D214400000000C70BC543
+                    B2C510440100000010D86442B2C510440100000010D86442F4FD644401000000
+                    C70BC543F4FD644401000000C70BC543B2C5104403000000C70BC543B2C51044}
+                  Fill.Color = xFF1070FF
+                  Locked = True
+                  HitTest = False
+                  Size.Width = 16.000000000000000000
+                  Size.Height = 16.000000000000000000
+                  Size.PlatformDefault = False
+                  Stroke.Kind = None
+                  WrapMode = Fit
+                end
+              end
+              object TLine
+                Align = Right
+                LineType = Right
+                Margins.Top = 3.000000000000000000
+                Margins.Right = 4.000000000000000000
+                Margins.Bottom = 3.000000000000000000
+                Position.X = 161.000000000000000000
+                Position.Y = 5.000000000000000000
+                Size.Width = 5.000000000000000000
+                Size.Height = 24.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Color = x50808080
+              end
+              object TLine
+                Align = Right
+                LineType = Right
+                Margins.Top = 3.000000000000000000
+                Margins.Right = 4.000000000000000000
+                Margins.Bottom = 3.000000000000000000
+                Position.X = 82.000000000000000000
+                Position.Y = 5.000000000000000000
+                Size.Width = 5.000000000000000000
+                Size.Height = 24.000000000000000000
+                Size.PlatformDefault = False
+                Stroke.Color = x50808080
+              end
+            end
+          end
+          object tvJson: TTreeView
+            Align = Client
+            EnableDragHighlight = False
+            Size.Width = 504.000000000000000000
+            Size.Height = 635.000000000000000000
+            Size.PlatformDefault = False
+            TabOrder = 1
+            OnDragOver = tvJsonDragOver
+            OnMouseDown = tvJsonMouseDown
+            OnMouseMove = tvJsonMouseMove
+            ItemHeight = 28.000000000000000000
+            Images = imglstJSONKind
+            OnChange = tvJsonChange
+            OnDragChange = tvJsonDragChange
+            Viewport.Width = 500.000000000000000000
+            Viewport.Height = 631.000000000000000000
+            object rctDrap: TRectangle
+              Fill.Color = xB2005ACC
+              HitTest = False
+              Position.X = 146.000000000000000000
+              Position.Y = 238.000000000000000000
+              Size.Width = 194.000000000000000000
+              Size.Height = 15.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Kind = None
+            end
+          end
+          object lblPath: TLabel
+            Anchors = [akLeft, akTop, akRight]
+            StyledSettings = [Size, Style, FontColor]
+            Opacity = 0.750000000000000000
+            Margins.Left = 5.000000000000000000
+            Margins.Right = 2.000000000000000000
+            Position.X = 51.000000000000000000
+            Position.Y = 39.000000000000000000
+            Size.Width = 449.000000000000000000
+            Size.Height = 22.000000000000000000
+            Size.PlatformDefault = False
+            TextSettings.Font.Family = #23435#20307
+            TabOrder = 0
+          end
+        end
+        object rctRight: TRectangle
+          Align = MostRight
+          Fill.Kind = None
+          Padding.Left = 1.000000000000000000
+          Padding.Top = 1.000000000000000000
+          Padding.Right = 1.000000000000000000
+          Padding.Bottom = 1.000000000000000000
+          Position.X = 508.000000000000000000
+          Size.Width = 506.000000000000000000
+          Size.Height = 671.000000000000000000
+          Size.PlatformDefault = False
+          Stroke.Color = x80808080
+          object rctRightTopBar: TRectangle
+            Align = Top
+            Fill.Color = x20808080
+            Position.X = 1.000000000000000000
+            Position.Y = 1.000000000000000000
+            Size.Width = 504.000000000000000000
+            Size.Height = 34.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            object edtName: TEdit
+              Touch.InteractiveGestures = [LongTap, DoubleTap]
+              Anchors = [akLeft, akTop, akRight]
+              TabOrder = 1
+              Position.X = 16.000000000000000000
+              Position.Y = 5.000000000000000000
+              Size.Width = 370.000000000000000000
+              Size.Height = 22.000000000000000000
+              Size.PlatformDefault = False
+              OnChangeTracking = edtNameChangeTracking
+            end
+            object cbValueType: TComboBox
+              Anchors = [akTop, akRight]
+              Images = imglstJSONKind
+              Position.X = 394.000000000000000000
+              Position.Y = 4.000000000000000000
+              Size.Width = 99.000000000000000000
+              Size.Height = 22.000000000000000000
+              Size.PlatformDefault = False
+              TabOrder = 0
+              OnChange = cbValueTypeChange
+              object TListBoxItem
+                Tag = 1
+                ImageIndex = 1
+                Size.Width = 19.000000000000000000
+                Size.Height = 19.000000000000000000
+                Size.PlatformDefault = False
+                TabOrder = 0
+                Text = 'Object'
+              end
+              object TListBoxItem
+                Tag = 2
+                ImageIndex = 2
+                TabOrder = 1
+                Text = 'Array'
+              end
+              object TListBoxItem
+                Tag = 3
+                ImageIndex = 3
+                TabOrder = 2
+                Text = 'String'
+              end
+              object TListBoxItem
+                Tag = 4
+                ImageIndex = 4
+                TabOrder = 3
+                Text = 'Number'
+              end
+              object TListBoxItem
+                Tag = 5
+                ImageIndex = 5
+                TabOrder = 4
+                Text = 'Bool'
+              end
+              object TListBoxItem
+                Tag = 6
+                ImageIndex = 6
+                TabOrder = 5
+                Text = 'Null'
+              end
+            end
+          end
+          object rctRightMiddle: TRectangle
+            Align = Client
+            Fill.Kind = None
+            Size.Width = 504.000000000000000000
+            Size.Height = 635.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            object mmoEdit: TMemo
+              Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
+              AutoHide = False
+              DataDetectorTypes = []
+              StyledSettings = [Style]
+              TextSettings.Font.Family = #23435#20307
+              TextSettings.FontColor = claWhite
+              OnChangeTracking = mmoEditChangeTracking
+              Align = Contents
+              Size.Width = 504.000000000000000000
+              Size.Height = 635.000000000000000000
+              Size.PlatformDefault = False
+              TabOrder = 0
+              OnDragOver = JsonFileDragOver
+              OnDragDrop = JsonFileDragDrop
+              OnViewportPositionChange = mmoEditViewportPositionChange
+              Viewport.Width = 500.000000000000000000
+              Viewport.Height = 629.000000000000000000
+            end
+            object rctForBoolValue: TRectangle
+              Align = Top
+              Corners = [BottomLeft, BottomRight]
+              CornerType = Bevel
+              Fill.Color = x00E0E0E0
+              HitTest = False
+              Sides = [Bottom]
+              Size.Width = 504.000000000000000000
+              Size.Height = 41.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Color = x30808080
+              object rbTrue: TRadioButton
+                CanFocus = False
+                Locked = True
+                Position.X = 25.000000000000000000
+                Position.Y = 9.000000000000000000
+                Size.Width = 70.000000000000000000
+                Size.Height = 19.000000000000000000
+                Size.PlatformDefault = False
+                TabOrder = 0
+                Text = 'true'
+                OnChange = rbTrueFalseChange
+              end
+              object rbFalse: TRadioButton
+                CanFocus = False
+                Locked = True
+                Position.X = 105.000000000000000000
+                Position.Y = 9.000000000000000000
+                Size.Width = 70.000000000000000000
+                Size.Height = 19.000000000000000000
+                Size.PlatformDefault = False
+                TabOrder = 1
+                Text = 'false'
+                OnChange = rbTrueFalseChange
+              end
+            end
+          end
+        end
+        object slL_R: TSplitter
+          Align = Right
+          Cursor = crHSplit
+          MinSize = 300.000000000000000000
+          Margins.Left = -4.000000000000000000
+          Margins.Right = -4.000000000000000000
+          Position.X = 502.000000000000000000
+          ShowGrip = False
+          Size.Width = 10.000000000000000000
+          Size.Height = 671.000000000000000000
+          Size.PlatformDefault = False
+          OnMouseUp = slL_RMouseUp
+        end
+      end
+    end
+    object rctTitleBar: TRectangle
+      Align = MostTop
+      Corners = [TopLeft, TopRight]
+      Fill.Color = x20808080
+      HitTest = False
+      Margins.Left = 1.000000000000000000
+      Margins.Top = 1.000000000000000000
+      Margins.Right = 1.000000000000000000
+      Position.X = 1.000000000000000000
+      Position.Y = 1.000000000000000000
+      Size.Width = 1022.000000000000000000
+      Size.Height = 34.000000000000000000
+      Size.PlatformDefault = False
+      Stroke.Thickness = 0.000000000000000000
+      XRadius = 5.000000000000000000
+      YRadius = 5.000000000000000000
+      object rctTitleBarForMove: TRectangle
+        Align = Client
+        Corners = [TopLeft, TopRight]
+        Fill.Kind = None
+        Locked = True
+        Margins.Left = 1.000000000000000000
+        Margins.Top = 1.000000000000000000
+        Margins.Right = 1.000000000000000000
+        Size.Width = 1020.000000000000000000
+        Size.Height = 33.000000000000000000
+        Size.PlatformDefault = False
+        Stroke.Kind = None
+        XRadius = 15.000000000000000000
+        YRadius = 15.000000000000000000
+        OnDragOver = JsonFileDragOver
+        OnDragDrop = JsonFileDragDrop
+        object TLayout
+          Align = Right
+          Position.X = 889.000000000000000000
+          Size.Width = 131.000000000000000000
+          Size.Height = 33.000000000000000000
+          Size.PlatformDefault = False
+          TabOrder = 0
+          object rctBtnClose: TRectangle
+            Align = MostRight
+            Corners = [TopRight]
+            Fill.Color = x00B13B2B
+            Margins.Top = -1.000000000000000000
+            Margins.Right = -1.000000000000000000
+            Position.X = 87.000000000000000000
+            Position.Y = -1.000000000000000000
+            Size.Width = 45.000000000000000000
+            Size.Height = 34.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            XRadius = 5.000000000000000000
+            YRadius = 5.000000000000000000
+            OnClick = rctBtnCloseClick
+            object aniForCloseBtn: TColorAnimation
+              Duration = 0.200000002980232200
+              PropertyName = 'Fill.Color'
+              StartValue = x00B13B2B
+              StopValue = xFFB13B2B
+              Trigger = 'IsMouseOver=true'
+              TriggerInverse = 'IsMouseOver=false'
+            end
+            object pathCloseBtn: TPath
+              Align = Center
+              Data.Path = {
+                2200000000000000B4AB0C4400000044010000002F1242440A33954302000000
+                07924544B0338E430200000006924544FCDA8243020000002F12424443B77743
+                0200000082923E44E6B769430200000028E63844E6B76943020000007B663544
+                43B777430100000000000044F0A7E6430100000009339543F2B5774302000000
+                68338E430CB7694302000000C0DA824358B76943020000009AB677439AB67743
+                02000000B4B76943EEDA82430200000000B8694396338E430200000041B77743
+                093395430100000097A8E643000000440100000041B777437B66354402000000
+                E4B7694328E6384402000000E4B7694382923E440200000041B777432F124244
+                02000000FBDA82430792454402000000B0338E43069245440200000009339543
+                2F1242440100000000000044B4AB0C44010000007B6635442F12424402000000
+                28E63844069245440200000082923E4407924544020000002F1242442F124244
+                020000000792454482923E44020000000792454428E63844020000002F124244
+                7B66354401000000B4AB0C440000004403000000B4AB0C4400000044}
+              Locked = True
+              HitTest = False
+              Size.Width = 10.000000000000000000
+              Size.Height = 12.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Kind = None
+              WrapMode = Fit
+            end
+          end
+          object rctBtnMin: TRectangle
+            Align = Right
+            Fill.Color = x00B13B2B
+            Margins.Top = -1.000000000000000000
+            Position.X = 7.000000000000000000
+            Position.Y = -1.000000000000000000
+            Size.Width = 40.000000000000000000
+            Size.Height = 34.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            OnClick = rctBtnMinClick
+            object aniForMinBtn: TColorAnimation
+              Duration = 0.200000002980232200
+              PropertyName = 'Fill.Color'
+              StartValue = x00808080
+              StopValue = x80808080
+              Trigger = 'IsMouseOver=true'
+              TriggerInverse = 'IsMouseOver=false'
+            end
+            object pathMinBtn: TPath
+              Align = Center
+              Data.Path = {
+                1000000000000000000070440000E04301000000000080420000E04302000000
+                EE3AE5410000E0430200000000000000AF53EE43020000000000803600000044
+                020000000000000028D6084402000000EA3AE5410000104402000000FDFF7F42
+                000010440100000000007044000010440200000029D678440000104402000000
+                0000804429D608440200000000008044000000440200000000008044AF53EE43
+                0200000029D678440000E04302000000000070440000E0430300000000007044
+                0000E043}
+              Locked = True
+              HitTest = False
+              Size.Width = 10.000000000000000000
+              Size.Height = 12.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Kind = None
+              WrapMode = Fit
+            end
+          end
+          object rctBtnMax: TRectangle
+            Align = MostRight
+            Fill.Color = x00B13B2B
+            Margins.Top = -1.000000000000000000
+            Position.X = 47.000000000000000000
+            Position.Y = -1.000000000000000000
+            Size.Width = 40.000000000000000000
+            Size.Height = 34.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            OnClick = rctBtnMaxClick
+            object aniForMaxBtn: TColorAnimation
+              Duration = 0.200000002980232200
+              PropertyName = 'Fill.Color'
+              StartValue = x00808080
+              StopValue = x80808080
+              Trigger = 'IsMouseOver=true'
+              TriggerInverse = 'IsMouseOver=false'
+            end
+            object pathMaxBtn: TPath
+              Align = Center
+              Data.Path = {
+                240000000000000000006943000000430200000000002F430000004302000000
+                0000004300002F43020000000000004300006943010000000000004300804544
+                0200000000000043000054440200000000002F43000060440200000000006943
+                0000604401000000008045440000604402000000000054440000604402000000
+                0000604400005444020000000000604400804544010000000000604400006943
+                020000000000604400002F4302000000000054440000FE420200000000804544
+                0000004301000000000069430000004303000000000069430000004300000000
+                0000564300006943020000000000564300005F430200000000005F4300005643
+                0200000000006943000056430100000000804544000056430200000000004844
+                000056430200000000404A4400005F430200000000404A440000694301000000
+                00404A44008045440200000000404A4400004844020000000000484400404A44
+                020000000080454400404A44010000000000694300404A440200000000005F43
+                00404A4402000000000056430000484402000000000056430080454401000000
+                0000564300006943030000000000564300006943}
+              Locked = True
+              HitTest = False
+              Size.Width = 10.000000000000000000
+              Size.Height = 12.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Kind = None
+              WrapMode = Fit
+            end
+          end
+        end
+        object lblCaption: TLabel
+          Locked = True
+          Position.X = 37.000000000000000000
+          Position.Y = 8.000000000000000000
+          Size.Width = 116.000000000000000000
+          Size.Height = 17.000000000000000000
+          Size.PlatformDefault = False
+          Text = 'JSON '#32534#36753#22120
+          TabOrder = 1
+        end
+        object imgLogo: TImage
+          MultiResBitmap.Height = 24
+          MultiResBitmap.Width = 24
+          MultiResBitmap.LoadSize = 2
+          MultiResBitmap = <
+            item
+              Width = 16
+              Height = 16
+              PNG = {
+                89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+                610000000473424954080808087C0864880000031C49444154388D85935F6895
+                6500879FF7FDFE9CEFDBD9CE8EF3E491A92D5C93C9586EA3659231D4AC98FF82
+                9C774110445D956145B420C2C69A8B6EBC4888A08B8A929432A26509DB6C2299
+                0D5B873C1CB7B11236EDCCB3B3F3EFFBDEF37D6F17D28ABAE8B9FB5DFC9EBB47
+                00B04DBB5B7B973EDA7A8FB143FA42AEA993B896607631C09212C782B18C0A17
+                4BFAE8547F7C987F93387A73DFD0B725FD17BF2E54F5973F7B2BBBEC877AFFBB
+                79DDD4BFA8BB077347FEF93501FC1CD10DF5128037BE2A93F73477272463992A
+                13D7148B45CDD4F5806A08455F1FEB783327265F8D1F039000520BDF32052329
+                45A256D0D769F3C04693EFAF292C5330F0580DAFEF7589DA02430A0C83A1EEB7
+                72BB5604B661905E08C85734FBDA6DDE9FF028FAF0CA232ECD09C989F10A4FDC
+                17E1E24BF59C79B68E435D36D3F37AFD8AA0E205D79BEF30E8EBB29998563CF3
+                6004DB80E1B365963D4DCB1A0380B82B686A90B4260D4A46980630370DE45B55
+                C1DB339651D43B82CFAF287A5AA02E22F8ED56C81F254DCC117C9D52E4CA1A34
+                FC385725B64AEFD9F074FE96E81ACC955C13B7ACE0F25C95EE26934D4983B18C
+                A2E0C1C39B2DD20B013FCD54696934C816358E056D8D064B055D362BBE7656D7
+                488E3CE47075216057ABC5484A319B0D79BCD3667BB349DC151C3E59E24087CD
+                EE568B8E811CCFF7B87C91F21C19680A41083147B03626B9F74E93F14C95A606
+                C993F747E87927CF873FF8F4F7BA143DCD5DAB25CFED70282A8D6B1805B31A80
+                D6D0D668F2DA993C1F5FF2F9E4A95A66B22133D980724553A96A1010AF111C1F
+                ADB0BDD962DB4693CF267DCCB53161BD7D30CA685AB16E9564CB3A93F48D8013
+                E73D3AD71B9C7FB19E86A8E0E5D3250E6CB1B9F27BC0484AB17B731D15A52D53
+                08E17C70A1C2A9491F3F8088213835E97339A370A292BDED16B3D9904B19C5D5
+                1B012A8082A779F4789E8287233A07960F4ECD970FBDB033DAD7DB6671735963
+                9B90A895784A932D696CE3F65E2A6B2C03C6338AA1EF2A275B1AF81480E4E1F9
+                F6E1B37FC7F47F0C9F2BE9E4E07CFB4A4C16C9CC7B17964E7FF38BBF132964F8
+                9F5E6F23011C1DCE4D73CE1A4D6600FE0494F08F02D77F8AEA0000000049454E
+                44AE426082}
+              FileName = 'D:\Work\Dev\svn.5nx.com\gale\gsJSON\image\json_16.png'
+            end
+            item
+              Scale = 2.000000000000000000
+              Width = 32
+              Height = 32
+              PNG = {
+                89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+                F40000000473424954080808087C0864880000081A494441545885B596699015
+                D515C77FE7F6F2D679F386611B06D99440466B34208845492462B0B414AA3489
+                2491184A54486930984252F94025224C120C89025A5A062D131554A4CA445153
+                4ADC4004470324941890C561322333EFF1B67EBDDC7CE8C7F06684A1B29D4FDD
+                7DBAFBFCEE3DCBFF0A7DACF9EE1317B88DE5556D47E462415B7DFD67B3C6B422
+                15557ED9D5F7BCFF93F4C3677B5FAA6FC6CDCB0F2B0F710F9C375CEC6F5C1821
+                6681EEF3B2A14010DC40D3D704D8B0ABCCDF8EF9A46382D62CD8B934FD507F00
+                66F54D7C8273A7FB39F6EA59299A1A8DB3C19FD6B61FF47973BF473A2688B06E
+                F28A6EDEEB074255DFE43BD5888684E2BC21A70FBEFE5D87ABD76499FFFB1C5F
+                5C7F68255763577D1E08EB26AEEC5E7026805E3B20E8921708D9926660F25476
+                36EE2A73D7B379BC00BA8B9AEB2FB211A0ECC1035B4B6CFDD8A52D13601BE006
+                30BCAED7BA10583BB125233B97D4AEED17804ACAABD37BEB93791ED95264E135
+                315A66C789D982A1A03D1B30EDFE2CFB3B03BE3AD6A4B9D1A0E38466779B4FDC
+                169211F0832A08ADD74C6AC9B0A30F445F00002295A7776C0883BFBCB496994D
+                6143ACD85264E9CC182DAF14199E56EC5B96EEF9CEF561EBC72ED73E7482BA98
+                30B84611685DFDDF359356640B3B96A6D69F7CD67BAF2A561B13767FE6F3E0CB
+                45B6FD3CCDCC268B6C4933656586C7DE7108348CAA373015FCEAB5226F7FE201
+                60193063BCC5E373930CAE51644B1AC70B53E5FA952D96604EBF3B605452BFFA
+                F512CB6E4870C928933FEF73F9D36E974F8F07BCBA288512B8737A94F31B0C36
+                7E5066C7C122CFB71ADC3D234A43ADE29B136C6635DBEC6BF7311428816C49B3
+                68639E8CA3DBFB051009096C03C60C50ACDFE6E0B89AA60683F9D3228C1978AA
+                C4AF186F71C5F83035B73F9567E1D37936DD56D393C6E63EADAC045CAF77037D
+                01C00B349E0F0BA74559F25C9E6F4F8970F39428D37F9DE5DA669B6D075C36EE
+                2A73C96893842D648A9AD6231ECFED7458FCF5D8E9320A405741A32B10FD0240
+                B85D170C33F8E31D2900163C9D27D0B0705A84CF32011B7639ACDFEE602A8898
+                C2901AE1A7D7C4F9E1F4E81901CCD3565B1F000D5D0075F15398731FCF11B384
+                AD3F0A61C60C34F8FC970368CF0628250C88876D7936AB890A02F89518274D46
+                2ECF378C30CAF34B4A629EC7D5A641F3858D26B6014733012FED71993F3542CC
+                160A8E4604D27121610B5A83E369F2E57002EA338D47C201D57AC4C3F5D96D99
+                BC181DE8170FBD187D4426ACECFEBB298CD31A9482E379CDE1AE809AA8908C08
+                8392C29E369F7C418311068F9861F000C81434AEAB4155F9088750B61802A7A2
+                8269C0883A45C98582ABA94D0838B24F26AFECD23EE1F668206187D7651F8E65
+                7D3C1FBE728E497D52389ED71C3A1E609A902B69DAB301170C33694C2B728EE6
+                C3231E5A8792EC6B885B821FC0B11301F509C1F5216A826508794723B6C60C90
+                9C40D2F1C2EADF746B0DF509A17979869825ACB929C9E5634F95CA9AAD25EEDA
+                906750AD62E5EC04F3A7467A7CDB0E782C7E3ECFAE4F7DAE6CB2786A5E123F80
+                398FE5D87ED04503BF989DE0C68B6D6E5A9F63E7212FA72A0B47136AC0D09422
+                6E0B9FE703965F17E7F2B1260F6E2D31F3B7591E78A3C4D1EE00DF87FBAF0F83
+                EF6DF359B421CFE68FCA4C196DF2EC2D35442C289435095B484585D537C4C394
+                1434A958583FA6023F40F7D4AF005299587E00861246D787EEBD6D3EAFBCE770
+                E71339D6BDE5306BA2CDB726DAECEFF099BA2AC36F5E2F317BCD09367F54A6A1
+                5631774A84235DA11275E43463071B2CBF2E8ED71150F6F4C98EC390336881A1
+                4267CBAB2500D6DE9860C77D75CCB92C4A77A7CF84E1614A9ED95926EF682E3D
+                D724951036B59601681E66F628EAFA6D259EFBB0CCC26951868C3239D0794A22
+                03AA0044C0F34F49E8C87AC5A6D632731ECBF1D67E978B4798FCE1FB49665C64
+                D3960D5FF282B073B406C3901EC1A9B6A829CCFB5D0E8027E7257B0E8127278D
+                3255A8547BDB7CBA8B9A64347429150EA4A7DF2E71D9BD19E6547EF2B3EBE2EC
+                3E16469AD56CA3B5F0C1619FAEE37E8F64B71EF17A46EE39758A6CBBCFBD2F15
+                9931CE62C165D15E046677513366A0E26BE3628C1F6210B7E0AD4F3CF61CF658
+                F79D246D9980CDAD2E83AB4E487FF9ABCB7B9F7A4C1E69B2F9F61A1E7DB3C415
+                5FB6987B4984B66CC013DB1D268F322BE914A2830DEEDB52646693C5A49195E7
+                1216BD992D69A29670FFF57100FED1E9B3E485020517CE1D64F0DDC9117E7C65
+                2832BB0E7BDCF3428141B5C2CD4FE4587D4382AB9A2CAEAAACFC83C31E3F78A6
+                80E341D20E81CBBE261E01DB10166DCCB3E58E14C988A011444026ACE87600FB
+                C2E106B6216C3FE8D1990B185AABF07D38BFC160484AD1910B78E7138FB20F23
+                EA1547BB021C4F73E96893A129455741F3EE010FD7D70C4B2B84B0A5F38EA623
+                A78959F0CF9C6674BD221911DA4F681C579765724BB7F603F82C13A081BA9890
+                A9B462BEACC9E535F81A0CA12621C46C21082ADAEE6BBAF21ADCD09F4A0A514B
+                40831B68BA729A882DE1111D386780A2BBA0713C4D7D52B095C27402EBB68872
+                9634A68DA817E8B465109FFE250BEBB442FD9F9BEBC18E431E8988146A63AA5B
+                443BA5B26EE9A9ACCB9769F328DD8F0E4ACAF7DE5E5CFBBF8D5EB1A9AB3274E4
+                F4E38DA46F79639978503507DE58269E610414CBFF97D800945C308C8093C17B
+                0100D4F9465B67DE67F5EB251CAF1F71FF37CDF134AB5F2BD1510CA81B60B455
+                FB7A9DD09A96E5865A11EF60B61044CE1B641031FB1CE0FE0B808F8FFBD48A72
+                DC7673D4DEB5C963A7050038FFBE134D29DC55C78A3229D0DAFE5F002891F2D0
+                117A47F67D6BF19E876BF656FBFE052B1D8306B059B3120000000049454E44AE
+                426082}
+              FileName = 'D:\Work\Dev\svn.5nx.com\gale\gsJSON\image\json_32.png'
+            end>
+          Position.X = 11.000000000000000000
+          Position.Y = 8.000000000000000000
+          Size.Width = 16.000000000000000000
+          Size.Height = 16.000000000000000000
+          Size.PlatformDefault = False
+        end
+      end
+      object lblFilename: TLabel
+        Anchors = [akLeft, akTop, akRight]
+        Locked = True
+        Position.X = 146.000000000000000000
+        Position.Y = 1.000000000000000000
+        Size.Width = 727.000000000000000000
+        Size.Height = 33.000000000000000000
+        Size.PlatformDefault = False
+        TextSettings.HorzAlign = Center
+        Text = 'Filename'
+        TabOrder = 0
+      end
+    end
+    object rctToolBar: TRectangle
+      Align = Top
+      Fill.Kind = None
+      HitTest = False
+      Position.Y = 35.000000000000000000
+      Size.Width = 1024.000000000000000000
+      Size.Height = 38.000000000000000000
+      Size.PlatformDefault = False
+      Stroke.Kind = None
+      object MenuBar1: TMenuBar
+        Align = Left
+        Margins.Left = 5.000000000000000000
+        Margins.Top = 5.000000000000000000
+        Margins.Bottom = 5.000000000000000000
+        Position.X = 5.000000000000000000
+        Position.Y = 5.000000000000000000
+        Size.Width = 505.000000000000000000
+        Size.Height = 28.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 0
+        object miFile: TMenuItem
+          Action = fmMain.actFile
+          StyleLookup = 'menuitemstyle_lite'
+          ImageIndex = -1
+          object miFileNew: TMenuItem
+            Action = fmMain.actFileNew
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000129494441545885ED963D8EC2
+              301085671007A00C0587A0D83E3902C22B71073A12ADC40D404AC43590B0A8B7
+              22BE4DC2167B819532DB10293236D8C6C829F2757632332F93E71F8081C06077
+              C0D2BA0480D832C1EE54445B5F02C831CF119BBFF5E930FBB50D1C3916945935
+              A3F1F772F3330F250010F003B1B97C66D74510013726447466E9F52B94801BB4
+              377D736C9D1B29E1F95458C75909D01461694D3C9F0A97E5DA41F0224ADA81EB
+              2FD017474A0029D13E9762D51D202C595A3BE802683B671AFF26139A135C80B5
+              097D0BE869074C4CF8643FE04584F21CCBAA1808CBEE5C4F3B6082A64BED972B
+              FDA270D06042EF3BA12D3DEDC00BB0AC8A014069389F0204E84E44699D6B62DD
+              05B0AC8A791E3D3A6EADF0752DBF43B513AA904D283CD5F79567E0FDFC03FE01
+              6A384AED68940000000049454E44AE426082}
+            Locked = True
+            ImageIndex = -1
+          end
+          object miFileOpen: TMenuItem
+            Action = fmMain.actFileOpen
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000001BF494441545885ED97314B1C
+              5110C77F337781E4CE23951041123D054D30A9F201ACAD25841CFA01847C07BF
+              8B660B8B54292CED244D8A109760F462636163732E12617752EC72E6EEDE7A22
+              3BB1F15FED9B19DEFFC7BC790F161E74CF927F17BD4FEDCD9B8A6BF0BDD1E97E
+              7601B888DADB8274C6D45F66A9ACB4D68EF6AA02D06B92B1E6004FB466DB17D1
+              EC9BAA00FA1D48A239AB6AD3804E50FBD87CDFFD329CD050B5836630590F25FE
+              1700624C86E2F592FA3F02FB8E3C3701D85752DD68AC1D7DBB1780CCD86D15E6
+              E3DE85BBAAD5E9F6F71DED80680CB77E17EEA4249A5B6D7E385E82D010AAC579
+              42DE7A980320D6E8DB0D65CE277E1EC7BD9DF94983053700E3470980C5B24966
+              69BAE8669EAB04C088016AA9BA02A8940018F9F98B3AB61F48CD4A3A20398009
+              AF1CFDAF9A87BFC3005A7F140360BCF6F3CFE72C0470D27877789A6CBD9802A6
+              BDECC5F27726041003645A771D402B8E790440E00040455E7A02881006C88A2B
+              8899E3F98366D7376000406A76507C7A029C3DEE747F05017A57495C4496BCDC
+              85C1F60F003C5B3F4B2E77DACF319E7A013034800300F94227DCCC7382682432
+              1CE86DCD2FA3D972E5DE99EE55F93FF1A0CAF417B61388CE6504BE6400000000
+              49454E44AE426082}
+            Locked = True
+            ImageIndex = -1
+          end
+          object miFileOpenRecent: TMenuItem
+            Action = fmMain.actFileOpenRecent
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000200494441545885ED96B14B5B
+              5118C5CF7989510249DB4D212E1D8590B1D0A5B6086E852E82D8FC0BB65D12B3
+              94B7D564513276E9604110FA071404D33F214BC62E89085D342FF8A4212FA783
+              166B7BDFCD7BE115979CEDDDFBDD737EDC0BEFFB809966BA67314EF191ABCC99
+              3FD814B146A024611900487605B5291C2F6573871B2E878903ECED78350A1500
+              0F6D7582FA20EBEF76F31F12016856FCC298A30300AB91486FD572942E6F37B2
+              BDA9019A15BF2027F82A692566F8B539D9E138B56E83706C06638E0E6CE1A5A7
+              19149FCC859E97B42267F4D996110AB0B7E3D560B9F6C2E314565FCEE3C5AB05
+              9B3F243CDBAF0EDEC7023872958154B53AC7926A4D57F9C80067FE6093E083E4
+              00B0105CF5B7220388584B301C004038464F2300C152D200008A9101242DFF07
+              8045D3623A09E737BBB93BDFBDEF01BE7CF4EF160981E9ACF90988EEA4D0E1CF
+              F0BDB98CC993464FE30D086823E4CD7EEBC769804FF54BE41FFDFB33BDF464F0
+              543B3200856311AF6D0000E09D8FE19D4FAABAF534AD1B9F60299B3B047011CD
+              7AB204F56F3CA3016CB81C8A68240500B21E362358BBE17ED53B41FC36FCB75A
+              6FEBF9E7619BD66EE8285D26D999369964C751BA6CCDB06D6E37B23D8E53EB24
+              BE4D91DF9A340B003146B2EB96AA1A007BFF052E4434121BC9FE54D3553EB8EA
+              6FDD3496228045080189AE80A986D29966BA77FD02D638ADF011FF5EDE000000
+              0049454E44AE426082}
+            Locked = True
+            ImageIndex = -1
+            OnApplyStyleLookup = miFileOpenRecentApplyStyleLookup
+          end
+          object TMenuItem
+            Locked = True
+            Text = '-'
+          end
+          object miFileSave: TMenuItem
+            Action = fmMain.actFileSave
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000001FC494441545885CD953F6814
+              411487BF392318B0104B2D12102DD4462DB450B263A19D858560E50962651AC1
+              52EE5D2FDA59A70F28A4D2C6D9B31052D90489D8984205EDCE8049303E8BE572
+              EBB93B33376E2EFEAABB77EFDEF7317F760DE5E4DD25D04BC02100148B951C80
+              378FA7D9EC9FC797FDFBBE70F1E1FBE13C71283DAC48DD5FA64AF015D053955D
+              AFE5245BFDE7184E78057E6E432E4FC8E4FE4ECDD0C10975122D009CB46BE100
+              DBDC80007C98337F550A098F00CC460E4F4F8D44ABA275A2129315A89098BCC0
+              88449C80E1EB18E37F8CE332156E0132798A93B3188E053ABFA1BC6B5E00C0CA
+              9D7106C7C6BF05869BC9939D6440166A0BADC05D72B9027C4C5008C26304A078
+              48CD260844656FAE2140CB28F857600165AD1198610668FF51FBA5C627B04426
+              B71B810F92CB61E0DA68B97A0B94B78DC23D33C387F055F72AE84C1AD5AC71B9
+              F3D2D7E117707200A32FD2E0000A4EA6B1B251D7E1BF0556365096FF81BFEC83
+              43CC1658B9902C1091BD7B0EFC2F02E12DE8751780D3C5178D1C6B061F5698EB
+              B4D3059C1C44F55624B5941DD17338B98795F534012BEB387980E1F8F81280E1
+              03593D3C2C50483C4A8247A6FA10162F8F665333B36E05DAE4F21DE55943F0EB
+              8CBE0D4704562B7E9BC730DF88407556A1745FE8C9279423BB081CC6F0993939
+              0AE53350141681FE2EA2FBC0E2000EF01B3EFE8606F40DEAF80000000049454E
+              44AE426082}
+            Locked = True
+            ImageIndex = -1
+          end
+          object miFileSaveAs: TMenuItem
+            Action = fmMain.actFileSaveAs
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000213494441545885ED963F6853
+              5114C67F372FB14DFDD76A85EA50C117FC53E912C82266281682837F32A4C425
+              454CB0835340EAE2AE20419C84B4483B152B6435E02064127113DB21010396AA
+              68A3B4F25A9BE775482A89E6BDBCFAAED821DF76DFFDCE3DDFFB38E7DC2BF847
+              D0B27A024114411800490149CE4C95661B794279E2A9400C216790F85B120406
+              528C9BC9E27C9380BEC905D9C85BB973D271D2D7EF37BE0E1FEEEED5A6023190
+              8F9D45893133599CF738CE6283C5E5EF73B533E58CE3A03AD7DB8E97CFE76DF7
+              43E1D11FB1E0BE092DAB272C6D6F05895FCBEA09D70E94573657011044B71D2C
+              88B675201289D8EE3F5D585BAA1F164642F55A1100EF740068B316845D3BE0F3
+              A0B989775D037A70E42850EB73B8BCF5A7BF12D8AD2505D70E040EEDEABEFFFC
+              5308496EDBC1929CEB1A0038D2EBBB6DA64A17B569FDA1E34E101866B234AB64
+              0E4487F75EB8F7ECF310528C3B0EAA739508F07A04E74FEF7E511BAF620C8161
+              4916185B53101C14A1530C0D74ED2994BE955FBE35CEA4CFF5F7585E46C9E6CB
+              48990080B3C77A064383FE7703AFBECC2D55CC0737470FFE319CFA26DFC4415C
+              AFDC3D35A25C004097577025B83F0EC42F7D58DF2857AAE58F6BD5D51B4F96D7
+              919C00FA1BF996020EDC5A54A207386E475052846ED0116059035737B34A133D
+              F2A55A7EDFB90EFC2D32994CD343379D4E4B2B2EEC00073A023A02947741BBAA
+              FF1DFFDD810E7E02C6CEA29C14BEFB140000000049454E44AE426082}
+            Locked = True
+            ImageIndex = -1
+          end
+          object TMenuItem
+            Locked = True
+            Text = '-'
+          end
+          object miFileClose: TMenuItem
+            Action = fmMain.actFileClose
+            Locked = True
+            ImageIndex = -1
+          end
+        end
+        object miEdit: TMenuItem
+          Action = fmMain.actEdit
+          StyleLookup = 'menuitemstyle_lite'
+          ImageIndex = -1
+          object miEditMoveUp: TMenuItem
+            Action = fmMain.actEditMoveUp
+            Locked = True
+            ImageIndex = -1
+          end
+          object miEditMoveDown: TMenuItem
+            Action = fmMain.actEditMoveDown
+            Locked = True
+            ImageIndex = -1
+          end
+        end
+        object miView: TMenuItem
+          Action = fmMain.actView
+          StyleLookup = 'menuitemstyle_lite'
+          ImageIndex = -1
+          object miViewLang: TMenuItem
+            Action = fmMain.actViewLang
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000479494441545885E5975F8854
+              7514C73FE737AB8619E1DE9DD6C40703255813E78E0FC942B0D11FDB401329C1
+              97F2A116896811B317E7AEB79DD18722327B5A10D2872CD6D850C10D53DCB20C
+              02F78E524B560F05A5ADE35D095312777EA787B9633377EE8EBB604F9E977B7F
+              BF73CEF7FBBD877B7EF75CB8DB4D669A70C55BE12AA9E755B41D95051514FD53
+              54C685F2A7F3F36783FF4540E8655E06D9003C152596806BAACC4110604114FA
+              05E8A0932FEEBD23024A3977AD115E077D0891F3AA2C35B058A1A536AE25254B
+              27CB9A466495AABE2AF09B55F6A40BC1E166F8A69973A2CF3D60844328B38C18
+              50BA0596C4C941AE4E5AEB3AF9E05BA77FF4BD7B522D8FA932668443137DEE81
+              661C535620F45C0550D5DF456451331084379CFEE0DD068C5CA61791DD004E3E
+              48E44AAC40D897DD1DDD1EBF2D3960953F92F69D42F1FD2A710D667301A197ED
+              41B557E108F0E4EDC8014C8A73CDFC6AEDA3A8F6865EB6E7B602407B8053026B
+              A6C1FD09D0E9F8C158B3A0B69D67BF136457843DB580D0CBF6082C5770A6410E
+              C83F882E2AE532FE84E79EFCCBCF2E498ABAE267165B6B7F12581EAF42AC02BA
+              4E0CA7053AA6274037A132684476A8327EBF3FFA4B52942D9B1D62649FA201E8
+              BA440197FC8E7940B7B5D8E991C74844DE99CA27E8E2CA95D94077C4552F2035
+              39AB330A32AA7C6055DF9A01FFDE747EF44C9223CC657A15BA0014716BB9A0E6
+              405135ED225C68CD078FDF4AF6DC6DC0DCC647D20DD6B2CC88AC02565BD58F92
+              C84BDBDD8D08F5EDA784AAA6BDBABC550131DA0E5CACE3A99CF7B5EB11035D4E
+              7FF160BA50F4E7946FBE14B9BA920418C3D604F161C4552F20C9142EC7D6E9F9
+              F9E0CBEA7ADEAEEFC725252B04F93A9E1B75C4CA66F87502D4CA38F0604CEEA9
+              587C437BB6FAA3E7DA0AC1F1F87EA523F4B306461527E2AA172062C78185756C
+              F9D12DA2FA26F003808053CA65BAC29CBB75A2CFDDD8F4D180494D6D037EAD7F
+              269C882B5A4676C15F39774ED95E536BD7B7ED3CDBA0FCB2E7FE2C103F68866C
+              D9BC96DE75E6623CFEBFBCCC26413E0440F53C220FDF48997B17FA67AE434D05
+              A28D2163CCBA2420557DA5D29A72B0667BBD31E563E1F64C67520E405BBEB80F
+              649F084531F223305425AF1310D10C2BBC58F2B20D2F4FBA501C49178A3EE8D5
+              3A87C82318F92629A76A56EDFEB2D52DAA3C073A5CEBAB13108D51270CB6E1A3
+              51C398D83906DD1F7AD9C1245FBA501C31C246E0447C546B00B3CA1E909E3097
+              E94DA4174D24019681BE50CA65BAE28E0A96F454B0E3C21BD406875106AA934C
+              DC5AFB8361449E49F229FA76BA501C4950BD1B6520693E9C72249BF0DCC30A6B
+              4478B6B53F188EFB43DFEDA0CC20B02CDAFADCC907DD75187D6EB72A47058EB4
+              E683B5493C539E84ADF960ADA86C56E568E86506E22F99E30763B547B5A87E55
+              BD2F79D995A1971950E5A8A86C9E8A1C663496F384081F5BD56395D68209CF3D
+              59FDD2A176B58A2C34224FAB565EB8E98CE533FD31590F54CB7C5D60B6C20D54
+              2D22F745FBC3A04377ECC7246E97FC8E79A9C9599DAAA6BDFA55532BE32276BC
+              DC72F3F403FED8DF33C5BCBBED5F42FAD8DD4C3E9EC40000000049454E44AE42
+              6082}
+            Locked = True
+            ImageIndex = -1
+          end
+          object miViewShowLog: TMenuItem
+            Action = fmMain.actViewShowLog
+            Locked = True
+            ImageIndex = -1
+          end
+          object miViewDarkStyle: TMenuItem
+            Action = fmMain.actViewDarkStyle
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C0864880000001A494441545885EDC1010100
+              00008220FFAF6E484001000000EF06102000014701A0880000000049454E44AE
+              426082}
+            Locked = True
+            ImageIndex = -1
+            object BitmapAnimation1: TBitmapAnimation
+              Duration = 0.200000002980232200
+              PropertyName = 'Bitmap'
+              StopValue.PNG = {
+                89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+                F40000000473424954080808087C08648800000262494441545885C5973F6814
+                4114C67F73F326DAA8048458886010040BF52206449060631A0BC55858898592
+                226021825898DAC2423B8B48044525880AA2207285128258288AFF0EFC032246
+                0B09220998DC58EC2CEC1DBB3B3377A73E786C71DFF7BEEFBD7DBB3B07FF39F4
+                DF2A6C60B091D49F2BC355028B6D151817A8090C87702CEC16381082F5891F17
+                F8216005A6427902F70C4C76A2DD2B30E584D3DC15C85D23302FF0A42D650355
+                815F59710D13A17C77BB52DE4894B8C0504BD769EE0C303E90154FD3C0D832D8
+                E015EF81CD025FF30C00BD25A66F0BCC1618CFE673035704CE14753059407C17
+                D07DD5C09881EB39FCFB6E327B8095455D0C9738BFE31D5F73ADEC0E5C082219
+                B85162E06C8C016095C01781D73E6005A00736D9926D55B02ED2C09C85BBC0B7
+                20030D3858066AC0F6480300B780673E900028D8684B400AFA9743FF02BCF715
+                D4B05F43BD02AF163DDF017013B030E003FE0E9C8282410BDB16E0C3223C0EE1
+                10F0FC5A03977D75348C08BC74B923483CD480CB1305C287046634D43386AF1A
+                3842C8024718B0C06ACF142E098C87369F9E07BC6FBA8CD9871EC84DE06768BD
+                B4E8B9982968381F25E00BB73CC1069C89BA816A27BA4D7C81A7B1265C9E6AA7
+                6103D75ADD1C6DD38035F0C96DFD28255B2F7052E0BBE30D01A816400DF74387
+                F1029827F9F4AEC85C01B07071098EE5392C3A0D7533DF026B53CDA6FF050DF8
+                5849A6D28D29E48685510B33A520C939D775294F073BEDB609B7A071E176A2D6
+                A1F8030D7BA3C5B3E11ED1D8F7C4B486C3BEDACA07C886867D0AB6A8E408B75E
+                419F853E05B316DED864C3A797E011F0B9CD7EFF6DFC013AE94EF301B2FCA100
+                00000049454E44AE426082}
+              Trigger = 'IsChecked=true'
+              TriggerInverse = 'IsChecked=false'
+            end
+          end
+          object miViewFont: TMenuItem
+            Action = fmMain.actViewFont
+            Bitmap.PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000000F5494441545885ED963D1282
+              301085DF328E055881E3213C055C0C0885D7120EE1251CB1120B8BAC159A01C2
+              107E264DBE2ABB0B9B97649359C0E1B00CA9465044BC3421338B77F6CCA77EEF
+              2D9D7029BB2127494ABA3E493226A24C17678F3300F12A0200E0953F4AD5F645
+              18EB6200101451663A794F00330B00A03DDF4D13317305A0F280DB6C0126C5D3
+              65EEBFD68BD0BA006D11CE61EA3BD2A4F5EFFDB1BE039B0868D29AD45592A444
+              B5371760C2AA35A05BE558DCFA0E38014E807501A3D7F07009CFF87827009090
+              7F7F7E8CDBF1506F60C2E8BDF54598B75D903681A4A42B2228A22BFADD51D9A4
+              75AF93B27E040E8775BE08AF4D0193A766C80000000049454E44AE426082}
+            Locked = True
+            ImageIndex = -1
+          end
+        end
+        object miWindow: TMenuItem
+          Action = fmMain.actWindow
+          StyleLookup = 'menuitemstyle_lite'
+          ImageIndex = -1
+          object miWindowItems: TMenuItem
+            Action = fmMain.actWindowItems
+            Locked = True
+            ImageIndex = -1
+          end
+          object mi1: TMenuItem
+            Locked = True
+            Text = '-'
+          end
+          object miWindowShowAll: TMenuItem
+            Action = fmMain.actWindowShowAll
+            Locked = True
+            ImageIndex = -1
+            OnApplyStyleLookup = miWindowShowAllApplyStyleLookup
+          end
+        end
+        object miHelp: TMenuItem
+          Action = fmMain.actHelp
+          StyleLookup = 'menuitemstyle_lite'
+          ImageIndex = -1
+          object miHelpHelp: TMenuItem
+            Action = fmMain.actHelpHelp
+            Locked = True
+            ImageIndex = -1
+          end
+          object TMenuItem
+            Locked = True
+            Text = '-'
+          end
+          object miHelpAbout: TMenuItem
+            Action = fmMain.actHelpAbout
+            Locked = True
+            ImageIndex = -1
+          end
+        end
+      end
+    end
+  end
+  object imglstJSONKind: TImageList
+    Source = <
+      item
+        MultiResBitmap.Height = 32
+        MultiResBitmap.Width = 32
+        MultiResBitmap.LoadSize = 0
+        MultiResBitmap = <
+          item
+            Width = 32
+            Height = 32
+            PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000233494441545885ED543D6814
+              41187DDF9EB159094110542C53A89582BD118470211A440D6A658410AC437637
+              8DD9D8ECED8F7B10381004D14690682744B0C82508C632D6D61696C2159BCBCE
+              B39985B975732476CA3E1878DFF7BE9979F38A016AD4A851E37F401004134110
+              4CFCCDDE63661186A10F0022B2E338CEC72A4D29D55D5E5EEE1AFD0B22B2A994
+              9A2ACD5F01300D00AEEBFA0719B0CC4244AE8AC80A80B6EFFBC74BDA8AD6060F
+              B0AC3992DF3DCFDB28CD3F2EF62449D23C940103E76DDB7E7AD02613241F8AC8
+              4685F408C04F00504ACD1FD50048BA711CDF1876799AA6E3004E29A5060CB45A
+              AD490010916DDDBA7524032457355DED743A274CADD168B0E0799E4F89C8AF72
+              FC9665CDEB73B68B74A2289A3EB4018D1D92977BBD9E7FD000C93992AFCDDEDA
+              DADA2880DB00A094DA2659987B702403249F68BA18C7F14C59D7F15F2AC79F65
+              D95D4DBB9EE7ED8E8C8CBCD3F57DDFF707D21C6AC075DD4F24536DE66559DFDF
+              DF6F0240397E92F70A1E45D166BFDF7F53D4B66DDF3CB40100181B1BF3487E06
+              70B2AC894813C07BB39724C94500D7753961AC027F2439D4C0C2C242DFB22CA7
+              DC4FD3749C6413C02BB39FE7F9ACA66FF33CBF662E002039DB6EB7CF987B067E
+              C22A2C2D2D7D89E37891E4B3A257C4EF38CE07735644EE68FACDFC2D01208AA2
+              1F00CEEEEDEDCD00785E6980E41680AD0A13691886A3FA12884893E45773A6D5
+              6A4D8AC83A807500BBE53348BED0F4F480E9AA570F439AA6E359969D0380F22B
+              6BD4A851E39FC46F0015F131F41B79110000000049454E44AE426082}
+            FileName = 'Z:\gale\Downloads\none (1).png'
+          end>
+        Name = 'none'
+      end
+      item
+        MultiResBitmap = <
+          item
+            Width = 32
+            Height = 32
+            PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000003E0494441545885ED975B681C
+              551CC6BFEF6C528A62A1DEF049A4987AA14F05118A82C14B4866B6FAA245AB82
+              B4D94D52696C12DBBE68922212DB15935AE2CC0445B1FAE0E5A1BBB35B2D1683
+              C517A508A2D4162FE8835A50C182D45CE67CBEB8BBB3E9EE6677D3820FFEDFE6
+              3BE7FF7DBF398719CE215A29896E804900DD56D859E8E3072DF90060B30DAEAF
+              1D805EAEE8150AA68D83D9EDFCF692013881BA284D01B8A9B6992657AF3523EF
+              3EC4E8A201F4045A6F840CA06465279F3206796B3505A12736B2486A30974A4C
+              AF0820E5ABFD67DA098843950D0AE6CE99A1634FF3AFA25663754E911CCEA578
+              B46900D7D793805E04B02A36F304C1E15C8A9FD7324B7AD180C029106D454DC4
+              1123EECDA5F9CDB2008E2F87D004800D2551F8DDCA8E14FADB5EAFF726C5EA3E
+              A83589D51885B474E52617E7CCDEA33B397701C0FD9E6E8DA8090095FB0C1E98
+              3F87F1F872375AAEAF8D80C69678FE4D704F2ECD8315006E603F867057699A50
+              A0E158BDE56E18C45BDC029A5100B794441B7586FDEDB30060AA76113D02065D
+              4F1D2B094F068BDDA0D95511BEA4AA030080B415D419C78BC69B0D763D75247D
+              FB8E640A006EAF37F7020091F702F8B1F84CF259D7B3DF2567F47023E18E171D
+              007546C08331F9186CD4D910403EC58FC2B4B981D28E9248AC93D5DBAE6F3FEC
+              09B4BE9A911BA8D7F5ED6F244762F20F10EF09D3A6AB1670CD2DC8F525A6C3B4
+              21A1C9987C9F914E277D658A82136893EBDB939002005795A1D91FA6CDBAB08F
+              C76B65D4052881A413BB4C1B6F26982F6A82865DDFFEE9FAD15B943E05B0B13C
+              C6977E015785297ACB790328FFB1EA55761B4F03709D409B29650074005803F0
+              91D224B2A0087BF2FDFCAA11CFA6008A954F310B20EBFAD16E802F000084EF69
+              B83B97E2FBCD78156BD92DA856613AB13FE6F053ABE12D035CCCFA1FE0BF07E0
+              FA0B775C9224F2FA6A7295CF307122E9478769CC48B69767579AEBCCE84E5A4D
+              00D8546DDC0080C80109478AA2C047ADD5AFAEAF7D2D074F6BADEB458769F549
+              399CE7090E16CF0225807C2F4FE5FBCC0344D405F264D946CF247D7B36192C3E
+              D654B81F3DC784FE00B9B5249253D1E5B82E7E1A026A1C4A1D6F719BA1795EC0
+              B565167C6612ECCDF6F24B00707DAB7F1D66C394E90400D7D3165087005C1D8B
+              C8990446B3DBF945B5AC9AC7F2CDAFEA0A3B6F876138BAA4E5CD30CDC7E3005A
+              5818605BFB1B006E8BBDF1D7B0180BFBF85EAD8CBA00C5725ED1061A3B04F089
+              1A0EB315E749F0BC64C72FBBD2641AB921357C357367D4038B214077D79C24CD
+              5863328514CF34EADBF4E5D4F1A37E8243006E8CD91C374226DBC22DB9690000
+              E87E4DD724E6ED3E800EA8FD613A71A8151F00F807FF2C855ABCAD219C000000
+              0049454E44AE426082}
+          end>
+        Name = 'object'
+      end
+      item
+        MultiResBitmap = <
+          item
+            Width = 32
+            Height = 32
+            PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000000E2494441545885ED97B10DC2
+              3010459F1183A4600316A045620E28210D2D6102A7668EF44C909202D1B8822D
+              084582132C27240A4448DCAF2CDFF9FEB3DCF8C3BF4BD995668E620BCC9C8E2B
+              771242569D266B22140B60EA54523212422217E08262523B7053E96DA398ACB1
+              5ECC1BD98D7AF31319FB4EE6B9749BA6F2562E71D71BFB110220289C8EBEF9E3
+              DE264D0A31800120F6B78CFCDBC34900044000044000044000044000EAFF84DA
+              E6833321B7E101AABF58CDE183C1E445D527300D30CB4EE6F999DD3B7317600D
+              A49E9E6F04135BEB1F3E9A11029EC1A49429F2C26FE801C087290080A6069B00
+              00000049454E44AE426082}
+          end>
+        Name = 'array'
+      end
+      item
+        MultiResBitmap.Height = 32
+        MultiResBitmap.Width = 32
+        MultiResBitmap.LoadSize = 0
+        MultiResBitmap = <
+          item
+            Width = 32
+            Height = 32
+            PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000343494441545885ED964D681C
+              7518C67FCFEC1A142C821745301441840AF5B028CDA1B0CDA144C17614725250
+              04839F6024C9B2713799CD6E0D3B095A5490F46A4148B4CE9E1A05C9520AA5C6
+              207808F8D11E5AD14341A10D9658775E0F3B9B9D4C92EAA67A721F1866DE679E
+              F77D9FF9F3FF18E8A28BFF3B140F6CCACDE030043C06ECC558439CC358053E52
+              31B8F09F19B08AFB06F0EE4DB46B602755A8BD9C7C313333331986A10072B99C
+              D7890107C0CA4FF5279A7F0FD481CB31EE4ED04B56393A9E2C62665949939226
+              3B69BE6100C72AED6A9454081E522138A442D04B6807304AED141DB3F291814E
+              1BED68C0AA47F660F445F16515032F2ED044ED7CC47DD1265307FF2D0369FE70
+              32ED99A0DF6EA2FD1238DC7C0C1F01989E9ECE2645712E9FCFD7939A7C3E5FF7
+              7DFF05E020B037BD39DDF6DBD4D38F6AE2D472B2B00A810FF8712E954A4D02D9
+              04B704606625A0EE384EB635371A8DC621DFF74F02CFB4F40E77AD9F03AE6D54
+              70EC8C55DCD7CC1BBC7B9B51B82548BA37DE1CA2656865D7432467F035601969
+              9930FC5AC5DA273B15F67D7F896824C6C6C636ED2DD56AD58BAD8E4560C0CC4A
+              92BE6A341ABFA701540C3C2BBB20E5C06E8FC47B807ECCFA91B063EE0A70426F
+              052776F3F51106CCAC14DF2B9CD6838A818739FBA325F739707553AA91C198B3
+              8A3B7F0B067EEEE9E9998B134E3C50F1D31F540C3C158201FE5CBF1FF104C6FB
+              C08F31D9A0955D8FDDE1FCF0F0F02F7122BD9352DEE9ABC0E9E8C2CAEE7B88D7
+              23DB2FDA3B8355BDB970BD43033F2589B455DCA58DC8B157355E5BDD3635755B
+              99F046D380711FD7D71F04BEEDA4BB99FD9AE41CC41D3467709686FAB66445D0
+              F8C2159AE743643DBDA5D86EE060F64DBB0BCFEE24B4B78FEE0332916E45B953
+              5B86737706D099589CB58A3B67536E6653F3B27B98D099A7B93421B4780E9236
+              36B2D9D9D97D9D1848AB107C6C15F71EDAC7F1100E4356762F212E623C80E805
+              6BE59CA5D13391A8B30A3C091086E1BCEFFB5724D54747474BFC0D1C001582E3
+              38BC027CD7FE2C7A816C748F608B18CFCB5B588B1791B4100B1F06B2AD1F947F
+              640040E3C187A46EF43537227D065C40AC232E0267919E53A1F6F876BF652323
+              232B920E48FA005894743CFEDECC4AD1E1D445175D6CC15F5C98276AACF68007
+              0000000049454E44AE426082}
+            FileName = 'Z:\gale\Downloads\String.png'
+          end>
+        Name = 'string'
+      end
+      item
+        MultiResBitmap = <
+          item
+            Width = 32
+            Height = 32
+            PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000166494441545885ED97D16D83
+              301086FF83AC90259221CA10512641443C953E59414CD2256A864896C80CF6E5
+              A139448D8D4C126855E57B3A1F87EFC7F6F9041D8FC78A88DE00645816CDCCED
+              8A887600B60B2707808C88D62B49CECC1F699A7EE6797E9E336BD3341B63CC9E
+              88DE016C137960ADD5732707803CCFCFD65A2DE34E405996DAF7C21CF4732523
+              718BF012B0721DBD7B01CCDC1E0E87CAF167CE2BFA9E3861B002B77B21C3779D
+              EE3C7E97BBE28202F0F352EADB174FEC237141015E98B905707A569C30380321
+              6E7B57C9B8AE6B7E244EF87B551022B66B4EEDAED10262BBE6D4EE3A650BC626
+              D53D7BAC0A1E1210E2743BF90066AC0297A228C8E7FFBF55E0D2FBB2D85EE0E5
+              192B10DB0BA205E808DBE512B0C7E606E0D902666E89682DB6C7EF96E3A00A62
+              E20492BD0C9DEAB990BCBF5E052F019D80A669364B25EDE7EA041863F64AA96C
+              EEE44AA9CC18B39731D575FD85E5FF8C059D4CED5E4FE4C4CCED15B852BAFB0D
+              F8F8070000000049454E44AE426082}
+          end>
+        Name = 'number'
+      end
+      item
+        MultiResBitmap.Height = 32
+        MultiResBitmap.Width = 32
+        MultiResBitmap.LoadSize = 0
+        MultiResBitmap = <
+          item
+            Width = 32
+            Height = 32
+            PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C086488000003BB494441545885ED955D685C
+              4514C7FF67EE57B36D3E6A4B2011E3535B8BA8813E587DF045C1179545882F8A
+              41A406691BB64B36DB824DA561B7D94482AC45580D58438918415114FCC44A11
+              B5AD882C6AFD822435A5D1643731E926F7DEB9737C4893B4BBDBBB77093EB5FF
+              970B33E79CFFEFCE9C99016EEA4617150F6C7C73F3DD82681F18BA4FDE8CA1A1
+              37F754EEDFF502949808A223001E2F45BB560EE32C80D1EBCD0F0C0C3C4A444D
+              5D5D5DAFF9D511A543F49BBFF5B23F94F8E77A938944E241001F28A532FDFDFD
+              07AA02987F7AE6104BA7D123D10CC29EB519FE83C17779249AE737841A16DAA7
+              BF2C5730994C6E370CE373660633434AF9A71F408585066A876FB10198CC7C7C
+              A13DBFDF2F369D4ED7D9B63DC1CCF500609AE6DE4824F2AA5F4E992D5853C31B
+              0D0D00140010D1A64AB08B8B8B6798B95E4A09D3345FAE645E11804D26809657
+              89FC572B954A7DACEBFA0E003034EDA34824E2BBF78100822A994C1E775DF761
+              A514A0BC6C2C1E7F2468AEDF590FA4442271C0B2ACBD2C5DD89A3EEDD6D5EDAE
+              267F5D00C964322C841854AE8342CD2668A6DEFA624747E17F01286E81BEBEBE
+              7B745D7FCF9312545B8FDAC6E607A26DE1C93CD09A6B82EED68400D75D8DD704
+              BC6DE3EE0F550128A904887500F018C6CAF8C84B235B2FA80B679452504A811B
+              9BDB0FB6854F4F01FD975A8C1881002957FBF74A3E7E6D314FEC98709EB9DAC3
+              B7092D6939CBF002978D995580294C9D03C3240072F396C4C1B6F030002C34D1
+              BD7E8785819AAA5660FAD9E9F9FAE1ADCFCD69B9FB2DCD4AD8B0F17A22F3D58C
+              CADFAE090D4ACAB70E3FDFF1C24ABC6399B3A478F98789E210C8AEB993B3736C
+              E954B147C59BF06A8D1C3B796242FFAB5DB000117D178BC5AEE9F8F32DE6FB00
+              1E63E0E79D13CE9D416A0606C8F4660EE7CCDC515337A1EBFA646767E76D44C4
+              E500005C16106149E22700100AA4B9C2DD7669A1E4010B7411A553E927F31BF2
+              472DC3C2D2D2929BCD6677159B1769A382FA4CB0BC28585E04C949CF74FEFEA5
+              C53C5635402A95DA6D0BFBA460016686E779F70D0D0D4D05012F160125DBE2DB
+              84838383B7BAAEFBF5CAD3EA38CE133D3D3DDF07F062108E40D18FABE60272FB
+              B8FD4960804C2663CCCECE9E2522010086611C8A46A3EF04300708BFDF31EEF4
+              06092DBB05A3A3A3DADCDCDC3744D4444460E6A16834DA17C81C0031DCCA513E
+              00636363AF00D80500CCFC453C1EDF532EAE8CF5160060A2C6750100F8F6CAF7
+              7C7777F743418B11F8530000F3A9A039657BA05028BC1B0A855A89E85CD04200
+              C01ABD0DC9B5CCE2C36AF26EEAC6D67F891C74B4EABF723E0000000049454E44
+              AE426082}
+            FileName = 'Z:\gale\Downloads\Boolean value (1).png'
+          end>
+        Name = 'boolean'
+      end
+      item
+        MultiResBitmap.Height = 32
+        MultiResBitmap.Width = 32
+        MultiResBitmap.LoadSize = 0
+        MultiResBitmap = <
+          item
+            Width = 32
+            Height = 32
+            PNG = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000000473424954080808087C08648800000262494441545885ED97CB75DB
+              301045DF80A9C13A5A192EC28E76A12BB155022B905C014B105589989D2C1711
+              78A523F7404C16041010003FFA6495CC0A0089799783CF0C817FDDE8DC09C772
+              210120439333E89EC09F00D02053F3625F0FCD3D954F2B0DB19D177B7536C0B1
+              5C48015E01FC3AF09A02A8D6A06D08732ABF6FCC5CA5219E2DC428C0B15CC80C
+              CD8641F954580B63853C716354CD8AF7E528C057F9F8CAA04DCA398115836A80
+              24414B064900B2E73D074FE0FAAEF878FED3EFB1981A00B00ED7D0B77699F40B
+              8075EA7928DE0B702A9F568193CEBA8D9901F9150CAB59717808DF1589C9B92F
+              4EE07A561C1EA68AB74E79D503968F026468DCE454C8C6AC67E900400AE8683F
+              7500CCA673940DB2B7EBC4A9D2107ED86518850E0043FCF0278F5D2C63E2B3E2
+              7D69966E6D47FD084700BE030D9AFCF543E7BCF525B64E012493006168A66EBA
+              3171EB8BC0B5E97696C10164683C32AA6E259E325FCB0130E87E8AE8A5E2EDAD
+              196B45C7F06F880F9903B069B56D6B797B71723E7D2D07D02053B61DEED4EBC5
+              0180734FAB8E000028AF1D5D183708BBB40DFF84097FD03B2A10E0975B899BE4
+              E6E6FACFBEF99D06D99B80CEDB1EE7C77291B720978BB7259C5EDBBE066DFDE7
+              9D53302FF6B57F6108E8DDB5BB3D43E3121081EBF07A8F8E6183AC47E07CF1AF
+              F2713796DC2200B34154387E4E6E38960B198A1378994A6E51453490CF1580EA
+              B292AC3F7A1D8084B8425C689A71AA013620AE30CD13EFAE67C5A1377A0E20AC
+              036D357465599E0C7B12C0846F0740A64AB1F4914CBAAC08FAE75DF1514DA1EC
+              2C81FDFB19DAEDFEAF19D06636027F4EF935FB6F29FB0D3E65735041C5A84200
+              00000049454E44AE426082}
+            FileName = 'C:\Users\gale\Downloads\null.png'
+          end>
+        Name = 'null'
+      end>
+    Destination = <
+      item
+        Layers = <
+          item
+            Name = 'none'
+            SourceRect.Right = 32.000000000000000000
+            SourceRect.Bottom = 32.000000000000000000
+          end>
+      end
+      item
+        Layers = <
+          item
+            Name = 'object'
+            SourceRect.Right = 32.000000000000000000
+            SourceRect.Bottom = 32.000000000000000000
+          end>
+      end
+      item
+        Layers = <
+          item
+            Name = 'array'
+            SourceRect.Right = 32.000000000000000000
+            SourceRect.Bottom = 32.000000000000000000
+          end>
+      end
+      item
+        Layers = <
+          item
+            Name = 'string'
+            SourceRect.Right = 32.000000000000000000
+            SourceRect.Bottom = 32.000000000000000000
+          end>
+      end
+      item
+        Layers = <
+          item
+            Name = 'number'
+            SourceRect.Right = 32.000000000000000000
+            SourceRect.Bottom = 32.000000000000000000
+          end>
+      end
+      item
+        Layers = <
+          item
+            Name = 'boolean'
+            SourceRect.Right = 32.000000000000000000
+            SourceRect.Bottom = 32.000000000000000000
+          end>
+      end
+      item
+        Layers = <
+          item
+            Name = 'null'
+            SourceRect.Right = 32.000000000000000000
+            SourceRect.Bottom = 32.000000000000000000
+          end>
+      end>
+    Left = 200
+    Top = 143
+  end
+end

+ 1197 - 0
FormDocument.pas

@@ -0,0 +1,1197 @@
+unit FormDocument;
+
+interface
+
+uses
+  jsonhelper, JsonDocument,
+  WinSizeUtil, LineNumbersMemoFMX,
+  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+  System.Math, System.StrUtils, FMX.DialogService,
+  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
+  FMX.Controls.Presentation, FMX.Layouts, FMX.TreeView, FMX.Objects, System.JSON,
+  FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, System.ImageList, FMX.ImgList, FMX.Text,
+  FMX.ListBox, FMX.Edit, FMX.TabControl, FMX.Menus, FMX.Ani, FMX.Effects,
+  FMX.Filter.Effects, System.Generics.Collections, System.Actions, FMX.ActnList,
+  System.Math.Vectors, FMX.Controls3D, FMX.Layers3D, FMX.EditBox, FMX.NumberBox;
+
+type
+  TfmDocument = class(TForm)
+    pmTreeViewItem: TPopupMenu;
+    miMoveDown: TMenuItem;
+    imglstJSONKind: TImageList;
+    miMoveUp: TMenuItem;
+    pnlSizeBorder: TPanel;
+    lytMiddle: TLayout;
+    rctFooter: TRectangle;
+    lytLeftAndRight: TLayout;
+    rctLeft: TRectangle;
+    rctLeftToolBar: TRectangle;
+    rctBtnCollapseAll: TRectangle;
+    ColorAnimation6: TColorAnimation;
+    pathBtnCollapseAll: TPath;
+    rctBtnExpandAll: TRectangle;
+    ColorAnimation7: TColorAnimation;
+    pathBtnExpandAll: TPath;
+    lytLeftToolBar_right: TLayout;
+    rctBtnDelete: TRectangle;
+    ColorAnimation8: TColorAnimation;
+    Path2: TPath;
+    rctBtnAddSubItem: TRectangle;
+    ColorAnimation9: TColorAnimation;
+    pathBtnAddSub: TPath;
+    rctBtnAddItem: TRectangle;
+    ColorAnimation10: TColorAnimation;
+    pathBtnAddBrother: TPath;
+    rctBtnMoveDown: TRectangle;
+    ColorAnimation11: TColorAnimation;
+    pathBtnMoveDown: TPath;
+    rctBtnMoveUp: TRectangle;
+    ColorAnimation12: TColorAnimation;
+    pathBtnMoveUp: TPath;
+    tvJson: TTreeView;
+    rctDrap: TRectangle;
+    rctRight: TRectangle;
+    rctRightTopBar: TRectangle;
+    edtName: TEdit;
+    cbValueType: TComboBox;
+    rctRightMiddle: TRectangle;
+    mmoEdit: TMemo;
+    rctForBoolValue: TRectangle;
+    rbTrue: TRadioButton;
+    rbFalse: TRadioButton;
+    slL_R: TSplitter;
+    rctTitleBar: TRectangle;
+    rctTitleBarForMove: TRectangle;
+    rctBtnClose: TRectangle;
+    aniForCloseBtn: TColorAnimation;
+    pathCloseBtn: TPath;
+    rctBtnMin: TRectangle;
+    aniForMinBtn: TColorAnimation;
+    pathMinBtn: TPath;
+    rctBtnMax: TRectangle;
+    aniForMaxBtn: TColorAnimation;
+    pathMaxBtn: TPath;
+    lblCaption: TLabel;
+    imgLogo: TImage;
+    lblFilename: TLabel;
+    rctToolBar: TRectangle;
+    MenuBar1: TMenuBar;
+    miFile: TMenuItem;
+    miFileNew: TMenuItem;
+    miFileOpen: TMenuItem;
+    miFileOpenRecent: TMenuItem;
+    miFileSave: TMenuItem;
+    miFileSaveAs: TMenuItem;
+    miFileClose: TMenuItem;
+    miEdit: TMenuItem;
+    miEditMoveUp: TMenuItem;
+    miEditMoveDown: TMenuItem;
+    miView: TMenuItem;
+    miViewShowLog: TMenuItem;
+    miViewDarkStyle: TMenuItem;
+    BitmapAnimation1: TBitmapAnimation;
+    miViewFont: TMenuItem;
+    miHelp: TMenuItem;
+    miHelpHelp: TMenuItem;
+    miHelpAbout: TMenuItem;
+    txtMsg: TText;
+    aniMsg: TFloatAnimation;
+    miWindow: TMenuItem;
+    mi1: TMenuItem;
+    miWindowShowAll: TMenuItem;
+    miWindowItems: TMenuItem;
+    lblPath: TLabel;
+    rctLinePos: TRectangle;
+    lblLineAndPos: TLabel;
+    ErrorLight: TCircle;
+    rctIndent: TRectangle;
+    lblIndent: TLabel;
+    rctWordWarp: TRectangle;
+    ColorAnimation13: TColorAnimation;
+    miViewLang: TMenuItem;
+    pathWordWrap: TPath;
+    procedure tvJsonChange(Sender: TObject);
+    procedure mmoEditChangeTracking(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure cbValueTypeChange(Sender: TObject);
+    procedure FormResize(Sender: TObject);
+    procedure slL_RMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure rctBtnCloseClick(Sender: TObject);
+    procedure rctBtnMaxClick(Sender: TObject);
+    procedure rctBtnMinClick(Sender: TObject);
+    procedure mmoEditViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
+    procedure edtNameChangeTracking(Sender: TObject);
+    procedure rctBtnCollapseAllMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure rctBtnExpandAllMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure rctIndentClick(Sender: TObject);
+    procedure rctWordWarpClick(Sender: TObject);
+    procedure rctBtnMoveUpMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure rctBtnMoveDownMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure tvJsonDragChange(SourceItem, DestItem: TTreeViewItem; var Allow: Boolean);
+    procedure tvJsonDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation);
+    procedure tvJsonMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
+    procedure rctBtnDeleteClick(Sender: TObject);
+    procedure pmTreeViewItemPopup(Sender: TObject);
+    procedure tvJsonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure JsonFileDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation);
+    procedure JsonFileDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF);
+    procedure rbTrueFalseChange(Sender: TObject);
+    procedure FormClose(Sender: TObject; var Action: TCloseAction);
+    procedure FormDestroy(Sender: TObject);
+    procedure rctBtnAddItemMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure rctBtnAddSubItemMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure miFileOpenRecentApplyStyleLookup(Sender: TObject);
+    procedure FormActivate(Sender: TObject);
+    procedure miWindowShowAllApplyStyleLookup(Sender: TObject);
+    procedure ErrorLightClick(Sender: TObject);
+  private
+    FDoc: TJsonDocument;
+    FIsUpdating: Boolean;
+    FLinesMemoUtil: TLinesMemoUtil;
+    FIndent: Integer;
+    FCurrentJSONKind: TJSONKind;
+    FRightPanelWidthPercent: Single; // 右侧宽度占整个窗口的比例
+    procedure SetIndent(AValue: Integer);
+    function GetWordWarp: Boolean;
+    procedure SetWordWarp(AValue: Boolean);
+    property Indent: Integer read FIndent write SetIndent;
+    property WordWarp: Boolean read GetWordWarp write SetWordWarp;
+  public
+    property Doc: TJsonDocument read FDoc;
+  private
+    procedure InitUI;
+    procedure miFileOepnedClick(Sender: TObject);
+    procedure miRecentFilesClick(Sender: TObject);
+    procedure FilenameChanged(ASender: TObject);
+    procedure SetErrInfo(const AMsg: string);
+  public
+    procedure SetLang;
+    procedure NewFile;
+    procedure OpenFile(const AFilename: string);
+    procedure SetStyleBook;
+    procedure InitOpenedFileMenu;
+    procedure InitRecentFile;
+    procedure ShowInfo(AText: string; ALevel: Integer = 0; ADelay: Single = 3.0);
+  end;
+
+var
+  fmDocument: TfmDocument;
+
+implementation
+
+{$R *.fmx}
+
+
+uses JSONTreeView, memo_json_auto, data_const, pub, Logger, fmFontDialog,
+  rjson, FormMain;
+
+procedure TfmDocument.FilenameChanged(ASender: TObject);
+var
+  strTmp: string;
+begin
+  if FDoc.FileName = '' then
+  begin
+    strTmp := c_untitled_filename;
+    for var i := 1 to 9999 do
+    begin
+      if g_pub.DocumentWindowList.GetWindowByFilename(strTmp) = nil then
+        Break;
+      strTmp := c_untitled_filename + ' (' + i.ToString + ')';
+    end;
+    lblFilename.Text := strTmp
+  end
+  else
+  begin
+    lblFilename.Text := FDoc.FileName;
+{$IFDEF MACOS}
+    fmMain.InitMacOsRecentFile;
+{$ENDIF}
+  end;
+{$IFDEF MACOS}
+  Caption := app_name + ' ' + app_version + ' [' + lblFilename.Text + ']';
+{$ENDIF}
+end;
+
+procedure TfmDocument.SetErrInfo(const AMsg: string);
+begin
+  ErrorLight.TagString := AMsg;
+  ErrorLight.Fill.Color := IfThen(AMsg.IsEmpty, $FF00FF00, $FFFF0000);
+end;
+
+procedure TfmDocument.FormCreate(Sender: TObject);
+var
+  LDisplay: TDisplay;
+begin
+  FDoc := TJsonDocument.Create;
+  FDoc.OnFilenameChanged := FilenameChanged;
+  if g_pub.DocumentWindowList.LastActive <> nil then
+  begin
+    Position := TFormPosition.Designed;
+    Left := g_pub.DocumentWindowList.LastActive.Left + 28;
+    Top := g_pub.DocumentWindowList.LastActive.Top + 28;
+    Width := g_pub.DocumentWindowList.LastActive.Width;
+    Height := g_pub.DocumentWindowList.LastActive.Height;
+    LDisplay := Screen.DisplayFromForm(g_pub.DocumentWindowList.LastActive);
+    if (Left > LDisplay.BoundsRect.Right - 320) or (Top > LDisplay.BoundsRect.Bottom - 240) then
+    begin
+      Left := 0;
+      Top := 0;
+    end;
+  end;
+
+  g_pub.DocumentWindowList.Add(self);
+  FIsUpdating := False;
+  TMemoJsonAuto.Create(self, mmoEdit);
+  FLinesMemoUtil := TLinesMemoUtil.Create(self, mmoEdit);
+  InitUI;
+end;
+
+procedure TfmDocument.FormDestroy(Sender: TObject);
+begin
+  FDoc.Free;
+end;
+
+procedure TfmDocument.FormResize(Sender: TObject);
+begin
+  rctRight.Width := IfThen((Width - 10) * FRightPanelWidthPercent > slL_R.MinSize,
+    IfThen((Width - 10) * (1.0 - FRightPanelWidthPercent) >= slL_R.MinSize, (Width - 10) * FRightPanelWidthPercent, (Width - 10) - slL_R.MinSize),
+    slL_R.MinSize);
+{$IFDEF MSWINDOWS}
+  pathMaxBtn.Data.Data := IfThen(WindowState = TWindowState.wsMaximized, c_ResPathData, c_MaxPathData);
+{$ENDIF}
+end;
+
+procedure TfmDocument.InitUI;
+begin
+{$IFDEF MACOS}
+  rctTitleBar.Visible := False;
+  pnlSizeBorder.StyleLookup := 'panelstyle_macos_frame';
+  mmoEdit.TextSettings.Font.Family := 'SimSong'; // [BIZ UDGothic] [BIZ UDMincho] [PCMyungjo] [SimSong]
+  rctToolBar.Visible := False;
+  rctToolBar.Free;
+  lytMiddle.Margins.Left := 2;
+  lytMiddle.Margins.Right := 2;
+  lytMiddle.Margins.Top := 2;
+{$ELSE}
+  Transparency := True;
+  with TWinSizeHelper.Create(self) do
+  begin
+    SetControlled(pnlSizeBorder);
+    SetTitleBar(rctTitleBarForMove);
+    CanMaximized := True;
+  end;
+
+  for var item in g_pub.Languages do
+  begin
+    var
+    mi := TMenuItem.Create(miViewLang);
+    mi.Text := item['caption'].ToStr('None');
+    mi.RadioItem := True;
+    mi.GroupIndex := 10;
+    mi.OnClick := fmMain.actViewLangExecute;
+    miViewLang.AddObject(mi);
+  end;
+{$ENDIF}
+  SetLang;
+  Caption := app_name + ' ' + app_version;
+  lblCaption.Text := Caption;
+  rctDrap.Visible := False;
+
+  OnResize := nil;
+
+  Indent := g_pub.Config['editor.indent'].ToInt(4);
+  WordWarp := g_pub.Config['editor.wordWarp'];
+  SetStyleBook;
+  FRightPanelWidthPercent := 0.5;
+  rctRight.Width := (Width - 10) * FRightPanelWidthPercent;
+
+  OnResize := FormResize;
+end;
+
+procedure TfmDocument.SetStyleBook;
+const
+  c_PathColors: array [Boolean] of TAlphaColor = ({false:}$FF000000, {true:}$FFFFFFFF);
+begin
+  tvJson.ScrollBy(tvJson.ViewportPosition.X, tvJson.ViewportPosition.Y); // 否则切换时会偶发异常
+  StyleBook := g_pub.StyleBook;
+  fmMain.actViewDarkStyle.Checked := g_pub.IsDarkStyle;
+  tvJson.ShowScrollBars := True;
+  for var item in [pathMaxBtn.Fill, pathMinBtn.Fill, pathCloseBtn.Fill] do
+    item.Color := c_PathColors[fmMain.actViewDarkStyle.Checked];
+  mmoEdit.TextSettings.FontColor := c_PathColors[fmMain.actViewDarkStyle.Checked];
+end;
+
+procedure TfmDocument.SetLang;
+begin
+{$IFDEF MSWINDOWS}
+  miViewLang.Items[g_pub.LangIndex].IsChecked := True;
+{$ENDIF}
+  rctIndent.Hint := g_pub.LangStr('strIndent');
+  rctWordWarp.Hint := g_pub.LangStr('strWordWarp');
+end;
+
+procedure TfmDocument.NewFile;
+begin
+  FDoc.New;
+  FIsUpdating := True;
+  try
+    tvJson.Clear;
+    SetTreeItem(tvJson, FDoc.JsonRoot);
+    tvJson.ExpandAll;
+    tvJson.Items[0].Select;
+    mmoEdit.SetFocus;
+    mmoEdit.Text := '{' + sLineBreak + StringOfChar(' ', Indent) + sLineBreak + '}';
+    mmoEdit.CaretPosition := TCaretPosition.Create(1, Indent);
+    cbValueType.ItemIndex := 0;
+  finally
+    FIsUpdating := False;
+  end;
+end;
+
+procedure TfmDocument.OpenFile(const AFilename: string);
+begin
+  if FDoc.Open(AFilename, True, False) then
+  begin
+    FIsUpdating := True;
+    try
+      tvJson.Clear;
+      tvJson.BeginUpdate;
+      SetTreeItem(tvJson, FDoc.JsonRoot);
+      tvJson.EndUpdate;
+      tvJson.ExpandAll;
+      mmoEdit.Text := '';
+      ShowInfo('Open: ' + AFilename);
+    finally
+      FIsUpdating := False;
+    end;
+    if tvJson.Count > 0 then
+    begin
+      tvJson.Items[0].Select;
+    end;
+  end
+  else
+  begin
+    ShowMessage('An error occurred while opening the file.!');
+  end;
+end;
+
+procedure TfmDocument.tvJsonChange(Sender: TObject);
+var
+  selItem: TJSONTreeViewItem;
+  LJsonKind: TJSONKind;
+begin
+  if FIsUpdating then
+    Exit;
+  FIsUpdating := True;
+  try
+    SetErrInfo('');
+    selItem := TJSONTreeViewItem(tvJson.Selected);
+    if selItem = nil then
+    begin
+      mmoEdit.Text := '';
+      Exit;
+    end;
+
+    edtName.Text := selItem.LastPath;
+    mmoEdit.Text := selItem.Value;
+    lblPath.Text := selItem.Path;
+    edtName.Enabled := not selItem.Key.IsEmpty;
+    LJsonKind := selItem.JsonValue.JsonKind;
+    cbValueType.ItemIndex := ord(LJsonKind) - 1;
+    if LJsonKind in [jkObject, jkArray] then
+    begin
+
+      mmoEdit.Text := selItem.JsonValue.Format(Indent);
+    end
+    else
+    begin
+      mmoEdit.Text := selItem.Value;
+      if LJsonKind = jkBoolean then
+      begin
+        rbTrue.IsChecked := selItem.JsonValue.AsType<Boolean>;
+        rbFalse.IsChecked := not rbTrue.IsChecked;
+      end;
+    end;
+  finally
+    FIsUpdating := False;
+  end;
+end;
+
+procedure TfmDocument.tvJsonDragChange(SourceItem, DestItem: TTreeViewItem; var Allow: Boolean);
+var
+  Pos: TPointF;
+  Source, Dest: TJSONTreeViewItem;
+begin
+  Allow := False;
+  rctDrap.Visible := False;
+  if DestItem = nil then
+    Exit;
+
+  Dest := TJSONTreeViewItem(DestItem);
+  Source := TJSONTreeViewItem(SourceItem);
+
+  if Source.IsChild(Dest) then
+  begin
+{$IFDEF DEBUG}
+    g_Logger.Debug('父条目不能插入子条目!');
+{$ENDIF}
+    Exit;
+  end;
+
+  Pos := Dest.ScreenToLocal(Screen.MousePos);
+  if Pos.Y < Dest.LocalRect.Height / 4 then
+  begin
+    if ((Dest.ParentItem = Source.ParentItem) and (Dest.Index - Source.Index = 1)) or (Dest.ParentItem = nil) then
+    begin
+{$IFDEF DEBUG}
+      g_Logger.Debug('Do nothing');
+{$ENDIF}
+    end
+    else
+    begin
+{$IFDEF DEBUG}
+      g_Logger.Debug('前边插入');
+{$ENDIF}
+      TJSONTreeViewItem(Source).ExtractFromParent(True);
+      TJSONTreeViewItem(Dest.ParentItem).InsertItem(Dest.Index, Source, True);
+      Source.Select;
+    end;
+  end
+  else if Pos.Y > Dest.LocalRect.Height / 4 * 3 then
+  begin
+    if ((Dest.ParentItem = Source.ParentItem) and (Source.Index - Dest.Index = 1)) or (Dest.ParentItem = nil) then
+    begin
+{$IFDEF DEBUG}
+      g_Logger.Debug('Do nothing');
+{$ENDIF}
+    end
+    else
+    begin
+{$IFDEF DEBUG}
+      g_Logger.Debug('后边插入');
+{$ENDIF}
+      TJSONTreeViewItem(Source).ExtractFromParent(True);
+      TJSONTreeViewItem(Dest.ParentItem).InsertItem(Dest.Index + 1, Source, True);
+      Source.Select;
+    end;
+  end
+  else
+  begin
+    if not Dest.JsonValue.IsObjectOrArray then
+    begin
+{$IFDEF DEBUG}
+      g_Logger.Debug('Do nothing');
+{$ENDIF}
+    end
+    else
+    begin
+{$IFDEF DEBUG}
+      g_Logger.Debug('插入子项');
+{$ENDIF}
+      TJSONTreeViewItem(Source).ExtractFromParent(True);
+      Dest.AddItem(Source, True);
+      Source.Select;
+    end;
+  end;
+
+end;
+
+procedure TfmDocument.tvJsonDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation);
+var
+  Pos: TPointF;
+  Source, Dest: TJSONTreeViewItem;
+  LRect: TRectF;
+  LPoint: TPointF;
+begin
+  Operation := TDragOperation.None;
+  Dest := TJSONTreeViewItem(tvJson.ItemByPoint(Point.X, Point.Y));
+  if Dest = nil then
+    Exit;
+  Source := TJSONTreeViewItem(Data.Source);
+  if Source.IsChild(Dest) then
+    Exit;
+  LRect := Dest.BoundsRect;
+  Pos := Dest.ScreenToLocal(Screen.MousePos);
+  LPoint := tvJson.ScreenToLocal(Dest.LocalToScreen(PointF(0, 0)));
+  if Pos.Y < Dest.LocalRect.Height / 4 then
+  begin
+    if ((Dest.ParentItem = Source.ParentItem) and (Dest.Index - Source.Index = 1)) or (Dest.ParentItem = nil) then
+    begin
+      rctDrap.Visible := False;
+    end
+    else
+    begin
+      rctDrap.Height := Dest.Height / 2;
+      rctDrap.Position.Y := LPoint.Y - rctDrap.Height / 2 + tvJson.ViewportPosition.Y;
+      rctDrap.Position.X := LPoint.X + tvJson.ViewportPosition.X;
+      rctDrap.Width := tvJson.ClipRect.Width - 10 - rctDrap.Position.X + tvJson.ViewportPosition.X;
+      rctDrap.Visible := True;
+    end;
+  end
+  else if Pos.Y > Dest.LocalRect.Height / 4 * 3 then
+  begin
+    if ((Dest.ParentItem = Source.ParentItem) and (Source.Index - Dest.Index = 1)) or (Dest.ParentItem = nil) then
+    begin
+      rctDrap.Visible := False;
+    end
+    else
+    begin
+      rctDrap.Height := Dest.Height / 2;
+      rctDrap.Position.Y := LPoint.Y - rctDrap.Height / 2 + Dest.Height + tvJson.ViewportPosition.Y;
+      rctDrap.Position.X := LPoint.X + tvJson.ViewportPosition.X;
+      rctDrap.Width := tvJson.ClipRect.Width - 10 - rctDrap.Position.X + tvJson.ViewportPosition.X;
+      rctDrap.Visible := True;
+    end;
+  end
+  else
+  begin
+    if not Dest.JsonValue.IsObjectOrArray then
+    begin
+      rctDrap.Visible := False;
+    end
+    else
+    begin
+      rctDrap.Height := Dest.Height / 4 * 3;
+      rctDrap.Position.Y := LPoint.Y + (Dest.Height - rctDrap.Height) / 2 + tvJson.ViewportPosition.Y;
+      rctDrap.Position.X := LPoint.X + tvJson.ViewportPosition.X;
+      rctDrap.Width := tvJson.ClipRect.Width - 10 - rctDrap.Position.X + tvJson.ViewportPosition.X;
+      rctDrap.Visible := True;
+    end;
+  end;
+end;
+
+procedure TfmDocument.tvJsonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+var
+  LItem: TTreeViewItem;
+begin
+  if ssRight in Shift then
+  begin
+    LItem := tvJson.ItemByPoint(X, Y);
+    if LItem <> nil then
+    begin
+      LItem.Select;
+      pmTreeViewItem.Popup(Screen.MousePos.X, Screen.MousePos.Y);
+    end;
+  end;
+end;
+
+procedure TfmDocument.tvJsonMouseMove(Sender: TObject; Shift: TShiftState; X,
+  Y: Single);
+begin
+  if not(ssLeft in Shift) then
+    rctDrap.Visible := False;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmDocument.actHelpAboutExecute
+  说明: 关于
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmDocument.cbValueTypeChange(Sender: TObject);
+var
+  LJValue:
+    TJsonValue;
+  treeItem:
+    TJSONTreeViewItem;
+  bValue:
+    Boolean;
+begin
+  FCurrentJSONKind := TJSONKind(cbValueType.ItemIndex + 1);
+  rctForBoolValue.Visible := FCurrentJSONKind = jkBoolean;
+  mmoEdit.Visible := FCurrentJSONKind <> jkBoolean;
+  mmoEdit.Enabled := FCurrentJSONKind in [jkObject, jkArray, jkString, jkNumber];
+
+  treeItem := TJSONTreeViewItem(tvJson.Selected);
+  if FIsUpdating or (treeItem = nil) then
+    Exit;
+
+  LJValue := nil;
+  FIsUpdating := True;
+  try
+    try
+      case FCurrentJSONKind of
+        jkObject:
+          begin
+            LJValue := TJsonValue.ParseJSONValue(mmoEdit.Text, True, False);
+            if not(LJValue is TJSONObject) then
+            begin
+              FreeAndNil(LJValue);
+              mmoEdit.Text := '{' + sLineBreak + StringOfChar(' ', Indent) + sLineBreak + '}';
+              mmoEdit.CaretPosition := TCaretPosition.Create(1, Indent);
+              mmoEdit.SetFocus;
+              LJValue := TJSONObject.Create;
+            end;
+          end;
+        jkArray:
+          begin
+            LJValue := TJsonValue.ParseJSONValue(mmoEdit.Text, True, False);
+            if not(LJValue is TJSONArray) then
+            begin
+              FreeAndNil(LJValue);
+              LJValue := TJSONArray.Create;
+              mmoEdit.Text := '[' + sLineBreak + StringOfChar(' ', Indent) + sLineBreak + ']';
+              mmoEdit.CaretPosition := TCaretPosition.Create(1, Indent);
+              mmoEdit.SetFocus;
+            end;
+          end;
+        jkString:
+          begin
+            LJValue := TJSONString.Create(mmoEdit.Text);
+            mmoEdit.GoToTextEnd;
+            mmoEdit.SetFocus;
+          end;
+        jkNumber:
+          begin
+            LJValue := TJsonValue.ParseJSONValue(mmoEdit.Text.Trim, True, False);
+            if not(LJValue is TJSONNumber) then
+            begin
+              FreeAndNil(LJValue);
+              LJValue := TJSONNumber.Create(0);
+            end;
+            mmoEdit.Text := LJValue.Value;
+            mmoEdit.GoToTextEnd;
+            mmoEdit.SetFocus;
+          end;
+        jkBoolean:
+          begin
+            bValue := StrToBoolDef(mmoEdit.Text.Trim, False);
+            LJValue := TJSONBool.Create(bValue);
+            mmoEdit.Text := LJValue.Value;
+            if bValue then
+            begin
+              rbTrue.IsChecked := True;
+            end
+            else
+            begin
+              rbFalse.IsChecked := True;
+            end;
+          end;
+        jkNull:
+          begin
+            LJValue := TJSONNull.Create;
+            mmoEdit.Text := LJValue.Value;
+          end;
+      end;
+    except
+      on E: Exception do
+        SetErrInfo(E.Message);
+    end;
+
+    treeItem.ClearItem;
+    treeItem.JsonValue := LJValue;
+    treeItem.ReText;
+    SetTreeItems(treeItem, LJValue);
+
+    if treeItem.ParentItem = nil then
+    begin
+      FDoc.JsonRoot := LJValue;
+    end;
+  finally
+    FIsUpdating := False;
+  end;
+end;
+
+procedure TfmDocument.edtNameChangeTracking(Sender: TObject);
+var
+  treeItem: TJSONTreeViewItem;
+begin
+  if FIsUpdating or Trim(edtName.Text).IsEmpty then
+    Exit;
+  FIsUpdating := True;
+  try
+    treeItem := TJSONTreeViewItem(tvJson.Selected);
+    if treeItem <> nil then
+    begin
+      TJSONPair(treeItem.JsonData).Rename(Trim(edtName.Text));
+      treeItem.Text := Trim(edtName.Text) + ': ' + treeItem.Value;
+    end;
+  finally
+    FIsUpdating := False;
+  end;
+end;
+
+procedure TfmDocument.ErrorLightClick(Sender: TObject);
+begin
+  if not ErrorLight.TagString.IsEmpty then
+    ShowInfo(ErrorLight.TagString, 1, 5);
+end;
+
+procedure TfmDocument.FormActivate(Sender: TObject);
+var
+  LIndex: Integer;
+begin
+  LIndex := g_pub.DocumentWindowList.IndexOf(self);
+  if LIndex > 0 then
+  begin
+    g_pub.DocumentWindowList.Move(LIndex, 0);
+{$IFDEF DEBUG}
+    g_Logger.Debug('窗口激活,移动到列表首位!');
+{$ENDIF}
+  end;
+end;
+
+procedure TfmDocument.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+  g_pub.Config['editor.indent'] := Indent;
+  g_pub.Config['editor.wordWarp'] := mmoEdit.TextSettings.WordWrap;
+
+  g_pub.DocumentWindowList.Remove(self);
+  Action := TCloseAction.caFree;
+end;
+
+procedure TfmDocument.mmoEditChangeTracking(Sender: TObject);
+var
+  LJValue: TJsonValue;
+  treeItem: TJSONTreeViewItem;
+begin
+  treeItem := TJSONTreeViewItem(tvJson.Selected);
+  if FIsUpdating or (treeItem = nil) then
+    Exit;
+  LJValue := nil;
+  SetErrInfo('');
+  FIsUpdating := True;
+  try
+    try
+      if FCurrentJSONKind = jkString then
+      begin
+        LJValue := TJSONString.Create(mmoEdit.Text);
+      end
+      else
+      begin
+        LJValue := TJsonValue.ParseJSONValue(mmoEdit.Text, True, True);
+        if LJValue.JsonKind <> FCurrentJSONKind then
+        begin
+          FreeAndNil(LJValue);
+        end;
+      end;
+    except
+      on E: Exception do
+        SetErrInfo(E.Message);
+    end;
+
+    if LJValue <> nil then
+    begin
+      if treeItem.JsonValue.ToString = LJValue.ToString then
+      begin
+        FreeAndNil(LJValue);
+      end
+      else
+      begin
+        treeItem.BeginUpdate;
+        treeItem.ClearItem;
+        treeItem.JsonValue := LJValue;
+        if treeItem.ParentItem = nil then
+        begin
+          FDoc.JsonRoot := LJValue;
+        end;
+        treeItem.ReText;
+        SetTreeItems(treeItem, LJValue);
+        treeItem.EndUpdate;
+      end;
+    end;
+  finally
+    FIsUpdating := False;
+  end;
+end;
+
+procedure TfmDocument.mmoEditViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
+begin
+  lblLineAndPos.Text := (mmoEdit.CaretPosition.Line + 1).ToString + ': ' + (mmoEdit.CaretPosition.Pos + 1).ToString;
+end;
+
+procedure TfmDocument.pmTreeViewItemPopup(Sender: TObject);
+var
+  selItem: TJSONTreeViewItem;
+begin
+  selItem := TJSONTreeViewItem(tvJson.Selected);
+  if selItem = nil then
+  begin
+    for var i := 0 to pmTreeViewItem.ItemsCount - 1 do
+      pmTreeViewItem.Items[i].Enabled := False;
+    Exit;
+  end;
+  fmMain.actEditMoveUp.Enabled := selItem.Index <> 0;
+  fmMain.actEditMoveDown.Enabled := (selItem.ParentItem <> nil) and (selItem.Index < selItem.ParentItem.Count - 1);
+end;
+
+procedure TfmDocument.rbTrueFalseChange(Sender: TObject);
+var
+  treeItem: TJSONTreeViewItem;
+begin
+  treeItem := TJSONTreeViewItem(tvJson.Selected);
+  if FIsUpdating or (treeItem = nil) then
+    Exit;
+  mmoEdit.Text := rbTrue.IsChecked.ToString(TUseBoolStrs.True).ToLower;
+end;
+
+procedure TfmDocument.rctBtnAddItemMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+var
+  newItem, selItem, parItem: TJSONTreeViewItem;
+  LIndex: Integer;
+begin
+  if tvJson.Selected = nil then
+    Exit;
+  if tvJson.Selected.ParentItem = nil then
+    Exit;
+  selItem := TJSONTreeViewItem(tvJson.Selected);
+  parItem := selItem.MyParentItem;
+  LIndex := selItem.Index;
+  newItem := TJSONTreeViewItem.Create(nil);
+  if parItem.JsonValue is TJSONObject then
+  begin
+    newItem.JsonData := TJSONPair.Create('newItem', 'new value');
+  end
+  else
+  begin
+    newItem.JsonData := TJSONString.Create('newItem');
+  end;
+  parItem.InsertItem(LIndex + 1, newItem, True);
+  newItem.Select;
+end;
+
+procedure TfmDocument.rctBtnAddSubItemMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+var
+  newItem, selItem: TJSONTreeViewItem;
+begin
+  if tvJson.Selected = nil then
+    Exit;
+  selItem := TJSONTreeViewItem(tvJson.Selected);
+  if not selItem.JsonValue.IsObjectOrArray then
+    Exit;
+  newItem := TJSONTreeViewItem.Create(nil);
+  if selItem.JsonValue is TJSONObject then
+  begin
+    newItem.JsonData := TJSONPair.Create('newItem', 'new value');
+  end
+  else
+  begin
+    newItem.JsonData := TJSONString.Create('newItem');
+  end;
+  selItem.AddItem(newItem, True);
+  newItem.Select;
+end;
+
+procedure TfmDocument.rctBtnCloseClick(Sender: TObject);
+begin
+  Close;
+end;
+
+procedure TfmDocument.rctBtnCollapseAllMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  if tvJson.Selected <> nil then
+    tvJson.Selected.CollapseAll
+  else
+    tvJson.CollapseAll;
+end;
+
+procedure TfmDocument.rctBtnDeleteClick(Sender: TObject);
+var
+  selItem: TJSONTreeViewItem;
+  parItem: TJSONTreeViewItem;
+  LIndex: Integer;
+begin
+  if tvJson.Selected = nil then
+    Exit;
+  if tvJson.Selected.ParentItem = nil then
+    Exit;
+  TDialogService.MessageDialog('Confirm deletion of this item?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0,
+    procedure(const AResult: TModalResult)
+    begin
+      if AResult = mrYes then
+      begin
+        selItem := TJSONTreeViewItem(tvJson.Selected);
+        LIndex := selItem.Index;
+        parItem := selItem.ExtractFromParent(True);
+        selItem.JsonData.Free;
+        selItem.Free;
+        if LIndex < parItem.Count then
+          parItem.Items[LIndex].Select
+        else if parItem.Count > 0 then
+          parItem.Items[parItem.Count - 1].Select
+        else
+          parItem.Select;
+      end;
+    end);
+end;
+
+procedure TfmDocument.rctBtnExpandAllMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  if tvJson.Selected <> nil then
+  begin
+    if tvJson.Selected.ParentItem <> nil then
+    begin
+      tvJson.Selected.ExpandAll;
+    end
+    else
+    begin
+      tvJson.ExpandAll;
+    end;
+  end
+  else
+  begin
+    tvJson.ExpandAll;
+  end;
+end;
+
+procedure TfmDocument.rctBtnMaxClick(Sender: TObject);
+begin
+{$IFDEF MSWINDOWS}
+  if WindowState = TWindowState.wsMaximized then
+  begin
+    WindowState := TWindowState.wsNormal;
+  end
+  else
+  begin
+    WindowState := TWindowState.wsMaximized;
+  end;
+{$ENDIF}
+end;
+
+procedure TfmDocument.rctBtnMinClick(Sender: TObject);
+begin
+  fmMain.OnActivate := nil;
+  try
+    Hide;
+    if g_pub.DocumentWindowList.NumOfVisible <= 0 then
+    begin
+      fmMain.WindowState := TWindowState.wsMinimized;
+      fmMain.Deactivate;
+    end;
+  finally
+    fmMain.OnActivate := fmMain.FormActivate;
+  end;
+
+end;
+
+procedure TfmDocument.rctBtnMoveDownMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  fmMain.actEditMoveDownExecute(Sender);
+end;
+
+procedure TfmDocument.rctBtnMoveUpMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  fmMain.actEditMoveUpExecute(Sender);
+end;
+
+procedure TfmDocument.miFileOpenRecentApplyStyleLookup(Sender: TObject);
+begin
+{$IFDEF MSWINDOWS}
+  if TThread.GetTickCount - miFileOpenRecent.Tag > 2000 then // 防止多次触发
+  begin
+    InitRecentFile;
+    miFileOpenRecent.Tag := TThread.GetTickCount;
+  end;
+{$ENDIF}
+end;
+
+procedure TfmDocument.miFileOepnedClick(Sender: TObject);
+begin
+  if TMenuItem(Sender).TagObject <> nil then
+  begin
+    TfmDocument(TMenuItem(Sender).TagObject).Show;
+    //TfmDocument(TMenuItem(Sender).TagObject).Activate;
+    //TfmDocument(TMenuItem(Sender).TagObject).BringToFront;
+  end;
+end;
+
+procedure TfmDocument.miRecentFilesClick(Sender: TObject);
+var
+  LFilename: string;
+  LDocWin: TDocumentWindow;
+begin
+  if TMenuItem(Sender).Tag = -100 then
+  begin
+    g_pub.Config['recent'] := nil;
+  end
+  else
+  begin
+    LFilename := TMenuItem(Sender).Text;
+    LDocWin := g_pub.DocumentWindowList.GetWindowByFilename(LFilename);
+    if LDocWin <> nil then
+      LDocWin.Show
+    else
+      OpenFile(LFilename);
+  end;
+end;
+
+procedure TfmDocument.miWindowShowAllApplyStyleLookup(Sender: TObject);
+begin
+{$IFDEF MSWINDOWS}
+  if TThread.GetTickCount - miWindowItems.Tag > 2000 then // 防止多次触发
+  begin
+    InitOpenedFileMenu;
+    miWindowItems.Tag := TThread.GetTickCount;
+  end;
+{$ENDIF}
+end;
+
+procedure TfmDocument.rctIndentClick(Sender: TObject);
+begin
+  FIsUpdating := True;
+  try
+    case Indent of
+      0:
+        Indent := 2;
+      2:
+        Indent := 4;
+      4:
+        Indent := 0;
+    end;
+    //Indent := IfThen(Indent = 2, 4, 2);
+  finally
+    FIsUpdating := False;
+  end;
+end;
+
+procedure TfmDocument.JsonFileDragDrop(Sender: TObject;
+const
+  Data:
+  TDragObject;
+const
+  Point:
+  TPointF);
+begin
+  if Length(Data.Files) = 1 then
+  begin
+    OpenFile(Data.Files[0]);
+  end;
+end;
+
+procedure TfmDocument.JsonFileDragOver(Sender: TObject;
+const
+  Data:
+  TDragObject;
+const
+  Point:
+  TPointF;
+var
+  Operation: TDragOperation);
+begin
+  if Length(Data.Files) = 1 then
+    Operation := TDragOperation.Link;
+end;
+
+procedure TfmDocument.rctWordWarpClick(Sender: TObject);
+begin
+  WordWarp := not WordWarp;
+end;
+
+procedure TfmDocument.slL_RMouseUp(Sender: TObject;
+Button: TMouseButton;
+Shift: TShiftState;
+X, Y: Single);
+begin
+  FRightPanelWidthPercent := rctRight.Width / (pnlSizeBorder.Width - 10);
+end;
+
+procedure TfmDocument.SetIndent(AValue: Integer);
+begin
+  if FIndent = AValue then
+    Exit;
+  FIndent := AValue;
+
+  lblIndent.Text := AValue.ToString;
+  if tvJson.Selected <> nil then
+  begin
+    if TJSONTreeViewItem(tvJson.Selected).JsonValue.IsObjectOrArray then
+    begin
+      if FIndent > 0 then
+      begin
+        mmoEdit.Text := TJSONTreeViewItem(tvJson.Selected).JsonValue.Format(FIndent);
+      end
+      else
+      begin
+        mmoEdit.Text := TJSONTreeViewItem(tvJson.Selected).JsonValue.ToString;
+      end;
+    end;
+  end;
+end;
+
+function TfmDocument.GetWordWarp: Boolean;
+begin
+  Result := mmoEdit.TextSettings.WordWrap;
+end;
+
+procedure TfmDocument.SetWordWarp(AValue: Boolean);
+begin
+  if mmoEdit.TextSettings.WordWrap = AValue then
+    Exit;
+  FIsUpdating := True;
+  try
+    mmoEdit.TextSettings.WordWrap := AValue;
+    pathWordWrap.Fill.Color := IfThen(mmoEdit.TextSettings.WordWrap,  $FF00FF00,  $FF808080);
+  finally
+    FIsUpdating := False;
+  end;
+end;
+
+procedure TfmDocument.InitOpenedFileMenu;
+var
+  miTmp: TMenuItem;
+begin
+  miWindowItems.Clear;
+  for var item in g_pub.DocumentWindowList do
+  begin
+    miTmp := TMenuItem.Create(miWindowItems);
+    miTmp.TagObject := item;
+    miTmp.Text := item.lblFilename.Text;
+    miTmp.OnClick := miFileOepnedClick;
+    miWindowItems.AddObject(miTmp);
+    miTmp.Enabled := self <> item;
+  end;
+end;
+
+procedure TfmDocument.InitRecentFile;
+var
+  miTmp: TMenuItem;
+begin
+  miFileOpenRecent.Clear;
+  for var item in g_pub.Config['recent'] do
+  begin
+    miTmp := TMenuItem.Create(miFileOpenRecent);
+    miTmp.Text := item;
+    miTmp.OnClick := miRecentFilesClick;
+    miFileOpenRecent.AddObject(miTmp);
+    miTmp.Enabled := (miTmp.Text <> FDoc.FileName) and FileExists(miTmp.Text);
+  end;
+  if miFileOpenRecent.ItemsCount > 0 then
+  begin
+    miTmp := TMenuItem.Create(miFileOpenRecent);
+    miTmp.Text := '-';
+    miFileOpenRecent.AddObject(miTmp);
+    miTmp := TMenuItem.Create(miFileOpenRecent);
+    //miTmp.Text := 'Clear';
+    //miTmp.Tag := -100;
+    miTmp.Action := fmMain.actFileClearRecent;
+    //miTmp.OnClick := miRecentFilesClick;
+    miFileOpenRecent.AddObject(miTmp);
+  end
+  else
+  begin
+    miTmp := TMenuItem.Create(miFileOpenRecent);
+    miTmp.Text := 'No file!';
+    miTmp.Enabled := False;
+    miFileOpenRecent.AddObject(miTmp);
+  end;
+end;
+
+procedure TfmDocument.ShowInfo(AText: string; ALevel: Integer = 0; ADelay: Single = 3.0);
+begin
+  aniMsg.Stop;
+  txtMsg.Text := AText;
+  case ALevel of
+    0:
+      txtMsg.TextSettings.FontColor := IfThen(fmMain.actViewDarkStyle.Checked, $FFFFFFFF, $FF000000);
+    1:
+      txtMsg.TextSettings.FontColor := $FFFF0000;
+  end;
+  txtMsg.Opacity := 1.0;
+  aniMsg.Delay := ADelay;
+  aniMsg.Start;
+end;
+
+initialization
+
+end.

+ 52 - 0
FormLogger.fmx

@@ -0,0 +1,52 @@
+object fmLogger: TfmLogger
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  Caption = #26085#24535
+  ClientHeight = 480
+  ClientWidth = 664
+  Position = ScreenCenter
+  FormFactor.Width = 320
+  FormFactor.Height = 480
+  FormFactor.Devices = [Desktop]
+  OnCreate = FormCreate
+  DesignerMasterStyle = 0
+  object btnClear: TButton
+    Anchors = [akTop, akRight]
+    CanFocus = False
+    Position.X = 576.000000000000000000
+    Position.Y = 8.000000000000000000
+    TabOrder = 0
+    Text = 'Clear'
+    TextSettings.Trimming = None
+    OnClick = btnClearClick
+  end
+  object pnl1: TPanel
+    Anchors = [akLeft, akTop, akRight, akBottom]
+    Position.X = 8.000000000000000000
+    Position.Y = 8.000000000000000000
+    Size.Width = 560.000000000000000000
+    Size.Height = 464.000000000000000000
+    Size.PlatformDefault = False
+    TabOrder = 1
+    object mmoLog: TMemo
+      Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
+      DataDetectorTypes = []
+      ReadOnly = True
+      StyledSettings = [Size, Style, FontColor]
+      TextSettings.Font.Family = #23435#20307
+      TextSettings.WordWrap = True
+      Align = Client
+      Margins.Left = 5.000000000000000000
+      Margins.Top = 2.000000000000000000
+      Margins.Right = 2.000000000000000000
+      Margins.Bottom = 2.000000000000000000
+      Size.Width = 553.000000000000000000
+      Size.Height = 460.000000000000000000
+      Size.PlatformDefault = False
+      TabOrder = 0
+      Viewport.Width = 549.000000000000000000
+      Viewport.Height = 456.000000000000000000
+    end
+  end
+end

+ 53 - 0
FormLogger.pas

@@ -0,0 +1,53 @@
+unit FormLogger;
+
+interface
+
+uses
+  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types,
+  FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;
+
+type
+  TfmLogger = class(TForm)
+    btnClear: TButton;
+    pnl1: TPanel;
+    mmoLog: TMemo;
+    procedure btnClearClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+  end;
+
+var
+  fmLogger: TfmLogger;
+
+implementation
+
+{$R *.fmx}
+
+
+uses Logger, pub;
+
+procedure TfmLogger.btnClearClick(Sender: TObject);
+begin
+  mmoLog.Lines.Clear;
+end;
+
+procedure TfmLogger.FormCreate(Sender: TObject);
+begin
+  g_Logger.OnLog := procedure(Sender: TObject; ALevel: TLogLevel; ALevelTag: string; ALog: string; ATime: TDateTime)
+    begin
+      if mmoLog.Lines.Count > 1000 then
+      begin
+        mmoLog.Text := mmoLog.Lines[mmoLog.Lines.Count - 1];
+      end;
+      mmoLog.Lines.Add(Format('%s %s %s', [FormatDateTime('hh:mm:ss.zzz', ATime), ALevelTag, ALog]));
+      mmoLog.GoToTextEnd;
+    end;
+  g_Logger.Info('Start running');
+  StyleBook := g_pub.StyleBook;
+end;
+
+end.

+ 6907 - 0
FormMain.fmx

@@ -0,0 +1,6907 @@
+object fmMain: TfmMain
+  Left = 0
+  Top = 0
+  BorderStyle = None
+  Caption = 'gale JSON'#32534#36753#22120
+  ClientHeight = 265
+  ClientWidth = 463
+  Position = Designed
+  FormFactor.Width = 320
+  FormFactor.Height = 480
+  FormFactor.Devices = [Desktop]
+  OnActivate = FormActivate
+  OnCreate = FormCreate
+  OnClose = FormClose
+  OnDestroy = FormDestroy
+  DesignerMasterStyle = 0
+  object StyleBookBlack: TStyleBook
+    Styles = <
+      item
+        ResourcesBin = {
+          464D585F5354594C4520322E3501060B7377697463687374796C6503EB00060D
+          63616C656E6461727374796C6503760B061263616C656E6461726C6162656C73
+          74796C65032F010611696D616765636F6E74726F6C7374796C6503B503061466
+          72616D65647363726F6C6C626F787374796C6503AF08060F6261636B67726F75
+          6E647374796C6503B800060E6D756C7469766965777374796C6503F200060A70
+          616E656C7374796C6503A501061163616C6C6F757470616E656C7374796C6503
+          1601060E7374617475736261727374796C6503D902060C746F6F6C6261727374
+          796C6503BB010613457870616E646572427574746F6E5374796C6503C30B060D
+          657870616E6465727374796C65035D04060D67726F7570626F787374796C6503
+          850206107370656564627574746F6E7374796C65035E08060D73706C69747465
+          727374796C65034E01060A6C6162656C7374796C65035101060F76616C75656C
+          6162656C7374796C65036902060C7461626974656D7374796C65034D0D060B74
+          6162646F747374796C65034B01060F746162636F6E74726F6C7374796C650319
+          02060D636865636B626F787374796C6503E6070610726164696F627574746F6E
+          7374796C65032407061070726F67726573736261727374796C6503A30A060D73
+          697A65677269707374796C6503C401060F636F6D626F706F7075707374796C65
+          030F02060D74726565766965777374796C650361080611747265657669657769
+          74656D7374796C65039D04061B7472656576696577657870616E646572627574
+          746F6E7374796C65038B04060D747261636B6261727374796C65032105060E6E
+          756D626572626F787374796C65039C060609656469747374796C6503D305060C
+          7370696E626F787374796C6503820A0611636C656172696E6765646974737479
+          6C65037D0806096D656D6F7374796C65036708060B627574746F6E7374796C65
+          03C5080610636F6C6F72627574746F6E7374796C6503FD070611636F726E6572
+          627574746F6E7374796C65035A06060D706F707570626F787374796C6503E308
+          060C6172636469616C7374796C6503FE08060D7468756D626261727374796C65
+          035C0306147363726F6C6C62617276747261636B7374796C6503990206147363
+          726F6C6C62617268747261636B7374796C65039A0206137363726F6C6C626172
+          6C656674627574746F6E03200406147363726F6C6C6261727269676874627574
+          746F6E03150406127363726F6C6C626172746F70627574746F6E031F04061573
+          63726F6C6C626172626F74746F6D627574746F6E031604060B687468756D6273
+          74796C65036D03060B767468756D627374796C65036D03060D636F6D626F626F
+          787374796C65031A06060E636F6D626F656469747374796C6503E307060A7472
+          61636B7374796C6503FE02060C6C697374626F787374796C6503D80806126C69
+          7374626F78706C61696E686561646572036603060D6C697374626F78666F6F74
+          657203B60106177472616E73706172656E746C697374626F787374796C650371
+          0806167472616E73706172656E74627574746F6E7374796C6503FB02061C7472
+          616E73706172656E74636972636C65627574746F6E7374796C6503E10206106C
+          697374626F786974656D7374796C650345030615636F6C6F726C697374626F78
+          6974656D7374796C65037C03060E7363726F6C6C6261727374796C6503480606
+          19736D616C6C7363726F6C6C62617276747261636B7374796C65035402061973
+          6D616C6C7363726F6C6C62617268747261636B7374796C650354020613736D61
+          6C6C7363726F6C6C6261727374796C65036702060F64726F7074617267657473
+          74796C650375040609677269647374796C65031E0A060F686561646572697465
+          6D7374796C65036303060D7465787463656C6C7374796C65038402060E636865
+          636B63656C6C7374796C6503E003060E706F70757063656C6C7374796C650315
+          04061170726F677265737363656C6C7374796C65031003060E696D6167656365
+          6C6C7374796C65038001060C6D656E756261727374796C6503A901060D6D656E
+          75766965777374796C6503C902060D6D656E756974656D7374796C6503870C06
+          106D656E756261726974656D7374796C6503690C06126D656E75736570617261
+          746F727374796C6503E5010611616E69696E64696361746F727374796C6503AA
+          00060D74696D65656469747374796C6503680C060D6461746565646974737479
+          6C6503520A060E7370696E65646974627574746F6E03FE0206126D656E756974
+          656D7374796C655F6C697465030D08061170616E656C7374796C655F72616469
+          757303F801061670616E656C7374796C655F6D61636F735F6672616D6503AB01
+          00545046300D545377697463684F626A65637400095374796C654E616D65060B
+          7377697463687374796C65085461624F72646572020012547261636B696E6754
+          68756D625363616C65050000000000000080FF3F0756697369626C65080A4669
+          6C6C2E436F6C6F7207097846463438343834380C46696C6C4F6E2E436F6C6F72
+          07097846463635433845300B46696C6C4F6E2E4B696E640705536F6C69640C53
+          74726F6B652E436F6C6F7207097846463143314331430B5468756D622E436F6C
+          6F720709784646343834383438115468756D625374726F6B652E436F6C6F7207
+          0978464631433143314300005450463007544C61796F757400095374796C654E
+          616D65060D63616C656E6461727374796C650A53697A652E5769647468050000
+          0000000000B406400B53697A652E4865696768740500000000000000A0064014
+          53697A652E506C6174666F726D44656661756C74080756697369626C65080854
+          61624F7264657202010009545374796C6554616700095374796C654E616D6506
+          09466978656453697A65000007544C61796F75740005416C69676E07074D6F73
+          74546F70064C6F636B6564090E4D617267696E732E426F74746F6D0500000000
+          0000008000400A53697A652E57696474680500000000000000B406400B53697A
+          652E48656967687405000000000000009803401453697A652E506C6174666F72
+          6D44656661756C7408000754427574746F6E00095374796C654E616D65060470
+          72657605416C69676E07044C6566740843616E466F63757308064C6F636B6564
+          090D4D617267696E732E526967687405000000000000008000400B5265706561
+          74436C69636B090A53697A652E576964746805000000000000009803400B5369
+          7A652E48656967687405000000000000009803401453697A652E506C6174666F
+          726D44656661756C74080B5374796C654C6F6F6B7570061C7472616E73706172
+          656E74636972636C65627574746F6E7374796C65155465787453657474696E67
+          732E5472696D6D696E6707044E6F6E65000A54506174684C6162656C0005416C
+          69676E070643656E74657209446174612E506174680A34000000040000000000
+          00000000803F00000000010000000000803F0000803F01000000000000000000
+          003F010000000000803F00000000064C6F636B6564090A53697A652E57696474
+          680500000000000000A001400B53697A652E4865696768740500000000000000
+          A001401453697A652E506C6174666F726D44656661756C74080B5374796C654C
+          6F6F6B7570061263616C656E6461726C6162656C7374796C6500000007544275
+          74746F6E00095374796C654E616D650605746F64617905416C69676E07044C65
+          66740843616E466F63757308064C6F636B6564090D4D617267696E732E526967
+          687405000000000000008000400A506F736974696F6E2E580500000000000000
+          A803400B526570656174436C69636B090A53697A652E57696474680500000000
+          0000009803400B53697A652E4865696768740500000000000000980340145369
+          7A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006
+          1C7472616E73706172656E74636972636C65627574746F6E7374796C65155465
+          787453657474696E67732E5472696D6D696E6707044E6F6E65000A5450617468
+          4C6162656C0005416C69676E070643656E74657209446174612E506174680A34
+          000000040000000000000089C965431BE2BB43010000002B88E1421080834301
+          0000002B886143AEFA114301000000CF46AB43625F8143064C6F636B6564090A
+          53697A652E57696474680500000000000000A001400B53697A652E4865696768
+          740500000000000000A001401453697A652E506C6174666F726D44656661756C
+          74080B5374796C654C6F6F6B7570061263616C656E6461726C6162656C737479
+          6C650000000754427574746F6E00095374796C654E616D6506046E6578740541
+          6C69676E07044C6566740843616E466F63757308064C6F636B6564090D4D6172
+          67696E732E526967687405000000000000008000400A506F736974696F6E2E58
+          0500000000000000A804400B526570656174436C69636B090A53697A652E5769
+          64746805000000000000009803400B53697A652E486569676874050000000000
+          00009803401453697A652E506C6174666F726D44656661756C74080B5374796C
+          654C6F6F6B7570061C7472616E73706172656E74636972636C65627574746F6E
+          7374796C65155465787453657474696E67732E5472696D6D696E6707044E6F6E
+          65000A54506174684C6162656C0005416C69676E070643656E74657209446174
+          612E506174680A28000000030000000000000000000000000000000100000000
+          0000000000803F010000000000803F0000003F064C6F636B6564090A53697A65
+          2E57696474680500000000000000A001400B53697A652E486569676874050000
+          0000000000A001401453697A652E506C6174666F726D44656661756C74080B53
+          74796C654C6F6F6B7570061263616C656E6461726C6162656C7374796C650000
+          000954506F707570426F7800095374796C654E616D6506066D6F6E7468730541
+          6C69676E0706436C69656E740843616E466F637573081244697361626C65466F
+          63757345666665637409064C6F636B6564090C4D617267696E732E4C65667405
+          00000000000000A001400D4D617267696E732E52696768740500000000000000
+          A001400A53697A652E576964746805000000000000008605400B53697A652E48
+          656967687405000000000000009803401453697A652E506C6174666F726D4465
+          6661756C74080B5374796C654C6F6F6B7570061263616C656E6461726C616265
+          6C7374796C6500000954506F707570426F7800095374796C654E616D65060579
+          6561727305416C69676E070552696768740843616E466F637573081244697361
+          626C65466F63757345666665637409064C6F636B6564090A506F736974696F6E
+          2E5805000000000000008C06400A53697A652E57696474680500000000000000
+          A004400B53697A652E48656967687405000000000000009803401453697A652E
+          506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006126361
+          6C656E6461726C6162656C7374796C650000000B54477269644C61796F757400
+          095374796C654E616D6506047765656B05416C69676E0703546F70064C6F636B
+          6564090A4974656D4865696768740500000000000000980340094974656D5769
+          64746805000000000000008005400B4F7269656E746174696F6E070A486F7269
+          7A6F6E74616C0E4D617267696E732E426F74746F6D0500000000000000800040
+          0A506F736974696F6E2E590500000000000000A803400A53697A652E57696474
+          680500000000000000B406400B53697A652E4865696768740500000000000000
+          9803401453697A652E506C6174666F726D44656661756C740800000B54477269
+          644C61796F757400095374796C654E616D6506057765656B7305416C69676E07
+          084D6F73744C656674064C6F636B6564090A4974656D48656967687405000000
+          00000000980340094974656D576964746805000000000000008005400B4F7269
+          656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E732E546F70
+          0500000000000000A803400A53697A652E57696474680500000000000000B803
+          400B53697A652E4865696768740500000000000000C804401453697A652E506C
+          6174666F726D44656661756C74080756697369626C6508000008544C69737442
+          6F7800095374796C654E616D6506046461797305416C69676E0706436C69656E
+          74064C6F636B6564090A53697A652E57696474680500000000000000B406400B
+          53697A652E4865696768740500000000000000EC05401453697A652E506C6174
+          666F726D44656661756C74080B5374796C654C6F6F6B757006177472616E7370
+          6172656E746C697374626F787374796C650E53686F775363726F6C6C42617273
+          0818416C7465726E6174696E67526F774261636B67726F756E64090843616E46
+          6F6375730807436F6C756D6E7302071244697361626C65466F63757345666665
+          6374090A4974656D48656967687405000000000000009803401B44656661756C
+          744974656D5374796C65732E4974656D5374796C651200000000224465666175
+          6C744974656D5374796C65732E47726F75704865616465725374796C65120000
+          00002244656661756C744974656D5374796C65732E47726F7570466F6F746572
+          5374796C6512000000000E56696577706F72742E576964746805000000000000
+          00B406400F56696577706F72742E4865696768740500000000000000E4054000
+          00005450463007544C61796F757400095374796C654E616D65061263616C656E
+          6461726C6162656C7374796C6505416C69676E070643656E7465720A53697A65
+          2E57696474680500000000000000C404400B53697A652E486569676874050000
+          0000000000A003401453697A652E506C6174666F726D44656661756C74080756
+          697369626C6508085461624F7264657202020005545465787400095374796C65
+          4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409
+          0748697454657374080A53697A652E57696474680500000000000000C404400B
+          53697A652E4865696768740500000000000000A003401453697A652E506C6174
+          666F726D44656661756C7408165465787453657474696E67732E466F6E74436F
+          6C6F7207097846464530453045300000005450463007544C61796F7574000953
+          74796C654E616D650611696D616765636F6E74726F6C7374796C650A506F7369
+          74696F6E2E580500000000000000C007400A506F736974696F6E2E5905000000
+          00000000F407400A53697A652E576964746805000000000000009205400B5369
+          7A652E4865696768740500000000000000D003401453697A652E506C6174666F
+          726D44656661756C74080756697369626C6508085461624F726465720203000A
+          5452656374616E676C6500095374796C654E616D65060A6261636B67726F756E
+          6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846
+          46313931393139064C6F636B6564090748697454657374080A53697A652E5769
+          64746805000000000000009205400B53697A652E486569676874050000000000
+          0000D003401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F720709784646333933393339000A5452656374616E676C6500
+          05416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748
+          697454657374080C4D617267696E732E4C656674050000000000000080FF3F0B
+          4D617267696E732E546F70050000000000000080FF3F0D4D617267696E732E52
+          69676874050000000000000080FF3F0E4D617267696E732E426F74746F6D0500
+          00000000000080FF3F0A53697A652E576964746805000000000000008E05400B
+          53697A652E4865696768740500000000000000C003401453697A652E506C6174
+          666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463138
+          3138313800000654496D61676500095374796C654E616D650605696D6167650E
+          4D756C74695265734269746D61700E01000005416C69676E0706436C69656E74
+          064C6F636B6564090748697454657374080C4D617267696E732E4C6566740500
+          000000000000C000400B4D617267696E732E546F700500000000000000C00040
+          0D4D617267696E732E52696768740500000000000000C000400E4D617267696E
+          732E426F74746F6D0500000000000000C000400A53697A652E57696474680500
+          0000000000008605400B53697A652E4865696768740500000000000000A00340
+          1453697A652E506C6174666F726D44656661756C74080000000B54476C6F7745
+          66666563740008536F66746E657373050000000000CDCCCCFC3F09476C6F7743
+          6F6C6F720709784646363543384530074F7061636974790500000000006666E6
+          FE3F0754726967676572060E4973466F63757365643D7472756507456E61626C
+          6564080000005450463007544C61796F757400095374796C654E616D65061466
+          72616D65647363726F6C6C626F787374796C650A506F736974696F6E2E580500
+          000000000080B507400A506F736974696F6E2E590500000000000000DA07400A
+          53697A652E5769647468050000000000FFFFE905400B53697A652E4865696768
+          7405000000000000008306401453697A652E506C6174666F726D44656661756C
+          74080756697369626C6508085461624F726465720204000A5452656374616E67
+          6C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E07
+          08436F6E74656E74730A46696C6C2E436F6C6F72070978464634383438343806
+          4C6F636B6564090748697454657374080C50616464696E672E4C656674050000
+          000000000080FF3F0B50616464696E672E546F70050000000000000080FF3F0D
+          50616464696E672E5269676874050000000000000080FF3F0E50616464696E67
+          2E426F74746F6D050000000000000080FF3F0A53697A652E5769647468050000
+          000000FFFFE905400B53697A652E486569676874050000000000000083064014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F720709784646314331433143000A5452656374616E676C650005416C69676E
+          0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374
+          080A53697A652E5769647468050000000000FFFFE505400B53697A652E486569
+          67687405000000000000008106401453697A652E506C6174666F726D44656661
+          756C74080C5374726F6B652E436F6C6F72070978464635393539353900000754
+          4C61796F75740005416C69676E0706436C69656E740A53697A652E5769647468
+          050000000000FFFFE505400B53697A652E486569676874050000000000000081
+          06401453697A652E506C6174666F726D44656661756C74080007544C61796F75
+          7400095374796C654E616D650607636F6E74656E7405416C69676E0706436C69
+          656E740C4D617267696E732E4C656674050000000000000080FF3F0B4D617267
+          696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874
+          050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000
+          000080FF3F0A53697A652E5769647468050000000000FFFFC305400B53697A65
+          2E4865696768740500000000000000E005401453697A652E506C6174666F726D
+          44656661756C740800000A545363726F6C6C42617200095374796C654E616D65
+          060A767363726F6C6C62617205416C69676E070552696768740B536D616C6C43
+          68616E676505000000000000000000000B4F7269656E746174696F6E07085665
+          72746963616C0A506F736974696F6E2E58050000000000FFFFC705400A53697A
+          652E57696474680500000000000000F002400B53697A652E4865696768740500
+          000000000000E405401453697A652E506C6174666F726D44656661756C740800
+          000A545363726F6C6C42617200095374796C654E616D65060A687363726F6C6C
+          62617205416C69676E0706426F74746F6D0B536D616C6C4368616E6765050000
+          00000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C
+          0A506F736974696F6E2E590500000000000000E405400A53697A652E57696474
+          68050000000000FFFFE505400B53697A652E4865696768740500000000000000
+          F002401453697A652E506C6174666F726D44656661756C740800000F54536D61
+          6C6C5363726F6C6C42617200095374796C654E616D65060F76736D616C6C7363
+          726F6C6C62617205416C69676E070552696768740B536D616C6C4368616E6765
+          05000000000000000000000B4F7269656E746174696F6E070856657274696361
+          6C0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E73
+          2E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F6D
+          050000000000000080FF3F0A506F736974696F6E2E580500000000000000C605
+          400A506F736974696F6E2E5905000000000000008000400A53697A652E576964
+          746805000000000000008002400B53697A652E48656967687405000000000000
+          008002401453697A652E506C6174666F726D44656661756C7408075669736962
+          6C650800000F54536D616C6C5363726F6C6C42617200095374796C654E616D65
+          060F68736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B
+          536D616C6C4368616E676505000000000000000000000B4F7269656E74617469
+          6F6E070A486F72697A6F6E74616C0C4D617267696E732E4C6566740500000000
+          00000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E
+          4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73697469
+          6F6E2E5805000000000000008000400A506F736974696F6E2E59050000000000
+          0000E205400A53697A652E576964746805000000000000009606400B53697A65
+          2E48656967687405000000000000008002401453697A652E506C6174666F726D
+          44656661756C74080756697369626C6508000007544C61796F75740005416C69
+          676E0708436F6E74656E74730A53697A652E5769647468050000000000FFFFE5
+          05400B53697A652E48656967687405000000000000008106401453697A652E50
+          6C6174666F726D44656661756C74080007544C61796F75740005416C69676E07
+          06426F74746F6D0A506F736974696F6E2E590500000000000000DA05400A5369
+          7A652E5769647468050000000000FFFFE505400B53697A652E48656967687405
+          00000000000000A003401453697A652E506C6174666F726D44656661756C7408
+          00095453697A654772697000095374796C654E616D65060873697A6567726970
+          05416C69676E07055269676874064C6F636B6564090A506F736974696F6E2E58
+          050000000000FFFFBD05400A53697A652E57696474680500000000000000A003
+          400B53697A652E4865696768740500000000000000A003401453697A652E506C
+          6174666F726D44656661756C740800000000000000545046300A545265637461
+          6E676C6500095374796C654E616D65060F6261636B67726F756E647374796C65
+          05416C69676E070643656E7465720A46696C6C2E436F6C6F7207097846463139
+          313931390748697454657374080A53697A652E57696474680500000000000000
+          C804400B53697A652E4865696768740500000000000000C804401453697A652E
+          506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F
+          6E650756697369626C65080000545046300A5452656374616E676C6500095374
+          796C654E616D65060E6D756C7469766965777374796C6505416C69676E070643
+          656E7465720A46696C6C2E436F6C6F7207097846463438343834380748697454
+          657374080A53697A652E57696474680500000000000000C804400B53697A652E
+          4865696768740500000000000000C804401453697A652E506C6174666F726D44
+          656661756C74080B5374726F6B652E4B696E6407044E6F6E650756697369626C
+          6508000C5442727573684F626A65637400095374796C654E616D65060864726F
+          706C696E650B42727573682E436F6C6F72070978464631433143314300000054
+          5046300A5452656374616E676C6500095374796C654E616D65060A70616E656C
+          7374796C6505416C69676E070643656E7465720A46696C6C2E436F6C6F720709
+          7846463139313931390748697454657374080A53697A652E5769647468050000
+          0000000000C804400B53697A652E4865696768740500000000000000C8044014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F7207097846463539353935390756697369626C6508000A5452656374616E67
+          6C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E
+          650748697454657374080C4D617267696E732E4C656674050000000000000080
+          FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E
+          732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F
+          6D050000000000000080FF3F0A53697A652E57696474680500000000000000C0
+          04400B53697A652E4865696768740500000000000000C004401453697A652E50
+          6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
+          6500000054504630115443616C6C6F757452656374616E676C6500095374796C
+          654E616D65061163616C6C6F757470616E656C7374796C650A46696C6C2E436F
+          6C6F7207097846463438343834380748697454657374080A506F736974696F6E
+          2E580500000000000000C607400A506F736974696F6E2E590500000000000000
+          EE07400A53697A652E57696474680500000000000000C804400B53697A652E48
+          65696768740500000000000000C804401453697A652E506C6174666F726D4465
+          6661756C74080C5374726F6B652E436F6C6F7207097846463143314331430756
+          697369626C65080C43616C6C6F757457696474680500000000000000B803400D
+          43616C6C6F75744C656E6774680500000000000000B002400000545046300A54
+          52656374616E676C6500095374796C654E616D65060E73746174757362617273
+          74796C650C436C69704368696C6472656E090A46696C6C2E436F6C6F72070978
+          46463438343834380A506F736974696F6E2E580500000000000000C607400A50
+          6F736974696F6E2E590500000000000000EE07400A53697A652E576964746805
+          00000000000000C804400B53697A652E4865696768740500000000000000C804
+          401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E43
+          6F6C6F7207097846463143314331430756697369626C6508000A545265637461
+          6E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E
+          6F6E650C4D617267696E732E4C656674050000000000000080FF3F0B4D617267
+          696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874
+          050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000
+          000080FF3F0A53697A652E57696474680500000000000000C004400B53697A65
+          2E4865696768740500000000000000C004401453697A652E506C6174666F726D
+          44656661756C74080C5374726F6B652E436F6C6F720709784646353935393539
+          00095453697A654772697000095374796C654E616D65060873697A6567726970
+          05416C69676E07055269676874064C6F636B6564090748697454657374080C4D
+          617267696E732E4C65667405000000000000008000400B4D617267696E732E54
+          6F7005000000000000008000400D4D617267696E732E52696768740500000000
+          0000008000400E4D617267696E732E426F74746F6D0500000000000000800040
+          0A506F736974696F6E2E580500000000000000D003400A506F736974696F6E2E
+          5905000000000000008000400A53697A652E57696474680500000000000000A0
+          03400B53697A652E4865696768740500000000000000B004401453697A652E50
+          6C6174666F726D44656661756C740800000000545046300A5452656374616E67
+          6C6500095374796C654E616D65060C746F6F6C6261727374796C6505416C6967
+          6E070643656E7465720C436C69704368696C6472656E090A46696C6C2E436F6C
+          6F7207097846463438343834380748697454657374080A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          C804401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
+          2E436F6C6F7207097846463143314331430756697369626C6508000A54526563
+          74616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407
+          044E6F6E650748697454657374080C4D617267696E732E4C6566740500000000
+          00000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61
+          7267696E732E5269676874050000000000000080FF3F0E4D617267696E732E42
+          6F74746F6D050000000000000080FF3F0A53697A652E57696474680500000000
+          000000C004400B53697A652E4865696768740500000000000000C00440145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          07097846463539353935390000005450463007544C61796F757400095374796C
+          654E616D650613457870616E646572427574746F6E5374796C650C5061646469
+          6E672E4C65667405000000000000008000400B50616464696E672E546F700500
+          0000000000008000400D50616464696E672E5269676874050000000000000080
+          00400E50616464696E672E426F74746F6D05000000000000008000400C4D6172
+          67696E732E4C65667405000000000000008001400B4D617267696E732E546F70
+          05000000000000008001400D4D617267696E732E526967687405000000000000
+          008001400E4D617267696E732E426F74746F6D05000000000000008001400A50
+          6F736974696F6E2E580500000000000000C007400A506F736974696F6E2E5905
+          00000000000000F407400A53697A652E57696474680500000000000000920540
+          0B53697A652E4865696768740500000000000000D003401453697A652E506C61
+          74666F726D44656661756C74080756697369626C6508085461624F7264657202
+          0B000854456C6C6970736500095374796C654E616D65060A6261636B67726F75
+          6E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407084772
+          616469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F
+          6C6F720709784646353835383538064F66667365740500000000000000000000
+          000105436F6C6F720709784646353135313531064F6666736574050000000000
+          A01BF3FD3F000105436F6C6F720709784646343934393439064F666673657405
+          0000000000000080FF3F0000064C6F636B6564090748697454657374080A5369
+          7A652E576964746805000000000000009205400B53697A652E48656967687405
+          00000000000000D003401453697A652E506C6174666F726D44656661756C7408
+          0C5374726F6B652E436F6C6F720709784646364136413641000F54436F6C6F72
+          416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50
+          726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C
+          756507097846463538353835380953746F7056616C7565070978464634383438
+          34380754726967676572062049734D6F7573654F7665723D747275653B497350
+          7265737365643D66616C736500000F54436F6C6F72416E696D6174696F6E0008
+          4475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65
+          060A46696C6C2E436F6C6F720A537461727456616C7565070978464634383438
+          34380953746F7056616C75650709784646353835383538075472696767657206
+          2149734D6F7573654F7665723D66616C73653B4973507265737365643D66616C
+          736500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500
+          00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C756507097846463438343834380953746F7056616C
+          756507097846463432343234320754726967676572062049734D6F7573654F76
+          65723D66616C73653B4973507265737365643D7472756500000F54436F6C6F72
+          416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50
+          726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C
+          756507097846463432343234320953746F7056616C7565070978464634383438
+          34380754726967676572061F49734D6F7573654F7665723D747275653B497350
+          7265737365643D7472756500000854456C6C697073650005416C69676E070643
+          6C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D
+          617267696E732E4C65667405000000000000008000C00B4D617267696E732E54
+          6F7005000000000000008000C00D4D617267696E732E52696768740500000000
+          0000008000C00E4D617267696E732E426F74746F6D05000000000000008000C0
+          0A53697A652E576964746805000000000000009A05400B53697A652E48656967
+          68740500000000000000F003401453697A652E506C6174666F726D4465666175
+          6C74080C5374726F6B652E436F6C6F720709784646353135313531000854456C
+          6C697073650005416C69676E0706436C69656E740946696C6C2E4B696E640704
+          4E6F6E650748697454657374080C4D617267696E732E4C656674050000000000
+          000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D6172
+          67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F
+          74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000
+          00009605400B53697A652E4865696768740500000000000000E003401453697A
+          652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207
+          09784646314331433143000000000554506174680005416C69676E0708436F6E
+          74656E747309446174612E506174680A6400000008000000000000001DFA7743
+          664E0D4401000000B032464364C3034401000000F668B94375C3A84301000000
+          4E92084464C303440100000019A4F74319940E4401000000A4D0B9434E12D043
+          010000001DFA7743664E0D44030000000000000000000000064C6F636B656409
+          0748697454657374080C4D617267696E732E4C65667405000000000000008001
+          400B4D617267696E732E546F700500000000000000C001400D4D617267696E73
+          2E526967687405000000000000008001400E4D617267696E732E426F74746F6D
+          0500000000000000C001400A53697A652E576964746805000000000000008205
+          400B53697A652E4865696768740500000000000000E002401453697A652E506C
+          6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
+          000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000
+          0017B7D1F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097830304530453045300953746F7056616C756507
+          097846464530453045300754726967676572060F4973457870616E6465643D74
+          72756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
+          000000000017B7D1F13F07496E7665727365090C50726F70657274794E616D65
+          060A46696C6C2E436F6C6F720A537461727456616C7565070978303045304530
+          45300953746F7056616C75650709784646453045304530075472696767657206
+          104973457870616E6465643D66616C73650000000554506174680005416C6967
+          6E0708436F6E74656E747309446174612E506174680A64000000080000000000
+          0000C540F843D94EAB43010000004E920844DD64BE4301000000FED4BA431994
+          0E4401000000B0324643DD64BE4301000000B633794375C3A84301000000506D
+          BA4358D9F54301000000C540F843D94EAB430300000000000000000000000A46
+          696C6C2E436F6C6F720709783030453045304530064C6F636B65640907486974
+          54657374080C4D617267696E732E4C65667405000000000000008001400B4D61
+          7267696E732E546F700500000000000000C001400D4D617267696E732E526967
+          687405000000000000008001400E4D617267696E732E426F74746F6D05000000
+          00000000C001400A53697A652E576964746805000000000000008205400B5369
+          7A652E4865696768740500000000000000E002401453697A652E506C6174666F
+          726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F5443
+          6F6C6F72416E696D6174696F6E00084475726174696F6E05000000000017B7D1
+          F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172
+          7456616C756507097830304530453045300953746F7056616C75650709784646
+          453045304530075472696767657206104973457870616E6465643D66616C7365
+          00000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000
+          000017B7D1F13F07496E7665727365090C50726F70657274794E616D65060A46
+          696C6C2E436F6C6F720A537461727456616C7565070978303045304530453009
+          53746F7056616C756507097846464530453045300754726967676572060F4973
+          457870616E6465643D74727565000000005450463007544C61796F7574000953
+          74796C654E616D65060D657870616E6465727374796C650A506F736974696F6E
+          2E580500000000000000AB07400A506F736974696F6E2E590500000000000000
+          DC07400A53697A652E576964746805000000000000009F06400B53697A652E48
+          65696768740500000000000000F205401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F72646572020C000A54526563
+          74616E676C650005416C69676E0708436F6E74656E74730A46696C6C2E436F6C
+          6F7207097846463438343834380748697454657374080A53697A652E57696474
+          6805000000000000009F06400B53697A652E4865696768740500000000000000
+          F205401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
+          2E436F6C6F720709784646314331433143000A5452656374616E676C65000541
+          6C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650C4D6172
+          67696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F70
+          050000000000000080FF3F0D4D617267696E732E526967687405000000000000
+          0080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53
+          697A652E576964746805000000000000009D06400B53697A652E486569676874
+          0500000000000000EE05401453697A652E506C6174666F726D44656661756C74
+          080C5374726F6B652E436F6C6F72070978464635393539353900000005545465
+          787400095374796C654E616D6506047465787405416C69676E0703546F70064C
+          6F636B6564090748697454657374080C4D617267696E732E4C65667405000000
+          00000000C803400A506F736974696F6E2E580500000000000000C803400A5369
+          7A652E576964746805000000000000008606400B53697A652E48656967687405
+          00000000000000C803401453697A652E506C6174666F726D44656661756C7408
+          04546578740608457870616E646572165465787453657474696E67732E466F6E
+          74436F6C6F720709784646463146314631155465787453657474696E67732E57
+          6F72645772617008000F54457870616E646572427574746F6E00095374796C65
+          4E616D650606627574746F6E05416C69676E07044C656674064C6F636B656409
+          0C4D617267696E732E4C6566740500000000000000C803C00A506F736974696F
+          6E2E580500000000000000C803C00A53697A652E576964746805000000000000
+          00C803400B53697A652E4865696768740500000000000000C803401453697A65
+          2E506C6174666F726D44656661756C740800000954436865636B426F78000953
+          74796C654E616D650608636865636B626F7805416C69676E0705526967687408
+          43616E466F63757308064C6F636B6564090A506F736974696F6E2E5805000000
+          00000000DA05400A53697A652E57696474680500000000000000C803400B5369
+          7A652E4865696768740500000000000000C803401453697A652E506C6174666F
+          726D44656661756C7408000000005450463007544C61796F757400095374796C
+          654E616D65060D67726F7570626F787374796C6505416C69676E070643656E74
+          65720C50616464696E672E4C65667405000000000000008000400B5061646469
+          6E672E546F7005000000000000008002400D50616464696E672E526967687405
+          000000000000008000400E50616464696E672E426F74746F6D05000000000000
+          008000400A53697A652E576964746805000000000000008706400B53697A652E
+          4865696768740500000000000000CC05401453697A652E506C6174666F726D44
+          656661756C74080756697369626C6508085461624F72646572020D000A545265
+          6374616E676C6500095374796C654E616D65060A6261636B67726F756E640541
+          6C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65064C6F63
+          6B6564090748697454657374080A53697A652E57696474680500000000000000
+          8306400B53697A652E4865696768740500000000000000B805401453697A652E
+          506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978
+          46463539353935390005545465787400095374796C654E616D65060474657874
+          084175746F53697A65090A436C6970506172656E7409064C6F636B6564090748
+          697454657374080A506F736974696F6E2E580500000000000000F002400A506F
+          736974696F6E2E5905000000000000008002C00A53697A652E57696474680500
+          0000000000ECE103400B53697A652E48656967687405000000000000D8F30240
+          1453697A652E506C6174666F726D44656661756C740816546578745365747469
+          6E67732E466F6E74436F6C6F7207097846464638463846381554657874536574
+          74696E67732E576F72645772617008000000005450463007544C61796F757400
+          095374796C654E616D6506107370656564627574746F6E7374796C650A506F73
+          6974696F6E2E580500000000000000C007400A506F736974696F6E2E59050000
+          0000000000F407400A53697A652E576964746805000000000000009205400B53
+          697A652E4865696768740500000000000000D003401453697A652E506C617466
+          6F726D44656661756C74080756697369626C6508085461624F72646572020E00
+          0A5452656374616E676C6500095374796C654E616D65060A6261636B67726F75
+          6E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407084772
+          616469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F
+          6C6F720709784646353835383538064F66667365740500000000000000000000
+          000105436F6C6F720709784646353135313531064F6666736574050000000000
+          A01BF3FD3F000105436F6C6F720709784646343934393439064F666673657405
+          0000000000000080FF3F0000064C6F636B6564090748697454657374080C4D61
+          7267696E732E4C65667405000000000000008000400B4D617267696E732E546F
+          7005000000000000008000400D4D617267696E732E5269676874050000000000
+          00008000400E4D617267696E732E426F74746F6D05000000000000008000400A
+          53697A652E576964746805000000000000008A05400B53697A652E4865696768
+          740500000000000000B003401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F720709784646364136413641000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C756507097846463538353835380953746F7056616C756507097846463438
+          343834380754726967676572062049734D6F7573654F7665723D747275653B49
+          73507265737365643D66616C736500000F54436F6C6F72416E696D6174696F6E
+          00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E61
+          6D65060A46696C6C2E436F6C6F720A537461727456616C756507097846463438
+          343834380953746F7056616C7565070978464635383538353807547269676765
+          72062149734D6F7573654F7665723D66616C73653B4973507265737365643D66
+          616C736500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
+          050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846463438343834380953746F7056
+          616C756507097846463432343234320754726967676572062049734D6F757365
+          4F7665723D66616C73653B4973507265737365643D7472756500000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C756507097846463432343234320953746F7056616C756507097846463438
+          343834380754726967676572061F49734D6F7573654F7665723D747275653B49
+          73507265737365643D7472756500000A5452656374616E676C650005416C6967
+          6E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507486974546573
+          74080C4D617267696E732E4C65667405000000000000008000C00B4D61726769
+          6E732E546F7005000000000000008000C00D4D617267696E732E526967687405
+          000000000000008000C00E4D617267696E732E426F74746F6D05000000000000
+          008000C00A53697A652E576964746805000000000000009205400B53697A652E
+          4865696768740500000000000000D003401453697A652E506C6174666F726D44
+          656661756C74080C5374726F6B652E436F6C6F72070978464635313531353100
+          0A5452656374616E676C650005416C69676E0706436C69656E740946696C6C2E
+          4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C656674
+          050000000000000080FF3F0B4D617267696E732E546F70050000000000000080
+          FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267
+          696E732E426F74746F6D050000000000000080FF3F0A53697A652E5769647468
+          05000000000000008E05400B53697A652E4865696768740500000000000000C0
+          03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F720709784646314331433143000000000654476C7970680009537479
+          6C654E616D65060A676C7970687374796C650C4D617267696E732E4C65667405
+          00000000000000A001400B4D617267696E732E546F7005000000000000008000
+          400D4D617267696E732E5269676874050000000000000080FF3F0E4D61726769
+          6E732E426F74746F6D050000000000000080004005416C69676E07044C656674
+          0A53697A652E576964746805000000000000008003400B53697A652E48656967
+          687405000000000000008003401453697A652E506C6174666F726D4465666175
+          6C7408000005545465787400095374796C654E616D6506047465787405416C69
+          676E0706436C69656E74064C6F636B6564090748697454657374080C4D617267
+          696E732E4C6566740500000000000000C001400B4D617267696E732E546F7005
+          000000000000008000400D4D617267696E732E52696768740500000000000000
+          C001400E4D617267696E732E426F74746F6D05000000000000008000400A5369
+          7A652E57696474680500000000000000F404400B53697A652E48656967687405
+          00000000000000B003401453697A652E506C6174666F726D44656661756C7408
+          04546578740606627574746F6E165465787453657474696E67732E466F6E7443
+          6F6C6F720708636C6157686974650000005450463007544C61796F7574000953
+          74796C654E616D65060D73706C69747465727374796C650A506F736974696F6E
+          2E580500000000000000C607400A506F736974696F6E2E590500000000000000
+          EE07400A53697A652E57696474680500000000000000C804400B53697A652E48
+          65696768740500000000000000C804401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F72646572020F000854456C6C
+          6970736500095374796C654E616D6506046772697005416C69676E0703466974
+          0A46696C6C2E436F6C6F720709784646314331433143064C6F636B6564090748
+          697454657374080A53697A652E57696474680500000000000000C804400B5369
+          7A652E4865696768740500000000000000C804401453697A652E506C6174666F
+          726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000054
+          50463007544C61796F757400095374796C654E616D65060A6C6162656C737479
+          6C650A506F736974696F6E2E580500000000000000C607400A506F736974696F
+          6E2E590500000000000080F507400A53697A652E576964746805000000000000
+          00C404400B53697A652E4865696768740500000000000000A003401453697A65
+          2E506C6174666F726D44656661756C74080756697369626C6508085461624F72
+          64657202100005545465787400095374796C654E616D6506047465787405416C
+          69676E0706436C69656E74064C6F636B6564090748697454657374080A53697A
+          652E57696474680500000000000000C404400B53697A652E4865696768740500
+          000000000000A003401453697A652E506C6174666F726D44656661756C740804
+          5465787406056C6162656C165465787453657474696E67732E466F6E74436F6C
+          6F7207097846464644464446440000005450463007544C61796F757400095374
+          796C654E616D65060F76616C75656C6162656C7374796C650A506F736974696F
+          6E2E580500000000000000BB07400A506F736974696F6E2E5905000000000000
+          80F407400A53697A652E57696474680500000000000000BE05400B53697A652E
+          4865696768740500000000000000C003401453697A652E506C6174666F726D44
+          656661756C74080756697369626C6508085461624F726465720211000A545265
+          6374616E676C650005416C69676E0708436F6E74656E74730A46696C6C2E436F
+          6C6F7207097846463139313931390748697454657374080A53697A652E576964
+          74680500000000000000BE05400B53697A652E48656967687405000000000000
+          00C003401453697A652E506C6174666F726D44656661756C74080C5374726F6B
+          652E436F6C6F720709784646333933393339000005545465787400095374796C
+          654E616D6506047465787405416C69676E0706436C69656E7407486974546573
+          74080C4D617267696E732E4C656674050000000000000080FF3F0B4D61726769
+          6E732E546F70050000000000000080FF3F0D4D617267696E732E526967687405
+          0000000000000080FF3F0E4D617267696E732E426F74746F6D05000000000000
+          0080FF3F0A53697A652E57696474680500000000000000BA05400B53697A652E
+          4865696768740500000000000000B003401453697A652E506C6174666F726D44
+          656661756C74080454657874060454657874165465787453657474696E67732E
+          466F6E742E53697A650500000000000000A00240165465787453657474696E67
+          732E466F6E74436F6C6F7207097846464541454145410000005450463007544C
+          61796F757400095374796C654E616D65060C7461626974656D7374796C650541
+          6C69676E070643656E7465720A53697A652E57696474680500000000000000B8
+          04400B53697A652E4865696768740500000000000000A003401453697A652E50
+          6C6174666F726D44656661756C74080756697369626C6508085461624F726465
+          720212000A5452656374616E676C6500095374796C654E616D650603746F7005
+          416C69676E0708436F6E74656E74730C436C69704368696C6472656E090A4669
+          6C6C2E436F6C6F720709784646343834383438064C6F636B6564090748697454
+          657374080553696465730B03546F70044C656674055269676874000A53697A65
+          2E57696474680500000000000000B804400B53697A652E486569676874050000
+          0000000000A003401453697A652E506C6174666F726D44656661756C74080C53
+          74726F6B652E436F6C6F720709784646314331433143000F54436F6C6F72416E
+          696D6174696F6E00084475726174696F6E05000000000017B7D1F13F0C50726F
+          70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565
+          07097846463438343834380953746F7056616C75650709784646333833383338
+          0754726967676572062149734D6F7573654F7665723D747275653B497353656C
+          65637465643D66616C736500000F54436F6C6F72416E696D6174696F6E000844
+          75726174696F6E05000000000017B7D1F13F0C50726F70657274794E616D6506
+          0A46696C6C2E436F6C6F720A537461727456616C756507097846463338333833
+          380953746F7056616C7565070978464634383438343807547269676765720622
+          49734D6F7573654F7665723D66616C73653B497353656C65637465643D66616C
+          736500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500
+          00000000BD3786EB3F0C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C756507097846463338333833380953746F7056616C
+          7565070978464634383438343807547269676765720610497353656C65637465
+          643D66616C736500000F54436F6C6F72416E696D6174696F6E00084475726174
+          696F6E050000000000ACC5A7EE3F0C50726F70657274794E616D65060A46696C
+          6C2E436F6C6F720A537461727456616C75650709784646343834383438095374
+          6F7056616C756507097846463538353835380754726967676572060F49735365
+          6C65637465643D7472756500000E5452656374416E696D6174696F6E00084475
+          726174696F6E050000000000ACC5A7EE3F0C50726F70657274794E616D650607
+          4D617267696E730E537461727456616C75652E546F70050000000000000080FF
+          3F10537461727456616C75652E5269676874050000000000000080FFBF0F5374
+          6F7056616C75652E5269676874050000000000000080FFBF0754726967676572
+          060F497353656C65637465643D7472756500000E5452656374416E696D617469
+          6F6E00084475726174696F6E050000000000ACC5A7EE3F07496E766572736509
+          0C50726F70657274794E616D6506074D617267696E730E537461727456616C75
+          652E546F70050000000000000080FF3F10537461727456616C75652E52696768
+          74050000000000000080FFBF0F53746F7056616C75652E526967687405000000
+          0000000080FFBF07547269676765720610497353656C65637465643D66616C73
+          6500000654476C79706800095374796C654E616D65060A676C7970687374796C
+          650C4D617267696E732E4C65667405000000000000008001400D4D617267696E
+          732E526967687405000000000000008001C005416C69676E07044C6566740A53
+          697A652E576964746805000000000000008003400B53697A652E486569676874
+          05000000000000008003401453697A652E506C6174666F726D44656661756C74
+          08000005545465787400095374796C654E616D6506047465787405416C69676E
+          0706436C69656E74064C6F636B6564090748697454657374080C4D617267696E
+          732E4C65667405000000000000008002400B4D617267696E732E546F70050000
+          0000000000C000400D4D617267696E732E526967687405000000000000008002
+          400E4D617267696E732E426F74746F6D05000000000000008000400A53697A65
+          2E57696474680500000000000000F003400B53697A652E486569676874050000
+          0000000000F002401453697A652E506C6174666F726D44656661756C74080454
+          65787406046974656D165465787453657474696E67732E466F6E74436F6C6F72
+          0709784646444544454445155465787453657474696E67732E576F7264577261
+          70080000000A5452656374616E676C6500095374796C654E616D650606626F74
+          746F6D05416C69676E0708436F6E74656E74730C436C69704368696C6472656E
+          090A46696C6C2E436F6C6F720709784646343834383438064C6F636B65640907
+          48697454657374080553696465730B044C65667406426F74746F6D0552696768
+          74000A53697A652E57696474680500000000000000B804400B53697A652E4865
+          696768740500000000000000A003401453697A652E506C6174666F726D446566
+          61756C74080C5374726F6B652E436F6C6F720709784646314331433143000F54
+          436F6C6F72416E696D6174696F6E00084475726174696F6E05000000000017B7
+          D1F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461
+          727456616C756507097846463438343834380953746F7056616C756507097846
+          463338333833380754726967676572062149734D6F7573654F7665723D747275
+          653B497353656C65637465643D66616C736500000F54436F6C6F72416E696D61
+          74696F6E00084475726174696F6E05000000000017B7D1F13F0C50726F706572
+          74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978
+          46463338333833380953746F7056616C75650709784646343834383438075472
+          6967676572062249734D6F7573654F7665723D66616C73653B497353656C6563
+          7465643D66616C736500000F54436F6C6F72416E696D6174696F6E0008447572
+          6174696F6E050000000000BD3786EB3F0C50726F70657274794E616D65060A46
+          696C6C2E436F6C6F720A537461727456616C7565070978464633383338333809
+          53746F7056616C75650709784646343834383438075472696767657206104973
+          53656C65637465643D66616C736500000F54436F6C6F72416E696D6174696F6E
+          00084475726174696F6E050000000000ACC5A7EE3F0C50726F70657274794E61
+          6D65060A46696C6C2E436F6C6F720A537461727456616C756507097846463438
+          343834380953746F7056616C7565070978464635383538353807547269676765
+          72060F497353656C65637465643D7472756500000E5452656374416E696D6174
+          696F6E00084475726174696F6E050000000000ACC5A7EE3F0C50726F70657274
+          794E616D6506074D617267696E730F537461727456616C75652E4C6566740500
+          00000000000080FFBF10537461727456616C75652E5269676874050000000000
+          000080FFBF11537461727456616C75652E426F74746F6D050000000000000080
+          00400E53746F7056616C75652E4C656674050000000000000080FFBF0F53746F
+          7056616C75652E5269676874050000000000000080FFBF075472696767657206
+          0F497353656C65637465643D547275650E54726967676572496E766572736506
+          10497353656C65637465643D66616C736500000654476C79706800095374796C
+          654E616D65060A676C7970687374796C650C4D617267696E732E4C6566740500
+          0000000000008001400D4D617267696E732E5269676874050000000000000080
+          01C005416C69676E07044C6566740A53697A652E576964746805000000000000
+          008003400B53697A652E48656967687405000000000000008003401453697A65
+          2E506C6174666F726D44656661756C7408000005545465787400095374796C65
+          4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409
+          0748697454657374080C4D617267696E732E4C65667405000000000000008002
+          400B4D617267696E732E546F700500000000000000C000400D4D617267696E73
+          2E526967687405000000000000008002400E4D617267696E732E426F74746F6D
+          05000000000000008000400A53697A652E57696474680500000000000000F003
+          400B53697A652E4865696768740500000000000000F002401453697A652E506C
+          6174666F726D44656661756C7408045465787406045465787416546578745365
+          7474696E67732E466F6E74436F6C6F7207097846464445444544451554657874
+          53657474696E67732E576F72645772617008000F54436F6C6F72416E696D6174
+          696F6E00095374796C654E616D650614436F6C6F72416E696D6174696F6E3153
+          74796C65084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274
+          794E616D6506165465787453657474696E67732E466F6E74436F6C6F720A5374
+          61727456616C756507097846464336433643360953746F7056616C7565070863
+          6C6157686974650754726967676572060F497353656C65637465643D74727565
+          0E54726967676572496E76657273650610497353656C65637465643D66616C73
+          650000000000545046300A5452656374616E676C6500095374796C654E616D65
+          060B746162646F747374796C650A46696C6C2E436F6C6F720709784646314331
+          4331430748697454657374080A53697A652E57696474680500000000000000C8
+          04400B53697A652E4865696768740500000000000000C804401453697A652E50
+          6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
+          650756697369626C6508000F54436F6C6F72416E696D6174696F6E0008447572
+          6174696F6E05000000000018B7D1F23F0C50726F70657274794E616D65060A46
+          696C6C2E436F6C6F720A537461727456616C7565070978464631433143314309
+          53746F7056616C756507097846464644464446440754726967676572060F4973
+          53656C65637465643D747275650E54726967676572496E766572736506104973
+          53656C65637465643D66616C73650000005450463007544C61796F7574000953
+          74796C654E616D65060F746162636F6E74726F6C7374796C6505416C69676E07
+          0643656E7465720A53697A652E576964746805000000000000008E06400B5369
+          7A652E486569676874050000000000FFFFC905401453697A652E506C6174666F
+          726D44656661756C74080756697369626C6508085461624F726465720214000A
+          5452656374616E676C650005416C69676E0708436F6E74656E74730A46696C6C
+          2E436F6C6F7207097846463139313931390748697454657374080A53697A652E
+          576964746805000000000000008E06400B53697A652E48656967687405000000
+          0000FFFFC905401453697A652E506C6174666F726D44656661756C74080C5374
+          726F6B652E436F6C6F720709784646314331433143000A5452656374616E676C
+          650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65
+          0748697454657374080C4D617267696E732E4C656674050000000000000080FF
+          3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E73
+          2E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F6D
+          050000000000000080FF3F0A53697A652E576964746805000000000000008C06
+          400B53697A652E486569676874050000000000FFFFC505401453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646
+          353935393539000000005450463007544C61796F757400095374796C654E616D
+          65060D636865636B626F787374796C6505416C69676E070643656E7465720A53
+          697A652E57696474680500000000000000F205400B53697A652E486569676874
+          0500000000000000A803401453697A652E506C6174666F726D44656661756C74
+          080756697369626C6508085461624F7264657202150007544C61796F75740005
+          416C69676E07044C6566740A53697A652E57696474680500000000000000A003
+          400B53697A652E4865696768740500000000000000A803401453697A652E506C
+          6174666F726D44656661756C7408000A5452656374616E676C6500095374796C
+          654E616D65060A6261636B67726F756E6405416C69676E070643656E7465720A
+          46696C6C2E436F6C6F720709784646353835383538064C6F636B656409074869
+          7454657374080A53697A652E57696474680500000000000000D002400B53697A
+          652E4865696768740500000000000000D002401453697A652E506C6174666F72
+          6D44656661756C74080C5374726F6B652E436F6C6F7207097846463143314331
+          43000B54476C6F774566666563740008536F66746E6573730500000000009A99
+          99FD3F09476C6F77436F6C6F720709784646363543384530074F706163697479
+          050000000000000080FF3F0754726967676572060E4973466F63757365643D74
+          72756507456E61626C65640800000A5452656374616E676C650005416C69676E
+          0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374
+          080C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E
+          732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500
+          00000000000080FF3F0E4D617267696E732E426F74746F6D0500000000000000
+          80FF3F0A53697A652E57696474680500000000000000B002400B53697A652E48
+          65696768740500000000000000B002401453697A652E506C6174666F726D4465
+          6661756C74080C5374726F6B652E436F6C6F7207097846463539353935390000
+          0F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000
+          CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53
+          7461727456616C756507097846463538353835380953746F7056616C75650709
+          7846463638363836380754726967676572061049734D6F7573654F7665723D74
+          72756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
+          0000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F
+          6C6F720A537461727456616C756507097846463638363836380953746F705661
+          6C756507097846463538353835380754726967676572061149734D6F7573654F
+          7665723D66616C7365000005545061746800095374796C654E616D6506096368
+          65636B6D61726B05416C69676E070643656E74657209446174612E506174680A
+          3C0100001A0000000000000066467E449A19B443010000006666EB4300A06244
+          0200000066E6DE4300E068440200000066A6CA4300E06844020000006626BE43
+          00A0624401000000CDCCDC4066460544020000003833333F99B9034402000000
+          3833333FCC2C014402000000CDCCDC40FF3FFF43010000000000F04233B3C643
+          020000006666FC429999C34302000000666608439999C343020000009A990E43
+          33B3C6430100000067E6D14366A62844020000003473D343CC6C294402000000
+          0100D643CC6C294402000000CD8CD74366A628440100000034535C44FE7F6043
+          0200000001E05D44CB4C5A4302000000CE6C6044CB4C5A43020000009AF96144
+          FE7F60430100000000407E44CDCCA8430200000033D37F4467E6AB4302000000
+          33D37F440000B1430200000066467E449A19B4430300000066467E449A19B443
+          0A46696C6C2E436F6C6F720707636C614E756C6C064C6F636B65640907486974
+          54657374080A53697A652E576964746805000000000000009002400B53697A65
+          2E48656967687405000000000000009002401453697A652E506C6174666F726D
+          44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C75650707636C614E756C6C0953746F7056616C75650708636C61426C6163
+          6B0754726967676572060E4973436865636B65643D7472756500000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E05000000000018B7D1F13F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C75650708636C61426C61636B0953746F7056616C75650707636C614E756C
+          6C0754726967676572060F4973436865636B65643D66616C7365000000000005
+          545465787400095374796C654E616D6506047465787405416C69676E0706436C
+          69656E74064C6F636B6564090748697454657374080C4D617267696E732E4C65
+          6674050000000000000080FF3F0B4D617267696E732E546F7005000000000000
+          008000400D4D617267696E732E5269676874050000000000000080FF3F0A5369
+          7A652E57696474680500000000000000C605400B53697A652E48656967687405
+          000000000000009803401453697A652E506C6174666F726D44656661756C7408
+          0454657874060454657874165465787453657474696E67732E466F6E74436F6C
+          6F7207097846464633463346330000005450463007544C61796F757400095374
+          796C654E616D650610726164696F627574746F6E7374796C650A506F73697469
+          6F6E2E580500000000000000B407400A506F736974696F6E2E59050000000000
+          0000F507400A53697A652E57696474680500000000000000F205400B53697A65
+          2E4865696768740500000000000000A803401453697A652E506C6174666F726D
+          44656661756C74080756697369626C6508085461624F7264657202160007544C
+          61796F75740005416C69676E07044C6566740A53697A652E5769647468050000
+          0000000000A003400B53697A652E4865696768740500000000000000A8034014
+          53697A652E506C6174666F726D44656661756C7408000854456C6C6970736500
+          095374796C654E616D65060A6261636B67726F756E6405416C69676E07064365
+          6E7465720A46696C6C2E436F6C6F720709784646353835383538064C6F636B65
+          64090748697454657374080A53697A652E57696474680500000000000000D002
+          400B53697A652E4865696768740500000000000000D002401453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646
+          314331433143000B54476C6F774566666563740008536F66746E657373050000
+          0000009A9999FD3F09476C6F77436F6C6F720709784646363543384530074F70
+          6163697479050000000000000080FF3F0754726967676572060E4973466F6375
+          7365643D7472756507456E61626C65640800000854456C6C697073650005416C
+          69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454
+          657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D6172
+          67696E732E546F70050000000000000080FF3F0D4D617267696E732E52696768
+          74050000000000000080FF3F0E4D617267696E732E426F74746F6D0500000000
+          00000080FF3F0A53697A652E57696474680500000000000000B002400B53697A
+          652E4865696768740500000000000000B002401453697A652E506C6174666F72
+          6D44656661756C74080C5374726F6B652E436F6C6F7207097846463539353935
+          3900000F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000
+          000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F
+          720A537461727456616C756507097846463538353835380953746F7056616C75
+          6507097846463638363836380754726967676572061049734D6F7573654F7665
+          723D7472756500000F54436F6C6F72416E696D6174696F6E0008447572617469
+          6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C
+          2E436F6C6F720A537461727456616C756507097846463638363836380953746F
+          7056616C756507097846463538353835380754726967676572061149734D6F75
+          73654F7665723D66616C736500000854456C6C6970736500095374796C654E61
+          6D650609636865636B6D61726B05416C69676E0706436C69656E740A46696C6C
+          2E436F6C6F720707636C614E756C6C064C6F636B656409074869745465737408
+          0C4D617267696E732E4C6566740500000000000000C000400B4D617267696E73
+          2E546F700500000000000000C000400D4D617267696E732E5269676874050000
+          0000000000C000400E4D617267696E732E426F74746F6D0500000000000000C0
+          00400A53697A652E57696474680500000000000000E001400B53697A652E4865
+          696768740500000000000000E001401453697A652E506C6174666F726D446566
+          61756C74080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F7241
+          6E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C5072
+          6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75
+          650707636C614E756C6C0953746F7056616C75650708636C61426C61636B0754
+          726967676572060E4973436865636B65643D7472756500000F54436F6C6F7241
+          6E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C5072
+          6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75
+          650708636C61426C61636B0953746F7056616C75650707636C614E756C6C0754
+          726967676572060F4973436865636B65643D66616C7365000000000005545465
+          787400095374796C654E616D6506047465787405416C69676E0706436C69656E
+          74064C6F636B6564090748697454657374080C4D617267696E732E4C65667405
+          0000000000000080FF3F0B4D617267696E732E546F7005000000000000008000
+          400D4D617267696E732E5269676874050000000000000080FF3F0A53697A652E
+          57696474680500000000000000C605400B53697A652E48656967687405000000
+          000000009803401453697A652E506C6174666F726D44656661756C7408045465
+          7874060B526164696F427574746F6E165465787453657474696E67732E466F6E
+          74436F6C6F7207097846464633463346330000005450463007544C61796F7574
+          00095374796C654E616D65061070726F67726573736261727374796C650A506F
+          736974696F6E2E580500000000000080C007400A506F736974696F6E2E590500
+          000000000080EB07400A53697A652E576964746805000000000000009005400B
+          53697A652E486569676874050000000000FFFFF304401453697A652E506C6174
+          666F726D44656661756C74080756697369626C6508085461624F726465720217
+          000A5452656374616E676C6500095374796C654E616D650605747261636B0541
+          6C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846463146
+          31463146064C6F636B6564090748697454657374080A53697A652E5769647468
+          05000000000000009005400B53697A652E486569676874050000000000FFFFF3
+          04401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F720709784646334433443344000A5452656374616E676C6500095374
+          796C654E616D65060A68696E64696361746F7205416C69676E07044C65667409
+          46696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E
+          742E506F696E74730E0105436F6C6F720709784646323637324238064F666673
+          65740500000000000000000000000105436F6C6F720709784646303634353735
+          064F6666736574050000000000000080FF3F0000064C6F636B65640907486974
+          54657374080C4D617267696E732E4C65667405000000000000008000400B4D61
+          7267696E732E546F7005000000000000008000400D4D617267696E732E526967
+          687405000000000000008000400E4D617267696E732E426F74746F6D05000000
+          000000008000400A506F736974696F6E2E5805000000000000008000400A506F
+          736974696F6E2E5905000000000000008000400A53697A652E57696474680500
+          000000000000C804400B53697A652E486569676874050000000000FEFFFF0340
+          1453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B69
+          6E6407044E6F6E650007544C61796F75740005416C69676E0706436C69656E74
+          0C436C69704368696C6472656E09064C6F636B6564090C4D617267696E732E4C
+          65667405000000000000008000400D4D617267696E732E526967687405000000
+          000000008000400A53697A652E57696474680500000000000000B804400B5369
+          7A652E486569676874050000000000FEFFFF03401453697A652E506C6174666F
+          726D44656661756C7408000A5452656374616E676C650005416C69676E070856
+          6572746963616C0946696C6C2E4B696E6407084772616469656E741446696C6C
+          2E4772616469656E742E506F696E74730E0105436F6C6F720709783030323637
+          324238064F66667365740500000000000000000000000105436F6C6F72070978
+          4239323038314433064F6666736574050000000000000080FE3F000105436F6C
+          6F720709783030303835313838064F6666736574050000000000000080FF3F00
+          001C46696C6C2E4772616469656E742E53746F70506F736974696F6E2E580500
+          00000000000080FF3F1C46696C6C2E4772616469656E742E53746F70506F7369
+          74696F6E2E590500000000000000000000064C6F636B65640907486974546573
+          74080A53697A652E5769647468050000000000FFFFF704400B53697A652E4865
+          69676874050000000000FEFFFF03401453697A652E506C6174666F726D446566
+          61756C74080B5374726F6B652E4B696E6407044E6F6E65075852616469757305
+          0000000000000090024007595261646975730500000000000000900240000F54
+          466C6F6174416E696D6174696F6E00084475726174696F6E0500000000000000
+          800140044C6F6F70090C50726F70657274794E616D65060A506F736974696F6E
+          2E780A537461727456616C75650500000000000000C804C00953746F7056616C
+          75650500000000000000C808400754726967676572060E497356697369626C65
+          3D7472756500000000000A5452656374616E676C6500095374796C654E616D65
+          060A76696E64696361746F7205416C69676E0706426F74746F6D0946696C6C2E
+          4B696E6407084772616469656E741446696C6C2E4772616469656E742E506F69
+          6E74730E0105436F6C6F720709784646323637324238064F6666736574050000
+          0000000000000000000105436F6C6F720709784646303634353735064F666673
+          6574050000000000000080FF3F00001C46696C6C2E4772616469656E742E5374
+          6F70506F736974696F6E2E58050000000000000080FF3F1C46696C6C2E477261
+          6469656E742E53746F70506F736974696F6E2E59050000000000000000000006
+          4C6F636B6564090748697454657374080C4D617267696E732E4C656674050000
+          00000000008000400B4D617267696E732E546F7005000000000000008000400D
+          4D617267696E732E526967687405000000000000008000400E4D617267696E73
+          2E426F74746F6D05000000000000008000400A506F736974696F6E2E58050000
+          00000000008000400A506F736974696F6E2E59050000000000FFFF9704400A53
+          697A652E576964746805000000000000008805400B53697A652E486569676874
+          0500000000000000A803401453697A652E506C6174666F726D44656661756C74
+          080B5374726F6B652E4B696E6407044E6F6E650007544C61796F75740005416C
+          69676E0706436C69656E740C436C69704368696C6472656E09064C6F636B6564
+          090B4D617267696E732E546F7005000000000000008000400E4D617267696E73
+          2E426F74746F6D05000000000000008000400A53697A652E5769647468050000
+          00000000008805400B53697A652E486569676874050000000000000088034014
+          53697A652E506C6174666F726D44656661756C7408000A5452656374616E676C
+          650005416C69676E070A486F72697A6F6E74616C0946696C6C2E4B696E640708
+          4772616469656E741446696C6C2E4772616469656E742E506F696E74730E0105
+          436F6C6F720709783030323637324238064F6666736574050000000000000000
+          0000000105436F6C6F720709784239323038314433064F666673657405000000
+          0000000080FE3F000105436F6C6F720709783030303835313838064F66667365
+          74050000000000000080FF3F0000064C6F636B6564090748697454657374080C
+          4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E
+          546F70050000000000000080FF3F0D4D617267696E732E526967687405000000
+          0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF
+          3F0A506F736974696F6E2E58050000000000000080FF3F0A506F736974696F6E
+          2E590500000000000000F108400A53697A652E57696474680500000000000000
+          8405400B53697A652E4865696768740500000000000000C804401453697A652E
+          506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F
+          6E65075852616469757305000000000000009002400759526164697573050000
+          0000000000900240000F54466C6F6174416E696D6174696F6E00084475726174
+          696F6E0500000000000000800140044C6F6F70090C50726F70657274794E616D
+          65060A506F736974696F6E2E790A537461727456616C75650500000000000000
+          C808400953746F7056616C75650500000000000000C804C00754726967676572
+          060E497356697369626C653D74727565000000000000005450463007544C6179
+          6F757400095374796C654E616D65060D73697A65677269707374796C650A506F
+          736974696F6E2E580500000000000000CD07400A506F736974696F6E2E590500
+          000000000000F507400A53697A652E57696474680500000000000000B803400B
+          53697A652E4865696768740500000000000000B803401453697A652E506C6174
+          666F726D44656661756C74080756697369626C6508085461624F726465720218
+          000654496D616765000E4D756C74695265734269746D61700E01055769647468
+          020B06486569676874020B03504E470A6D00000089504E470D0A1A0A0000000D
+          494844520000000B0000000B0806000000A9AC77260000000473424954080808
+          087C086488000000244944415418956360A036101616FE4F1B13A96732BA8994
+          9B8CCB44F24D26642259260300F02112497749387B0000000049454E44AE4260
+          82000005416C69676E070643656E746572064C6F636B65640907486974546573
+          74080A53697A652E57696474680500000000000100B002400B53697A652E4865
+          696768740500000000000100B002401453697A652E506C6174666F726D446566
+          61756C740808577261704D6F646507084F726967696E616C0000005450463007
+          544C61796F757400095374796C654E616D65060F636F6D626F706F7075707374
+          796C6505416C69676E070643656E7465720C436C69704368696C6472656E0907
+          4F7061636974790500000000003333F3FE3F0A53697A652E5769647468050000
+          0000000000B805400B53697A652E4865696768740500000000000000EC044014
+          53697A652E506C6174666F726D44656661756C74080756697369626C65080854
+          61624F726465720219000A5452656374616E676C6500095374796C654E616D65
+          060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A46696C
+          6C2E436F6C6F720709784646343834383438064C6F636B656409074869745465
+          7374080A53697A652E57696474680500000000000000B805400B53697A652E48
+          65696768740500000000000000EC04401453697A652E506C6174666F726D4465
+          6661756C74080C5374726F6B652E436F6C6F720709784646314331433143000F
+          54466C6F6174416E696D6174696F6E00084475726174696F6E050000000000CD
+          CCCCFB3F0C50726F70657274794E616D65060E506172656E742E4F7061636974
+          790A537461727456616C756505000000000000000000000953746F7056616C75
+          65050000000000000080FF3F0754726967676572060F497344726F70446F776E
+          3D747275650E54726967676572496E76657273650610497344726F70446F776E
+          3D66616C7365000000005450463007544C61796F757400095374796C654E616D
+          65060D74726565766965777374796C6505416C69676E070643656E7465720A53
+          697A652E5769647468050000000000FFFFE905400B53697A652E486569676874
+          05000000000000008C06401453697A652E506C6174666F726D44656661756C74
+          080756697369626C6508085461624F72646572021A000A5452656374616E676C
+          6500095374796C654E616D65060A6261636B67726F756E6405416C69676E0708
+          436F6E74656E74730A46696C6C2E436F6C6F720709784646313931393139064C
+          6F636B6564090748697454657374080C50616464696E672E4C65667405000000
+          0000000080FF3F0B50616464696E672E546F70050000000000000080FF3F0D50
+          616464696E672E5269676874050000000000000080FF3F0E50616464696E672E
+          426F74746F6D050000000000000080FF3F0A53697A652E576964746805000000
+          0000FFFFE905400B53697A652E48656967687405000000000000008C06401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E65000A5452656374616E676C650005416C69676E0706436C69656E
+          740946696C6C2E4B696E6407044E6F6E650748697454657374080A53697A652E
+          5769647468050000000000FFFFE505400B53697A652E48656967687405000000
+          000000008A06401453697A652E506C6174666F726D44656661756C74080B5374
+          726F6B652E4B696E6407044E6F6E65000007544C61796F75740005416C69676E
+          0706436C69656E740A53697A652E5769647468050000000000FFFFE505400B53
+          697A652E48656967687405000000000000008A06401453697A652E506C617466
+          6F726D44656661756C74080007544C61796F757400095374796C654E616D6506
+          07636F6E74656E7405416C69676E0706436C69656E740C436C69704368696C64
+          72656E090C4D617267696E732E4C656674050000000000000080FF3F0B4D6172
+          67696E732E546F70050000000000000080FF3F0D4D617267696E732E52696768
+          74050000000000000080FF3F0E4D617267696E732E426F74746F6D0500000000
+          00000080FF3F0A53697A652E5769647468050000000000FFFFC305400B53697A
+          652E4865696768740500000000000000F205401453697A652E506C6174666F72
+          6D44656661756C7408000A5452656374616E676C6500095374796C654E616D65
+          060973656C656374696F6E0A46696C6C2E436F6C6F7207097846463243324332
+          430748697454657374080A53697A652E57696474680500000000000000C80440
+          0B53697A652E4865696768740500000000000000C804401453697A652E506C61
+          74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500
+          000A5452656374616E676C6500095374796C654E616D650610666F6375736564
+          73656C656374696F6E0A46696C6C2E436F6C6F72070978464632433243324307
+          48697454657374080A53697A652E57696474680500000000000000C804400B53
+          697A652E4865696768740500000000000000C804401453697A652E506C617466
+          6F726D44656661756C74080B5374726F6B652E446173680703446F740000000A
+          545363726F6C6C42617200095374796C654E616D65060A767363726F6C6C6261
+          7205416C69676E070552696768740B536D616C6C4368616E6765050000000000
+          00000000000B4F7269656E746174696F6E0708566572746963616C0A506F7369
+          74696F6E2E58050000000000FFFFC705400A53697A652E576964746805000000
+          00000000F002400B53697A652E4865696768740500000000000000F605401453
+          697A652E506C6174666F726D44656661756C740800000A545363726F6C6C4261
+          7200095374796C654E616D65060A687363726F6C6C62617205416C69676E0706
+          426F74746F6D0B536D616C6C4368616E676505000000000000000000000B4F72
+          69656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E59
+          0500000000000000F605400A53697A652E5769647468050000000000FFFFE505
+          400B53697A652E4865696768740500000000000000F002401453697A652E506C
+          6174666F726D44656661756C740800000F54536D616C6C5363726F6C6C426172
+          00095374796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69
+          676E070552696768740B536D616C6C4368616E67650500000000000000000000
+          0B4F7269656E746174696F6E0708566572746963616C0B4D617267696E732E54
+          6F70050000000000000080FF3F0D4D617267696E732E52696768740500000000
+          00000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F
+          0A506F736974696F6E2E580500000000000000C605400A506F736974696F6E2E
+          5905000000000000008000400A53697A652E5769647468050000000000000080
+          02400B53697A652E48656967687405000000000000008002401453697A652E50
+          6C6174666F726D44656661756C74080756697369626C650800000F54536D616C
+          6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C736372
+          6F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C4368616E6765
+          05000000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E
+          74616C0C4D617267696E732E4C656674050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000000000
+          008000400A506F736974696F6E2E590500000000000000E205400A53697A652E
+          576964746805000000000000009606400B53697A652E48656967687405000000
+          000000008002401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C65080000000000545046300A5452656374616E676C6500095374796C
+          654E616D65061174726565766965776974656D7374796C6505416C69676E0706
+          43656E7465720946696C6C2E4B696E6407044E6F6E650748697454657374080A
+          53697A652E57696474680500000000000000AE05400B53697A652E4865696768
+          740500000000000000A004401453697A652E506C6174666F726D44656661756C
+          74080B5374726F6B652E4B696E6407044E6F6E650756697369626C6508000C54
+          5370656564427574746F6E00095374796C654E616D650606627574746F6E0541
+          6C69676E07044C6566740C4D617267696E732E4C6566740500000000000000C0
+          00400B4D617267696E732E546F700500000000000000C000400D4D617267696E
+          732E52696768740500000000000000C000400E4D617267696E732E426F74746F
+          6D0500000000000000C000400A506F736974696F6E2E580500000000000000C0
+          00400A506F736974696F6E2E590500000000000000C000400A53697A652E5769
+          6474680500000000000000A003400B53697A652E486569676874050000000000
+          00008804401453697A652E506C6174666F726D44656661756C74080B5374796C
+          654C6F6F6B7570061B7472656576696577657870616E646572627574746F6E73
+          74796C65155465787453657474696E67732E5472696D6D696E6707044E6F6E65
+          000007544C61796F75740005416C69676E0708436F6E74656E74730C4D617267
+          696E732E4C6566740500000000000000A003400A53697A652E57696474680500
+          0000000000008605400B53697A652E4865696768740500000000000000A00440
+          1453697A652E506C6174666F726D44656661756C7408000954436865636B426F
+          7800095374796C654E616D650605636865636B05416C69676E07044C65667408
+          43616E466F637573081244697361626C65466F637573456666656374090A5369
+          7A652E57696474680500000000000000A003400B53697A652E48656967687405
+          00000000000000A004401453697A652E506C6174666F726D44656661756C7408
+          00000654476C79706800095374796C654E616D65060A676C7970687374796C65
+          0C4D617267696E732E4C65667405000000000000008000400B4D617267696E73
+          2E546F70050000000000000080FF3F0D4D617267696E732E5269676874050000
+          00000000008000400E4D617267696E732E426F74746F6D050000000000000080
+          FF3F05416C69676E07044C6566740A53697A652E576964746805000000000000
+          008003400B53697A652E48656967687405000000000000008003401453697A65
+          2E506C6174666F726D44656661756C7408000005545465787400095374796C65
+          4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409
+          0748697454657374080A53697A652E57696474680500000000000000BC04400B
+          53697A652E4865696768740500000000000000A004401453697A652E506C6174
+          666F726D44656661756C7408165465787453657474696E67732E466F6E74436F
+          6C6F720708636C615768697465155465787453657474696E67732E576F726457
+          72617008165465787453657474696E67732E486F727A416C69676E07074C6561
+          64696E67000000005450463007544C61796F757400095374796C654E616D6506
+          1B7472656576696577657870616E646572627574746F6E7374796C6505416C69
+          676E070643656E7465720B4D617267696E732E546F70050000000000000080FF
+          3F0A53697A652E57696474680500000000000000B003400B53697A652E486569
+          6768740500000000000000B003401453697A652E506C6174666F726D44656661
+          756C74080756697369626C6508085461624F72646572021C0005545061746800
+          05416C69676E070643656E74657209446174612E506174680A40000000050000
+          0000000000D36D3F431BEF4843010000001749E043BA09E54301000000D36D3F
+          43C73B344401000000D36D3F431BEF484303000000D36D3F431BEF48430A4669
+          6C6C2E436F6C6F720708636C61426C61636B064C6F636B656409074869745465
+          7374080A53697A652E576964746805000000000000008002400B53697A652E48
+          656967687405000000000000009002401453697A652E506C6174666F726D4465
+          6661756C74080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72
+          416E696D6174696F6E00084475726174696F6E05000000000017B7D1F13F0C50
+          726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C
+          75650707636C614E756C6C0953746F7056616C75650708636C61576869746507
+          5472696767657206104973457870616E6465643D66616C736500000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E05000000000017B7D1F13F
+          07496E7665727365090C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C75650707636C614E756C6C0953746F7056616C7565
+          0708636C6157686974650754726967676572060F4973457870616E6465643D74
+          7275650000000554506174680005416C69676E070643656E7465720944617461
+          2E506174680A400000000500000000000000CB11CF4379E93C4301000000CB11
+          CF4396230A44010000007DBF1E4296230A4401000000CB11CF4379E93C430300
+          0000CB11CF4379E93C430A46696C6C2E436F6C6F720707636C614E756C6C064C
+          6F636B6564090748697454657374080A53697A652E5769647468050000000000
+          00008002400B53697A652E48656967687405000000000000008002401453697A
+          652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704
+          4E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
+          000000000017B7D1F13F0C50726F70657274794E616D65060A46696C6C2E436F
+          6C6F720A537461727456616C75650707636C614E756C6C0953746F7056616C75
+          650708636C6157686974650754726967676572060F4973457870616E6465643D
+          7472756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
+          05000000000017B7D1F13F07496E7665727365090C50726F70657274794E616D
+          65060A46696C6C2E436F6C6F720A537461727456616C75650707636C614E756C
+          6C0953746F7056616C75650708636C6157686974650754726967676572061049
+          73457870616E6465643D66616C7365000000005450463007544C61796F757400
+          095374796C654E616D65060D747261636B6261727374796C650A506F73697469
+          6F6E2E580500000000000000B207400A506F736974696F6E2E59050000000000
+          0000F707400A53697A652E576964746805000000000000008206400B53697A65
+          2E4865696768740500000000000100E002401453697A652E506C6174666F726D
+          44656661756C74080756697369626C6508085461624F72646572021D000A5452
+          656374616E676C6500095374796C654E616D65060668747261636B05416C6967
+          6E070A5665727443656E7465720A46696C6C2E436F6C6F720709784646314631
+          463146064C6F636B6564090748697454657374080C4D617267696E732E4C6566
+          7405000000000000008001400B4D617267696E732E546F700500000000000000
+          8001400D4D617267696E732E526967687405000000000000008001400E4D6172
+          67696E732E426F74746F6D05000000000000008001400A506F736974696F6E2E
+          5805000000000000008001400A506F736974696F6E2E59050000000000000080
+          01400A53697A652E57696474680500000000000000F405400B53697A652E4865
+          696768740500000000000200C001401453697A652E506C6174666F726D446566
+          61756C74080C5374726F6B652E436F6C6F720709784646314331433143000B54
+          476C6F774566666563740008536F66746E6573730500000000009A9999FD3F09
+          476C6F77436F6C6F720709784646363543384530074F70616369747905000000
+          0000000080FF3F0754726967676572060E4973466F63757365643D7472756507
+          456E61626C6564080000000A5452656374616E676C6500095374796C654E616D
+          65060676747261636B05416C69676E070A486F727A43656E7465720A46696C6C
+          2E436F6C6F720709784646314631463146064C6F636B65640907486974546573
+          74080C4D617267696E732E4C65667405000000000000008001400B4D61726769
+          6E732E546F7005000000000000008001400D4D617267696E732E526967687405
+          000000000000008001400E4D617267696E732E426F74746F6D05000000000000
+          008001400A506F736974696F6E2E580500000000000000F804400A506F736974
+          696F6E2E5905000000000000008001400A53697A652E57696474680500000000
+          000000C001400B53697A652E4865696768740500000000000200C00140145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          0709784646314331433143000B54476C6F774566666563740008536F66746E65
+          73730500000000009A9999FD3F09476C6F77436F6C6F72070978464636354338
+          4530074F706163697479050000000000000080FF3F0754726967676572060E49
+          73466F63757365643D7472756507456E61626C65640800000006545468756D62
+          00095374796C654E616D6506057468756D62064C6F636B6564090C4D61726769
+          6E732E4C65667405000000000000008000C00B4D617267696E732E546F700500
+          0000000000008000C00D4D617267696E732E5269676874050000000000000080
+          00C00E4D617267696E732E426F74746F6D05000000000000008000C00A506F73
+          6974696F6E2E580500000000000000C000400A506F736974696F6E2E59050000
+          000000000080FF3F0A53697A652E57696474680500000000000000A002400B53
+          697A652E4865696768740500000000000100E002401453697A652E506C617466
+          6F726D44656661756C74080B5374796C654C6F6F6B7570060D7468756D626261
+          727374796C65085461624F7264657202010000005450463007544C61796F7574
+          00095374796C654E616D65060E6E756D626572626F787374796C6505416C6967
+          6E070643656E7465720A53697A652E57696474680500000000000000B605400B
+          53697A652E4865696768740500000000000000C003401453697A652E506C6174
+          666F726D44656661756C74080756697369626C6508085461624F72646572021E
+          000A5452656374616E676C6500095374796C654E616D65060A6261636B67726F
+          756E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E64070847
+          72616469656E741446696C6C2E4772616469656E742E506F696E74730E010543
+          6F6C6F720709784646353835383538064F666673657405000000000000000000
+          00000105436F6C6F720709784646353135313531064F66667365740500000000
+          00A01BF3FD3F000105436F6C6F720709784646343934393439064F6666736574
+          050000000000000080FF3F0000064C6F636B6564090748697454657374080C4D
+          617267696E732E4C65667405000000000000008000400B4D617267696E732E54
+          6F7005000000000000008000400D4D617267696E732E52696768740500000000
+          0000008000400E4D617267696E732E426F74746F6D0500000000000000800040
+          0A53697A652E57696474680500000000000000AE05400B53697A652E48656967
+          68740500000000000000A003401453697A652E506C6174666F726D4465666175
+          6C74080C5374726F6B652E436F6C6F720709784646364136413641000F54436F
+          6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC
+          3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C756507097846463538353835380953746F7056616C7565070978464634
+          38343834380754726967676572061049734D6F7573654F7665723D7472756500
+          000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000
+          00CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097846463438343834380953746F7056616C756507
+          097846463538353835380754726967676572061149734D6F7573654F7665723D
+          66616C736500000A5452656374616E676C650005416C69676E0706436C69656E
+          740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61726769
+          6E732E4C65667405000000000000008000C00B4D617267696E732E546F700500
+          0000000000008000C00D4D617267696E732E5269676874050000000000000080
+          00C00E4D617267696E732E426F74746F6D05000000000000008000C00A53697A
+          652E57696474680500000000000000B605400B53697A652E4865696768740500
+          000000000000C003401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F720709784646353135313531000A5452656374616E
+          676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F
+          6E650748697454657374080C4D617267696E732E4C6566740500000000000000
+          80FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61726769
+          6E732E5269676874050000000000000080FF3F0E4D617267696E732E426F7474
+          6F6D050000000000000080FF3F0A53697A652E57696474680500000000000000
+          B205400B53697A652E4865696768740500000000000000B003401453697A652E
+          506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978
+          46463143314331430000000007544C61796F757400095374796C654E616D6506
+          07636F6E74656E7405416C69676E0708436F6E74656E7473064C6F636B656409
+          0C4D617267696E732E4C65667405000000000000008001400B4D617267696E73
+          2E546F7005000000000000008001400D4D617267696E732E5269676874050000
+          00000000008001400E4D617267696E732E426F74746F6D050000000000000080
+          01400A53697A652E57696474680500000000000000A605400B53697A652E4865
+          6967687405000000000000008003401453697A652E506C6174666F726D446566
+          61756C740800000C5442727573684F626A65637400095374796C654E616D6506
+          0A666F726567726F756E640B42727573682E436F6C6F720708636C61426C6163
+          6B00000B54476C6F774566666563740008536F66746E6573730500000000009A
+          9999FD3F09476C6F77436F6C6F720709784646363543384530074F7061636974
+          79050000000000000080FF3F0754726967676572060E4973466F63757365643D
+          7472756507456E61626C6564080000005450463007544C61796F757400095374
+          796C654E616D650609656469747374796C6505416C69676E070643656E746572
+          0A53697A652E57696474680500000000000000B605400B53697A652E48656967
+          68740500000000000000C003401453697A652E506C6174666F726D4465666175
+          6C74080756697369626C6508085461624F72646572021F000A5452656374616E
+          676C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E
+          0708436F6E74656E74730A46696C6C2E436F6C6F720709784646313931393139
+          064C6F636B6564090748697454657374080A53697A652E576964746805000000
+          00000000B605400B53697A652E4865696768740500000000000000C003401453
+          697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F
+          720709784646333933393339000F54436F6C6F72416E696D6174696F6E000844
+          75726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D6506
+          0A46696C6C2E436F6C6F720A537461727456616C756507097846463530353035
+          300953746F7056616C7565070978464637303730373000000F54436F6C6F7241
+          6E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F07496E
+          7665727365090C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097846463530353035300953746F7056616C756507
+          0978464637303730373000000A5452656374616E676C650005416C69676E0706
+          436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C
+          4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E
+          546F70050000000000000080FF3F0D4D617267696E732E526967687405000000
+          0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF
+          3F0A53697A652E57696474680500000000000000B205400B53697A652E486569
+          6768740500000000000000B003401453697A652E506C6174666F726D44656661
+          756C74080C5374726F6B652E436F6C6F72070978464631383138313800000007
+          544C61796F757400095374796C654E616D650607636F6E74656E7405416C6967
+          6E0706436C69656E74064C6F636B6564090C4D617267696E732E4C6566740500
+          000000000000C000400B4D617267696E732E546F700500000000000000C00040
+          0D4D617267696E732E52696768740500000000000000C000400E4D617267696E
+          732E426F74746F6D0500000000000000C000400A53697A652E57696474680500
+          0000000000008004400B53697A652E4865696768740500000000000000900340
+          1453697A652E506C6174666F726D44656661756C7408000007544C61796F7574
+          00095374796C654E616D650607627574746F6E7305416C69676E070552696768
+          74064C6F636B6564090B4D617267696E732E546F700500000000000000C00040
+          0D4D617267696E732E52696768740500000000000000C000400E4D617267696E
+          732E426F74746F6D0500000000000000C000400A506F736974696F6E2E580500
+          0000000000009804400A506F736974696F6E2E590500000000000000C000400A
+          53697A652E57696474680500000000000000C804400B53697A652E4865696768
+          7405000000000000009003401453697A652E506C6174666F726D44656661756C
+          740800000C5442727573684F626A65637400095374796C654E616D65060A666F
+          726567726F756E640B42727573682E436F6C6F72070978464645414541454100
+          000C5442727573684F626A65637400095374796C654E616D65060973656C6563
+          74696F6E0A42727573682E4B696E6407084772616469656E741542727573682E
+          4772616469656E742E506F696E74730E0105436F6C6F72070978383032423739
+          3843064F66667365740500000000000000000000000105436F6C6F7207097838
+          30324236453746064F666673657405000000000012A2F8FD3F000105436F6C6F
+          720709783830324236343732064F6666736574050000000000000080FF3F0000
+          0000005450463007544C61796F757400095374796C654E616D65060C7370696E
+          626F787374796C650A506F736974696F6E2E580500000000000000BC07400A50
+          6F736974696F6E2E590500000000000080F407400A53697A652E576964746805
+          00000000000000B605400B53697A652E4865696768740500000000000000C003
+          401453697A652E506C6174666F726D44656661756C74080756697369626C6508
+          085461624F726465720220000A5452656374616E676C6500095374796C654E61
+          6D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A46
+          696C6C2E436F6C6F720709784646313931393139064C6F636B65640907486974
+          54657374080A53697A652E57696474680500000000000000B605400B53697A65
+          2E4865696768740500000000000000C003401453697A652E506C6174666F726D
+          44656661756C74080C5374726F6B652E436F6C6F720709784646333933393339
+          000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000
+          00CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097846463530353035300953746F7056616C756507
+          0978464637303730373000000F54436F6C6F72416E696D6174696F6E00084475
+          726174696F6E050000000000CDCCCCFC3F07496E7665727365090C50726F7065
+          7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709
+          7846463530353035300953746F7056616C756507097846463730373037300000
+          0A5452656374616E676C650005416C69676E0706436C69656E740946696C6C2E
+          4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C656674
+          050000000000000080FF3F0B4D617267696E732E546F70050000000000000080
+          FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267
+          696E732E426F74746F6D050000000000000080FF3F0A53697A652E5769647468
+          0500000000000000B205400B53697A652E4865696768740500000000000000B0
+          03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F72070978464631383138313800000007544C61796F75740009537479
+          6C654E616D650607636F6E74656E7405416C69676E0706436C69656E74064C6F
+          636B6564090C4D617267696E732E4C6566740500000000000000C000400B4D61
+          7267696E732E546F700500000000000000C000400D4D617267696E732E526967
+          68740500000000000000C000400E4D617267696E732E426F74746F6D05000000
+          00000000C000400A53697A652E576964746805000000000000009404400B5369
+          7A652E48656967687405000000000000009003401453697A652E506C6174666F
+          726D44656661756C740800000754427574746F6E00095374796C654E616D6506
+          0B6D696E7573627574746F6E05416C69676E07074669744C6566740843616E46
+          6F637573080C4D617267696E732E4C65667405000000000000008000400B4D61
+          7267696E732E546F7005000000000000008000400D4D617267696E732E526967
+          687405000000000000008000400E4D617267696E732E426F74746F6D05000000
+          000000008000400A506F736974696F6E2E5805000000000000008000400A506F
+          736974696F6E2E5905000000000000008000400A53697A652E57696474680500
+          000000000000A003400B53697A652E4865696768740500000000000000A00340
+          1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B
+          7570061C7472616E73706172656E74636972636C65627574746F6E7374796C65
+          155465787453657474696E67732E5472696D6D696E6707044E6F6E6500055450
+          6174680005416C69676E0706436C69656E7409446174612E506174680A400000
+          0005000000000000000000803F00000000010000000000803F0000803F010000
+          00000000000000003F010000000000803F00000000030000000000803F000000
+          000A46696C6C2E436F6C6F720708636C6157686974650748697454657374080C
+          4D617267696E732E4C6566740500000000000000C001400B4D617267696E732E
+          546F700500000000000000C001400D4D617267696E732E526967687405000000
+          00000000C001400E4D617267696E732E426F74746F6D0500000000000000C001
+          400A53697A652E576964746805000000000000008002400B53697A652E486569
+          67687405000000000000008002401453697A652E506C6174666F726D44656661
+          756C74080B5374726F6B652E4B696E6407044E6F6E650000000754427574746F
+          6E00095374796C654E616D65060A706C7573627574746F6E05416C69676E0708
+          46697452696768740843616E466F637573080C4D617267696E732E4C65667405
+          000000000000008000400B4D617267696E732E546F7005000000000000008000
+          400D4D617267696E732E526967687405000000000000008000400E4D61726769
+          6E732E426F74746F6D05000000000000008000400A506F736974696F6E2E5805
+          000000000000008A05400A506F736974696F6E2E590500000000000000800040
+          0A53697A652E57696474680500000000000000A003400B53697A652E48656967
+          68740500000000000000A003401453697A652E506C6174666F726D4465666175
+          6C74080B5374796C654C6F6F6B7570061C7472616E73706172656E7463697263
+          6C65627574746F6E7374796C65155465787453657474696E67732E5472696D6D
+          696E6707044E6F6E65000554506174680005416C69676E0706436C69656E7409
+          446174612E506174680A34000000040000000000000000000000000000000100
+          0000000000000000803F010000000000803F0000003F03000000000000000000
+          00000A46696C6C2E436F6C6F720708636C615768697465074869745465737408
+          0C4D617267696E732E4C6566740500000000000000C001400B4D617267696E73
+          2E546F700500000000000000C001400D4D617267696E732E5269676874050000
+          0000000000C001400E4D617267696E732E426F74746F6D0500000000000000C0
+          01400A53697A652E576964746805000000000000008002400B53697A652E4865
+          6967687405000000000000008002401453697A652E506C6174666F726D446566
+          61756C74080B5374726F6B652E4B696E6407044E6F6E650000000C5442727573
+          684F626A65637400095374796C654E616D65060A666F726567726F756E640B42
+          727573682E436F6C6F72070978464645414541454100000C5442727573684F62
+          6A65637400095374796C654E616D65060973656C656374696F6E0A4272757368
+          2E4B696E6407084772616469656E741542727573682E4772616469656E742E50
+          6F696E74730E0105436F6C6F720709783830324237393843064F666673657405
+          00000000000000000000000105436F6C6F720709783830324236453746064F66
+          6673657405000000000012A2F8FD3F000105436F6C6F72070978383032423634
+          3732064F6666736574050000000000000080FF3F000000000B54476C6F774566
+          666563740008536F66746E6573730500000000009A9999FD3F09476C6F77436F
+          6C6F720709784646363543384530074F706163697479050000000000000080FF
+          3F0754726967676572060E4973466F63757365643D7472756507456E61626C65
+          64080000005450463007544C61796F757400095374796C654E616D650611636C
+          656172696E67656469747374796C650A506F736974696F6E2E58050000000000
+          0000BC07400A506F736974696F6E2E590500000000000080F407400A53697A65
+          2E57696474680500000000000000B605400B53697A652E486569676874050000
+          0000000000C003401453697A652E506C6174666F726D44656661756C74080756
+          697369626C6508085461624F726465720221000A5452656374616E676C650009
+          5374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E
+          74656E74730A46696C6C2E436F6C6F720709784646313931393139064C6F636B
+          6564090748697454657374080A53697A652E57696474680500000000000000B6
+          05400B53697A652E4865696768740500000000000000C003401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          46333933393339000F54436F6C6F72416E696D6174696F6E0008447572617469
+          6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C
+          2E436F6C6F720A537461727456616C756507097846463530353035300953746F
+          7056616C7565070978464637303730373000000F54436F6C6F72416E696D6174
+          696F6E00084475726174696F6E050000000000CDCCCCFC3F07496E7665727365
+          090C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C756507097846463530353035300953746F7056616C7565070978464637
+          303730373000000A5452656374616E676C650005416C69676E0706436C69656E
+          740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61726769
+          6E732E4C656674050000000000000080FF3F0B4D617267696E732E546F700500
+          00000000000080FF3F0D4D617267696E732E5269676874050000000000000080
+          FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A
+          652E57696474680500000000000000B205400B53697A652E4865696768740500
+          000000000000B003401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F72070978464631383138313800000007544C61796F
+          757400095374796C654E616D650607636F6E74656E7405416C69676E0708436F
+          6E74656E7473064C6F636B6564090C4D617267696E732E4C6566740500000000
+          000000C000400B4D617267696E732E546F700500000000000000C000400D4D61
+          7267696E732E52696768740500000000000000B803400E4D617267696E732E42
+          6F74746F6D0500000000000000C000400A53697A652E57696474680500000000
+          0000008205400B53697A652E4865696768740500000000000000900340145369
+          7A652E506C6174666F726D44656661756C740800000754427574746F6E000953
+          74796C654E616D65060B636C656172627574746F6E05416C69676E0708466974
+          52696768740843616E466F637573080C4D617267696E732E4C65667405000000
+          000000008000400B4D617267696E732E546F7005000000000000008000400D4D
+          617267696E732E526967687405000000000000008000400E4D617267696E732E
+          426F74746F6D05000000000000008000400A506F736974696F6E2E5805000000
+          000000008A05400A506F736974696F6E2E5905000000000000008000400A5369
+          7A652E57696474680500000000000000A003400B53697A652E48656967687405
+          00000000000000A003401453697A652E506C6174666F726D44656661756C7408
+          0B5374796C654C6F6F6B7570061C7472616E73706172656E74636972636C6562
+          7574746F6E7374796C65155465787453657474696E67732E5472696D6D696E67
+          07044E6F6E65000554506174680005416C69676E070346697409446174612E50
+          6174680AC400000010000000000000000000A0C0000070410100000000007041
+          0000A0C001000000000048420000F041010000000000AA420000A0C001000000
+          0000D242000070410100000000008C4200004842010000000000D2420000B442
+          010000000000AA420000DC42020000003BDF34429E6F8C4202000000FE547D42
+          7FAAB04202000000000048420000964201000000000070410000DC4201000000
+          0000A0C00000B442010000000000F04100005C42010000000000A0C000007041
+          030000000000000000000000064C6F636B6564090748697454657374080C4D61
+          7267696E732E4C65667405000000000000008001400B4D617267696E732E546F
+          7005000000000000008001400D4D617267696E732E5269676874050000000000
+          00008001400E4D617267696E732E426F74746F6D05000000000000008001400A
+          53697A652E57696474680500000000000000C002400B53697A652E4865696768
+          740500000000000000C002401453697A652E506C6174666F726D44656661756C
+          74080B5374726F6B652E4B696E6407044E6F6E650000000C5442727573684F62
+          6A65637400095374796C654E616D65060A666F726567726F756E640B42727573
+          682E436F6C6F72070978464645414541454100000C5442727573684F626A6563
+          7400095374796C654E616D65060973656C656374696F6E0A42727573682E4B69
+          6E6407084772616469656E741542727573682E4772616469656E742E506F696E
+          74730E0105436F6C6F720709783830324237393843064F666673657405000000
+          00000000000000000105436F6C6F720709783830324236453746064F66667365
+          7405000000000012A2F8FD3F000105436F6C6F72070978383032423634373206
+          4F6666736574050000000000000080FF3F000000000B54476C6F774566666563
+          740008536F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F72
+          0709784646363543384530074F706163697479050000000000000080FF3F0754
+          726967676572060E4973466F63757365643D7472756507456E61626C65640800
+          00005450463007544C61796F757400095374796C654E616D6506096D656D6F73
+          74796C6505416C69676E070643656E7465720C436C69704368696C6472656E09
+          0A53697A652E5769647468050000000000FFFFE905400B53697A652E48656967
+          687405000000000000008306401453697A652E506C6174666F726D4465666175
+          6C74080756697369626C6508085461624F726465720222000A5452656374616E
+          676C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E
+          0708436F6E74656E74730A46696C6C2E436F6C6F720709784646313931393139
+          064C6F636B6564090748697454657374080C50616464696E672E4C6566740500
+          00000000000080FF3F0B50616464696E672E546F70050000000000000080FF3F
+          0D50616464696E672E5269676874050000000000000080FF3F0E50616464696E
+          672E426F74746F6D050000000000000080FF3F0A53697A652E57696474680500
+          00000000FFFFE905400B53697A652E4865696768740500000000000000830640
+          1453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B69
+          6E6407044E6F6E65000A5452656374616E676C650005416C69676E0706436C69
+          656E740946696C6C2E4B696E6407044E6F6E650748697454657374080A53697A
+          652E5769647468050000000000FFFFE505400B53697A652E4865696768740500
+          0000000000008106401453697A652E506C6174666F726D44656661756C74080B
+          5374726F6B652E4B696E6407044E6F6E65000007544C61796F75740005416C69
+          676E0706436C69656E740A53697A652E5769647468050000000000FFFFE50540
+          0B53697A652E48656967687405000000000000008106401453697A652E506C61
+          74666F726D44656661756C74080007544C61796F757400095374796C654E616D
+          650607636F6E74656E7405416C69676E0706436C69656E740C4D617267696E73
+          2E4C656674050000000000000080FF3F0B4D617267696E732E546F7005000000
+          00000000C000400D4D617267696E732E5269676874050000000000000080FF3F
+          0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E
+          5769647468050000000000FFFFC305400B53697A652E48656967687405000000
+          00000000DC05401453697A652E506C6174666F726D44656661756C740800000A
+          545363726F6C6C42617200095374796C654E616D65060A767363726F6C6C6261
+          7205416C69676E0705526967687406437572736F72070763724172726F770B53
+          6D616C6C4368616E676505000000000000000000000B4F7269656E746174696F
+          6E0708566572746963616C0A506F736974696F6E2E58050000000000FFFFC705
+          400A53697A652E57696474680500000000000000F002400B53697A652E486569
+          6768740500000000000000E405401453697A652E506C6174666F726D44656661
+          756C740800000A545363726F6C6C42617200095374796C654E616D65060A6873
+          63726F6C6C62617205416C69676E0706426F74746F6D06437572736F72070763
+          724172726F770B536D616C6C4368616E676505000000000000000000000B4F72
+          69656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E59
+          0500000000000000E405400A53697A652E5769647468050000000000FFFFE505
+          400B53697A652E4865696768740500000000000000F002401453697A652E506C
+          6174666F726D44656661756C740800000F54536D616C6C5363726F6C6C426172
+          00095374796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69
+          676E0705526967687406437572736F72070763724172726F770B536D616C6C43
+          68616E676505000000000000000000000B4F7269656E746174696F6E07085665
+          72746963616C0B4D617267696E732E546F70050000000000000080FF3F0D4D61
+          7267696E732E5269676874050000000000000080FF3F0E4D617267696E732E42
+          6F74746F6D050000000000000080FF3F0A506F736974696F6E2E580500000000
+          000000C605400A506F736974696F6E2E5905000000000000008000400A53697A
+          652E576964746805000000000000008002400B53697A652E4865696768740500
+          0000000000008002401453697A652E506C6174666F726D44656661756C740807
+          56697369626C650800000F54536D616C6C5363726F6C6C42617200095374796C
+          654E616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F
+          74746F6D06437572736F72070763724172726F770B536D616C6C4368616E6765
+          05000000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E
+          74616C0C4D617267696E732E4C656674050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000000000
+          008000400A506F736974696F6E2E590500000000000000E205400A53697A652E
+          576964746805000000000000009606400B53697A652E48656967687405000000
+          000000008002401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C6508000000000C5442727573684F626A65637400095374796C654E61
+          6D65060A666F726567726F756E640B42727573682E436F6C6F72070978464645
+          414541454100000C5442727573684F626A65637400095374796C654E616D6506
+          0973656C656374696F6E0A42727573682E4B696E6407084772616469656E7415
+          42727573682E4772616469656E742E506F696E74730E0105436F6C6F72070978
+          3830324237393843064F66667365740500000000000000000000000105436F6C
+          6F720709783830324236453746064F666673657405000000000012A2F8FD3F00
+          0105436F6C6F720709783830324236343732064F666673657405000000000000
+          0080FF3F00000000005450463007544C61796F757400095374796C654E616D65
+          060B627574746F6E7374796C650A506F736974696F6E2E580500000000000000
+          BC07400A506F736974696F6E2E590500000000000080F407400A53697A652E57
+          696474680500000000000000B605400B53697A652E4865696768740500000000
+          000000C003401453697A652E506C6174666F726D44656661756C740807566973
+          69626C6508085461624F726465720223000A5452656374616E676C6500095374
+          796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E7465
+          6E74730946696C6C2E4B696E6407084772616469656E741446696C6C2E477261
+          6469656E742E506F696E74730E0105436F6C6F72070978464635383538353806
+          4F66667365740500000000000000000000000105436F6C6F7207097846463531
+          35313531064F6666736574050000000000A01BF3FD3F000105436F6C6F720709
+          784646343934393439064F6666736574050000000000000080FF3F0000064C6F
+          636B6564090748697454657374080C4D617267696E732E4C6566740500000000
+          0000008000400B4D617267696E732E546F7005000000000000008000400D4D61
+          7267696E732E526967687405000000000000008000400E4D617267696E732E42
+          6F74746F6D05000000000000008000400A53697A652E57696474680500000000
+          000000AE05400B53697A652E4865696768740500000000000000A00340145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          0709784646364136413641000F54436F6C6F72416E696D6174696F6E00084475
+          726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A
+          46696C6C2E436F6C6F720A537461727456616C75650709784646353835383538
+          0953746F7056616C756507097846463438343834380754726967676572062049
+          734D6F7573654F7665723D747275653B4973507265737365643D66616C736500
+          000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000
+          00CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097846463438343834380953746F7056616C756507
+          097846463538353835380754726967676572062149734D6F7573654F7665723D
+          66616C73653B4973507265737365643D66616C736500000F54436F6C6F72416E
+          696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F
+          70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565
+          07097846463438343834380953746F7056616C75650709784646343234323432
+          0754726967676572062049734D6F7573654F7665723D66616C73653B49735072
+          65737365643D7472756500000F54436F6C6F72416E696D6174696F6E00084475
+          726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A
+          46696C6C2E436F6C6F720A537461727456616C75650709784646343234323432
+          0953746F7056616C756507097846463438343834380754726967676572061F49
+          734D6F7573654F7665723D747275653B4973507265737365643D747275650000
+          0A5452656374616E676C650005416C69676E0706436C69656E740946696C6C2E
+          4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C656674
+          05000000000000008000C00B4D617267696E732E546F70050000000000000080
+          00C00D4D617267696E732E526967687405000000000000008000C00E4D617267
+          696E732E426F74746F6D05000000000000008000C00A53697A652E5769647468
+          0500000000000000B605400B53697A652E4865696768740500000000000000C0
+          03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F720709784646353135313531000A5452656374616E676C650005416C
+          69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454
+          657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D6172
+          67696E732E546F70050000000000000080FF3F0D4D617267696E732E52696768
+          74050000000000000080FF3F0E4D617267696E732E426F74746F6D0500000000
+          00000080FF3F0A53697A652E57696474680500000000000000B205400B53697A
+          652E4865696768740500000000000000B003401453697A652E506C6174666F72
+          6D44656661756C74080C5374726F6B652E436F6C6F7207097846463143314331
+          43000000000654476C79706800095374796C654E616D65060A676C7970687374
+          796C650C4D617267696E732E4C6566740500000000000000A001400B4D617267
+          696E732E546F7005000000000000008000400D4D617267696E732E5269676874
+          050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000
+          000080004005416C69676E07044C6566740A53697A652E576964746805000000
+          000000008003400B53697A652E48656967687405000000000000008003401453
+          697A652E506C6174666F726D44656661756C7408000005545465787400095374
+          796C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B
+          6564090748697454657374080C4D617267696E732E4C65667405000000000000
+          00A001400B4D617267696E732E546F7005000000000000008000400D4D617267
+          696E732E52696768740500000000000000A001400E4D617267696E732E426F74
+          746F6D05000000000000008000400A53697A652E576964746805000000000000
+          00A205400B53697A652E4865696768740500000000000000A003401453697A65
+          2E506C6174666F726D44656661756C740804546578740606627574746F6E1654
+          65787453657474696E67732E466F6E74436F6C6F720708636C61576869746500
+          000B54476C6F774566666563740008536F66746E6573730500000000009A9999
+          FD3F09476C6F77436F6C6F720709784646363543384530074F70616369747905
+          0000000000000080FF3F0754726967676572060E4973466F63757365643D7472
+          756507456E61626C6564080000005450463007544C61796F757400095374796C
+          654E616D650610636F6C6F72627574746F6E7374796C650A506F736974696F6E
+          2E580500000000000000BC07400A506F736974696F6E2E590500000000000080
+          F407400A53697A652E57696474680500000000000000B605400B53697A652E48
+          65696768740500000000000000C003401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F726465720224000A54526563
+          74616E676C6500095374796C654E616D65060A6261636B67726F756E6405416C
+          69676E0708436F6E74656E74730946696C6C2E4B696E6407084772616469656E
+          741446696C6C2E4772616469656E742E506F696E74730E0105436F6C6F720709
+          784646353835383538064F66667365740500000000000000000000000105436F
+          6C6F720709784646353135313531064F6666736574050000000000A01BF3FD3F
+          000105436F6C6F720709784646343934393439064F6666736574050000000000
+          000080FF3F0000064C6F636B6564090748697454657374080C4D617267696E73
+          2E4C65667405000000000000008000400B4D617267696E732E546F7005000000
+          000000008000400D4D617267696E732E52696768740500000000000000800040
+          0E4D617267696E732E426F74746F6D05000000000000008000400A53697A652E
+          57696474680500000000000000AE05400B53697A652E48656967687405000000
+          00000000A003401453697A652E506C6174666F726D44656661756C74080C5374
+          726F6B652E436F6C6F720709784646364136413641000F54436F6C6F72416E69
+          6D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70
+          657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507
+          097846463538353835380953746F7056616C7565070978464634383438343807
+          54726967676572062049734D6F7573654F7665723D747275653B497350726573
+          7365643D66616C736500000F54436F6C6F72416E696D6174696F6E0008447572
+          6174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46
+          696C6C2E436F6C6F720A537461727456616C7565070978464634383438343809
+          53746F7056616C75650709784646353835383538075472696767657206214973
+          4D6F7573654F7665723D66616C73653B4973507265737365643D66616C736500
+          000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000
+          00CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097846463438343834380953746F7056616C756507
+          097846463432343234320754726967676572062049734D6F7573654F7665723D
+          66616C73653B4973507265737365643D7472756500000F54436F6C6F72416E69
+          6D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70
+          657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507
+          097846463432343234320953746F7056616C7565070978464634383438343807
+          54726967676572061F49734D6F7573654F7665723D747275653B497350726573
+          7365643D7472756500000A5452656374616E676C650005416C69676E0706436C
+          69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61
+          7267696E732E4C65667405000000000000008000C00B4D617267696E732E546F
+          7005000000000000008000C00D4D617267696E732E5269676874050000000000
+          00008000C00E4D617267696E732E426F74746F6D05000000000000008000C00A
+          53697A652E57696474680500000000000000B605400B53697A652E4865696768
+          740500000000000000C003401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F720709784646353135313531000A54526563
+          74616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407
+          044E6F6E650748697454657374080C4D617267696E732E4C6566740500000000
+          00000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61
+          7267696E732E5269676874050000000000000080FF3F0E4D617267696E732E42
+          6F74746F6D050000000000000080FF3F0A53697A652E57696474680500000000
+          000000B205400B53697A652E4865696768740500000000000000B00340145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          0709784646314331433143000000000A5452656374616E676C6500095374796C
+          654E616D65060466696C6C05416C69676E0706436C69656E740A46696C6C2E43
+          6F6C6F720708636C61426C61636B064C6F636B6564090748697454657374080C
+          4D617267696E732E4C6566740500000000000000C001400B4D617267696E732E
+          546F700500000000000000A001400D4D617267696E732E526967687405000000
+          00000000C001400E4D617267696E732E426F74746F6D0500000000000000A001
+          400A53697A652E576964746805000000000000009E05400B53697A652E486569
+          6768740500000000000000E002401453697A652E506C6174666F726D44656661
+          756C74080C5374726F6B652E436F6C6F72070978464636413641364100000B54
+          476C6F774566666563740008536F66746E6573730500000000009A9999FD3F09
+          476C6F77436F6C6F720709784646363543384530074F70616369747905000000
+          0000000080FF3F0754726967676572060E4973466F63757365643D7472756507
+          456E61626C6564080000005450463007544C61796F757400095374796C654E61
+          6D650611636F726E6572627574746F6E7374796C6505416C69676E070643656E
+          7465720A53697A652E57696474680500000000000000B605400B53697A652E48
+          65696768740500000000000000C003401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F726465720225000A54526563
+          74616E676C6500095374796C654E616D65060A6261636B67726F756E6405416C
+          69676E0708436F6E74656E74730946696C6C2E4B696E6407084772616469656E
+          741446696C6C2E4772616469656E742E506F696E74730E0105436F6C6F720709
+          784646353835383538064F66667365740500000000000000000000000105436F
+          6C6F720709784646353135313531064F6666736574050000000000A01BF3FD3F
+          000105436F6C6F720709784646343934393439064F6666736574050000000000
+          000080FF3F0000064C6F636B6564090748697454657374080A53697A652E5769
+          6474680500000000000000B605400B53697A652E486569676874050000000000
+          0000C003401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F720709784646314331433143000F54436F6C6F72416E696D61
+          74696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F706572
+          74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978
+          46463538353835380953746F7056616C75650709784646343834383438075472
+          6967676572062049734D6F7573654F7665723D747275653B4973507265737365
+          643D66616C736500000F54436F6C6F72416E696D6174696F6E00084475726174
+          696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C
+          6C2E436F6C6F720A537461727456616C75650709784646343834383438095374
+          6F7056616C756507097846463538353835380754726967676572062149734D6F
+          7573654F7665723D66616C73653B4973507265737365643D66616C736500000F
+          54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CD
+          CCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374
+          61727456616C756507097846463438343834380953746F7056616C7565070978
+          46463432343234320754726967676572062049734D6F7573654F7665723D6661
+          6C73653B4973507265737365643D7472756500000F54436F6C6F72416E696D61
+          74696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F706572
+          74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978
+          46463432343234320953746F7056616C75650709784646343834383438075472
+          6967676572061F49734D6F7573654F7665723D747275653B4973507265737365
+          643D747275650000000654476C79706800095374796C654E616D65060A676C79
+          70687374796C650C4D617267696E732E4C65667405000000000000008000400B
+          4D617267696E732E546F7005000000000000008001400D4D617267696E732E52
+          6967687405000000000000008000400E4D617267696E732E426F74746F6D0500
+          00000000000080004005416C69676E07044C6566740A53697A652E5769647468
+          05000000000000008003400B53697A652E486569676874050000000000000080
+          03401453697A652E506C6174666F726D44656661756C74080000055454657874
+          00095374796C654E616D6506047465787405416C69676E0706436C69656E7406
+          4C6F636B6564090748697454657374080C4D617267696E732E4C656674050000
+          0000000000A001400B4D617267696E732E546F7005000000000000008000400D
+          4D617267696E732E52696768740500000000000000A001400E4D617267696E73
+          2E426F74746F6D05000000000000008000400A53697A652E5769647468050000
+          0000000000A205400B53697A652E4865696768740500000000000000A0034014
+          53697A652E506C6174666F726D44656661756C7408165465787453657474696E
+          67732E466F6E74436F6C6F720708636C61576869746500000B54476C6F774566
+          666563740008536F66746E6573730500000000009A9999FD3F09476C6F77436F
+          6C6F720709784646363543384530074F706163697479050000000000000080FF
+          3F0754726967676572060E4973466F63757365643D7472756507456E61626C65
+          64080000005450463007544C61796F757400095374796C654E616D65060D706F
+          707570626F787374796C6505416C69676E070643656E7465720A53697A652E57
+          696474680500000000000000D605400B53697A652E4865696768740500000000
+          000000B003401453697A652E506C6174666F726D44656661756C740807566973
+          69626C6508085461624F726465720226000A5452656374616E676C6500095374
+          796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E7465
+          6E74730946696C6C2E4B696E6407084772616469656E741446696C6C2E477261
+          6469656E742E506F696E74730E0105436F6C6F72070978464635383538353806
+          4F66667365740500000000000000000000000105436F6C6F7207097846463531
+          35313531064F6666736574050000000000A01BF3FD3F000105436F6C6F720709
+          784646343934393439064F6666736574050000000000000080FF3F0000064C6F
+          636B6564090748697454657374080C4D617267696E732E4C6566740500000000
+          0000008000400B4D617267696E732E546F7005000000000000008000400D4D61
+          7267696E732E526967687405000000000000008000400E4D617267696E732E42
+          6F74746F6D05000000000000008000400A53697A652E57696474680500000000
+          000000CE05400B53697A652E4865696768740500000000000000900340145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          0709784646364136413641000F54436F6C6F72416E696D6174696F6E00084475
+          726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A
+          46696C6C2E436F6C6F720A537461727456616C75650709784646353835383538
+          0953746F7056616C756507097846463438343834380754726967676572061049
+          734D6F7573654F7665723D7472756500000F54436F6C6F72416E696D6174696F
+          6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E
+          616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978464634
+          38343834380953746F7056616C75650709784646353835383538075472696767
+          6572061149734D6F7573654F7665723D66616C736500000A5452656374616E67
+          6C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E
+          650748697454657374080C4D617267696E732E4C656674050000000000000080
+          00C00B4D617267696E732E546F7005000000000000008000C00D4D617267696E
+          732E526967687405000000000000008000C00E4D617267696E732E426F74746F
+          6D05000000000000008000C00A53697A652E57696474680500000000000000D6
+          05400B53697A652E4865696768740500000000000000B003401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          46353135313531000A5452656374616E676C650005416C69676E0706436C6965
+          6E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267
+          696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F7005
+          0000000000000080FF3F0D4D617267696E732E52696768740500000000000000
+          80FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A5369
+          7A652E57696474680500000000000000D205400B53697A652E48656967687405
+          00000000000000A003401453697A652E506C6174666F726D44656661756C7408
+          0C5374726F6B652E436F6C6F7207097846463143314331430000000007544C61
+          796F75740005416C69676E070552696768740A506F736974696F6E2E58050000
+          0000000000B805400A53697A652E57696474680500000000000000F002400B53
+          697A652E4865696768740500000000000000B003401453697A652E506C617466
+          6F726D44656661756C7408000554506174680005416C69676E070643656E7465
+          7209446174612E506174680A400000000500000000000000000000000000803F
+          010000000000803F0000803F010000000000003F000000000100000000000000
+          0000803F0300000000000000000000000A46696C6C2E436F6C6F72070C636C61
+          4C69676874677261790748697454657374080B4D617267696E732E546F700500
+          0000000000009002C00A53697A652E576964746805000000000000008002400B
+          53697A652E4865696768740500000000000000A001401453697A652E506C6174
+          666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650000
+          0554506174680005416C69676E070643656E74657209446174612E506174680A
+          3400000004000000000000000000000000000000010000000000803F00000000
+          010000000000003F0000803F0300000000000000000000000A46696C6C2E436F
+          6C6F7207097846464430443044300748697454657374080B4D617267696E732E
+          546F700500000000000000E001400A53697A652E576964746805000000000000
+          008002400B53697A652E4865696768740500000000000000A001401453697A65
+          2E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E
+          6F6E6500000005545465787400095374796C654E616D6506047465787405416C
+          69676E0706436C69656E74064C6F636B6564090748697454657374080C4D6172
+          67696E732E4C6566740500000000000000A001400B4D617267696E732E546F70
+          0500000000000000A001400D4D617267696E732E526967687405000000000000
+          00A001400E4D617267696E732E426F74746F6D0500000000000000A001400A53
+          697A652E57696474680500000000000000A405400B53697A652E486569676874
+          0500000000000000C002401453697A652E506C6174666F726D44656661756C74
+          08165465787453657474696E67732E466F6E74436F6C6F720708636C61576869
+          7465155465787453657474696E67732E576F7264577261700800000B54476C6F
+          774566666563740008536F66746E6573730500000000009A9999FD3F09476C6F
+          77436F6C6F720709784646363543384530074F70616369747905000000000000
+          0080FF3F0754726967676572060E4973466F63757365643D7472756507456E61
+          626C6564080000005450463007544C61796F757400095374796C654E616D6506
+          0C6172636469616C7374796C650A506F736974696F6E2E580500000000000080
+          C307400A506F736974696F6E2E590500000000000080EF07400A53697A652E57
+          69647468050000000000FFFFB304400B53697A652E4865696768740500000000
+          000000B004401453697A652E506C6174666F726D44656661756C740807566973
+          69626C6508085461624F726465720227000854456C6C6970736500095374796C
+          654E616D65060A6261636B67726F756E6405416C69676E07034669740946696C
+          6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E50
+          6F696E74730E0105436F6C6F720709784646353835383538064F666673657405
+          00000000000000000000000105436F6C6F720709784646353135313531064F66
+          66736574050000000000A01BF3FD3F000105436F6C6F72070978464634393439
+          3439064F6666736574050000000000000080FF3F0000064C6F636B6564090748
+          697454657374080C4D617267696E732E4C65667405000000000000008000400B
+          4D617267696E732E546F7005000000000000008000400D4D617267696E732E52
+          6967687405000000000000008000400E4D617267696E732E426F74746F6D0500
+          0000000000008000400A53697A652E57696474680500000000000000A004400B
+          53697A652E4865696768740500000000000000A004401453697A652E506C6174
+          666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463641
+          36413641000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
+          0000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F
+          6C6F720A537461727456616C756507097846463538353835380953746F705661
+          6C756507097846463438343834380754726967676572061049734D6F7573654F
+          7665723D7472756500000F54436F6C6F72416E696D6174696F6E000844757261
+          74696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A4669
+          6C6C2E436F6C6F720A537461727456616C756507097846463438343834380953
+          746F7056616C756507097846463538353835380754726967676572061149734D
+          6F7573654F7665723D66616C736500000854456C6C697073650005416C69676E
+          0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374
+          080C4D617267696E732E4C65667405000000000000008000C00B4D617267696E
+          732E546F7005000000000000008000C00D4D617267696E732E52696768740500
+          0000000000008000C00E4D617267696E732E426F74746F6D0500000000000000
+          8000C00A53697A652E57696474680500000000000000B004400B53697A652E48
+          65696768740500000000000000B004401453697A652E506C6174666F726D4465
+          6661756C74080C5374726F6B652E436F6C6F7207097846463531353135310008
+          54456C6C697073650005416C69676E0706436C69656E740946696C6C2E4B696E
+          6407044E6F6E650748697454657374080C4D617267696E732E4C656674050000
+          000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D
+          4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E73
+          2E426F74746F6D050000000000000080FF3F0A53697A652E5769647468050000
+          0000000000A804400B53697A652E4865696768740500000000000000A8044014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F72070978464631433143314300000007544C61796F757400095374796C654E
+          616D6506047469636B05416C69676E0706436C69656E74064C6F636B6564090C
+          4D617267696E732E4C65667405000000000000008000400B4D617267696E732E
+          546F7005000000000000008000400D4D617267696E732E526967687405000000
+          000000008000400E4D617267696E732E426F74746F6D05000000000000008000
+          400A53697A652E576964746805000000000000009004400B53697A652E486569
+          67687405000000000000009004401453697A652E506C6174666F726D44656661
+          756C74080007544C61796F75740005416C69676E070552696768740A506F7369
+          74696F6E2E580500000000000000F803400A53697A652E576964746805000000
+          00000000A001400B53697A652E48656967687405000000000000009004401453
+          697A652E506C6174666F726D44656661756C7408000854456C6C697073650005
+          416C69676E070643656E7465720A46696C6C2E436F6C6F720709784646443044
+          304430064C6F636B6564090748697454657374080A53697A652E576964746805
+          00000000000000A001400B53697A652E4865696768740500000000000000A001
+          401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B
+          696E6407044E6F6E65000000000005545465787400095374796C654E616D6506
+          047465787405416C69676E0706436C69656E74064C6F636B6564090748697454
+          657374080A53697A652E5769647468050000000000FFFFB304400B53697A652E
+          4865696768740500000000000000B004401453697A652E506C6174666F726D44
+          656661756C74080454657874060474657874165465787453657474696E67732E
+          466F6E742E53697A650500000000000000900240165465787453657474696E67
+          732E466F6E74436F6C6F72070978464645304530453015546578745365747469
+          6E67732E576F72645772617008000005545465787400095374796C654E616D65
+          0609747261636B7465787405416C69676E0706426F74746F6D064C6F636B6564
+          090748697454657374080E4D617267696E732E426F74746F6D05000000000000
+          00A002C00A506F736974696F6E2E590500000000000000B004400A53697A652E
+          5769647468050000000000FFFFB304400B53697A652E48656967687405000000
+          00000000A002401453697A652E506C6174666F726D44656661756C7408045465
+          7874060474657874165465787453657474696E67732E466F6E742E53697A6505
+          00000000000000900240165465787453657474696E67732E466F6E74436F6C6F
+          720709784646453045304530155465787453657474696E67732E576F72645772
+          6170080000005450463007544C61796F757400095374796C654E616D65060D74
+          68756D626261727374796C650A506F736974696F6E2E580500000000000080CE
+          07400A506F736974696F6E2E590500000000000080F607400A53697A652E5769
+          64746805000000000000008003400B53697A652E486569676874050000000000
+          00008003401453697A652E506C6174666F726D44656661756C74080756697369
+          626C6508085461624F726465720228000A5452656374616E676C650009537479
+          6C654E616D65060A6261636B67726F756E6405416C69676E070643656E746572
+          0A46696C6C2E436F6C6F720709784646343834383438064C6F636B6564090748
+          697454657374080A53697A652E5769647468050000000000FFFFBF02400B5369
+          7A652E486569676874050000000000FFFFBF02401453697A652E506C6174666F
+          726D44656661756C74080C5374726F6B652E436F6C6F72070978464631433143
+          3143000A5452656374616E676C650005416C69676E0706436C69656E74094669
+          6C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C
+          656674050000000000000080FF3F0B4D617267696E732E546F70050000000000
+          000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D
+          617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E5769
+          647468050000000000FFFF9F02400B53697A652E486569676874050000000000
+          FFFF9F02401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F72070978464635393539353900000F54436F6C6F72416E696D
+          6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F7065
+          7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709
+          7846463438343834380953746F7056616C756507097846463538353835380754
+          726967676572061049734D6F7573654F7665723D7472756500000F54436F6C6F
+          72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C
+          50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172745661
+          6C756507097846463538353835380953746F7056616C75650709784646343834
+          3834380754726967676572061149734D6F7573654F7665723D66616C73650000
+          0000545046300A5452656374616E676C6500095374796C654E616D6506147363
+          726F6C6C62617276747261636B7374796C650946696C6C2E4B696E6407044E6F
+          6E650748697454657374080C4D617267696E732E4C6566740500000000000000
+          80FF3F0D4D617267696E732E5269676874050000000000000080FF3F0A506F73
+          6974696F6E2E580500000000000000CC07400A506F736974696F6E2E59050000
+          0000000080EB07400A53697A652E57696474680500000000000000C803400B53
+          697A652E486569676874050000000000FFFFF304401453697A652E506C617466
+          6F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65075669
+          7369626C6508000A5452656374616E676C650005416C69676E0706436C69656E
+          740A46696C6C2E436F6C6F720709784646343834383438064C6F636B65640907
+          48697454657374080B4D617267696E732E546F7005000000000000008000C00E
+          4D617267696E732E426F74746F6D05000000000000008000C00A53697A652E57
+          696474680500000000000000C803400B53697A652E4865696768740500000000
+          0000008205401453697A652E506C6174666F726D44656661756C74080C537472
+          6F6B652E436F6C6F720709784646314331433143000006545468756D62000953
+          74796C654E616D6506057468756D62064C6F636B6564090D4D617267696E732E
+          526967687405000000000000008000400A506F736974696F6E2E580500000000
+          000000A001400A506F736974696F6E2E590500000000000000A001400A53697A
+          652E57696474680500000000000000A002400B53697A652E4865696768740500
+          000000000000B804401453697A652E506C6174666F726D44656661756C74080B
+          5374796C654C6F6F6B7570060B767468756D627374796C65000000545046300A
+          5452656374616E676C6500095374796C654E616D6506147363726F6C6C626172
+          68747261636B7374796C650946696C6C2E4B696E6407044E6F6E650748697454
+          657374080B4D617267696E732E546F70050000000000000080FF3F0E4D617267
+          696E732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E58
+          0500000000000080B407400A506F736974696F6E2E590500000000000080F507
+          400A53697A652E5769647468050000000000FFFFEF05400B53697A652E486569
+          67687405000000000000009803401453697A652E506C6174666F726D44656661
+          756C74080B5374726F6B652E4B696E6407044E6F6E650756697369626C650800
+          0A5452656374616E676C650005416C69676E0706436C69656E740A46696C6C2E
+          436F6C6F720709784646343834383438064C6F636B6564090748697454657374
+          080C4D617267696E732E4C65667405000000000000008000C00D4D617267696E
+          732E526967687405000000000000008000C00A53697A652E5769647468050000
+          000000FFFFF705400B53697A652E486569676874050000000000000098034014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F720709784646314331433143000006545468756D6200095374796C654E616D
+          6506057468756D62064C6F636B6564090E4D617267696E732E426F74746F6D05
+          000000000000008000400A506F736974696F6E2E580500000000000000800140
+          0A506F736974696F6E2E5905000000000000008001400A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          D002401453697A652E506C6174666F726D44656661756C74080B5374796C654C
+          6F6F6B7570060B687468756D627374796C65000000545046300A545265637461
+          6E676C6500095374796C654E616D6506137363726F6C6C6261726C6566746275
+          74746F6E0A46696C6C2E436F6C6F720709784646343834383438074869745465
+          7374080C4D617267696E732E4C65667405000000000000008000400B4D617267
+          696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874
+          050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000
+          000080FF3F0A506F736974696F6E2E580500000000000000CE07400A506F7369
+          74696F6E2E590500000000000000F607400A53697A652E576964746805000000
+          000000009803400B53697A652E48656967687405000000000000009003401453
+          697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F
+          7207097846463143314331430756697369626C6508000A5452656374616E676C
+          650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65
+          0748697454657374080C4D617267696E732E4C656674050000000000000080FF
+          3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E73
+          2E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F6D
+          050000000000000080FF3F0A53697A652E576964746805000000000000008803
+          400B53697A652E48656967687405000000000000008003401453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646
+          35393539353900000F54436F6C6F72416E696D6174696F6E0008447572617469
+          6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C
+          2E436F6C6F720A537461727456616C756507097846463438343834380953746F
+          7056616C756507097846463538353835380754726967676572061049734D6F75
+          73654F7665723D7472756500000F54436F6C6F72416E696D6174696F6E000844
+          75726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D6506
+          0A46696C6C2E436F6C6F720A537461727456616C756507097846463538353835
+          380953746F7056616C7565070978464634383438343807547269676765720611
+          49734D6F7573654F7665723D66616C736500000554506174680005416C69676E
+          070643656E74657209446174612E506174680A40000000050000000000000000
+          00803F00000000010000000000803F0000803F01000000000000000000003F01
+          0000000000803F000000000300000000000000000000000A46696C6C2E436F6C
+          6F720708636C61426C61636B064C6F636B6564090748697454657374080A5369
+          7A652E57696474680500000000000000E001400B53697A652E48656967687405
+          000000000000008002401453697A652E506C6174666F726D44656661756C7408
+          0B5374726F6B652E4B696E6407044E6F6E65000000545046300A545265637461
+          6E676C6500095374796C654E616D6506147363726F6C6C626172726967687462
+          7574746F6E0A46696C6C2E436F6C6F7207097846463438343834380748697454
+          657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D6172
+          67696E732E546F70050000000000000080FF3F0D4D617267696E732E52696768
+          7405000000000000008000400E4D617267696E732E426F74746F6D0500000000
+          00000080FF3F0A506F736974696F6E2E580500000000000000CE07400A506F73
+          6974696F6E2E590500000000000000F607400A53697A652E5769647468050000
+          00000000008803400B53697A652E486569676874050000000000000090034014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F7207097846463143314331430756697369626C6508000A5452656374616E67
+          6C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E
+          650748697454657374080C4D617267696E732E4C656674050000000000000080
+          FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E
+          732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F
+          6D050000000000000080FF3F0A53697A652E57696474680500000000000000F0
+          02400B53697A652E48656967687405000000000000008003401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          4635393539353900000F54436F6C6F72416E696D6174696F6E00084475726174
+          696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C
+          6C2E436F6C6F720A537461727456616C75650709784646343834383438095374
+          6F7056616C756507097846463538353835380754726967676572061049734D6F
+          7573654F7665723D7472756500000F54436F6C6F72416E696D6174696F6E0008
+          4475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65
+          060A46696C6C2E436F6C6F720A537461727456616C7565070978464635383538
+          35380953746F7056616C75650709784646343834383438075472696767657206
+          1149734D6F7573654F7665723D66616C736500000554506174680005416C6967
+          6E070643656E74657209446174612E506174680A340000000400000000000000
+          000000000000000001000000000000000000803F010000000000803F0000003F
+          0300000000000000000000000A46696C6C2E436F6C6F720708636C61426C6163
+          6B064C6F636B6564090748697454657374080A53697A652E5769647468050000
+          0000000000E001400B53697A652E486569676874050000000000000080024014
+          53697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E
+          6407044E6F6E65000000545046300A5452656374616E676C6500095374796C65
+          4E616D6506127363726F6C6C626172746F70627574746F6E0A46696C6C2E436F
+          6C6F7207097846463438343834380748697454657374080C4D617267696E732E
+          4C656674050000000000000080FF3F0B4D617267696E732E546F700500000000
+          0000008000400D4D617267696E732E5269676874050000000000000080FF3F0E
+          4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73697469
+          6F6E2E580500000000000080CE07400A506F736974696F6E2E59050000000000
+          0000F607400A53697A652E576964746805000000000000008003400B53697A65
+          2E48656967687405000000000000009803401453697A652E506C6174666F726D
+          44656661756C74080C5374726F6B652E436F6C6F720709784646314331433143
+          0756697369626C6508000A5452656374616E676C650005416C69676E0706436C
+          69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61
+          7267696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F
+          70050000000000000080FF3F0D4D617267696E732E5269676874050000000000
+          000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A
+          53697A652E57696474680500000000000000E002400B53697A652E4865696768
+          7405000000000000008803401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F72070978464635393539353900000F54436F
+          6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC
+          3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C756507097846463438343834380953746F7056616C7565070978464635
+          38353835380754726967676572061049734D6F7573654F7665723D7472756500
+          000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000
+          00CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097846463538353835380953746F7056616C756507
+          097846463438343834380754726967676572061149734D6F7573654F7665723D
+          66616C736500000554506174680005416C69676E070643656E74657209446174
+          612E506174680A400000000500000000000000000000000000803F0100000000
+          00803F0000803F010000000000003F0000000001000000000000000000803F03
+          00000000000000000000000A46696C6C2E436F6C6F720708636C61426C61636B
+          064C6F636B6564090748697454657374080A53697A652E576964746805000000
+          000000008002400B53697A652E4865696768740500000000000000E001401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E65000000545046300A5452656374616E676C6500095374796C654E
+          616D6506157363726F6C6C626172626F74746F6D627574746F6E0A46696C6C2E
+          436F6C6F7207097846463438343834380748697454657374080C4D617267696E
+          732E4C656674050000000000000080FF3F0B4D617267696E732E546F70050000
+          000000000080FF3F0D4D617267696E732E5269676874050000000000000080FF
+          3F0E4D617267696E732E426F74746F6D05000000000000008000400A506F7369
+          74696F6E2E580500000000000000CE07400A506F736974696F6E2E5905000000
+          00000000F607400A53697A652E576964746805000000000000008803400B5369
+          7A652E48656967687405000000000000008803401453697A652E506C6174666F
+          726D44656661756C74080C5374726F6B652E436F6C6F72070978464631433143
+          31430756697369626C6508000A5452656374616E676C650005416C69676E0706
+          436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C
+          4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E
+          546F70050000000000000080FF3F0D4D617267696E732E526967687405000000
+          0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF
+          3F0A53697A652E57696474680500000000000000F002400B53697A652E486569
+          6768740500000000000000F002401453697A652E506C6174666F726D44656661
+          756C74080C5374726F6B652E436F6C6F72070978464635393539353900000F54
+          436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCC
+          CCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461
+          727456616C756507097846463438343834380953746F7056616C756507097846
+          463538353835380754726967676572061049734D6F7573654F7665723D747275
+          6500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000
+          000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F
+          720A537461727456616C756507097846463538353835380953746F7056616C75
+          6507097846463438343834380754726967676572061149734D6F7573654F7665
+          723D66616C736500000554506174680005416C69676E070643656E7465720944
+          6174612E506174680A3400000004000000000000000000000000000000010000
+          000000803F00000000010000000000003F0000803F0300000000000000000000
+          000A46696C6C2E436F6C6F720708636C61426C61636B064C6F636B6564090748
+          697454657374080A53697A652E576964746805000000000000008002400B5369
+          7A652E4865696768740500000000000000E001401453697A652E506C6174666F
+          726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000054
+          50463007544C61796F757400095374796C654E616D65060B687468756D627374
+          796C6505416C69676E070643656E7465720A53697A652E576964746805000000
+          0000FFFFF304400B53697A652E4865696768740500000000000100E002401453
+          697A652E506C6174666F726D44656661756C74080756697369626C6508085461
+          624F72646572022F000A5452656374616E676C6500095374796C654E616D6506
+          0A6261636B67726F756E6405416C69676E0706436C69656E740A46696C6C2E43
+          6F6C6F720709784646343834383438064C6F636B656409074869745465737408
+          0C4D617267696E732E4C656674050000000000000080FFBF0D4D617267696E73
+          2E5269676874050000000000000080FFBF0A53697A652E576964746805000000
+          0000FFFFFB04400B53697A652E4865696768740500000000000100E002401453
+          697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F
+          720709784646314331433143000A5452656374616E676C650005416C69676E07
+          06436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465737408
+          0C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E73
+          2E546F70050000000000000080FF3F0D4D617267696E732E5269676874050000
+          000000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080
+          FF3F0A53697A652E5769647468050000000000FFFFF304400B53697A652E4865
+          696768740500000000000100C002401453697A652E506C6174666F726D446566
+          61756C74080C5374726F6B652E436F6C6F72070978464635393539353900000F
+          54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CD
+          CCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374
+          61727456616C756507097846463438343834380953746F7056616C7565070978
+          46463538353835380754726967676572061049734D6F7573654F7665723D7472
+          756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500
+          00000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C756507097846463538353835380953746F7056616C
+          756507097846463438343834380754726967676572061149734D6F7573654F76
+          65723D66616C7365000000005450463007544C61796F757400095374796C654E
+          616D65060B767468756D627374796C6505416C69676E070643656E7465720A53
+          697A652E5769647468050000000000FFFFBF02400B53697A652E486569676874
+          0500000000000000BC04401453697A652E506C6174666F726D44656661756C74
+          080756697369626C6508085461624F726465720230000A5452656374616E676C
+          6500095374796C654E616D65060A6261636B67726F756E6405416C69676E0706
+          436C69656E740A46696C6C2E436F6C6F720709784646343834383438064C6F63
+          6B6564090748697454657374080B4D617267696E732E546F7005000000000000
+          0080FFBF0E4D617267696E732E426F74746F6D050000000000000080FFBF0A53
+          697A652E5769647468050000000000FFFFBF02400B53697A652E486569676874
+          0500000000000000C404401453697A652E506C6174666F726D44656661756C74
+          080C5374726F6B652E436F6C6F720709784646314331433143000A5452656374
+          616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E640704
+          4E6F6E650748697454657374080C4D617267696E732E4C656674050000000000
+          000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D6172
+          67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F
+          74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000
+          FFFF9F02400B53697A652E4865696768740500000000000000BC04401453697A
+          652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207
+          0978464635393539353900000F54436F6C6F72416E696D6174696F6E00084475
+          726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A
+          46696C6C2E436F6C6F720A537461727456616C75650709784646343834383438
+          0953746F7056616C756507097846463538353835380754726967676572061049
+          734D6F7573654F7665723D7472756500000F54436F6C6F72416E696D6174696F
+          6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E
+          616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978464635
+          38353835380953746F7056616C75650709784646343834383438075472696767
+          6572061149734D6F7573654F7665723D66616C7365000000005450463007544C
+          61796F757400095374796C654E616D65060D636F6D626F626F787374796C6505
+          416C69676E070643656E7465720A53697A652E57696474680500000000000000
+          B205400B53697A652E4865696768740500000000000000D003401453697A652E
+          506C6174666F726D44656661756C74080756697369626C6508085461624F7264
+          65720231000A5452656374616E676C6500095374796C654E616D65060A626163
+          6B67726F756E6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C
+          6F720709784646313931393139064C6F636B6564090748697454657374080C4D
+          617267696E732E4C65667405000000000000008000400B4D617267696E732E54
+          6F7005000000000000008000400D4D617267696E732E52696768740500000000
+          0000008000400E4D617267696E732E426F74746F6D0500000000000000800040
+          0A53697A652E57696474680500000000000000AA05400B53697A652E48656967
+          68740500000000000000B003401453697A652E506C6174666F726D4465666175
+          6C74080B5374726F6B652E4B696E6407044E6F6E65000A5452656374616E676C
+          650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65
+          0748697454657374080C4D617267696E732E4C65667405000000000000008000
+          C00B4D617267696E732E546F7005000000000000008000C00D4D617267696E73
+          2E526967687405000000000000008000C00E4D617267696E732E426F74746F6D
+          05000000000000008000C00A53697A652E57696474680500000000000000B205
+          400B53697A652E4865696768740500000000000000D003401453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646
+          353135313531000A5452656374616E676C650005416C69676E0706436C69656E
+          740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61726769
+          6E732E4C656674050000000000000080FF3F0B4D617267696E732E546F700500
+          00000000000080FF3F0D4D617267696E732E5269676874050000000000000080
+          FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A
+          652E57696474680500000000000000AE05400B53697A652E4865696768740500
+          000000000000C003401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F7207097846463143314331430000000007544C6179
+          6F75740005416C69676E07055269676874064C6F636B6564090A506F73697469
+          6F6E2E5805000000000000008E05400A53697A652E5769647468050000000000
+          00009003400B53697A652E4865696768740500000000000000D003401453697A
+          652E506C6174666F726D44656661756C7408000554506174680005416C69676E
+          070643656E74657209446174612E506174680A640000000800000000000000E5
+          D01C414A0CF241010000005839EB41D7A36E410100000054E35B42AC1C344201
+          000000BE5F9F425EBA774101000000B448C842A8C6EF410100000054E35B424C
+          B7954201000000E5D01C414A0CF2410300000000000000000000000A46696C6C
+          2E436F6C6F720709784646434143414341064C6F636B65640907486974546573
+          74080A53697A652E57696474680500000000000000A002400B53697A652E4865
+          696768740500000000000000E001401453697A652E506C6174666F726D446566
+          61756C74080B5374726F6B652E4B696E6407044E6F6E650000000C5442727573
+          684F626A65637400095374796C654E616D65060A666F726567726F756E640B42
+          727573682E436F6C6F720709784646453645364536000007544C61796F757400
+          095374796C654E616D650607636F6E74656E7405416C69676E0708436F6E7465
+          6E7473064C6F636B6564090C4D617267696E732E4C6566740500000000000000
+          8000400B4D617267696E732E546F7005000000000000008000400D4D61726769
+          6E732E52696768740500000000000000B803400E4D617267696E732E426F7474
+          6F6D05000000000000008000400A53697A652E57696474680500000000000000
+          8005400B53697A652E4865696768740500000000000000B003401453697A652E
+          506C6174666F726D44656661756C74080000005450463007544C61796F757400
+          095374796C654E616D65060E636F6D626F656469747374796C6505416C69676E
+          070643656E7465720A53697A652E57696474680500000000000000B205400B53
+          697A652E4865696768740500000000000000D003401453697A652E506C617466
+          6F726D44656661756C74080756697369626C6508085461624F72646572023200
+          0A5452656374616E676C6500095374796C654E616D65060A6261636B67726F75
+          6E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407084772
+          616469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F
+          6C6F720709784646353835383538064F66667365740500000000000000000000
+          000105436F6C6F720709784646353135313531064F6666736574050000000000
+          A01BF3FD3F000105436F6C6F720709784646343934393439064F666673657405
+          0000000000000080FF3F0000064C6F636B6564090748697454657374080C4D61
+          7267696E732E4C65667405000000000000008000400B4D617267696E732E546F
+          7005000000000000008000400D4D617267696E732E5269676874050000000000
+          00008000400E4D617267696E732E426F74746F6D05000000000000008000400A
+          53697A652E57696474680500000000000000AA05400B53697A652E4865696768
+          740500000000000000B003401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F720709784646364136413641000A54526563
+          74616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407
+          044E6F6E650748697454657374080C4D617267696E732E4C6566740500000000
+          0000008000C00B4D617267696E732E546F7005000000000000008000C00D4D61
+          7267696E732E526967687405000000000000008000C00E4D617267696E732E42
+          6F74746F6D05000000000000008000C00A53697A652E57696474680500000000
+          000000B205400B53697A652E4865696768740500000000000000D00340145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          0709784646353135313531000A5452656374616E676C650005416C69676E0706
+          436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C
+          4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E
+          546F70050000000000000080FF3F0D4D617267696E732E526967687405000000
+          0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF
+          3F0A53697A652E57696474680500000000000000AE05400B53697A652E486569
+          6768740500000000000000C003401453697A652E506C6174666F726D44656661
+          756C74080C5374726F6B652E436F6C6F72070978464631433143314300000000
+          07544C61796F757400095374796C654E616D6506056172726F7705416C69676E
+          07055269676874064C6F636B6564090A506F736974696F6E2E58050000000000
+          00008E05400A53697A652E576964746805000000000000009003400B53697A65
+          2E4865696768740500000000000000D003401453697A652E506C6174666F726D
+          44656661756C7408000554506174680005416C69676E070643656E7465720944
+          6174612E506174680A640000000800000000000000E5D01C414A0CF241010000
+          005839EB41D7A36E410100000054E35B42AC1C344201000000BE5F9F425EBA77
+          4101000000B448C842A8C6EF410100000054E35B424CB7954201000000E5D01C
+          414A0CF2410300000000000000000000000A46696C6C2E436F6C6F7207097846
+          46434143414341064C6F636B6564090748697454657374080A53697A652E5769
+          6474680500000000000000A002400B53697A652E486569676874050000000000
+          0000E001401453697A652E506C6174666F726D44656661756C74080B5374726F
+          6B652E4B696E6407044E6F6E650000000C5442727573684F626A656374000953
+          74796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F72
+          070978464645414541454100000C5442727573684F626A65637400095374796C
+          654E616D65060973656C656374696F6E0A42727573682E4B696E640708477261
+          6469656E741542727573682E4772616469656E742E506F696E74730E0105436F
+          6C6F720709783830324237393843064F66667365740500000000000000000000
+          000105436F6C6F720709783830324236453746064F6666736574050000000000
+          12A2F8FD3F000105436F6C6F720709783830324236343732064F666673657405
+          0000000000000080FF3F0000000007544C61796F757400095374796C654E616D
+          650607636F6E74656E7405416C69676E0708436F6E74656E7473064C6F636B65
+          64090C4D617267696E732E4C65667405000000000000008001400B4D61726769
+          6E732E546F700500000000000000C000400D4D617267696E732E526967687405
+          00000000000000B803400E4D617267696E732E426F74746F6D05000000000000
+          00C000400A53697A652E57696474680500000000000000F804400B53697A652E
+          4865696768740500000000000000A003401453697A652E506C6174666F726D44
+          656661756C740800000B54476C6F774566666563740008536F66746E65737305
+          00000000009A9999FD3F09476C6F77436F6C6F72070978464636354338453007
+          4F706163697479050000000000000080FF3F0754726967676572060E4973466F
+          63757365643D7472756507456E61626C656408000000545046300A5452656374
+          616E676C6500095374796C654E616D65060A747261636B7374796C650A46696C
+          6C2E436F6C6F7207097846463438343834380748697454657374080A506F7369
+          74696F6E2E580500000000000080B407400A506F736974696F6E2E5905000000
+          00000000F607400A53697A652E5769647468050000000000FFFFEF05400B5369
+          7A652E48656967687405000000000000009803401453697A652E506C6174666F
+          726D44656661756C74080C5374726F6B652E436F6C6F72070978464631433143
+          31430756697369626C6508000A5452656374616E676C650005416C69676E0706
+          436C69656E740946696C6C2E4B696E6407044E6F6E65064C6F636B6564090748
+          697454657374080C4D617267696E732E4C65667405000000000000008000400B
+          4D617267696E732E546F7005000000000000008000400D4D617267696E732E52
+          6967687405000000000000008000400E4D617267696E732E426F74746F6D0500
+          0000000000008000400A53697A652E5769647468050000000000FFFFE705400B
+          53697A652E4865696768740500000000000000F002401453697A652E506C6174
+          666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650758
+          5261646975730500000000000000E00140075952616469757305000000000000
+          00E00140000006545468756D6200095374796C654E616D6506057468756D6206
+          4C6F636B6564090C4D617267696E732E4C6566740500000000000000C000400B
+          4D617267696E732E546F7005000000000000008000400D4D617267696E732E52
+          696768740500000000000000C000400E4D617267696E732E426F74746F6D0500
+          0000000000008000400A506F736974696F6E2E5805000000000000008001400A
+          506F736974696F6E2E5905000000000000008001400A53697A652E5769647468
+          0500000000000000CC04400B53697A652E486569676874050000000000000080
+          03401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F
+          6F6B7570060B687468756D627374796C650000005450463007544C61796F7574
+          00095374796C654E616D65060C6C697374626F787374796C6505416C69676E07
+          0643656E7465720A53697A652E5769647468050000000000FFFFE905400B5369
+          7A652E48656967687405000000000000008306401453697A652E506C6174666F
+          726D44656661756C74080756697369626C6508085461624F726465720234000A
+          5452656374616E676C6500095374796C654E616D65060A6261636B67726F756E
+          6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846
+          46313931393139064C6F636B6564090748697454657374080C50616464696E67
+          2E4C656674050000000000000080FF3F0B50616464696E672E546F7005000000
+          0000000080FF3F0D50616464696E672E5269676874050000000000000080FF3F
+          0E50616464696E672E426F74746F6D050000000000000080FF3F0A53697A652E
+          5769647468050000000000FFFFE905400B53697A652E48656967687405000000
+          000000008306401453697A652E506C6174666F726D44656661756C74080C5374
+          726F6B652E436F6C6F720709784646314331433143000A5452656374616E676C
+          650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65
+          0748697454657374080A53697A652E5769647468050000000000FFFFE505400B
+          53697A652E48656967687405000000000000008106401453697A652E506C6174
+          666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463539
+          35393539000007544C61796F75740005416C69676E0706436C69656E740A5369
+          7A652E5769647468050000000000FFFFE505400B53697A652E48656967687405
+          000000000000008106401453697A652E506C6174666F726D44656661756C7408
+          0007544C61796F757400095374796C654E616D650607636F6E74656E7405416C
+          69676E0706436C69656E740C436C69704368696C6472656E090C4D617267696E
+          732E4C656674050000000000000080FF3F0B4D617267696E732E546F70050000
+          000000000080FF3F0D4D617267696E732E5269676874050000000000000080FF
+          3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A65
+          2E5769647468050000000000FFFFC305400B53697A652E486569676874050000
+          0000000000E005401453697A652E506C6174666F726D44656661756C7408000A
+          5452656374616E676C6500095374796C654E616D65060973656C656374696F6E
+          0A46696C6C2E436F6C6F7207097846463443344334430748697454657374080A
+          53697A652E57696474680500000000000000C804400B53697A652E4865696768
+          740500000000000000C804401453697A652E506C6174666F726D44656661756C
+          74080B5374726F6B652E4B696E6407044E6F6E6500000A5452656374616E676C
+          6500095374796C654E616D650610666F637573656473656C656374696F6E0A46
+          696C6C2E436F6C6F7207097846463443344334430748697454657374080A5369
+          7A652E57696474680500000000000000C804400B53697A652E48656967687405
+          00000000000000C804401453697A652E506C6174666F726D44656661756C7408
+          0B5374726F6B652E446173680703446F740000000A545363726F6C6C42617200
+          095374796C654E616D65060A767363726F6C6C62617205416C69676E07055269
+          6768740B536D616C6C4368616E676505000000000000000000000B4F7269656E
+          746174696F6E0708566572746963616C0A506F736974696F6E2E580500000000
+          00FFFFC705400A53697A652E57696474680500000000000000F002400B53697A
+          652E4865696768740500000000000000E405401453697A652E506C6174666F72
+          6D44656661756C740800000A545363726F6C6C42617200095374796C654E616D
+          65060A687363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C
+          6C4368616E676505000000000000000000000B4F7269656E746174696F6E070A
+          486F72697A6F6E74616C0A506F736974696F6E2E590500000000000000E40540
+          0A53697A652E5769647468050000000000FFFFE505400B53697A652E48656967
+          68740500000000000000F002401453697A652E506C6174666F726D4465666175
+          6C740800000F54536D616C6C5363726F6C6C42617200095374796C654E616D65
+          060F76736D616C6C7363726F6C6C62617205416C69676E070552696768740B53
+          6D616C6C4368616E676505000000000000000000000B4F7269656E746174696F
+          6E0708566572746963616C0B4D617267696E732E546F70050000000000000080
+          FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267
+          696E732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E58
+          0500000000000000C605400A506F736974696F6E2E5905000000000000008000
+          400A53697A652E576964746805000000000000008002400B53697A652E486569
+          67687405000000000000008002401453697A652E506C6174666F726D44656661
+          756C74080756697369626C650800000F54536D616C6C5363726F6C6C42617200
+          095374796C654E616D65060F68736D616C6C7363726F6C6C62617205416C6967
+          6E0706426F74746F6D0B536D616C6C4368616E67650500000000000000000000
+          0B4F7269656E746174696F6E070A486F72697A6F6E74616C0C4D617267696E73
+          2E4C656674050000000000000080FF3F0D4D617267696E732E52696768740500
+          00000000000080FF3F0E4D617267696E732E426F74746F6D0500000000000000
+          80FF3F0A506F736974696F6E2E5805000000000000008000400A506F73697469
+          6F6E2E590500000000000000E205400A53697A652E5769647468050000000000
+          00009606400B53697A652E48656967687405000000000000008002401453697A
+          652E506C6174666F726D44656661756C74080756697369626C6508000000000B
+          54476C6F774566666563740008536F66746E6573730500000000009A9999FD3F
+          09476C6F77436F6C6F720709784646363543384530074F706163697479050000
+          000000000080FF3F0754726967676572060E4973466F63757365643D74727565
+          07456E61626C6564080000005450463007544C61796F757400095374796C654E
+          616D6506126C697374626F78706C61696E6865616465720A506F736974696F6E
+          2E580500000000000000BC07400A506F736974696F6E2E590500000000000080
+          F407400A53697A652E57696474680500000000000000B605400B53697A652E48
+          65696768740500000000000000C003401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F726465720235000A54526563
+          74616E676C6500095374796C654E616D65060A6261636B67726F756E6405416C
+          69676E0708436F6E74656E74730946696C6C2E4B696E6407084772616469656E
+          741446696C6C2E4772616469656E742E506F696E74730E0105436F6C6F720709
+          784646353835383538064F66667365740500000000000000000000000105436F
+          6C6F720709784646353135313531064F6666736574050000000000A01BF3FD3F
+          000105436F6C6F720709784646343934393439064F6666736574050000000000
+          000080FF3F0000064C6F636B6564090748697454657374080A53697A652E5769
+          6474680500000000000000B605400B53697A652E486569676874050000000000
+          0000C003401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F720709784646314331433143001054496E6E6572476C6F7745
+          66666563740008536F66746E657373050000000000CDCCCCFD3F09476C6F7743
+          6F6C6F720709784646344634383438074F7061636974790500000000006666E6
+          FE3F0754726967676572060E4973507265737365643D7472756507456E61626C
+          65640800000005545465787400095374796C654E616D6506047465787405416C
+          69676E0706436C69656E74064C6F636B6564090748697454657374080C4D6172
+          67696E732E4C6566740500000000000000A001400B4D617267696E732E546F70
+          05000000000000008000400D4D617267696E732E526967687405000000000000
+          00A001400E4D617267696E732E426F74746F6D05000000000000008000400A53
+          697A652E57696474680500000000000000A205400B53697A652E486569676874
+          0500000000000000A003401453697A652E506C6174666F726D44656661756C74
+          0804546578740606627574746F6E165465787453657474696E67732E466F6E74
+          436F6C6F720708636C6157686974650000005450463007544C61796F75740009
+          5374796C654E616D65060D6C697374626F78666F6F7465720A506F736974696F
+          6E2E580500000000000000BC07400A506F736974696F6E2E5905000000000000
+          80F407400A53697A652E57696474680500000000000000B605400B53697A652E
+          4865696768740500000000000000C003401453697A652E506C6174666F726D44
+          656661756C74080756697369626C6508085461624F7264657202360005545465
+          787400095374796C654E616D6506047465787405416C69676E0706436C69656E
+          74064C6F636B6564090748697454657374080C4D617267696E732E4C65667405
+          00000000000000A001400B4D617267696E732E546F7005000000000000008000
+          400D4D617267696E732E52696768740500000000000000A001400E4D61726769
+          6E732E426F74746F6D05000000000000008000400A53697A652E576964746805
+          00000000000000A205400B53697A652E4865696768740500000000000000A003
+          401453697A652E506C6174666F726D44656661756C7408045465787406066275
+          74746F6E165465787453657474696E67732E466F6E74436F6C6F720708636C61
+          57686974650000005450463007544C61796F757400095374796C654E616D6506
+          177472616E73706172656E746C697374626F787374796C650A506F736974696F
+          6E2E580500000000000080B507400A506F736974696F6E2E5905000000000000
+          00DA07400A53697A652E5769647468050000000000FFFFE905400B53697A652E
+          48656967687405000000000000008306401453697A652E506C6174666F726D44
+          656661756C74080756697369626C6508085461624F7264657202370007544C61
+          796F757400095374796C654E616D65060A6261636B67726F756E6405416C6967
+          6E0708436F6E74656E7473064C6F636B6564090A53697A652E57696474680500
+          00000000FFFFE905400B53697A652E4865696768740500000000000000830640
+          1453697A652E506C6174666F726D44656661756C74080007544C61796F757400
+          05416C69676E0706436C69656E740A53697A652E5769647468050000000000FF
+          FFE905400B53697A652E48656967687405000000000000008306401453697A65
+          2E506C6174666F726D44656661756C74080007544C61796F757400095374796C
+          654E616D650607636F6E74656E7405416C69676E0706436C69656E740C436C69
+          704368696C6472656E090C4D617267696E732E4C656674050000000000000080
+          FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E
+          732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F
+          6D050000000000000080FF3F0A53697A652E5769647468050000000000FFFFC7
+          05400B53697A652E4865696768740500000000000000E405401453697A652E50
+          6C6174666F726D44656661756C7408000A5452656374616E676C650009537479
+          6C654E616D65060973656C656374696F6E0946696C6C2E4B696E640708477261
+          6469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F6C
+          6F720709783830324237393843064F6666736574050000000000000000000000
+          0105436F6C6F720709783830324236453746064F666673657405000000000012
+          A2F8FD3F000105436F6C6F720709783830324236343732064F66667365740500
+          00000000000080FF3F00000748697454657374080A53697A652E576964746805
+          00000000000000C804400B53697A652E4865696768740500000000000000C804
+          401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B
+          696E6407044E6F6E6500000A5452656374616E676C6500095374796C654E616D
+          650610666F637573656473656C656374696F6E0946696C6C2E4B696E64070847
+          72616469656E741446696C6C2E4772616469656E742E506F696E74730E010543
+          6F6C6F720709783830324237393843064F666673657405000000000000000000
+          00000105436F6C6F720709783830324236453746064F66667365740500000000
+          0012A2F8FD3F000105436F6C6F720709783830324236343732064F6666736574
+          050000000000000080FF3F00000748697454657374080A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          C804401453697A652E506C6174666F726D44656661756C74080B5374726F6B65
+          2E446173680703446F740000000A545363726F6C6C42617200095374796C654E
+          616D65060A767363726F6C6C62617205416C69676E070552696768740B536D61
+          6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07
+          08566572746963616C0A506F736974696F6E2E58050000000000FFFFCB05400A
+          53697A652E57696474680500000000000000F002400B53697A652E4865696768
+          740500000000000000E805401453697A652E506C6174666F726D44656661756C
+          740800000A545363726F6C6C42617200095374796C654E616D65060A68736372
+          6F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C4368616E6765
+          05000000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E
+          74616C0A506F736974696F6E2E590500000000000000E805400A53697A652E57
+          69647468050000000000FFFFE905400B53697A652E4865696768740500000000
+          000000F002401453697A652E506C6174666F726D44656661756C740800000F54
+          536D616C6C5363726F6C6C42617200095374796C654E616D65060F76736D616C
+          6C7363726F6C6C62617205416C69676E070552696768740B536D616C6C436861
+          6E676505000000000000000000000B4F7269656E746174696F6E070856657274
+          6963616C0B4D617267696E732E546F70050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000000000
+          00C605400A506F736974696F6E2E5905000000000000008000400A53697A652E
+          576964746805000000000000008002400B53697A652E48656967687405000000
+          000000008002401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C650800000F54536D616C6C5363726F6C6C42617200095374796C654E
+          616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F7474
+          6F6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E74
+          6174696F6E070A486F72697A6F6E74616C0C4D617267696E732E4C6566740500
+          00000000000080FF3F0D4D617267696E732E5269676874050000000000000080
+          FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73
+          6974696F6E2E5805000000000000008000400A506F736974696F6E2E59050000
+          0000000000E205400A53697A652E576964746805000000000000009606400B53
+          697A652E48656967687405000000000000008002401453697A652E506C617466
+          6F726D44656661756C74080756697369626C65080000000000545046300A5452
+          656374616E676C6500095374796C654E616D6506167472616E73706172656E74
+          627574746F6E7374796C650A46696C6C2E436F6C6F7207097830303830383038
+          300748697454657374080A506F736974696F6E2E580500000000000080CE0740
+          0A506F736974696F6E2E590500000000000080F607400A53697A652E57696474
+          680500000000000000F002400B53697A652E4865696768740500000000000000
+          F002401453697A652E506C6174666F726D44656661756C74080B5374726F6B65
+          2E4B696E6407044E6F6E650756697369626C6508000F54436F6C6F72416E696D
+          6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F7065
+          7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709
+          7830303830383038300953746F7056616C756507097841463830383038300754
+          726967676572061049734D6F7573654F7665723D7472756500000F54436F6C6F
+          72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C
+          50726F70657274794E616D65060A46696C6C2E636F6C6F720A53746172745661
+          6C756507097841463830383038300953746F7056616C75650709783030383038
+          3038300754726967676572061149734D6F7573654F7665723D66616C73650000
+          0F54466C6F6174416E696D6174696F6E00084475726174696F6E050000000000
+          CDCCCCFB3F0C50726F70657274794E616D65060E506172656E742E4F70616369
+          74790A537461727456616C7565050000000000000080FF3F0953746F7056616C
+          7565050000000000000080FE3F0754726967676572061049734D6F7573654F76
+          65723D7472756500000F54466C6F6174416E696D6174696F6E00084475726174
+          696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060E506172
+          656E742E4F7061636974790A537461727456616C7565050000000000000080FE
+          3F0953746F7056616C7565050000000000000080FF3F07547269676765720611
+          49734D6F7573654F7665723D66616C7365000000545046300854456C6C697073
+          6500095374796C654E616D65061C7472616E73706172656E74636972636C6562
+          7574746F6E7374796C6505416C69676E070643656E7465720A46696C6C2E436F
+          6C6F7207097830303830383038300748697454657374080A53697A652E576964
+          74680500000000000000F002400B53697A652E48656967687405000000000000
+          00F002401453697A652E506C6174666F726D44656661756C74080B5374726F6B
+          652E4B696E6407044E6F6E650756697369626C6508000F54436F6C6F72416E69
+          6D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F70
+          657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507
+          097830303830383038300953746F7056616C7565070978414638303830383007
+          54726967676572061049734D6F7573654F7665723D7472756500000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F
+          0C50726F70657274794E616D65060A46696C6C2E636F6C6F720A537461727456
+          616C756507097841463830383038300953746F7056616C756507097830303830
+          383038300754726967676572061149734D6F7573654F7665723D66616C736500
+          000F54466C6F6174416E696D6174696F6E00084475726174696F6E0500000000
+          00CDCCCCFB3F0C50726F70657274794E616D65060E506172656E742E4F706163
+          6974790A537461727456616C7565050000000000000080FF3F0953746F705661
+          6C7565050000000000000080FE3F0754726967676572061049734D6F7573654F
+          7665723D7472756500000F54466C6F6174416E696D6174696F6E000844757261
+          74696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060E5061
+          72656E742E4F7061636974790A537461727456616C7565050000000000000080
+          FE3F0953746F7056616C7565050000000000000080FF3F075472696767657206
+          1149734D6F7573654F7665723D66616C73650000005450463007544C61796F75
+          7400095374796C654E616D6506106C697374626F786974656D7374796C650A50
+          6F736974696F6E2E580500000000000080BC07400A506F736974696F6E2E5905
+          00000000000080F407400A53697A652E57696474680500000000000000B00540
+          0B53697A652E4865696768740500000000000000C003401453697A652E506C61
+          74666F726D44656661756C74080756697369626C6508085461624F7264657202
+          3A000654476C79706800095374796C654E616D65060A676C7970687374796C65
+          0C4D617267696E732E4C65667405000000000000008000400B4D617267696E73
+          2E546F70050000000000000080FF3F0D4D617267696E732E5269676874050000
+          00000000008000400E4D617267696E732E426F74746F6D050000000000000080
+          FF3F05416C69676E07044C6566740A53697A652E576964746805000000000000
+          008003400B53697A652E48656967687405000000000000008003401453697A65
+          2E506C6174666F726D44656661756C7408000005545465787400095374796C65
+          4E616D6506047465787405416C69676E0706436C69656E740748697454657374
+          080C4D617267696E732E4C6566740500000000000000C000400B4D617267696E
+          732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500
+          000000000000C000400E4D617267696E732E426F74746F6D0500000000000000
+          80FF3F0A53697A652E57696474680500000000000000A405400B53697A652E48
+          65696768740500000000000000B003401453697A652E506C6174666F726D4465
+          6661756C7408165465787453657474696E67732E466F6E74436F6C6F72070978
+          4646453845384538155465787453657474696E67732E576F7264577261700816
+          5465787453657474696E67732E486F727A416C69676E07074C656164696E6700
+          000954436865636B426F7800095374796C654E616D650605636865636B05416C
+          69676E07084D6F73744C6566740843616E466F637573081244697361626C6546
+          6F637573456666656374090A53697A652E57696474680500000000000000A003
+          400B53697A652E4865696768740500000000000000C003401453697A652E506C
+          6174666F726D44656661756C74080756697369626C6508000000545046300754
+          4C61796F757400095374796C654E616D650615636F6C6F726C697374626F7869
+          74656D7374796C6505416C69676E070643656E7465720A53697A652E57696474
+          680500000000000000B005400B53697A652E4865696768740500000000000000
+          C003401453697A652E506C6174666F726D44656661756C74080756697369626C
+          6508085461624F72646572023B000954436865636B426F7800095374796C654E
+          616D650605636865636B05416C69676E07044C6566740843616E466F63757308
+          1244697361626C65466F637573456666656374090A53697A652E576964746805
+          00000000000000A003400B53697A652E4865696768740500000000000000C003
+          401453697A652E506C6174666F726D44656661756C74080756697369626C6508
+          00000A5452656374616E676C6500095374796C654E616D650605636F6C6F7205
+          416C69676E07044C656674064C6F636B6564090748697454657374080C4D6172
+          67696E732E4C65667405000000000000008000400B4D617267696E732E546F70
+          05000000000000008000400D4D617267696E732E526967687405000000000000
+          008000400E4D617267696E732E426F74746F6D05000000000000008000400A50
+          6F736974696F6E2E5805000000000000008000400A506F736974696F6E2E5905
+          000000000000008000400A53697A652E57696474680500000000000000800340
+          0B53697A652E4865696768740500000000000000A003401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464636
+          4136413641000005545465787400095374796C654E616D650604746578740541
+          6C69676E0706436C69656E740748697454657374080C4D617267696E732E4C65
+          66740500000000000000C000400B4D617267696E732E546F7005000000000000
+          0080FF3F0D4D617267696E732E52696768740500000000000000C000400E4D61
+          7267696E732E426F74746F6D050000000000000080FF3F0A53697A652E576964
+          74680500000000000000F804400B53697A652E48656967687405000000000000
+          00B003401453697A652E506C6174666F726D44656661756C7408165465787453
+          657474696E67732E466F6E74436F6C6F72070978464645384538453815546578
+          7453657474696E67732E576F72645772617008165465787453657474696E6773
+          2E486F727A416C69676E07074C656164696E670000005450463007544C61796F
+          757400095374796C654E616D65060E7363726F6C6C6261727374796C650A506F
+          736974696F6E2E580500000000000080A607400A506F736974696F6E2E590500
+          000000000000ED07400A53697A652E57696474680500000000000000B006400B
+          53697A652E4865696768740500000000000000D404401453697A652E506C6174
+          666F726D44656661756C74080756697369626C6508085461624F72646572023C
+          000A5452656374616E676C6500095374796C654E616D65060A6261636B67726F
+          756E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407044E
+          6F6E65064C6F636B6564090748697454657374080A53697A652E576964746805
+          00000000000000B006400B53697A652E4865696768740500000000000000D404
+          401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B
+          696E6407044E6F6E6500000C545370656564427574746F6E00095374796C654E
+          616D65060A6C656674627574746F6E05416C69676E07044C656674064C6F636B
+          6564090A506F736974696F6E2E5905000000000000009003400A53697A652E57
+          6964746805000000000000009003400B53697A652E4865696768740500000000
+          0000008803401453697A652E506C6174666F726D44656661756C74080B537479
+          6C654C6F6F6B757006137363726F6C6C6261726C656674627574746F6E155465
+          787453657474696E67732E5472696D6D696E6707044E6F6E6500000654547261
+          636B00095374796C654E616D65060668747261636B05416C69676E0706436C69
+          656E74064C6F636B656409034D6178050000000000000080FF3F0B4F7269656E
+          746174696F6E070A486F72697A6F6E74616C0A53697A652E5769647468050000
+          00000000008C06400B53697A652E486569676874050000000000000088034014
+          53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75
+          7006147363726F6C6C62617268747261636B7374796C650C56696577706F7274
+          53697A650500F8FFFFFFCCCCCCFB3F00000C545370656564427574746F6E0009
+          5374796C654E616D65060B7269676874627574746F6E05416C69676E07055269
+          676874064C6F636B6564090A506F736974696F6E2E5805000000000000009E06
+          400A506F736974696F6E2E5905000000000000009003400A53697A652E576964
+          746805000000000000009003400B53697A652E48656967687405000000000000
+          008803401453697A652E506C6174666F726D44656661756C74080B5374796C65
+          4C6F6F6B757006147363726F6C6C6261727269676874627574746F6E15546578
+          7453657474696E67732E5472696D6D696E6707044E6F6E650000065454726163
+          6B00095374796C654E616D65060676747261636B05416C69676E0706436C6965
+          6E74064C6F636B656409034D6178050000000000000080FF3F0B4F7269656E74
+          6174696F6E070A486F72697A6F6E74616C0A53697A652E576964746805000000
+          000000008C06400B53697A652E48656967687405000000000000008803401453
+          697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570
+          06147363726F6C6C62617276747261636B7374796C650C56696577706F727453
+          697A650500F8FFFFFFCCCCCCFB3F00000C545370656564427574746F6E000953
+          74796C654E616D650609746F70627574746F6E05416C69676E0703546F70064C
+          6F636B6564090A53697A652E57696474680500000000000000B006400B53697A
+          652E48656967687405000000000000009003401453697A652E506C6174666F72
+          6D44656661756C74080B5374796C654C6F6F6B757006127363726F6C6C626172
+          746F70627574746F6E155465787453657474696E67732E5472696D6D696E6707
+          044E6F6E6500000C545370656564427574746F6E00095374796C654E616D6506
+          0C626F74746F6D627574746F6E05416C69676E0706426F74746F6D064C6F636B
+          6564090A506F736974696F6E2E5905000000000000008C04400A53697A652E57
+          696474680500000000000000B006400B53697A652E4865696768740500000000
+          0000009003401453697A652E506C6174666F726D44656661756C74080B537479
+          6C654C6F6F6B757006157363726F6C6C626172626F74746F6D627574746F6E15
+          5465787453657474696E67732E5472696D6D696E6707044E6F6E650000005450
+          46300A5452656374616E676C6500095374796C654E616D650619736D616C6C73
+          63726F6C6C62617276747261636B7374796C650946696C6C2E4B696E6407044E
+          6F6E650748697454657374080A506F736974696F6E2E580500000000000000CC
+          07400A506F736974696F6E2E590500000000000080EB07400A53697A652E5769
+          6474680500000000000000C803400B53697A652E486569676874050000000000
+          FFFFF304401453697A652E506C6174666F726D44656661756C74080B5374726F
+          6B652E4B696E6407044E6F6E650756697369626C6508000A5452656374616E67
+          6C650005416C69676E0706436C69656E740A46696C6C2E436F6C6F7207097846
+          46343834383438064C6F636B6564090748697454657374080A53697A652E5769
+          6474680500000000000000C803400B53697A652E486569676874050000000000
+          FFFFF304401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F720709784646314331433143000006545468756D6200095374
+          796C654E616D6506057468756D62064C6F636B6564090B4D617267696E732E54
+          6F70050000000000000080FF3F0E4D617267696E732E426F74746F6D05000000
+          0000000080FF3F0A506F736974696F6E2E580500000000000000A001400A506F
+          736974696F6E2E590500000000000000A001400A53697A652E57696474680500
+          000000000000A002400B53697A652E4865696768740500000000000000B80440
+          1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B
+          7570060B767468756D627374796C65000000545046300A5452656374616E676C
+          6500095374796C654E616D650619736D616C6C7363726F6C6C62617268747261
+          636B7374796C650946696C6C2E4B696E6407044E6F6E65074869745465737408
+          0A506F736974696F6E2E580500000000000080B407400A506F736974696F6E2E
+          590500000000000000F607400A53697A652E5769647468050000000000FFFFEF
+          05400B53697A652E48656967687405000000000000009803401453697A652E50
+          6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
+          650756697369626C6508000A5452656374616E676C650005416C69676E070643
+          6C69656E740A46696C6C2E436F6C6F720709784646343834383438064C6F636B
+          6564090748697454657374080A53697A652E5769647468050000000000FFFFEF
+          05400B53697A652E48656967687405000000000000009803401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          46314331433143000006545468756D6200095374796C654E616D650605746875
+          6D62064C6F636B6564090C4D617267696E732E4C656674050000000000000080
+          FF3F0D4D617267696E732E5269676874050000000000000080FF3F0A506F7369
+          74696F6E2E5805000000000000008001400A506F736974696F6E2E5905000000
+          000000008001400A53697A652E57696474680500000000000000C804400B5369
+          7A652E4865696768740500000000000000D002401453697A652E506C6174666F
+          726D44656661756C74080B5374796C654C6F6F6B7570060B687468756D627374
+          796C650000005450463007544C61796F757400095374796C654E616D65061373
+          6D616C6C7363726F6C6C6261727374796C650A506F736974696F6E2E58050000
+          0000000080A607400A506F736974696F6E2E590500000000000000ED07400A53
+          697A652E57696474680500000000000000B006400B53697A652E486569676874
+          0500000000000000D404401453697A652E506C6174666F726D44656661756C74
+          080756697369626C6508085461624F72646572023F000654547261636B000953
+          74796C654E616D65060668747261636B05416C69676E0706436C69656E74064C
+          6F636B656409034D6178050000000000000080FF3F0B4F7269656E746174696F
+          6E070A486F72697A6F6E74616C0A53697A652E57696474680500000000000000
+          B006400B53697A652E4865696768740500000000000000D404401453697A652E
+          506C6174666F726D44656661756C74080B5374796C654C6F6F6B75700619736D
+          616C6C7363726F6C6C62617268747261636B7374796C650C56696577706F7274
+          53697A650500F8FFFFFFCCCCCCFB3F00000654547261636B00095374796C654E
+          616D65060676747261636B05416C69676E0706436C69656E74064C6F636B6564
+          09034D6178050000000000000080FF3F0B4F7269656E746174696F6E070A486F
+          72697A6F6E74616C0A53697A652E57696474680500000000000000B006400B53
+          697A652E4865696768740500000000000000D404401453697A652E506C617466
+          6F726D44656661756C74080B5374796C654C6F6F6B75700619736D616C6C7363
+          726F6C6C62617276747261636B7374796C650C56696577706F727453697A6505
+          00F8FFFFFFCCCCCCFB3F0000005450463007544C61796F757400095374796C65
+          4E616D65060F64726F707461726765747374796C6505416C69676E070643656E
+          7465720A53697A652E576964746805000000000000008906400B53697A652E48
+          656967687405000000000000008706401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F726465720240000A54526563
+          74616E676C650005416C69676E0708436F6E74656E74730946696C6C2E4B696E
+          6407044E6F6E650748697454657374080A53697A652E57696474680500000000
+          0000008906400B53697A652E4865696768740500000000000000870640145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          0709784646453645364536105374726F6B652E546869636B6E65737305000000
+          00000000C000400B5374726F6B652E4461736807044461736807585261646975
+          7305000000000000008000400759526164697573050000000000000080004000
+          05545465787400095374796C654E616D6506047465787405416C69676E070642
+          6F74746F6D0748697454657374080C4D617267696E732E4C6566740500000000
+          000000A002400D4D617267696E732E52696768740500000000000000A002400A
+          506F736974696F6E2E580500000000000000A002400A506F736974696F6E2E59
+          0500000000000000AA05400A53697A652E57696474680500000000000000EA05
+          400B53697A652E4865696768740500000000000000C804401453697A652E506C
+          6174666F726D44656661756C7408165465787453657474696E67732E466F6E74
+          436F6C6F7207097846464633463346330000001254466C6F61744B6579416E69
+          6D6174696F6E00084475726174696F6E050000000000999999FE3F044B657973
+          0E010001034B6579050000000000000080FE3F0556616C756505000000000000
+          00A003C00001034B6579050000000000000080FF3F0000044C6F6F70090C5072
+          6F70657274794E616D65060B50616464696E672E546F7010537461727446726F
+          6D43757272656E74080754726967676572060F4973447261674F7665723D7472
+          756500000554506174680005416C69676E070643656E74657209446174612E50
+          6174680AC4000000100000000000000008EC8343F087A4430100000008EC8343
+          083CFB430200000035BE7143504DF9430200000012835C43A8E6F54302000000
+          F0674943F803F1430100000008EC8343FC0116440100000008EC8343FC511644
+          0100000000408443FC5116440100000010689A43FC412B4401000000081CD043
+          F803F14302000000915DC64321E0F54302000000919DBB439643F94302000000
+          087CB043F833FB4301000000087CB043F087A4430100000008EC8343F087A443
+          0300000000000000000000000A46696C6C2E436F6C6F720708636C6157686974
+          650748697454657374080A53697A652E57696474680500000000000000C80440
+          0B53697A652E4865696768740500000000000100C804401453697A652E506C61
+          74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500
+          00005450463007544C61796F757400095374796C654E616D6506096772696473
+          74796C650C436C69704368696C6472656E090A506F736974696F6E2E58050000
+          0000000080B507400A506F736974696F6E2E590500000000000000DA07400A53
+          697A652E5769647468050000000000FFFFE905400B53697A652E486569676874
+          05000000000000008306401453697A652E506C6174666F726D44656661756C74
+          080756697369626C6508085461624F726465720241000C5442727573684F626A
+          65637400095374796C654E616D6506086C696E6566696C6C0B42727573682E43
+          6F6C6F72070978464632303230323000000A5452656374616E676C6500095374
+          796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E7465
+          6E74730A46696C6C2E436F6C6F720709784646343834383438064C6F636B6564
+          090748697454657374080C50616464696E672E4C656674050000000000000080
+          FF3F0B50616464696E672E546F70050000000000000080FF3F0D50616464696E
+          672E5269676874050000000000000080FF3F0E50616464696E672E426F74746F
+          6D050000000000000080FF3F0A53697A652E5769647468050000000000FFFFE9
+          05400B53697A652E48656967687405000000000000008306401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          463143314331430007544C61796F75740005416C69676E0706436C69656E740A
+          53697A652E5769647468050000000000FFFFE505400B53697A652E4865696768
+          7405000000000000008106401453697A652E506C6174666F726D44656661756C
+          740800075448656164657200095374796C654E616D6506066865616465720553
+          696465730B06426F74746F6D0005416C69676E0703546F700A53697A652E5769
+          647468050000000000FFFFE505400B53697A652E486569676874050000000000
+          0000A803401453697A652E506C6174666F726D44656661756C7408000007544C
+          61796F757400095374796C654E616D650607636F6E74656E7405416C69676E07
+          06436C69656E740C436C69704368696C6472656E090C4D617267696E732E4C65
+          6674050000000000000080FF3F0B4D617267696E732E546F7005000000000000
+          0080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61
+          7267696E732E426F74746F6D050000000000000080FF3F0A53697A652E576964
+          7468050000000000FFFFC305400B53697A652E48656967687405000000000000
+          00B605401453697A652E506C6174666F726D44656661756C7408000A54526563
+          74616E676C6500095374796C654E616D65060973656C656374696F6E0946696C
+          6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E50
+          6F696E74730E0105436F6C6F720709783830324237393843064F666673657405
+          00000000000000000000000105436F6C6F720709783830324236453746064F66
+          6673657405000000000012A2F8FD3F000105436F6C6F72070978383032423634
+          3732064F6666736574050000000000000080FF3F00000748697454657374080A
+          53697A652E57696474680500000000000000C804400B53697A652E4865696768
+          740500000000000000C804401453697A652E506C6174666F726D44656661756C
+          74080B5374726F6B652E4B696E6407044E6F6E6500000A5452656374616E676C
+          6500095374796C654E616D650605666F6375730A46696C6C2E436F6C6F720709
+          7846463139313931390748697454657374080C4D617267696E732E4C65667405
+          0000000000000080FF3F0B4D617267696E732E546F70050000000000000080FF
+          3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61726769
+          6E732E426F74746F6D050000000000000080FF3F0A53697A652E576964746805
+          00000000000000C804400B53697A652E4865696768740500000000000000C804
+          401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E43
+          6F6C6F7207097846463339333933390000000A545363726F6C6C426172000953
+          74796C654E616D65060A767363726F6C6C62617205416C69676E070552696768
+          740B536D616C6C4368616E676505000000000000000000000B4F7269656E7461
+          74696F6E0708566572746963616C0A506F736974696F6E2E58050000000000FF
+          FFC705400A506F736974696F6E2E590500000000000000A803400A53697A652E
+          57696474680500000000000000F002400B53697A652E48656967687405000000
+          00000000BA05401453697A652E506C6174666F726D44656661756C740800000A
+          545363726F6C6C42617200095374796C654E616D65060A687363726F6C6C6261
+          7205416C69676E0706426F74746F6D0B536D616C6C4368616E67650500000000
+          0000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A50
+          6F736974696F6E2E590500000000000000E405400A53697A652E576964746805
+          0000000000FFFFE505400B53697A652E4865696768740500000000000000F002
+          401453697A652E506C6174666F726D44656661756C740800000F54536D616C6C
+          5363726F6C6C42617200095374796C654E616D65060F76736D616C6C7363726F
+          6C6C62617205416C69676E070552696768740B536D616C6C4368616E67650500
+          0000000000000000000B4F7269656E746174696F6E0708566572746963616C0B
+          4D617267696E732E546F70050000000000000080FF3F0D4D617267696E732E52
+          69676874050000000000000080FF3F0E4D617267696E732E426F74746F6D0500
+          00000000000080FF3F0A506F736974696F6E2E580500000000000000C605400A
+          506F736974696F6E2E5905000000000000008000400A53697A652E5769647468
+          05000000000000008002400B53697A652E486569676874050000000000000080
+          02401453697A652E506C6174666F726D44656661756C74080756697369626C65
+          0800000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F
+          68736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B536D
+          616C6C4368616E676505000000000000000000000B4F7269656E746174696F6E
+          070A486F72697A6F6E74616C0C4D617267696E732E4C65667405000000000000
+          0080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61
+          7267696E732E426F74746F6D050000000000000080FF3F0A506F736974696F6E
+          2E5805000000000000008000400A506F736974696F6E2E590500000000000000
+          E205400A53697A652E576964746805000000000000009606400B53697A652E48
+          656967687405000000000000008002401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508000000000B54476C6F7745666665637400
+          08536F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F720709
+          784646363543384530074F706163697479050000000000000080FF3F07547269
+          67676572060E4973466F63757365643D7472756507456E61626C656408000000
+          5450463007544C61796F757400095374796C654E616D65060F68656164657269
+          74656D7374796C650A506F736974696F6E2E580500000000000000BC07400A50
+          6F736974696F6E2E590500000000000080F407400A53697A652E576964746805
+          00000000000000B605400B53697A652E4865696768740500000000000000C003
+          401453697A652E506C6174666F726D44656661756C74080756697369626C6508
+          085461624F726465720242000A5452656374616E676C6500095374796C654E61
+          6D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730946
+          696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E74
+          2E506F696E74730E0105436F6C6F720709784646353835383538064F66667365
+          740500000000000000000000000105436F6C6F72070978464635313531353106
+          4F6666736574050000000000A01BF3FD3F000105436F6C6F7207097846463439
+          34393439064F6666736574050000000000000080FF3F0000064C6F636B656409
+          0748697454657374080A53697A652E57696474680500000000000000B605400B
+          53697A652E4865696768740500000000000000C003401453697A652E506C6174
+          666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463143
+          31433143001054496E6E6572476C6F774566666563740008536F66746E657373
+          050000000000CDCCCCFD3F09476C6F77436F6C6F720709784646344634383438
+          074F7061636974790500000000006666E6FE3F0754726967676572060E497350
+          7265737365643D7472756507456E61626C656408000000055454657874000953
+          74796C654E616D6506047465787405416C69676E0706436C69656E74064C6F63
+          6B6564090748697454657374080C4D617267696E732E4C656674050000000000
+          0000A001400B4D617267696E732E546F7005000000000000008000400D4D6172
+          67696E732E52696768740500000000000000A001400E4D617267696E732E426F
+          74746F6D05000000000000008000400A53697A652E5769647468050000000000
+          0000A205400B53697A652E4865696768740500000000000000A003401453697A
+          652E506C6174666F726D44656661756C740804546578740606627574746F6E16
+          5465787453657474696E67732E466F6E74436F6C6F720708636C615768697465
+          0000005450463007544C61796F757400095374796C654E616D65060D74657874
+          63656C6C7374796C650A506F736974696F6E2E580500000000000000B807400A
+          506F736974696F6E2E590500000000000000F507400A53697A652E5769647468
+          0500000000000000D605400B53697A652E4865696768740500000000000000B0
+          03401453697A652E506C6174666F726D44656661756C74080756697369626C65
+          08085461624F726465720243000C5442727573684F626A65637400095374796C
+          654E616D65060A666F726567726F756E640B42727573682E436F6C6F72070978
+          464645414541454100000C5442727573684F626A65637400095374796C654E61
+          6D65060973656C656374696F6E0A42727573682E4B696E640708477261646965
+          6E741542727573682E4772616469656E742E506F696E74730E0105436F6C6F72
+          0709783830324237393843064F66667365740500000000000000000000000105
+          436F6C6F720709783830324236453746064F666673657405000000000012A2F8
+          FD3F000105436F6C6F720709783830324236343732064F666673657405000000
+          0000000080FF3F0000000007544C61796F757400095374796C654E616D650607
+          636F6E74656E7405416C69676E0708436F6E74656E7473064C6F636B6564090C
+          4D617267696E732E4C6566740500000000000000C000400B4D617267696E732E
+          546F700500000000000000C000400D4D617267696E732E526967687405000000
+          00000000C000400E4D617267696E732E426F74746F6D0500000000000000C000
+          400A53697A652E57696474680500000000000000CA05400B53697A652E486569
+          67687405000000000000008003401453697A652E506C6174666F726D44656661
+          756C74080000005450463007544C61796F757400095374796C654E616D65060E
+          636865636B63656C6C7374796C6505416C69676E070643656E7465720A53697A
+          652E576964746805000000000000009506400B53697A652E4865696768740500
+          000000000000F003401453697A652E506C6174666F726D44656661756C740807
+          56697369626C6508085461624F7264657202440007544C61796F75740005416C
+          69676E070643656E7465720A53697A652E57696474680500000000000000A003
+          400B53697A652E4865696768740500000000000000F003401453697A652E506C
+          6174666F726D44656661756C74080007544C61796F75740005416C69676E0706
+          43656E746572064C6F636B6564090A53697A652E576964746805000000000000
+          00F002400B53697A652E4865696768740500000000000000F002401453697A65
+          2E506C6174666F726D44656661756C74080005545061746800095374796C654E
+          616D650609636865636B6D61726B05416C69676E070643656E74657209446174
+          612E506174680ADC0000001200000000000000000000000000000001000000CD
+          CC4C3E00000000010000000000003F9A99993E01000000CDCC4C3F0000000001
+          0000000000803F00000000010000000000803FCDCC4C3E010000003333333F00
+          00003F010000000000803FCDCC4C3F010000000000803F0000803F01000000CD
+          CC4C3F0000803F010000000000003F3333333F01000000CDCC4C3E0000803F01
+          000000000000000000803F0100000000000000CDCC4C3F010000009A99993E00
+          00003F0100000000000000CDCC4C3E0100000000000000000000000300000000
+          000000000000000A46696C6C2E436F6C6F720707636C614E756C6C064C6F636B
+          6564090748697454657374080A53697A652E5769647468050000000000000090
+          02400B53697A652E48656967687405000000000000009002401453697A652E50
+          6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
+          65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000
+          00006F1283F53F0C50726F70657274794E616D65060A46696C6C2E436F6C6F72
+          0A537461727456616C75650707636C614E756C6C0953746F7056616C75650708
+          636C61426C61636B0754726967676572060E4973436865636B65643D74727565
+          00000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000
+          00006F1283F53F0C50726F70657274794E616D65060A46696C6C2E436F6C6F72
+          0A537461727456616C75650708636C61426C61636B0953746F7056616C756507
+          07636C614E756C6C0754726967676572060F4973436865636B65643D66616C73
+          650000000000005450463007544C61796F757400095374796C654E616D65060E
+          706F70757063656C6C7374796C650A506F736974696F6E2E5805000000000000
+          00B807400A506F736974696F6E2E590500000000000000F507400A53697A652E
+          57696474680500000000000000D605400B53697A652E48656967687405000000
+          00000000B003401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C6508085461624F7264657202450007544C61796F75740005416C6967
+          6E070552696768740A506F736974696F6E2E580500000000000000B805400A53
+          697A652E57696474680500000000000000F002400B53697A652E486569676874
+          0500000000000000B003401453697A652E506C6174666F726D44656661756C74
+          08000554506174680005416C69676E070643656E74657209446174612E506174
+          680A400000000500000000000000000000000000803F010000000000803F0000
+          803F010000000000003F0000000001000000000000000000803F030000000000
+          0000000000000A46696C6C2E436F6C6F72070978464645414541454107486974
+          54657374080B4D617267696E732E546F7005000000000000009002C00A53697A
+          652E576964746805000000000000008002400B53697A652E4865696768740500
+          000000000000A001401453697A652E506C6174666F726D44656661756C74080B
+          5374726F6B652E4B696E6407044E6F6E6500000554506174680005416C69676E
+          070643656E74657209446174612E506174680A34000000040000000000000000
+          00000000000000010000000000803F00000000010000000000003F0000803F03
+          00000000000000000000000A46696C6C2E436F6C6F7207097846464541454145
+          410748697454657374080B4D617267696E732E546F700500000000000000E001
+          400A53697A652E576964746805000000000000008002400B53697A652E486569
+          6768740500000000000000A001401453697A652E506C6174666F726D44656661
+          756C74080B5374726F6B652E4B696E6407044E6F6E6500000005545465787400
+          095374796C654E616D6506047465787405416C69676E0706436C69656E74064C
+          6F636B6564090748697454657374080C4D617267696E732E4C65667405000000
+          00000000A001400B4D617267696E732E546F700500000000000000A001400D4D
+          617267696E732E52696768740500000000000000A001400E4D617267696E732E
+          426F74746F6D0500000000000000A001400A53697A652E576964746805000000
+          00000000A405400B53697A652E4865696768740500000000000000C002401453
+          697A652E506C6174666F726D44656661756C740804546578740606627574746F
+          6E165465787453657474696E67732E466F6E74436F6C6F720708636C61576869
+          7465155465787453657474696E67732E576F7264577261700800000054504630
+          07544C61796F757400095374796C654E616D65061170726F677265737363656C
+          6C7374796C650A506F736974696F6E2E580500000000000080C007400A506F73
+          6974696F6E2E590500000000000080EB07400A53697A652E5769647468050000
+          00000000009005400B53697A652E486569676874050000000000FFFFF3044014
+          53697A652E506C6174666F726D44656661756C74080756697369626C65080854
+          61624F7264657202460007544C61796F757400095374796C654E616D65060668
+          747261636B05416C69676E0708436F6E74656E7473064C6F636B6564090C4D61
+          7267696E732E4C65667405000000000000008000400B4D617267696E732E546F
+          7005000000000000008000400D4D617267696E732E5269676874050000000000
+          00008000400E4D617267696E732E426F74746F6D05000000000000008000400A
+          53697A652E576964746805000000000000008805400B53697A652E4865696768
+          74050000000000FFFFE304401453697A652E506C6174666F726D44656661756C
+          7408000A5452656374616E676C6500095374796C654E616D65060A68696E6469
+          6361746F7205416C69676E07044C6566740946696C6C2E4B696E640708477261
+          6469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F6C
+          6F720709784646323637324238064F6666736574050000000000000000000000
+          0105436F6C6F720709784646303634353735064F666673657405000000000000
+          0080FF3F0000064C6F636B6564090748697454657374080C4D617267696E732E
+          4C656674050000000000000080FF3F0B4D617267696E732E546F700500000000
+          00000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E
+          4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73697469
+          6F6E2E58050000000000000080FF3F0A506F736974696F6E2E59050000000000
+          000080FF3F0A53697A652E57696474680500000000000000C804400B53697A65
+          2E486569676874050000000000FFFFDB04401453697A652E506C6174666F726D
+          44656661756C7408000000005450463007544C61796F757400095374796C654E
+          616D65060E696D61676563656C6C7374796C6505416C69676E070643656E7465
+          720A53697A652E576964746805000000000000009205400B53697A652E486569
+          6768740500000000000000D003401453697A652E506C6174666F726D44656661
+          756C74080756697369626C6508085461624F726465720247000654496D616765
+          00095374796C654E616D650605696D6167650E4D756C74695265734269746D61
+          700E01000005416C69676E0706436C69656E74064C6F636B6564090748697454
+          657374080C4D617267696E732E4C6566740500000000000000C000400B4D6172
+          67696E732E546F700500000000000000C000400D4D617267696E732E52696768
+          740500000000000000C000400E4D617267696E732E426F74746F6D0500000000
+          000000C000400A53697A652E576964746805000000000000008605400B53697A
+          652E4865696768740500000000000000A003401453697A652E506C6174666F72
+          6D44656661756C7408000000545046300A5452656374616E676C650009537479
+          6C654E616D65060C6D656E756261727374796C6505416C69676E070643656E74
+          65720C436C69704368696C6472656E090946696C6C2E4B696E6407044E6F6E65
+          0748697454657374080A53697A652E57696474680500000000000000C804400B
+          53697A652E4865696768740500000000000000C804401453697A652E506C6174
+          666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650756
+          697369626C6508000A5452656374616E676C650005416C69676E0706436C6965
+          6E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267
+          696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F7005
+          0000000000000080FF3F0D4D617267696E732E52696768740500000000000000
+          80FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A5369
+          7A652E57696474680500000000000000C004400B53697A652E48656967687405
+          00000000000000C004401453697A652E506C6174666F726D44656661756C7408
+          0B5374726F6B652E4B696E6407044E6F6E65000000545046300A545265637461
+          6E676C6500095374796C654E616D65060D6D656E75766965777374796C650541
+          6C69676E070643656E7465720D50616464696E672E5269676874050000000000
+          00008002400E50616464696E672E426F74746F6D05000000000000008002400A
+          53697A652E57696474680500000000000000C804400B53697A652E4865696768
+          740500000000000000C804401453697A652E506C6174666F726D44656661756C
+          74080756697369626C6508000A5452656374616E676C650005416C69676E0706
+          436C69656E740A46696C6C2E436F6C6F72070978464633333333333307486974
+          54657374080D4D617267696E732E526967687405000000000000008002C00E4D
+          617267696E732E426F74746F6D05000000000000008002C00A53697A652E5769
+          6474680500000000000000C804400B53697A652E486569676874050000000000
+          0000C804401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F720709784646323232323232000D54536861646F7745666665
+          6374000844697374616E6365050000000000000080014009446972656374696F
+          6E0500000000000000B4044008536F66746E657373050000000000CECCCCFC3F
+          074F706163697479050000000000000080FE3F0B536861646F77436F6C6F7207
+          08636C61426C61636B00000007544C61796F757400095374796C654E616D6506
+          07636F6E74656E7405416C69676E0706436C69656E740C4D617267696E732E4C
+          6566740500000000000000C000400B4D617267696E732E546F70050000000000
+          0000C000400D4D617267696E732E52696768740500000000000000C000400E4D
+          617267696E732E426F74746F6D0500000000000000C000400A53697A652E5769
+          64746805000000000000009004400B53697A652E486569676874050000000000
+          00009004401453697A652E506C6174666F726D44656661756C74080000005450
+          463007544C61796F757400095374796C654E616D65060D6D656E756974656D73
+          74796C6505416C69676E070643656E7465720C4D617267696E732E4C65667405
+          0000000000000080FF3F0B4D617267696E732E546F70050000000000000080FF
+          3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61726769
+          6E732E426F74746F6D050000000000000080FF3F0A53697A652E576964746805
+          000000000000009205400B53697A652E4865696768740500000000000000D003
+          401453697A652E506C6174666F726D44656661756C7408085461624F72646572
+          024B000A5452656374616E676C650005416C69676E0708436F6E74656E747309
+          46696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E
+          742E506F696E74730E0105436F6C6F720709784646353835383538064F666673
+          65740500000000000000000000000105436F6C6F720709784646353135313531
+          064F6666736574050000000000A01BF3FD3F000105436F6C6F72070978464634
+          3934393439064F6666736574050000000000000080FF3F000007486974546573
+          7408074F70616369747905000000000017B7D1F13F0A53697A652E5769647468
+          05000000000000009205400B53697A652E4865696768740500000000000000D0
+          03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F720709784646364136413641000F54466C6F6174416E696D6174696F
+          6E00084475726174696F6E05000000000018B7D1F23F0C50726F70657274794E
+          616D6506074F7061636974790A537461727456616C7565050000000000000000
+          00000953746F7056616C7565050000000000000080FF3F075472696767657206
+          0F497353656C65637465643D747275650E54726967676572496E766572736506
+          10497353656C65637465643D66616C73650000000A5452656374616E676C6500
+          095374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F
+          6E74656E74730946696C6C2E4B696E6407084772616469656E741446696C6C2E
+          4772616469656E742E506F696E74730E0105436F6C6F72070978464635383538
+          3538064F66667365740500000000000000000000000105436F6C6F7207097846
+          46353135313531064F6666736574050000000000A01BF3FD3F000105436F6C6F
+          720709784646343934393439064F6666736574050000000000000080FF3F0000
+          074869745465737408074F70616369747905000000000017B7D1F13F0A53697A
+          652E576964746805000000000000009205400B53697A652E4865696768740500
+          000000000000D003401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F720709784646364136413641000F54466C6F617441
+          6E696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C5072
+          6F70657274794E616D6506074F7061636974790A537461727456616C75650500
+          0000000000000000000953746F7056616C7565050000000000000080FF3F0754
+          726967676572061049734D6F7573654F7665723D747275650E54726967676572
+          496E7665727365061149734D6F7573654F7665723D66616C736500000007544C
+          61796F757400095374796C654E616D650605676C79706805416C69676E07084D
+          6F73744C6566740A53697A652E57696474680500000000000000C803400B5369
+          7A652E4865696768740500000000000000D003401453697A652E506C6174666F
+          726D44656661756C74080007544C61796F757400095374796C654E616D650609
+          636865636B6D61726B05416C69676E0708436F6E74656E7473074F7061636974
+          790500000000006F1283F53F0A53697A652E57696474680500000000000000C8
+          03400B53697A652E4865696768740500000000000000D003401453697A652E50
+          6C6174666F726D44656661756C74080005545061746800095374796C654E616D
+          65060E636865636B6D61726B7374796C6505416C69676E070643656E74657209
+          446174612E506174680A58000000070000000000000056D9524391AE2C430100
+          00009276664365021643010000009F3983432B7C3C43010000009E9AA64382D2
+          B442010000006F1CB04375A4D1420100000026DF8243263F67430300000056D9
+          524391AE2C430A46696C6C2E436F6C6F720708636C6157686974650748697454
+          657374080A53697A652E57696474680500000000000000B002400B53697A652E
+          4865696768740500000000000000B002401453697A652E506C6174666F726D44
+          656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000F54466C6F
+          6174416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F
+          0C50726F70657274794E616D6506074F7061636974790A537461727456616C75
+          6505000000000000000000000953746F7056616C7565050000000000000080FF
+          3F0754726967676572060E4973436865636B65643D747275650E547269676765
+          72496E7665727365060F4973436865636B65643D66616C73650000000654476C
+          79706800095374796C654E616D65060A676C7970687374796C650C4D61726769
+          6E732E4C656674050000000000000080FF3F0B4D617267696E732E546F700500
+          0000000000008000400D4D617267696E732E52696768740500000000000000C0
+          00400E4D617267696E732E426F74746F6D050000000000000080FF3F05416C69
+          676E07044C6566740A53697A652E576964746805000000000000008003400B53
+          697A652E48656967687405000000000000008003401453697A652E506C617466
+          6F726D44656661756C740800000654496D61676500095374796C654E616D6506
+          066269746D61700E4D756C74695265734269746D61700E01000005416C69676E
+          07044C6566740C4D617267696E732E4C65667405000000000000008000400B4D
+          617267696E732E546F7005000000000000008000400D4D617267696E732E5269
+          67687405000000000000008000400E4D617267696E732E426F74746F6D050000
+          00000000008000400A506F736974696F6E2E5805000000000000008000400A50
+          6F736974696F6E2E5905000000000000008000400A53697A652E576964746805
+          00000000000000A803400B53697A652E4865696768740500000000000000B003
+          401453697A652E506C6174666F726D44656661756C7408000000055454657874
+          00095374796C654E616D6506047465787405416C69676E07044C656674064C6F
+          636B6564090748697454657374080C4D617267696E732E4C6566740500000000
+          0000008002400D4D617267696E732E526967687405000000000000008002400A
+          506F736974696F6E2E5805000000000000008404400A53697A652E5769647468
+          0500000000000000C804400B53697A652E4865696768740500000000000000D0
+          03401453697A652E506C6174666F726D44656661756C74080454657874060454
+          657874165465787453657474696E67732E466F6E74436F6C6F720708636C6157
+          68697465165465787453657474696E67732E486F727A416C69676E07074C6561
+          64696E67000005545465787400095374796C654E616D65060873686F72746375
+          7405416C69676E07055269676874064C6F636B6564090748697454657374080C
+          4D617267696E732E4C6566740500000000000000C002400D4D617267696E732E
+          52696768740500000000000000C001400A506F736974696F6E2E580500000000
+          000000C000C00A53697A652E57696474680500000000000000C804400B53697A
+          652E4865696768740500000000000000D003401453697A652E506C6174666F72
+          6D44656661756C7408165465787453657474696E67732E466F6E74436F6C6F72
+          0708636C615768697465165465787453657474696E67732E486F727A416C6967
+          6E07074C656164696E67000007544C61796F757400095374796C654E616D6506
+          077375626D61726B05416C69676E070552696768740A506F736974696F6E2E58
+          0500000000000000D404400A53697A652E57696474680500000000000000A003
+          400B53697A652E4865696768740500000000000000D003401453697A652E506C
+          6174666F726D44656661756C7408000554506174680005416C69676E07064365
+          6E74657209446174612E506174680A3400000004000000000000000000000000
+          00000001000000000000000000803F010000000000803F0000003F0300000000
+          000000000000000A46696C6C2E436F6C6F720707636C6147726179064C6F636B
+          6564090748697454657374080A53697A652E57696474680500000000000000E0
+          01400B53697A652E48656967687405000000000000008002401453697A652E50
+          6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
+          65000000005450463007544C61796F757400095374796C654E616D6506106D65
+          6E756261726974656D7374796C6505416C69676E070643656E7465720C4D6172
+          67696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F70
+          050000000000000080FF3F0D4D617267696E732E526967687405000000000000
+          0080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53
+          697A652E576964746805000000000000009205400B53697A652E486569676874
+          0500000000000000D003401453697A652E506C6174666F726D44656661756C74
+          080756697369626C6508085461624F72646572024C000A5452656374616E676C
+          650005416C69676E0708436F6E74656E74730946696C6C2E4B696E6407084772
+          616469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F
+          6C6F720709784646353835383538064F66667365740500000000000000000000
+          000105436F6C6F720709784646353135313531064F6666736574050000000000
+          A01BF3FD3F000105436F6C6F720709784646343934393439064F666673657405
+          0000000000000080FF3F0000074869745465737408074F706163697479050000
+          00000017B7D1F13F0A53697A652E576964746805000000000000009205400B53
+          697A652E4865696768740500000000000000D003401453697A652E506C617466
+          6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646364136
+          413641000F54466C6F6174416E696D6174696F6E00084475726174696F6E0500
+          0000000018B7D1F23F0C50726F70657274794E616D6506074F7061636974790A
+          537461727456616C756505000000000000000000000953746F7056616C756505
+          0000000000000080FF3F0754726967676572060F497353656C65637465643D74
+          7275650E54726967676572496E76657273650610497353656C65637465643D66
+          616C73650000000A5452656374616E676C6500095374796C654E616D65060A62
+          61636B67726F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B
+          696E6407084772616469656E741446696C6C2E4772616469656E742E506F696E
+          74730E0105436F6C6F720709784646353835383538064F666673657405000000
+          00000000000000000105436F6C6F720709784646353135313531064F66667365
+          74050000000000A01BF3FD3F000105436F6C6F72070978464634393439343906
+          4F6666736574050000000000000080FF3F0000074869745465737408074F7061
+          6369747905000000000017B7D1F13F0A53697A652E5769647468050000000000
+          00009205400B53697A652E4865696768740500000000000000D003401453697A
+          652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207
+          09784646364136413641000F54466C6F6174416E696D6174696F6E0008447572
+          6174696F6E05000000000018B7D1F23F0C50726F70657274794E616D6506074F
+          7061636974790A537461727456616C756505000000000000000000000953746F
+          7056616C7565050000000000000080FF3F0754726967676572061049734D6F75
+          73654F7665723D747275650E54726967676572496E7665727365061149734D6F
+          7573654F7665723D66616C736500000007544C61796F757400095374796C654E
+          616D650605676C79706805416C69676E07084D6F73744C6566740A53697A652E
+          57696474680500000000000000C803400B53697A652E48656967687405000000
+          00000000D003401453697A652E506C6174666F726D44656661756C7408000754
+          4C61796F757400095374796C654E616D650609636865636B6D61726B05416C69
+          676E0708436F6E74656E7473074F7061636974790500000000006F1283F53F0A
+          53697A652E57696474680500000000000000C803400B53697A652E4865696768
+          740500000000000000D003401453697A652E506C6174666F726D44656661756C
+          74080005545061746800095374796C654E616D65060E636865636B6D61726B73
+          74796C6505416C69676E070643656E74657209446174612E506174680A580000
+          00070000000000000056D9524391AE2C43010000009276664365021643010000
+          009F3983432B7C3C43010000009E9AA64382D2B442010000006F1CB04375A4D1
+          420100000026DF8243263F67430300000056D9524391AE2C430A46696C6C2E43
+          6F6C6F720708636C6157686974650748697454657374080A53697A652E576964
+          74680500000000000000B002400B53697A652E48656967687405000000000000
+          00B002401453697A652E506C6174666F726D44656661756C74080B5374726F6B
+          652E4B696E6407044E6F6E6500000F54466C6F6174416E696D6174696F6E0008
+          4475726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65
+          06074F7061636974790A537461727456616C7565050000000000000000000009
+          53746F7056616C7565050000000000000080FF3F0754726967676572060E4973
+          436865636B65643D747275650E54726967676572496E7665727365060F497343
+          6865636B65643D66616C73650000000654476C79706800095374796C654E616D
+          65060A676C7970687374796C650C4D617267696E732E4C656674050000000000
+          000080FF3F0B4D617267696E732E546F7005000000000000008000400D4D6172
+          67696E732E52696768740500000000000000C000400E4D617267696E732E426F
+          74746F6D050000000000000080FF3F05416C69676E070552696768740A53697A
+          652E576964746805000000000000008003400B53697A652E4865696768740500
+          0000000000008003401453697A652E506C6174666F726D44656661756C740800
+          000654496D61676500095374796C654E616D6506066269746D61700E4D756C74
+          695265734269746D61700E01000005416C69676E070552696768740C4D617267
+          696E732E4C65667405000000000000008000400B4D617267696E732E546F7005
+          000000000000008000400D4D617267696E732E52696768740500000000000000
+          8000400E4D617267696E732E426F74746F6D05000000000000008000400A506F
+          736974696F6E2E5805000000000000008000400A506F736974696F6E2E590500
+          0000000000008000400A53697A652E57696474680500000000000000A803400B
+          53697A652E4865696768740500000000000000B003401453697A652E506C6174
+          666F726D44656661756C740800000005545465787400095374796C654E616D65
+          06047465787405416C69676E07044C656674064C6F636B656409074869745465
+          7374080C4D617267696E732E4C65667405000000000000008002400D4D617267
+          696E732E526967687405000000000000008002400A506F736974696F6E2E5805
+          000000000000008404400A53697A652E57696474680500000000000000C80440
+          0B53697A652E4865696768740500000000000000D003401453697A652E506C61
+          74666F726D44656661756C7408165465787453657474696E67732E466F6E7443
+          6F6C6F720708636C615768697465165465787453657474696E67732E486F727A
+          416C69676E07074C656164696E67000005545465787400095374796C654E616D
+          65060873686F727463757405416C69676E07055269676874064C6F636B656409
+          0748697454657374080C4D617267696E732E4C6566740500000000000000C002
+          400D4D617267696E732E52696768740500000000000000C001400A506F736974
+          696F6E2E580500000000000000C000C00A53697A652E57696474680500000000
+          000000C804400B53697A652E4865696768740500000000000000D00340145369
+          7A652E506C6174666F726D44656661756C7408165465787453657474696E6773
+          2E486F727A416C69676E07074C656164696E67000007544C61796F7574000953
+          74796C654E616D6506077375626D61726B05416C69676E070552696768740A50
+          6F736974696F6E2E580500000000000000D404400A53697A652E576964746805
+          00000000000000A003400B53697A652E4865696768740500000000000000D003
+          401453697A652E506C6174666F726D44656661756C7408000554506174680005
+          416C69676E070643656E74657209446174612E506174680A3400000004000000
+          00000000000000000000000001000000000000000000803F010000000000803F
+          0000003F0300000000000000000000000A46696C6C2E436F6C6F720707636C61
+          47726179064C6F636B6564090748697454657374080A53697A652E5769647468
+          0500000000000000E001400B53697A652E486569676874050000000000000080
+          02401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E
+          4B696E6407044E6F6E65000000005450463007544C61796F757400095374796C
+          654E616D6506126D656E75736570617261746F727374796C6505416C69676E07
+          0643656E7465720C4D617267696E732E4C656674050000000000000080FF3F0B
+          4D617267696E732E546F70050000000000000080FF3F0D4D617267696E732E52
+          69676874050000000000000080FF3F0E4D617267696E732E426F74746F6D0500
+          00000000000080FF3F0A53697A652E57696474680500000000000000C804400B
+          53697A652E4865696768740500000000000000C804401453697A652E506C6174
+          666F726D44656661756C74080756697369626C6508085461624F72646572024D
+          0005544C696E650005416C69676E0703546F70084C696E65547970650703546F
+          700C4D617267696E732E4C6566740500000000000000C000400B4D617267696E
+          732E546F7005000000000000008000400D4D617267696E732E52696768740500
+          000000000000C000400A506F736974696F6E2E580500000000000000C000400A
+          506F736974696F6E2E5905000000000000008000400A53697A652E5769647468
+          0500000000000000B004400B53697A652E486569676874050000000000000080
+          FF3F1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F720709636C6153696C766572000000545046300654496D6167650009
+          5374796C654E616D650611616E69696E64696361746F727374796C650E4D756C
+          74695265734269746D61700E0100000A53697A652E5769647468050000000000
+          0000C804400B53697A652E4865696768740500000000000000C804401453697A
+          652E506C6174666F726D44656661756C74080756697369626C6508000C544272
+          7573684F626A65637400095374796C654E616D65060466696C6C000000545046
+          3007544C61796F757400095374796C654E616D65060D74696D65656469747374
+          796C650A53697A652E57696474680500000000000000C804400B53697A652E48
+          65696768740500000000000000C804401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F72646572024F000B54476C6F
+          774566666563740008536F66746E6573730500000000009A9999FD3F09476C6F
+          77436F6C6F720709784646363543384530074F70616369747905000000000000
+          0080FF3F0754726967676572060E4973466F63757365643D7472756507456E61
+          626C65640800000A5452656374616E676C6500095374796C654E616D65060A62
+          61636B67726F756E6405416C69676E0708436F6E74656E74730A46696C6C2E43
+          6F6C6F720709784646313931393139064C6F636B656409074869745465737408
+          0A53697A652E57696474680500000000000000C804400B53697A652E48656967
+          68740500000000000000C804401453697A652E506C6174666F726D4465666175
+          6C74080C5374726F6B652E436F6C6F720709784646333933393339000F54436F
+          6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC
+          3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C756507097846463530353035300953746F7056616C7565070978464637
+          303730373000000F54436F6C6F72416E696D6174696F6E00084475726174696F
+          6E050000000000CDCCCCFC3F07496E7665727365090C50726F70657274794E61
+          6D65060A46696C6C2E436F6C6F720A537461727456616C756507097846463530
+          353035300953746F7056616C7565070978464637303730373000000A54526563
+          74616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407
+          044E6F6E650748697454657374080C4D617267696E732E4C6566740500000000
+          00000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61
+          7267696E732E5269676874050000000000000080FF3F0E4D617267696E732E42
+          6F74746F6D050000000000000080FF3F0A53697A652E57696474680500000000
+          000000C004400B53697A652E4865696768740500000000000000C00440145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          07097846463138313831380000000B54477269644C61796F75740005416C6967
+          6E07094D6F737452696768740A4974656D486569676874050000000000000080
+          FFBF094974656D576964746805000000000000008005400B4F7269656E746174
+          696F6E0708566572746963616C0C4D617267696E732E4C656674050000000000
+          00008000400B4D617267696E732E546F7005000000000000008000400D4D6172
+          67696E732E526967687405000000000000008000400E4D617267696E732E426F
+          74746F6D05000000000000008000400A506F736974696F6E2E58050000000000
+          0000E003400A506F736974696F6E2E5905000000000000008000400A53697A65
+          2E57696474680500000000000000A003400B53697A652E486569676874050000
+          0000000000B804401453697A652E506C6174666F726D44656661756C74080007
+          544C61796F7574000A53697A652E57696474680500000000000000A003400B53
+          697A652E4865696768740500000000000000B803401453697A652E506C617466
+          6F726D44656661756C7408000754427574746F6E00095374796C654E616D6506
+          087570627574746F6E05416C69676E0706436C69656E740843616E466F637573
+          080A53697A652E57696474680500000000000000A003400B53697A652E486569
+          6768740500000000000000B803401453697A652E506C6174666F726D44656661
+          756C74080B5374796C654C6F6F6B757006127363726F6C6C626172746F706275
+          74746F6E085461624F726465720200155465787453657474696E67732E547269
+          6D6D696E6707044E6F6E6500000007544C61796F7574000A506F736974696F6E
+          2E590500000000000000B803400A53697A652E57696474680500000000000000
+          A003400B53697A652E4865696768740500000000000000B803401453697A652E
+          506C6174666F726D44656661756C7408000754427574746F6E00095374796C65
+          4E616D65060A646F776E627574746F6E05416C69676E0706436C69656E740843
+          616E466F637573080A53697A652E57696474680500000000000000A003400B53
+          697A652E4865696768740500000000000000B803401453697A652E506C617466
+          6F726D44656661756C74080B5374796C654C6F6F6B757006157363726F6C6C62
+          6172626F74746F6D627574746F6E085461624F72646572020015546578745365
+          7474696E67732E5472696D6D696E6707044E6F6E650000000010545374796C65
+          546578744F626A65637400095374796C654E616D6506045465787405416C6967
+          6E0706436C69656E74064C6F636B6564090C4D617267696E732E4C6566740500
+          0000000000008000400B4D617267696E732E546F700500000000000000800040
+          0D4D617267696E732E526967687405000000000000008000400E4D617267696E
+          732E426F74746F6D05000000000000008000400A53697A652E57696474680500
+          0000000000000000000B53697A652E4865696768740500000000000000B80440
+          1453697A652E506C6174666F726D44656661756C740816546578745365747469
+          6E67732E466F6E74436F6C6F7207097846464541454145410D536861646F7756
+          697369626C650800000C5442727573684F626A65637400095374796C654E616D
+          65060973656C656374696F6E0A42727573682E4B696E6407084772616469656E
+          741542727573682E4772616469656E742E506F696E74730E0105436F6C6F7207
+          09783830324237393843064F6666736574050000000000000000000000010543
+          6F6C6F720709783830324236453746064F666673657405000000000012A2F8FD
+          3F000105436F6C6F720709783830324236343732064F66667365740500000000
+          00000080FF3F000000000954436865636B426F7800095374796C654E616D6506
+          05636865636B05416C69676E07084D6F73744C6566740843616E466F63757308
+          1244697361626C65466F637573456666656374090C4D617267696E732E4C6566
+          7405000000000000008000400A53697A652E57696474680500000000000000A0
+          03400B53697A652E48656967687405000000000000009803401453697A652E50
+          6C6174666F726D44656661756C7408085461624F726465720203075669736962
+          6C650800000754427574746F6E00095374796C654E616D65060B636C65617262
+          7574746F6E05416C69676E070552696768740843616E466F637573080C4D6172
+          67696E732E4C65667405000000000000008000400B4D617267696E732E546F70
+          05000000000000008000400D4D617267696E732E526967687405000000000000
+          008000400E4D617267696E732E426F74746F6D05000000000000008000400A50
+          6F736974696F6E2E5805000000000000008001400A506F736974696F6E2E5905
+          000000000000008000400A53697A652E57696474680500000000000000A00340
+          0B53697A652E4865696768740500000000000000B804401453697A652E506C61
+          74666F726D44656661756C74080B5374796C654C6F6F6B7570061C7472616E73
+          706172656E74636972636C65627574746F6E7374796C65155465787453657474
+          696E67732E5472696D6D696E6707044E6F6E65000554506174680005416C6967
+          6E070346697409446174612E506174680AC400000010000000000000000000A0
+          C00000704101000000000070410000A0C001000000000048420000F041010000
+          000000AA420000A0C0010000000000D242000070410100000000008C42000048
+          42010000000000D2420000B442010000000000AA420000DC42020000003BDF34
+          429E6F8C4202000000FE547D427FAAB042020000000000484200009642010000
+          00000070410000DC42010000000000A0C00000B442010000000000F04100005C
+          42010000000000A0C000007041030000000000000000000000064C6F636B6564
+          090748697454657374080C4D617267696E732E4C656674050000000000000080
+          01400B4D617267696E732E546F7005000000000000008001400D4D617267696E
+          732E526967687405000000000000008001400E4D617267696E732E426F74746F
+          6D05000000000000008001400A53697A652E57696474680500000000000000C0
+          02400B53697A652E4865696768740500000000000000C002401453697A652E50
+          6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
+          65000000005450463007544C61796F757400095374796C654E616D65060D6461
+          7465656469747374796C6505416C69676E070643656E7465720A53697A652E57
+          696474680500000000000000C804400B53697A652E4865696768740500000000
+          000000C804401453697A652E506C6174666F726D44656661756C740807566973
+          69626C6508085461624F726465720250000B54476C6F77456666656374000853
+          6F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F7207097846
+          46363543384530074F706163697479050000000000000080FF3F075472696767
+          6572060E4973466F63757365643D7472756507456E61626C65640800000A5452
+          656374616E676C6500095374796C654E616D65060A6261636B67726F756E6405
+          416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978464631
+          3931393139064C6F636B6564090748697454657374080A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          C804401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
+          2E436F6C6F720709784646333933393339000F54436F6C6F72416E696D617469
+          6F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F7065727479
+          4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709784646
+          3530353035300953746F7056616C7565070978464637303730373000000F5443
+          6F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCC
+          FC3F07496E7665727365090C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846463530353035300953746F7056
+          616C7565070978464637303730373000000A5452656374616E676C650005416C
+          69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454
+          657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D6172
+          67696E732E546F70050000000000000080FF3F0D4D617267696E732E52696768
+          74050000000000000080FF3F0E4D617267696E732E426F74746F6D0500000000
+          00000080FF3F0A53697A652E57696474680500000000000000C004400B53697A
+          652E4865696768740500000000000000C004401453697A652E506C6174666F72
+          6D44656661756C74080C5374726F6B652E436F6C6F7207097846463138313831
+          380000000754427574746F6E00095374796C654E616D6506056172726F770541
+          6C69676E07094D6F737452696768740843616E466F637573080C4D617267696E
+          732E4C65667405000000000000008000400B4D617267696E732E546F70050000
+          00000000008000400D4D617267696E732E526967687405000000000000008000
+          400E4D617267696E732E426F74746F6D05000000000000008000400A506F7369
+          74696F6E2E580500000000000000E003400A506F736974696F6E2E5905000000
+          000000008000400A53697A652E57696474680500000000000000A003400B5369
+          7A652E4865696768740500000000000000B804401453697A652E506C6174666F
+          726D44656661756C74080B5374796C654C6F6F6B757006157363726F6C6C6261
+          72626F74746F6D627574746F6E155465787453657474696E67732E5472696D6D
+          696E6707044E6F6E65000010545374796C65546578744F626A65637400095374
+          796C654E616D6506045465787405416C69676E0706436C69656E74064C6F636B
+          6564090C4D617267696E732E4C65667405000000000000008000400B4D617267
+          696E732E546F7005000000000000008000400D4D617267696E732E5269676874
+          05000000000000008000400E4D617267696E732E426F74746F6D050000000000
+          00008000400A53697A652E576964746805000000000000000000000B53697A65
+          2E4865696768740500000000000000B804401453697A652E506C6174666F726D
+          44656661756C7408165465787453657474696E67732E466F6E74436F6C6F7207
+          097846464541454145410D536861646F7756697369626C650800000C54427275
+          73684F626A65637400095374796C654E616D65060973656C656374696F6E0A42
+          727573682E4B696E6407084772616469656E741542727573682E477261646965
+          6E742E506F696E74730E0105436F6C6F720709783830324237393843064F6666
+          7365740500000000000000000000000105436F6C6F7207097838303242364537
+          46064F666673657405000000000012A2F8FD3F000105436F6C6F720709783830
+          324236343732064F6666736574050000000000000080FF3F0000000009544368
+          65636B426F7800095374796C654E616D650605636865636B05416C69676E0708
+          4D6F73744C6566740843616E466F637573081244697361626C65466F63757345
+          6666656374090C4D617267696E732E4C65667405000000000000008000400A53
+          697A652E57696474680500000000000000A003400B53697A652E486569676874
+          05000000000000009803401453697A652E506C6174666F726D44656661756C74
+          08085461624F7264657202030756697369626C650800000754427574746F6E00
+          095374796C654E616D65060B636C656172627574746F6E05416C69676E070552
+          696768740843616E466F637573080C4D617267696E732E4C6566740500000000
+          0000008000400B4D617267696E732E546F7005000000000000008000400D4D61
+          7267696E732E526967687405000000000000008000400E4D617267696E732E42
+          6F74746F6D05000000000000008000400A506F736974696F6E2E580500000000
+          0000008001400A506F736974696F6E2E5905000000000000008000400A53697A
+          652E57696474680500000000000000A003400B53697A652E4865696768740500
+          000000000000B804401453697A652E506C6174666F726D44656661756C74080B
+          5374796C654C6F6F6B7570061C7472616E73706172656E74636972636C656275
+          74746F6E7374796C65155465787453657474696E67732E5472696D6D696E6707
+          044E6F6E65000554506174680005416C69676E070346697409446174612E5061
+          74680AC400000010000000000000000000A0C000007041010000000000704100
+          00A0C001000000000048420000F041010000000000AA420000A0C00100000000
+          00D242000070410100000000008C4200004842010000000000D2420000B44201
+          0000000000AA420000DC42020000003BDF34429E6F8C4202000000FE547D427F
+          AAB04202000000000048420000964201000000000070410000DC420100000000
+          00A0C00000B442010000000000F04100005C42010000000000A0C00000704103
+          0000000000000000000000064C6F636B6564090748697454657374080C4D6172
+          67696E732E4C65667405000000000000008001400B4D617267696E732E546F70
+          05000000000000008001400D4D617267696E732E526967687405000000000000
+          008001400E4D617267696E732E426F74746F6D05000000000000008001400A53
+          697A652E57696474680500000000000000C002400B53697A652E486569676874
+          0500000000000000C002401453697A652E506C6174666F726D44656661756C74
+          080B5374726F6B652E4B696E6407044E6F6E6500000000545046300B54477269
+          644C61796F757400095374796C654E616D65060E7370696E6564697462757474
+          6F6E0A4974656D486569676874050000000000000080FFBF094974656D576964
+          746805000000000000008005400B4F7269656E746174696F6E07085665727469
+          63616C0A53697A652E57696474680500000000000000C804400B53697A652E48
+          65696768740500000000000000C804401453697A652E506C6174666F726D4465
+          6661756C74080756697369626C6508085461624F7264657202510007544C6179
+          6F7574000A53697A652E57696474680500000000000000C804400B53697A652E
+          4865696768740500000000000000C803401453697A652E506C6174666F726D44
+          656661756C7408000754427574746F6E00095374796C654E616D650608757062
+          7574746F6E05416C69676E0706436C69656E740843616E466F637573080A5369
+          7A652E57696474680500000000000000C804400B53697A652E48656967687405
+          00000000000000C803401453697A652E506C6174666F726D44656661756C7408
+          0B5374796C654C6F6F6B757006127363726F6C6C626172746F70627574746F6E
+          085461624F726465720200155465787453657474696E67732E5472696D6D696E
+          6707044E6F6E6500000007544C61796F7574000A506F736974696F6E2E590500
+          000000000000C803400A53697A652E57696474680500000000000000C804400B
+          53697A652E4865696768740500000000000000C803401453697A652E506C6174
+          666F726D44656661756C7408000754427574746F6E00095374796C654E616D65
+          060A646F776E627574746F6E05416C69676E0706436C69656E740843616E466F
+          637573080A53697A652E57696474680500000000000000C804400B53697A652E
+          4865696768740500000000000000C803401453697A652E506C6174666F726D44
+          656661756C74080B5374796C654C6F6F6B757006157363726F6C6C626172626F
+          74746F6D627574746F6E085461624F726465720200155465787453657474696E
+          67732E5472696D6D696E6707044E6F6E65000000005450463007544C61796F75
+          7400095374796C654E616D6506126D656E756974656D7374796C655F6C697465
+          05416C69676E070643656E7465720C4D617267696E732E4C6566740500000000
+          00000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61
+          7267696E732E5269676874050000000000000080FF3F0E4D617267696E732E42
+          6F74746F6D050000000000000080FF3F0A53697A652E57696474680500000000
+          0000009205400B53697A652E4865696768740500000000000000D00340145369
+          7A652E506C6174666F726D44656661756C74080756697369626C650808546162
+          4F72646572024A000A5452656374616E676C650005416C69676E0708436F6E74
+          656E74730946696C6C2E4B696E6407084772616469656E741446696C6C2E4772
+          616469656E742E506F696E74730E0105436F6C6F720709784646353835383538
+          064F66667365740500000000000000000000000105436F6C6F72070978464635
+          3135313531064F6666736574050000000000A01BF3FD3F000105436F6C6F7207
+          09784646343934393439064F6666736574050000000000000080FF3F00000748
+          69745465737408074F70616369747905000000000017B7D1F13F0A53697A652E
+          576964746805000000000000009205400B53697A652E48656967687405000000
+          00000000D003401453697A652E506C6174666F726D44656661756C74080C5374
+          726F6B652E436F6C6F720709784646364136413641000F54466C6F6174416E69
+          6D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F70
+          657274794E616D6506074F7061636974790A537461727456616C756505000000
+          000000000000000953746F7056616C7565050000000000000080FF3F07547269
+          67676572060F497353656C65637465643D747275650E54726967676572496E76
+          657273650610497353656C65637465643D66616C73650000000A545265637461
+          6E676C6500095374796C654E616D65060A6261636B67726F756E6405416C6967
+          6E0708436F6E74656E74730946696C6C2E4B696E6407084772616469656E7414
+          46696C6C2E4772616469656E742E506F696E74730E0105436F6C6F7207097846
+          46353835383538064F66667365740500000000000000000000000105436F6C6F
+          720709784646353135313531064F6666736574050000000000A01BF3FD3F0001
+          05436F6C6F720709784646343934393439064F66667365740500000000000000
+          80FF3F0000074869745465737408074F70616369747905000000000017B7D1F1
+          3F0A53697A652E576964746805000000000000009205400B53697A652E486569
+          6768740500000000000000D003401453697A652E506C6174666F726D44656661
+          756C74080C5374726F6B652E436F6C6F720709784646364136413641000F5446
+          6C6F6174416E696D6174696F6E00084475726174696F6E05000000000018B7D1
+          F23F0C50726F70657274794E616D6506074F7061636974790A53746172745661
+          6C756505000000000000000000000953746F7056616C75650500000000000000
+          80FF3F0754726967676572061049734D6F7573654F7665723D747275650E5472
+          6967676572496E7665727365061149734D6F7573654F7665723D66616C736500
+          000005545465787400095374796C654E616D6506047465787405416C69676E07
+          044C656674064C6F636B6564090748697454657374080C4D617267696E732E4C
+          6566740500000000000000F002400D4D617267696E732E526967687405000000
+          00000000F002400A506F736974696F6E2E580500000000000000F002400A5369
+          7A652E57696474680500000000000000C804400B53697A652E48656967687405
+          00000000000000D003401453697A652E506C6174666F726D44656661756C7408
+          165465787453657474696E67732E466F6E74436F6C6F720708636C6157686974
+          65165465787453657474696E67732E486F727A416C69676E07074C656164696E
+          67000005545465787400095374796C654E616D65060873686F72746375740541
+          6C69676E07055269676874064C6F636B6564090748697454657374080C4D6172
+          67696E732E4C6566740500000000000000C002400D4D617267696E732E526967
+          68740500000000000000C001400A506F736974696F6E2E580500000000000000
+          C000C00A53697A652E57696474680500000000000000C804400B53697A652E48
+          65696768740500000000000000D003401453697A652E506C6174666F726D4465
+          6661756C7408165465787453657474696E67732E466F6E74436F6C6F72070863
+          6C615768697465165465787453657474696E67732E486F727A416C69676E0707
+          4C656164696E67000007544C61796F757400095374796C654E616D6506077375
+          626D61726B05416C69676E070552696768740A506F736974696F6E2E58050000
+          0000000000D404400A53697A652E57696474680500000000000000A003400B53
+          697A652E4865696768740500000000000000D003401453697A652E506C617466
+          6F726D44656661756C7408000554506174680005416C69676E070643656E7465
+          7209446174612E506174680A3400000004000000000000000000000000000000
+          01000000000000000000803F010000000000803F0000003F0300000000000000
+          000000000A46696C6C2E436F6C6F720707636C6147726179064C6F636B656409
+          0748697454657374080A53697A652E57696474680500000000000000E001400B
+          53697A652E48656967687405000000000000008002401453697A652E506C6174
+          666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650000
+          0000545046300A5452656374616E676C6500095374796C654E616D6506117061
+          6E656C7374796C655F72616469757305416C69676E070643656E7465720A4669
+          6C6C2E436F6C6F7207097846463139313931390748697454657374080A53697A
+          652E57696474680500000000000000C804400B53697A652E4865696768740500
+          000000000000C804401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F7207097846463539353935390756697369626C6508
+          07585261646975730500000000000000A0014007595261646975730500000000
+          000000A00140000A5452656374616E676C650005416C69676E0706436C69656E
+          740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61726769
+          6E732E4C656674050000000000000080FF3F0B4D617267696E732E546F700500
+          00000000000080FF3F0D4D617267696E732E5269676874050000000000000080
+          FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A
+          652E57696474680500000000000000C004400B53697A652E4865696768740500
+          000000000000C004401453697A652E506C6174666F726D44656661756C74080B
+          5374726F6B652E4B696E6407044E6F6E65075852616469757305000000000000
+          00A0014007595261646975730500000000000000A00140000000545046300A54
+          52656374616E676C6500095374796C654E616D65061670616E656C7374796C65
+          5F6D61636F735F6672616D6505416C69676E070643656E7465720A46696C6C2E
+          436F6C6F7207097846463139313931390748697454657374080A53697A652E57
+          696474680500000000000000C804400B53697A652E4865696768740500000000
+          000000C804401453697A652E506C6174666F726D44656661756C74080B537472
+          6F6B652E4B696E6407044E6F6E650756697369626C6508000A5452656374616E
+          676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F
+          6E650748697454657374080C4D617267696E732E4C6566740500000000000000
+          80FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61726769
+          6E732E5269676874050000000000000080FF3F0E4D617267696E732E426F7474
+          6F6D050000000000000080FF3F0A53697A652E57696474680500000000000000
+          C004400B53697A652E4865696768740500000000000000C004401453697A652E
+          506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F
+          6E65000000}
+      end>
+    Left = 40
+    Top = 164
+  end
+  object StyleBookWhite: TStyleBook
+    Styles = <
+      item
+        ResourcesBin = {
+          464D585F5354594C4520322E3501060B7377697463687374796C6503F900060D
+          63616C656E6461727374796C6503840B061263616C656E6461726C6162656C73
+          74796C65032F010611696D616765636F6E74726F6C7374796C6503B503061466
+          72616D65647363726F6C6C626F787374796C6503AF08060F6261636B67726F75
+          6E647374796C6503B800060E6D756C7469766965777374796C6503F200060A70
+          616E656C7374796C6503AA01061163616C6C6F757470616E656C7374796C6503
+          1601060E7374617475736261727374796C6503BB02060C746F6F6C6261727374
+          796C6503D9010613457870616E646572427574746F6E5374796C6503A50B060D
+          657870616E6465727374796C65033004060D67726F7570626F787374796C6503
+          900206107370656564627574746F6E7374796C65033308060D73706C69747465
+          727374796C65034E01060A6C6162656C7374796C65030501060F76616C75656C
+          6162656C7374796C65034002060C7461626974656D7374796C6503500B060B74
+          6162646F747374796C65035901060F746162636F6E74726F6C7374796C65030D
+          02060D636865636B626F787374796C65037A070610726164696F627574746F6E
+          7374796C6503DF06061070726F67726573736261727374796C6503AD0A060D73
+          697A65677269707374796C6503A601060F636F6D626F706F7075707374796C65
+          030F02060D74726565766965777374796C650388080611747265657669657769
+          74656D7374796C65037C04061B7472656576696577657870616E646572627574
+          746F6E7374796C65038B04060D747261636B6261727374796C65032105060E6E
+          756D626572626F787374796C65039C060609656469747374796C65034905060C
+          7370696E626F787374796C6503640A0611636C656172696E6765646974737479
+          6C65037D0806096D656D6F7374796C6503F007060B627574746F6E7374796C65
+          0326090610636F6C6F72627574746F6E7374796C6503FD070611636F726E6572
+          627574746F6E7374796C65033906060D706F707570626F787374796C6503E308
+          060C6172636469616C7374796C6503FE08060D7468756D626261727374796C65
+          035C0306147363726F6C6C62617276747261636B7374796C6503750206147363
+          726F6C6C62617268747261636B7374796C6503760206137363726F6C6C626172
+          6C656674627574746F6E03F70206147363726F6C6C6261727269676874627574
+          746F6E03EC0206127363726F6C6C626172746F70627574746F6E03F602061573
+          63726F6C6C626172626F74746F6D627574746F6E03ED02060B687468756D6273
+          74796C65036103060B767468756D627374796C65036103060D636F6D626F626F
+          787374796C65031506060E636F6D626F656469747374796C6503F006060A7472
+          61636B7374796C6503E002060C6C697374626F787374796C6503E90806126C69
+          7374626F78706C61696E686561646572033B03060D6C697374626F78666F6F74
+          6572038B0106177472616E73706172656E746C697374626F787374796C650353
+          0806167472616E73706172656E74627574746F6E7374796C6503DD02061C7472
+          616E73706172656E74636972636C65627574746F6E7374796C6503E10206106C
+          697374626F786974656D7374796C650305030615636F6C6F726C697374626F78
+          6974656D7374796C65035A03060E7363726F6C6C6261727374796C65032A0606
+          19736D616C6C7363726F6C6C62617276747261636B7374796C65033602061973
+          6D616C6C7363726F6C6C62617268747261636B7374796C650336020613736D61
+          6C6C7363726F6C6C6261727374796C65034902060F64726F7074617267657473
+          74796C650375040609677269647374796C65031E0A060F686561646572697465
+          6D7374796C65033803060D7465787463656C6C7374796C65036602060E636865
+          636B63656C6C7374796C6503E003060E706F70757063656C6C7374796C6503EA
+          03061170726F677265737363656C6C7374796C6503F202060E696D6167656365
+          6C6C7374796C65038001060C6D656E756261727374796C6503A901060D6D656E
+          75766965777374796C6503DF0206126D656E756974656D7374796C655F6C6974
+          6503D90606106D656E756261726974656D7374796C65034F0C06126D656E7573
+          6570617261746F727374796C6503E5010611616E69696E64696361746F727374
+          796C6503AA00060D74696D65656469747374796C6503680C060D646174656564
+          69747374796C6503520A060E7370696E65646974627574746F6E030C0306146D
+          656E756974656D7374796C655F6E6F5F696D67034D0B061170616E656C737479
+          6C655F72616469757303FD01061670616E656C7374796C655F6D61636F735F66
+          72616D6503A10100545046300D545377697463684F626A65637400095374796C
+          654E616D65060B7377697463687374796C6505416C69676E070643656E746572
+          085461624F72646572020012547261636B696E675468756D625363616C650500
+          00000000000080FF3F0756697369626C65080A46696C6C2E436F6C6F72070978
+          46463438343834380C46696C6C4F6E2E436F6C6F720709784646363543384530
+          0B46696C6C4F6E2E4B696E640705536F6C69640C5374726F6B652E436F6C6F72
+          07097846463143314331430B5468756D622E436F6C6F72070978464634383438
+          3438115468756D625374726F6B652E436F6C6F72070978464631433143314300
+          005450463007544C61796F757400095374796C654E616D65060D63616C656E64
+          61727374796C6505416C69676E070643656E7465720A53697A652E5769647468
+          0500000000000000B406400B53697A652E4865696768740500000000000000A0
+          06401453697A652E506C6174666F726D44656661756C74080756697369626C65
+          08085461624F7264657202010009545374796C6554616700095374796C654E61
+          6D650609466978656453697A65000007544C61796F75740005416C69676E0707
+          4D6F7374546F70064C6F636B6564090E4D617267696E732E426F74746F6D0500
+          0000000000008000400A53697A652E57696474680500000000000000B406400B
+          53697A652E48656967687405000000000000009803401453697A652E506C6174
+          666F726D44656661756C7408000754427574746F6E00095374796C654E616D65
+          06047072657605416C69676E07044C6566740843616E466F63757308064C6F63
+          6B6564090D4D617267696E732E526967687405000000000000008000400B5265
+          70656174436C69636B090A53697A652E57696474680500000000000000980340
+          0B53697A652E48656967687405000000000000009803401453697A652E506C61
+          74666F726D44656661756C74080B5374796C654C6F6F6B7570061C7472616E73
+          706172656E74636972636C65627574746F6E7374796C65155465787453657474
+          696E67732E5472696D6D696E6707044E6F6E65000A54506174684C6162656C00
+          05416C69676E070643656E74657209446174612E506174680A34000000040000
+          00000000000000803F00000000010000000000803F0000803F01000000000000
+          000000003F010000000000803F00000000064C6F636B6564090A53697A652E57
+          696474680500000000000000A001400B53697A652E4865696768740500000000
+          000000A001401453697A652E506C6174666F726D44656661756C74080B537479
+          6C654C6F6F6B7570061263616C656E6461726C6162656C7374796C6500000007
+          54427574746F6E00095374796C654E616D650605746F64617905416C69676E07
+          044C6566740843616E466F63757308064C6F636B6564090D4D617267696E732E
+          526967687405000000000000008000400A506F736974696F6E2E580500000000
+          000000A803400B526570656174436C69636B090A53697A652E57696474680500
+          0000000000009803400B53697A652E4865696768740500000000000000980340
+          1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B
+          7570061C7472616E73706172656E74636972636C65627574746F6E7374796C65
+          155465787453657474696E67732E5472696D6D696E6707044E6F6E65000A5450
+          6174684C6162656C0005416C69676E070643656E74657209446174612E506174
+          680A34000000040000000000000089C965431BE2BB43010000002B88E1421080
+          8343010000002B886143AEFA114301000000CF46AB43625F8143064C6F636B65
+          64090A53697A652E57696474680500000000000000A001400B53697A652E4865
+          696768740500000000000000A001401453697A652E506C6174666F726D446566
+          61756C74080B5374796C654C6F6F6B7570061263616C656E6461726C6162656C
+          7374796C650000000754427574746F6E00095374796C654E616D6506046E6578
+          7405416C69676E07044C6566740843616E466F63757308064C6F636B6564090D
+          4D617267696E732E526967687405000000000000008000400A506F736974696F
+          6E2E580500000000000000A804400B526570656174436C69636B090A53697A65
+          2E576964746805000000000000009803400B53697A652E486569676874050000
+          00000000009803401453697A652E506C6174666F726D44656661756C74080B53
+          74796C654C6F6F6B7570061C7472616E73706172656E74636972636C65627574
+          746F6E7374796C65155465787453657474696E67732E5472696D6D696E670704
+          4E6F6E65000A54506174684C6162656C0005416C69676E070643656E74657209
+          446174612E506174680A28000000030000000000000000000000000000000100
+          0000000000000000803F010000000000803F0000003F064C6F636B6564090A53
+          697A652E57696474680500000000000000A001400B53697A652E486569676874
+          0500000000000000A001401453697A652E506C6174666F726D44656661756C74
+          080B5374796C654C6F6F6B7570061263616C656E6461726C6162656C7374796C
+          650000000954506F707570426F7800095374796C654E616D6506066D6F6E7468
+          7305416C69676E0706436C69656E740843616E466F637573081244697361626C
+          65466F63757345666665637409064C6F636B6564090C4D617267696E732E4C65
+          66740500000000000000A001400D4D617267696E732E52696768740500000000
+          000000A001400A53697A652E576964746805000000000000008605400B53697A
+          652E48656967687405000000000000009803401453697A652E506C6174666F72
+          6D44656661756C74080B5374796C654C6F6F6B7570061263616C656E6461726C
+          6162656C7374796C6500000954506F707570426F7800095374796C654E616D65
+          0605796561727305416C69676E070552696768740843616E466F637573081244
+          697361626C65466F63757345666665637409064C6F636B6564090A506F736974
+          696F6E2E5805000000000000008C06400A53697A652E57696474680500000000
+          000000A004400B53697A652E4865696768740500000000000000980340145369
+          7A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006
+          1263616C656E6461726C6162656C7374796C650000000B54477269644C61796F
+          757400095374796C654E616D6506047765656B05416C69676E0703546F70064C
+          6F636B6564090A4974656D486569676874050000000000000098034009497465
+          6D576964746805000000000000008005400B4F7269656E746174696F6E070A48
+          6F72697A6F6E74616C0E4D617267696E732E426F74746F6D0500000000000000
+          8000400A506F736974696F6E2E590500000000000000A803400A53697A652E57
+          696474680500000000000000B406400B53697A652E4865696768740500000000
+          0000009803401453697A652E506C6174666F726D44656661756C740800000B54
+          477269644C61796F757400095374796C654E616D6506057765656B7305416C69
+          676E07084D6F73744C656674064C6F636B6564090A4974656D48656967687405
+          00000000000000980340094974656D576964746805000000000000008005400B
+          4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E732E
+          546F700500000000000000A803400A53697A652E576964746805000000000000
+          00B803400B53697A652E4865696768740500000000000000C804401453697A65
+          2E506C6174666F726D44656661756C74080756697369626C6508000008544C69
+          7374426F7800095374796C654E616D6506046461797305416C69676E0706436C
+          69656E74064C6F636B6564090A53697A652E57696474680500000000000000B4
+          06400B53697A652E4865696768740500000000000000EC05401453697A652E50
+          6C6174666F726D44656661756C74080B5374796C654C6F6F6B75700617747261
+          6E73706172656E746C697374626F787374796C650E53686F775363726F6C6C42
+          6172730818416C7465726E6174696E67526F774261636B67726F756E64090843
+          616E466F6375730807436F6C756D6E7302071244697361626C65466F63757345
+          6666656374090A4974656D48656967687405000000000000009803401B446566
+          61756C744974656D5374796C65732E4974656D5374796C651200000000224465
+          6661756C744974656D5374796C65732E47726F75704865616465725374796C65
+          12000000002244656661756C744974656D5374796C65732E47726F7570466F6F
+          7465725374796C6512000000000E56696577706F72742E576964746805000000
+          00000000B406400F56696577706F72742E4865696768740500000000000000EC
+          05400000005450463007544C61796F757400095374796C654E616D6506126361
+          6C656E6461726C6162656C7374796C6505416C69676E070643656E7465720A53
+          697A652E57696474680500000000000000C404400B53697A652E486569676874
+          0500000000000000A003401453697A652E506C6174666F726D44656661756C74
+          080756697369626C6508085461624F7264657202020005545465787400095374
+          796C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B
+          6564090748697454657374080A53697A652E57696474680500000000000000C4
+          04400B53697A652E4865696768740500000000000000A003401453697A652E50
+          6C6174666F726D44656661756C7408165465787453657474696E67732E466F6E
+          74436F6C6F7207097846464530453045300000005450463007544C61796F7574
+          00095374796C654E616D650611696D616765636F6E74726F6C7374796C650A50
+          6F736974696F6E2E580500000000000000C007400A506F736974696F6E2E5905
+          00000000000000F407400A53697A652E57696474680500000000000000920540
+          0B53697A652E4865696768740500000000000000D003401453697A652E506C61
+          74666F726D44656661756C74080756697369626C6508085461624F7264657202
+          03000A5452656374616E676C6500095374796C654E616D65060A6261636B6772
+          6F756E6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207
+          09784646313931393139064C6F636B6564090748697454657374080A53697A65
+          2E576964746805000000000000009205400B53697A652E486569676874050000
+          0000000000D003401453697A652E506C6174666F726D44656661756C74080C53
+          74726F6B652E436F6C6F720709784646333933393339000A5452656374616E67
+          6C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E
+          650748697454657374080C4D617267696E732E4C656674050000000000000080
+          FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E
+          732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F
+          6D050000000000000080FF3F0A53697A652E576964746805000000000000008E
+          05400B53697A652E4865696768740500000000000000C003401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          4631383138313800000654496D61676500095374796C654E616D650605696D61
+          67650E4D756C74695265734269746D61700E01000005416C69676E0706436C69
+          656E74064C6F636B6564090748697454657374080C4D617267696E732E4C6566
+          740500000000000000C000400B4D617267696E732E546F700500000000000000
+          C000400D4D617267696E732E52696768740500000000000000C000400E4D6172
+          67696E732E426F74746F6D0500000000000000C000400A53697A652E57696474
+          6805000000000000008605400B53697A652E4865696768740500000000000000
+          A003401453697A652E506C6174666F726D44656661756C74080000000B54476C
+          6F774566666563740008536F66746E657373050000000000CDCCCCFC3F09476C
+          6F77436F6C6F720709784646363543384530074F706163697479050000000000
+          6666E6FE3F0754726967676572060E4973466F63757365643D7472756507456E
+          61626C6564080000005450463007544C61796F757400095374796C654E616D65
+          06146672616D65647363726F6C6C626F787374796C650A506F736974696F6E2E
+          580500000000000080B507400A506F736974696F6E2E590500000000000000DA
+          07400A53697A652E5769647468050000000000FFFFE905400B53697A652E4865
+          6967687405000000000000008306401453697A652E506C6174666F726D446566
+          61756C74080756697369626C6508085461624F726465720204000A5452656374
+          616E676C6500095374796C654E616D65060A6261636B67726F756E6405416C69
+          676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978464634383438
+          3438064C6F636B6564090748697454657374080C50616464696E672E4C656674
+          050000000000000080FF3F0B50616464696E672E546F70050000000000000080
+          FF3F0D50616464696E672E5269676874050000000000000080FF3F0E50616464
+          696E672E426F74746F6D050000000000000080FF3F0A53697A652E5769647468
+          050000000000FFFFE905400B53697A652E486569676874050000000000000083
+          06401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F720709784646314331433143000A5452656374616E676C650005416C
+          69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454
+          657374080A53697A652E5769647468050000000000FFFFE505400B53697A652E
+          48656967687405000000000000008106401453697A652E506C6174666F726D44
+          656661756C74080C5374726F6B652E436F6C6F72070978464635393539353900
+          0007544C61796F75740005416C69676E0706436C69656E740A53697A652E5769
+          647468050000000000FFFFE505400B53697A652E486569676874050000000000
+          00008106401453697A652E506C6174666F726D44656661756C74080007544C61
+          796F757400095374796C654E616D650607636F6E74656E7405416C69676E0706
+          436C69656E740C4D617267696E732E4C656674050000000000000080FF3F0B4D
+          617267696E732E546F70050000000000000080FF3F0D4D617267696E732E5269
+          676874050000000000000080FF3F0E4D617267696E732E426F74746F6D050000
+          000000000080FF3F0A53697A652E5769647468050000000000FFFFC305400B53
+          697A652E4865696768740500000000000000E005401453697A652E506C617466
+          6F726D44656661756C740800000A545363726F6C6C42617200095374796C654E
+          616D65060A767363726F6C6C62617205416C69676E070552696768740B536D61
+          6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07
+          08566572746963616C0A506F736974696F6E2E58050000000000FFFFC705400A
+          53697A652E57696474680500000000000000F002400B53697A652E4865696768
+          740500000000000000E405401453697A652E506C6174666F726D44656661756C
+          740800000A545363726F6C6C42617200095374796C654E616D65060A68736372
+          6F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C4368616E6765
+          05000000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E
+          74616C0A506F736974696F6E2E590500000000000000E405400A53697A652E57
+          69647468050000000000FFFFE505400B53697A652E4865696768740500000000
+          000000F002401453697A652E506C6174666F726D44656661756C740800000F54
+          536D616C6C5363726F6C6C42617200095374796C654E616D65060F76736D616C
+          6C7363726F6C6C62617205416C69676E070552696768740B536D616C6C436861
+          6E676505000000000000000000000B4F7269656E746174696F6E070856657274
+          6963616C0B4D617267696E732E546F70050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000000000
+          00C605400A506F736974696F6E2E5905000000000000008000400A53697A652E
+          576964746805000000000000008002400B53697A652E48656967687405000000
+          000000008002401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C650800000F54536D616C6C5363726F6C6C42617200095374796C654E
+          616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F7474
+          6F6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E74
+          6174696F6E070A486F72697A6F6E74616C0C4D617267696E732E4C6566740500
+          00000000000080FF3F0D4D617267696E732E5269676874050000000000000080
+          FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73
+          6974696F6E2E5805000000000000008000400A506F736974696F6E2E59050000
+          0000000000E205400A53697A652E576964746805000000000000009606400B53
+          697A652E48656967687405000000000000008002401453697A652E506C617466
+          6F726D44656661756C74080756697369626C6508000007544C61796F75740005
+          416C69676E0708436F6E74656E74730A53697A652E5769647468050000000000
+          FFFFE505400B53697A652E48656967687405000000000000008106401453697A
+          652E506C6174666F726D44656661756C74080007544C61796F75740005416C69
+          676E0706426F74746F6D0A506F736974696F6E2E590500000000000000DA0540
+          0A53697A652E5769647468050000000000FFFFE505400B53697A652E48656967
+          68740500000000000000A003401453697A652E506C6174666F726D4465666175
+          6C740800095453697A654772697000095374796C654E616D65060873697A6567
+          72697005416C69676E07055269676874064C6F636B6564090A506F736974696F
+          6E2E58050000000000FFFFBD05400A53697A652E576964746805000000000000
+          00A003400B53697A652E4865696768740500000000000000A003401453697A65
+          2E506C6174666F726D44656661756C740800000000000000545046300A545265
+          6374616E676C6500095374796C654E616D65060F6261636B67726F756E647374
+          796C6505416C69676E070643656E7465720A46696C6C2E436F6C6F7207097846
+          464536453645360748697454657374080A53697A652E57696474680500000000
+          000000C804400B53697A652E4865696768740500000000000000C80440145369
+          7A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407
+          044E6F6E650756697369626C65080000545046300A5452656374616E676C6500
+          095374796C654E616D65060E6D756C7469766965777374796C6505416C69676E
+          070643656E7465720A46696C6C2E436F6C6F7207097846463438343834380748
+          697454657374080A53697A652E57696474680500000000000000C804400B5369
+          7A652E4865696768740500000000000000C804401453697A652E506C6174666F
+          726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6507566973
+          69626C6508000C5442727573684F626A65637400095374796C654E616D650608
+          64726F706C696E650B42727573682E436F6C6F72070978464631433143314300
+          0000545046300A5452656374616E676C6500095374796C654E616D65060A7061
+          6E656C7374796C6505416C69676E070643656E7465720A46696C6C2E436F6C6F
+          720708636C6157686974650748697454657374080A53697A652E576964746805
+          00000000000000C804400B53697A652E4865696768740500000000000000C804
+          401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E43
+          6F6C6F7207097846464536453645360756697369626C6508000A545265637461
+          6E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E
+          6F6E650748697454657374080C4D617267696E732E4C65667405000000000000
+          0080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A53697A652E576964746805000000000000
+          00C004400B53697A652E4865696768740500000000000000C004401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
+          78464645364536453600000054504630115443616C6C6F757452656374616E67
+          6C6500095374796C654E616D65061163616C6C6F757470616E656C7374796C65
+          0A46696C6C2E436F6C6F7207097846463438343834380748697454657374080A
+          506F736974696F6E2E580500000000000000C607400A506F736974696F6E2E59
+          0500000000000000EE07400A53697A652E57696474680500000000000000C804
+          400B53697A652E4865696768740500000000000000C804401453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646
+          3143314331430756697369626C65080C43616C6C6F7574576964746805000000
+          00000000B803400D43616C6C6F75744C656E6774680500000000000000B00240
+          0000545046300A5452656374616E676C6500095374796C654E616D65060E7374
+          617475736261727374796C6505416C69676E070643656E7465720C436C697043
+          68696C6472656E090A46696C6C2E436F6C6F7207097846464439443944390A53
+          697A652E57696474680500000000000000C804400B53697A652E486569676874
+          0500000000000000C804401453697A652E506C6174666F726D44656661756C74
+          080C5374726F6B652E436F6C6F7207097846464536453645360756697369626C
+          6508000A5452656374616E676C650005416C69676E0706436C69656E74094669
+          6C6C2E4B696E6407044E6F6E650C4D617267696E732E4C656674050000000000
+          000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D6172
+          67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F
+          74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000
+          0000C004400B53697A652E4865696768740500000000000000C004401453697A
+          652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207
+          0978464644304430443000095453697A654772697000095374796C654E616D65
+          060873697A656772697005416C69676E07055269676874064C6F636B65640907
+          48697454657374080C4D617267696E732E4C6566740500000000000000800040
+          0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E
+          526967687405000000000000008000400E4D617267696E732E426F74746F6D05
+          000000000000008000400A506F736974696F6E2E580500000000000000D00340
+          0A506F736974696F6E2E5905000000000000008000400A53697A652E57696474
+          680500000000000000A003400B53697A652E4865696768740500000000000000
+          B004401453697A652E506C6174666F726D44656661756C740800000000545046
+          300A5452656374616E676C6500095374796C654E616D65060C746F6F6C626172
+          7374796C650C436C69704368696C6472656E090A46696C6C2E436F6C6F720709
+          7846463438343834380748697454657374080A506F736974696F6E2E58050000
+          0000000000C607400A506F736974696F6E2E590500000000000000EE07400A53
+          697A652E57696474680500000000000000C804400B53697A652E486569676874
+          0500000000000000C804401453697A652E506C6174666F726D44656661756C74
+          080C5374726F6B652E436F6C6F7207097846463143314331430756697369626C
+          6508000A5452656374616E676C650005416C69676E0706436C69656E74094669
+          6C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C
+          656674050000000000000080FF3F0B4D617267696E732E546F70050000000000
+          000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D
+          617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E5769
+          6474680500000000000000C004400B53697A652E486569676874050000000000
+          0000C004401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F7207097846463539353935390000005450463007544C61796F
+          757400095374796C654E616D650613457870616E646572427574746F6E537479
+          6C6505416C69676E070643656E7465720C50616464696E672E4C656674050000
+          00000000008000400B50616464696E672E546F7005000000000000008000400D
+          50616464696E672E526967687405000000000000008000400E50616464696E67
+          2E426F74746F6D05000000000000008000400C4D617267696E732E4C65667405
+          000000000000008001400B4D617267696E732E546F7005000000000000008001
+          400D4D617267696E732E526967687405000000000000008001400E4D61726769
+          6E732E426F74746F6D05000000000000008001400A53697A652E576964746805
+          000000000000009205400B53697A652E4865696768740500000000000000D003
+          401453697A652E506C6174666F726D44656661756C74080756697369626C6508
+          085461624F72646572020B000854456C6C6970736500095374796C654E616D65
+          060A6261636B67726F756E6405416C69676E0708436F6E74656E74730946696C
+          6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E50
+          6F696E74730E0105436F6C6F720709784646353835383538064F666673657405
+          00000000000000000000000105436F6C6F720709784646353135313531064F66
+          66736574050000000000A01BF3FD3F000105436F6C6F72070978464634393439
+          3439064F6666736574050000000000000080FF3F0000064C6F636B6564090748
+          697454657374080A53697A652E576964746805000000000000009205400B5369
+          7A652E4865696768740500000000000000D003401453697A652E506C6174666F
+          726D44656661756C74080C5374726F6B652E436F6C6F72070978464636413641
+          3641000F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000
+          000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F
+          720A537461727456616C756507097846463538353835380953746F7056616C75
+          6507097846463438343834380754726967676572062049734D6F7573654F7665
+          723D747275653B4973507265737365643D66616C736500000F54436F6C6F7241
+          6E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C5072
+          6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75
+          6507097846463438343834380953746F7056616C756507097846463538353835
+          380754726967676572062149734D6F7573654F7665723D66616C73653B497350
+          7265737365643D66616C736500000F54436F6C6F72416E696D6174696F6E0008
+          4475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65
+          060A46696C6C2E436F6C6F720A537461727456616C7565070978464634383438
+          34380953746F7056616C75650709784646343234323432075472696767657206
+          2049734D6F7573654F7665723D66616C73653B4973507265737365643D747275
+          6500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000
+          000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F
+          720A537461727456616C756507097846463432343234320953746F7056616C75
+          6507097846463438343834380754726967676572061F49734D6F7573654F7665
+          723D747275653B4973507265737365643D7472756500000854456C6C69707365
+          0005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507
+          48697454657374080C4D617267696E732E4C65667405000000000000008000C0
+          0B4D617267696E732E546F7005000000000000008000C00D4D617267696E732E
+          526967687405000000000000008000C00E4D617267696E732E426F74746F6D05
+          000000000000008000C00A53697A652E576964746805000000000000009A0540
+          0B53697A652E4865696768740500000000000000F003401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464635
+          3135313531000854456C6C697073650005416C69676E0706436C69656E740946
+          696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E
+          4C656674050000000000000080FF3F0B4D617267696E732E546F700500000000
+          00000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E
+          4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E57
+          6964746805000000000000009605400B53697A652E4865696768740500000000
+          000000E003401453697A652E506C6174666F726D44656661756C74080C537472
+          6F6B652E436F6C6F720709784646314331433143000000000554506174680005
+          416C69676E0708436F6E74656E747309446174612E506174680A640000000800
+          0000000000001DFA7743664E0D4401000000B032464364C3034401000000F668
+          B94375C3A843010000004E92084464C303440100000019A4F74319940E440100
+          0000A4D0B9434E12D043010000001DFA7743664E0D4403000000000000000000
+          0000064C6F636B6564090748697454657374080C4D617267696E732E4C656674
+          05000000000000008001400B4D617267696E732E546F700500000000000000C0
+          01400D4D617267696E732E526967687405000000000000008001400E4D617267
+          696E732E426F74746F6D0500000000000000C001400A53697A652E5769647468
+          05000000000000008205400B53697A652E4865696768740500000000000000E0
+          02401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E
+          4B696E6407044E6F6E65000F54436F6C6F72416E696D6174696F6E0008447572
+          6174696F6E05000000000017B7D1F13F0C50726F70657274794E616D65060A46
+          696C6C2E436F6C6F720A537461727456616C7565070978303045304530453009
+          53746F7056616C756507097846464530453045300754726967676572060F4973
+          457870616E6465643D7472756500000F54436F6C6F72416E696D6174696F6E00
+          084475726174696F6E05000000000017B7D1F13F07496E7665727365090C5072
+          6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75
+          6507097830304530453045300953746F7056616C756507097846464530453045
+          30075472696767657206104973457870616E6465643D66616C73650000000554
+          506174680005416C69676E0708436F6E74656E747309446174612E506174680A
+          640000000800000000000000C540F843D94EAB43010000004E920844DD64BE43
+          01000000FED4BA4319940E4401000000B0324643DD64BE4301000000B6337943
+          75C3A84301000000506DBA4358D9F54301000000C540F843D94EAB4303000000
+          00000000000000000A46696C6C2E436F6C6F720709783030453045304530064C
+          6F636B6564090748697454657374080C4D617267696E732E4C65667405000000
+          000000008001400B4D617267696E732E546F700500000000000000C001400D4D
+          617267696E732E526967687405000000000000008001400E4D617267696E732E
+          426F74746F6D0500000000000000C001400A53697A652E576964746805000000
+          000000008205400B53697A652E4865696768740500000000000000E002401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F
+          6E05000000000017B7D1F13F0C50726F70657274794E616D65060A46696C6C2E
+          436F6C6F720A537461727456616C756507097830304530453045300953746F70
+          56616C7565070978464645304530453007547269676765720610497345787061
+          6E6465643D66616C736500000F54436F6C6F72416E696D6174696F6E00084475
+          726174696F6E05000000000017B7D1F13F07496E7665727365090C50726F7065
+          7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709
+          7830304530453045300953746F7056616C756507097846464530453045300754
+          726967676572060F4973457870616E6465643D74727565000000005450463007
+          544C61796F757400095374796C654E616D65060D657870616E6465727374796C
+          6505416C69676E070643656E7465720A53697A652E5769647468050000000000
+          00009F06400B53697A652E4865696768740500000000000000F205401453697A
+          652E506C6174666F726D44656661756C74080756697369626C6508085461624F
+          72646572020C000A5452656374616E676C650005416C69676E0708436F6E7465
+          6E74730A46696C6C2E436F6C6F72070978464634383438343807486974546573
+          74080A53697A652E576964746805000000000000009F06400B53697A652E4865
+          696768740500000000000000F205401453697A652E506C6174666F726D446566
+          61756C74080C5374726F6B652E436F6C6F720709784646314331433143000A54
+          52656374616E676C650005416C69676E0706436C69656E740946696C6C2E4B69
+          6E6407044E6F6E650C4D617267696E732E4C656674050000000000000080FF3F
+          0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E732E
+          5269676874050000000000000080FF3F0E4D617267696E732E426F74746F6D05
+          0000000000000080FF3F0A53697A652E576964746805000000000000009D0640
+          0B53697A652E4865696768740500000000000000EE05401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464635
+          393539353900000005545465787400095374796C654E616D6506047465787405
+          416C69676E0703546F70064C6F636B6564090748697454657374080C4D617267
+          696E732E4C6566740500000000000000C803400A506F736974696F6E2E580500
+          000000000000C803400A53697A652E576964746805000000000000008606400B
+          53697A652E4865696768740500000000000000C803401453697A652E506C6174
+          666F726D44656661756C7408165465787453657474696E67732E466F6E74436F
+          6C6F720709784646463146314631155465787453657474696E67732E576F7264
+          5772617008000F54457870616E646572427574746F6E00095374796C654E616D
+          650606627574746F6E05416C69676E07044C656674064C6F636B6564090C4D61
+          7267696E732E4C6566740500000000000000C803C00A506F736974696F6E2E58
+          0500000000000000C803C00A53697A652E57696474680500000000000000C803
+          400B53697A652E4865696768740500000000000000C803401453697A652E506C
+          6174666F726D44656661756C740800000954436865636B426F7800095374796C
+          654E616D650608636865636B626F7805416C69676E070552696768740843616E
+          466F63757308064C6F636B6564090A506F736974696F6E2E5805000000000000
+          00DA05400A53697A652E57696474680500000000000000C803400B53697A652E
+          4865696768740500000000000000C803401453697A652E506C6174666F726D44
+          656661756C7408000000005450463007544C61796F757400095374796C654E61
+          6D65060D67726F7570626F787374796C6505416C69676E070643656E7465720C
+          50616464696E672E4C65667405000000000000008000400B50616464696E672E
+          546F7005000000000000008002400D50616464696E672E526967687405000000
+          000000008000400E50616464696E672E426F74746F6D05000000000000008000
+          400A53697A652E576964746805000000000000008706400B53697A652E486569
+          6768740500000000000000CC05401453697A652E506C6174666F726D44656661
+          756C74080756697369626C6508085461624F72646572020D000A545265637461
+          6E676C6500095374796C654E616D65060A6261636B67726F756E6405416C6967
+          6E0706436C69656E740946696C6C2E4B696E6407044E6F6E65064C6F636B6564
+          090748697454657374080A53697A652E57696474680500000000000000830640
+          0B53697A652E4865696768740500000000000000B805401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464645
+          36453645360005545465787400095374796C654E616D65060474657874084175
+          746F53697A65090A436C6970506172656E7409064C6F636B6564090748697454
+          657374080A506F736974696F6E2E580500000000000000F002400A506F736974
+          696F6E2E5905000000000000008002C00A53697A652E57696474680500000000
+          0000ECE103400B53697A652E48656967687405000000000000D8F30240145369
+          7A652E506C6174666F726D44656661756C740804546578740604546578741654
+          65787453657474696E67732E466F6E74436F6C6F720709784646303930393039
+          155465787453657474696E67732E576F72645772617008000000005450463007
+          544C61796F757400095374796C654E616D6506107370656564627574746F6E73
+          74796C6505416C69676E070643656E7465720A53697A652E5769647468050000
+          00000000009205400B53697A652E4865696768740500000000000000D0034014
+          53697A652E506C6174666F726D44656661756C74080756697369626C65080854
+          61624F72646572020E000A5452656374616E676C6500095374796C654E616D65
+          060A6261636B67726F756E6405416C69676E0708436F6E74656E74730946696C
+          6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E50
+          6F696E74730E0105436F6C6F720709784646353835383538064F666673657405
+          00000000000000000000000105436F6C6F720709784646353135313531064F66
+          66736574050000000000A01BF3FD3F000105436F6C6F72070978464634393439
+          3439064F6666736574050000000000000080FF3F0000064C6F636B6564090748
+          697454657374080C4D617267696E732E4C65667405000000000000008000400B
+          4D617267696E732E546F7005000000000000008000400D4D617267696E732E52
+          6967687405000000000000008000400E4D617267696E732E426F74746F6D0500
+          0000000000008000400A53697A652E576964746805000000000000008A05400B
+          53697A652E4865696768740500000000000000B003401453697A652E506C6174
+          666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463641
+          36413641000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
+          0000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F
+          6C6F720A537461727456616C756507097846463538353835380953746F705661
+          6C756507097846463438343834380754726967676572062049734D6F7573654F
+          7665723D747275653B4973507265737365643D66616C736500000F54436F6C6F
+          72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C
+          50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172745661
+          6C756507097846463438343834380953746F7056616C75650709784646353835
+          3835380754726967676572062149734D6F7573654F7665723D66616C73653B49
+          73507265737365643D66616C736500000F54436F6C6F72416E696D6174696F6E
+          00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E61
+          6D65060A46696C6C2E436F6C6F720A537461727456616C756507097846463438
+          343834380953746F7056616C7565070978464634323432343207547269676765
+          72062049734D6F7573654F7665723D66616C73653B4973507265737365643D74
+          72756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
+          0000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F
+          6C6F720A537461727456616C756507097846463432343234320953746F705661
+          6C756507097846463438343834380754726967676572061F49734D6F7573654F
+          7665723D747275653B4973507265737365643D7472756500000A545265637461
+          6E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E
+          6F6E650748697454657374080C4D617267696E732E4C65667405000000000000
+          008000C00B4D617267696E732E546F7005000000000000008000C00D4D617267
+          696E732E526967687405000000000000008000C00E4D617267696E732E426F74
+          746F6D05000000000000008000C00A53697A652E576964746805000000000000
+          009205400B53697A652E4865696768740500000000000000D003401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
+          784646353135313531000A5452656374616E676C650005416C69676E0706436C
+          69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61
+          7267696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F
+          70050000000000000080FF3F0D4D617267696E732E5269676874050000000000
+          000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A
+          53697A652E576964746805000000000000008E05400B53697A652E4865696768
+          740500000000000000C003401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F720709784646314331433143000000000654
+          476C79706800095374796C654E616D65060A676C7970687374796C650C4D6172
+          67696E732E4C6566740500000000000000A001400B4D617267696E732E546F70
+          05000000000000008000400D4D617267696E732E526967687405000000000000
+          0080FF3F0E4D617267696E732E426F74746F6D05000000000000008000400541
+          6C69676E07044C6566740A53697A652E57696474680500000000000000800340
+          0B53697A652E48656967687405000000000000008003401453697A652E506C61
+          74666F726D44656661756C7408000005545465787400095374796C654E616D65
+          06047465787405416C69676E0706436C69656E74064C6F636B65640907486974
+          54657374080C4D617267696E732E4C6566740500000000000000C001400B4D61
+          7267696E732E546F7005000000000000008000400D4D617267696E732E526967
+          68740500000000000000C001400E4D617267696E732E426F74746F6D05000000
+          000000008000400A53697A652E57696474680500000000000000F404400B5369
+          7A652E4865696768740500000000000000B003401453697A652E506C6174666F
+          726D44656661756C7408165465787453657474696E67732E466F6E74436F6C6F
+          720708636C6157686974650000005450463007544C61796F757400095374796C
+          654E616D65060D73706C69747465727374796C650A506F736974696F6E2E5805
+          00000000000000C607400A506F736974696F6E2E590500000000000000EE0740
+          0A53697A652E57696474680500000000000000C804400B53697A652E48656967
+          68740500000000000000C804401453697A652E506C6174666F726D4465666175
+          6C74080756697369626C6508085461624F72646572020F000854456C6C697073
+          6500095374796C654E616D6506046772697005416C69676E07034669740A4669
+          6C6C2E436F6C6F720709784646314331433143064C6F636B6564090748697454
+          657374080A53697A652E57696474680500000000000000C804400B53697A652E
+          4865696768740500000000000000C804401453697A652E506C6174666F726D44
+          656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000054504630
+          07544C61796F757400095374796C654E616D65060A6C6162656C7374796C6505
+          416C69676E070643656E7465720A53697A652E57696474680500000000000000
+          C404400B53697A652E4865696768740500000000000000A003401453697A652E
+          506C6174666F726D44656661756C74080756697369626C6508085461624F7264
+          657202100005545465787400095374796C654E616D6506047465787405416C69
+          676E0706436C69656E74064C6F636B6564090748697454657374080A53697A65
+          2E57696474680500000000000000C404400B53697A652E486569676874050000
+          0000000000A003401453697A652E506C6174666F726D44656661756C74080000
+          005450463007544C61796F757400095374796C654E616D65060F76616C75656C
+          6162656C7374796C6505416C69676E070643656E7465720A53697A652E576964
+          74680500000000000000BE05400B53697A652E48656967687405000000000000
+          00C003401453697A652E506C6174666F726D44656661756C7408075669736962
+          6C6508085461624F726465720211000A5452656374616E676C650005416C6967
+          6E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846463139313931
+          390748697454657374080A53697A652E57696474680500000000000000BE0540
+          0B53697A652E4865696768740500000000000000C003401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464633
+          3933393339000005545465787400095374796C654E616D650604746578740541
+          6C69676E0706436C69656E740748697454657374080C4D617267696E732E4C65
+          6674050000000000000080FF3F0B4D617267696E732E546F7005000000000000
+          0080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61
+          7267696E732E426F74746F6D050000000000000080FF3F0A53697A652E576964
+          74680500000000000000BA05400B53697A652E48656967687405000000000000
+          00B003401453697A652E506C6174666F726D44656661756C7408165465787453
+          657474696E67732E466F6E742E53697A650500000000000000A0024016546578
+          7453657474696E67732E466F6E74436F6C6F7207097846464541454145410000
+          005450463007544C61796F757400095374796C654E616D65060C746162697465
+          6D7374796C6505416C69676E070643656E7465720A53697A652E576964746805
+          00000000000000B804400B53697A652E4865696768740500000000000000A003
+          401453697A652E506C6174666F726D44656661756C74080756697369626C6508
+          085461624F726465720212000A5452656374616E676C6500095374796C654E61
+          6D650603746F7005416C69676E0708436F6E74656E74730C436C69704368696C
+          6472656E090A46696C6C2E436F6C6F720709784646343834383438064C6F636B
+          6564090748697454657374080553696465730B03546F70044C65667405526967
+          6874000A53697A652E57696474680500000000000000B804400B53697A652E48
+          65696768740500000000000000A003401453697A652E506C6174666F726D4465
+          6661756C74080C5374726F6B652E436F6C6F720709784646314331433143000F
+          54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000000017
+          B7D1F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374
+          61727456616C756507097846463438343834380953746F7056616C7565070978
+          46463338333833380754726967676572062149734D6F7573654F7665723D7472
+          75653B497353656C65637465643D66616C736500000F54436F6C6F72416E696D
+          6174696F6E00084475726174696F6E05000000000017B7D1F13F0C50726F7065
+          7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709
+          7846463338333833380953746F7056616C756507097846463438343834380754
+          726967676572062249734D6F7573654F7665723D66616C73653B497353656C65
+          637465643D66616C736500000F54436F6C6F72416E696D6174696F6E00084475
+          726174696F6E050000000000BD3786EB3F0C50726F70657274794E616D65060A
+          46696C6C2E436F6C6F720A537461727456616C75650709784646333833383338
+          0953746F7056616C756507097846463438343834380754726967676572061049
+          7353656C65637465643D66616C736500000F54436F6C6F72416E696D6174696F
+          6E00084475726174696F6E050000000000ACC5A7EE3F0C50726F70657274794E
+          616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978464634
+          38343834380953746F7056616C75650709784646353835383538075472696767
+          6572060F497353656C65637465643D7472756500000E5452656374416E696D61
+          74696F6E00084475726174696F6E050000000000ACC5A7EE3F0C50726F706572
+          74794E616D6506074D617267696E730E537461727456616C75652E546F700500
+          00000000000080FF3F10537461727456616C75652E5269676874050000000000
+          000080FFBF0F53746F7056616C75652E5269676874050000000000000080FFBF
+          0754726967676572060F497353656C65637465643D7472756500000E54526563
+          74416E696D6174696F6E00084475726174696F6E050000000000ACC5A7EE3F07
+          496E7665727365090C50726F70657274794E616D6506074D617267696E730E53
+          7461727456616C75652E546F70050000000000000080FF3F1053746172745661
+          6C75652E5269676874050000000000000080FFBF0F53746F7056616C75652E52
+          69676874050000000000000080FFBF07547269676765720610497353656C6563
+          7465643D66616C736500000654476C79706800095374796C654E616D65060A67
+          6C7970687374796C650C4D617267696E732E4C65667405000000000000008001
+          400D4D617267696E732E526967687405000000000000008001C005416C69676E
+          07044C6566740A53697A652E576964746805000000000000008003400B53697A
+          652E48656967687405000000000000008003401453697A652E506C6174666F72
+          6D44656661756C7408000005545465787400095374796C654E616D6506047465
+          787405416C69676E0706436C69656E74064C6F636B6564090748697454657374
+          080C4D617267696E732E4C65667405000000000000008002400B4D617267696E
+          732E546F700500000000000000C000400D4D617267696E732E52696768740500
+          0000000000008002400E4D617267696E732E426F74746F6D0500000000000000
+          8000400A53697A652E57696474680500000000000000F003400B53697A652E48
+          65696768740500000000000000F002401453697A652E506C6174666F726D4465
+          6661756C7408045465787406046974656D165465787453657474696E67732E46
+          6F6E74436F6C6F720709784646444544454445155465787453657474696E6773
+          2E576F726457726170080000000A5452656374616E676C6500095374796C654E
+          616D650606626F74746F6D05416C69676E0708436F6E74656E74730C436C6970
+          4368696C6472656E090A46696C6C2E436F6C6F72070978464645444544454406
+          4C6F636B6564090748697454657374080553696465730B044C65667406426F74
+          746F6D055269676874000A53697A652E57696474680500000000000000B80440
+          0B53697A652E4865696768740500000000000000A003401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464645
+          3245324532000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
+          050000000000BD3786EB3F0C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846464437443744370953746F7056
+          616C7565070978464646304630463007547269676765720610497353656C6563
+          7465643D66616C736500000F54436F6C6F72416E696D6174696F6E0008447572
+          6174696F6E050000000000ACC5A7EE3F0C50726F70657274794E616D65060A46
+          696C6C2E436F6C6F720A537461727456616C7565070978464646304630463009
+          53746F7056616C756507097846464437443744370754726967676572060F4973
+          53656C65637465643D7472756500000E5452656374416E696D6174696F6E0008
+          4475726174696F6E050000000000ACC5A7EE3F0C50726F70657274794E616D65
+          06074D617267696E730F537461727456616C75652E4C65667405000000000000
+          0080FFBF10537461727456616C75652E5269676874050000000000000080FFBF
+          11537461727456616C75652E426F74746F6D05000000000000008000400E5374
+          6F7056616C75652E4C656674050000000000000080FFBF0F53746F7056616C75
+          652E5269676874050000000000000080FFBF0754726967676572060F49735365
+          6C65637465643D547275650E54726967676572496E7665727365061049735365
+          6C65637465643D66616C736500000654476C79706800095374796C654E616D65
+          060A676C7970687374796C650C4D617267696E732E4C65667405000000000000
+          008001400D4D617267696E732E526967687405000000000000008001C005416C
+          69676E07044C6566740A53697A652E576964746805000000000000008003400B
+          53697A652E48656967687405000000000000008003401453697A652E506C6174
+          666F726D44656661756C7408000005545465787400095374796C654E616D6506
+          047465787405416C69676E0706436C69656E74064C6F636B6564090748697454
+          657374080C4D617267696E732E4C65667405000000000000008002400B4D6172
+          67696E732E546F700500000000000000C000400D4D617267696E732E52696768
+          7405000000000000008002400E4D617267696E732E426F74746F6D0500000000
+          0000008000400A53697A652E57696474680500000000000000F003400B53697A
+          652E4865696768740500000000000000F002401453697A652E506C6174666F72
+          6D44656661756C74080454657874060454657874165465787453657474696E67
+          732E466F6E74436F6C6F72070978464631373137313715546578745365747469
+          6E67732E576F7264577261700800000000545046300A5452656374616E676C65
+          00095374796C654E616D65060B746162646F747374796C6505416C69676E0706
+          43656E7465720A46696C6C2E436F6C6F72070978464631433143314307486974
+          54657374080A53697A652E57696474680500000000000000C804400B53697A65
+          2E4865696768740500000000000000C804401453697A652E506C6174666F726D
+          44656661756C74080B5374726F6B652E4B696E6407044E6F6E65075669736962
+          6C6508000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500
+          0000000018B7D1F23F0C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C756507097846463143314331430953746F7056616C
+          756507097846464644464446440754726967676572060F497353656C65637465
+          643D747275650E54726967676572496E76657273650610497353656C65637465
+          643D66616C73650000005450463007544C61796F757400095374796C654E616D
+          65060F746162636F6E74726F6C7374796C6505416C69676E070643656E746572
+          0A53697A652E576964746805000000000000008E06400B53697A652E48656967
+          6874050000000000FFFFC905401453697A652E506C6174666F726D4465666175
+          6C74080756697369626C6508085461624F726465720214000A5452656374616E
+          676C650005416C69676E0708436F6E74656E74730946696C6C2E4B696E640704
+          4E6F6E650748697454657374080A53697A652E57696474680500000000000000
+          8E06400B53697A652E486569676874050000000000FFFFC905401453697A652E
+          506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978
+          3830383038303830000A5452656374616E676C650005416C69676E0706436C69
+          656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D6172
+          67696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F70
+          050000000000000080FF3F0D4D617267696E732E526967687405000000000000
+          0080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53
+          697A652E576964746805000000000000008C06400B53697A652E486569676874
+          050000000000FFFFC505401453697A652E506C6174666F726D44656661756C74
+          080B5374726F6B652E4B696E6407044E6F6E65000000005450463007544C6179
+          6F757400095374796C654E616D65060D636865636B626F787374796C6505416C
+          69676E070643656E7465720A53697A652E57696474680500000000000000F205
+          400B53697A652E4865696768740500000000000000A803401453697A652E506C
+          6174666F726D44656661756C74080756697369626C6508085461624F72646572
+          02150007544C61796F75740005416C69676E07044C6566740A53697A652E5769
+          6474680500000000000000A003400B53697A652E486569676874050000000000
+          0000A803401453697A652E506C6174666F726D44656661756C7408000A545265
+          6374616E676C6500095374796C654E616D65060A6261636B67726F756E640541
+          6C69676E070643656E7465720A46696C6C2E436F6C6F72070978464645364536
+          4536064C6F636B6564090748697454657374080A53697A652E57696474680500
+          000000000000D002400B53697A652E4865696768740500000000000000D00240
+          1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F
+          6C6F720709784646423042304230000A5452656374616E676C650005416C6967
+          6E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507486974546573
+          74080C4D617267696E732E4C656674050000000000000080FF3F0B4D61726769
+          6E732E546F70050000000000000080FF3F0D4D617267696E732E526967687405
+          0000000000000080FF3F0E4D617267696E732E426F74746F6D05000000000000
+          0080FF3F0A53697A652E57696474680500000000000000B002400B53697A652E
+          4865696768740500000000000000B002401453697A652E506C6174666F726D44
+          656661756C74080C5374726F6B652E436F6C6F72070978464645434543454300
+          000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000
+          00CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
+          537461727456616C756507097846464530453045300953746F7056616C756507
+          097846464344434443440754726967676572061049734D6F7573654F7665723D
+          7472756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
+          050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846464344434443440953746F7056
+          616C756507097846464530453045300754726967676572061149734D6F757365
+          4F7665723D66616C7365000005545061746800095374796C654E616D65060963
+          6865636B6D61726B05416C69676E070643656E74657209446174612E50617468
+          0A3C0100001A0000000000000066467E449A19B443010000006666EB4300A062
+          440200000066E6DE4300E068440200000066A6CA4300E06844020000006626BE
+          4300A0624401000000CDCCDC4066460544020000003833333F99B90344020000
+          003833333FCC2C014402000000CDCCDC40FF3FFF43010000000000F04233B3C6
+          43020000006666FC429999C34302000000666608439999C343020000009A990E
+          4333B3C6430100000067E6D14366A62844020000003473D343CC6C2944020000
+          000100D643CC6C294402000000CD8CD74366A628440100000034535C44FE7F60
+          430200000001E05D44CB4C5A4302000000CE6C6044CB4C5A43020000009AF961
+          44FE7F60430100000000407E44CDCCA8430200000033D37F4467E6AB43020000
+          0033D37F440000B1430200000066467E449A19B4430300000066467E449A19B4
+          430A46696C6C2E436F6C6F720707636C614E756C6C064C6F636B656409074869
+          7454657374080A53697A652E576964746805000000000000009002400B53697A
+          652E48656967687405000000000000009002401453697A652E506C6174666F72
+          6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F54436F
+          6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB
+          3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C75650707636C614E756C6C0953746F7056616C75650708636C61426C61
+          636B0754726967676572060E4973436865636B65643D7472756500000F54436F
+          6C6F72416E696D6174696F6E00084475726174696F6E05000000000018B7D1F1
+          3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C75650708636C61426C61636B0953746F7056616C75650707636C614E75
+          6C6C0754726967676572060F4973436865636B65643D66616C73650000000000
+          05545465787400095374796C654E616D6506047465787405416C69676E070643
+          6C69656E74064C6F636B6564090748697454657374080C4D617267696E732E4C
+          656674050000000000000080FF3F0B4D617267696E732E546F70050000000000
+          00008000400D4D617267696E732E5269676874050000000000000080FF3F0A53
+          697A652E57696474680500000000000000C605400B53697A652E486569676874
+          05000000000000009803401453697A652E506C6174666F726D44656661756C74
+          080454657874060454657874165465787453657474696E67732E466F6E74436F
+          6C6F7207097846463039303930390000005450463007544C61796F7574000953
+          74796C654E616D650610726164696F627574746F6E7374796C6505416C69676E
+          070643656E7465720A53697A652E57696474680500000000000000F205400B53
+          697A652E4865696768740500000000000000A803401453697A652E506C617466
+          6F726D44656661756C74080756697369626C6508085461624F72646572021600
+          07544C61796F75740005416C69676E07044C6566740A53697A652E5769647468
+          0500000000000000A003400B53697A652E4865696768740500000000000000A8
+          03401453697A652E506C6174666F726D44656661756C7408000854456C6C6970
+          736500095374796C654E616D65060A6261636B67726F756E6405416C69676E07
+          0643656E7465720A46696C6C2E436F6C6F720709784646443444344434064C6F
+          636B6564090748697454657374080A53697A652E576964746805000000000000
+          00D002400B53697A652E4865696768740500000000000000D002401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
+          784646454145414541000B54476C6F774566666563740008536F66746E657373
+          0500000000009A9999FD3F09476C6F77436F6C6F720709784646363543384530
+          074F706163697479050000000000000080FF3F0754726967676572060E497346
+          6F63757365643D7472756507456E61626C65640800000854456C6C6970736500
+          05416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748
+          697454657374080C4D617267696E732E4C656674050000000000000080FF3F0B
+          4D617267696E732E546F70050000000000000080FF3F0D4D617267696E732E52
+          69676874050000000000000080FF3F0E4D617267696E732E426F74746F6D0500
+          00000000000080FF3F0A53697A652E57696474680500000000000000B002400B
+          53697A652E4865696768740500000000000000B002401453697A652E506C6174
+          666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846464246
+          4246424600000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
+          050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846464434443444340953746F7056
+          616C756507097846463638363836380754726967676572061049734D6F757365
+          4F7665723D7472756500000F54436F6C6F72416E696D6174696F6E0008447572
+          6174696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46
+          696C6C2E436F6C6F720A537461727456616C7565070978464636383638363809
+          53746F7056616C75650709784646443444344434075472696767657206114973
+          4D6F7573654F7665723D66616C736500000854456C6C6970736500095374796C
+          654E616D650609636865636B6D61726B05416C69676E0706436C69656E740A46
+          696C6C2E436F6C6F720707636C614E756C6C064C6F636B656409074869745465
+          7374080C4D617267696E732E4C6566740500000000000000C000400B4D617267
+          696E732E546F700500000000000000C000400D4D617267696E732E5269676874
+          0500000000000000C000400E4D617267696E732E426F74746F6D050000000000
+          0000C000400A53697A652E57696474680500000000000000E001400B53697A65
+          2E4865696768740500000000000000E001401453697A652E506C6174666F726D
+          44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C75650707636C614E756C6C0953746F7056616C7565070978464635363539
+          42450754726967676572060E4973436865636B65643D7472756500000F54436F
+          6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB
+          3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C756507097846463536353942450953746F7056616C75650707636C614E
+          756C6C0754726967676572060F4973436865636B65643D66616C736500000000
+          0005545465787400095374796C654E616D6506047465787405416C69676E0706
+          436C69656E74064C6F636B6564090748697454657374080C4D617267696E732E
+          4C656674050000000000000080FF3F0B4D617267696E732E546F700500000000
+          0000008000400D4D617267696E732E5269676874050000000000000080FF3F0A
+          53697A652E57696474680500000000000000C605400B53697A652E4865696768
+          7405000000000000009803401453697A652E506C6174666F726D44656661756C
+          740804546578740604546578740000005450463007544C61796F757400095374
+          796C654E616D65061070726F67726573736261727374796C6505416C69676E07
+          0643656E7465720A53697A652E576964746805000000000000009005400B5369
+          7A652E486569676874050000000000FFFFF304401453697A652E506C6174666F
+          726D44656661756C74080756697369626C6508085461624F726465720217000A
+          5452656374616E676C6500095374796C654E616D650605747261636B05416C69
+          676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978464631463146
+          3146064C6F636B6564090748697454657374080A53697A652E57696474680500
+          0000000000009005400B53697A652E486569676874050000000000FFFFF30440
+          1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F
+          6C6F720709784646334433443344000A5452656374616E676C6500095374796C
+          654E616D65060A68696E64696361746F7205416C69676E07044C656674094669
+          6C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E
+          506F696E74730E0105436F6C6F720709784646323637324238064F6666736574
+          0500000000000000000000000105436F6C6F720709784646303634353735064F
+          6666736574050000000000000080FF3F0000064C6F636B656409074869745465
+          7374080C4D617267696E732E4C65667405000000000000008000400B4D617267
+          696E732E546F7005000000000000008000400D4D617267696E732E5269676874
+          05000000000000008000400E4D617267696E732E426F74746F6D050000000000
+          00008000400A506F736974696F6E2E5805000000000000008000400A506F7369
+          74696F6E2E5905000000000000008000400A53697A652E576964746805000000
+          00000000C804400B53697A652E486569676874050000000000FEFFFF03401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E650007544C61796F75740005416C69676E0706436C69656E740C43
+          6C69704368696C6472656E09064C6F636B6564090C4D617267696E732E4C6566
+          7405000000000000008000400D4D617267696E732E5269676874050000000000
+          00008000400A53697A652E57696474680500000000000000B804400B53697A65
+          2E486569676874050000000000FEFFFF03401453697A652E506C6174666F726D
+          44656661756C7408000A5452656374616E676C650005416C69676E0708566572
+          746963616C0946696C6C2E4B696E6407084772616469656E741446696C6C2E47
+          72616469656E742E506F696E74730E0105436F6C6F7207097830303236373242
+          38064F66667365740500000000000000000000000105436F6C6F720709784239
+          323038314433064F6666736574050000000000000080FE3F000105436F6C6F72
+          0709783030303835313838064F6666736574050000000000000080FF3F00001C
+          46696C6C2E4772616469656E742E53746F70506F736974696F6E2E5805000000
+          0000000080FF3F1C46696C6C2E4772616469656E742E53746F70506F73697469
+          6F6E2E590500000000000000000000064C6F636B656409074869745465737408
+          0A506F736974696F6E2E580500000000000000C808400A53697A652E57696474
+          68050000000000FFFFF704400B53697A652E486569676874050000000000FEFF
+          FF03401453697A652E506C6174666F726D44656661756C74080B5374726F6B65
+          2E4B696E6407044E6F6E65075852616469757305000000000000009002400759
+          5261646975730500000000000000900240000F54466C6F6174416E696D617469
+          6F6E0007456E61626C656409084475726174696F6E0500000000000000800140
+          044C6F6F70090C50726F70657274794E616D65060A506F736974696F6E2E780A
+          537461727456616C75650500000000000000C804C00953746F7056616C756505
+          00000000000000C808400754726967676572060E497356697369626C653D7472
+          756500000000000A5452656374616E676C6500095374796C654E616D65060A76
+          696E64696361746F7205416C69676E0706426F74746F6D0946696C6C2E4B696E
+          6407084772616469656E741446696C6C2E4772616469656E742E506F696E7473
+          0E0105436F6C6F720709784646323637324238064F6666736574050000000000
+          0000000000000105436F6C6F720709784646303634353735064F666673657405
+          0000000000000080FF3F00001C46696C6C2E4772616469656E742E53746F7050
+          6F736974696F6E2E58050000000000000080FF3F1C46696C6C2E477261646965
+          6E742E53746F70506F736974696F6E2E590500000000000000000000064C6F63
+          6B6564090748697454657374080C4D617267696E732E4C656674050000000000
+          00008000400B4D617267696E732E546F7005000000000000008000400D4D6172
+          67696E732E526967687405000000000000008000400E4D617267696E732E426F
+          74746F6D05000000000000008000400A506F736974696F6E2E58050000000000
+          00008000400A506F736974696F6E2E59050000000000FFFF9704400A53697A65
+          2E576964746805000000000000008805400B53697A652E486569676874050000
+          0000000000A803401453697A652E506C6174666F726D44656661756C74080B53
+          74726F6B652E4B696E6407044E6F6E650007544C61796F75740005416C69676E
+          0706436C69656E740C436C69704368696C6472656E09064C6F636B6564090B4D
+          617267696E732E546F7005000000000000008000400E4D617267696E732E426F
+          74746F6D05000000000000008000400A53697A652E5769647468050000000000
+          00008805400B53697A652E48656967687405000000000000008803401453697A
+          652E506C6174666F726D44656661756C7408000A5452656374616E676C650005
+          416C69676E070A486F72697A6F6E74616C0946696C6C2E4B696E640708477261
+          6469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F6C
+          6F720709783030323637324238064F6666736574050000000000000000000000
+          0105436F6C6F720709784239323038314433064F666673657405000000000000
+          0080FE3F000105436F6C6F720709783030303835313838064F66667365740500
+          00000000000080FF3F0000064C6F636B6564090748697454657374080C4D6172
+          67696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F70
+          050000000000000080FF3F0D4D617267696E732E526967687405000000000000
+          0080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A50
+          6F736974696F6E2E58050000000000000080FF3F0A506F736974696F6E2E5905
+          00000000000000C804C00A53697A652E57696474680500000000000000840540
+          0B53697A652E4865696768740500000000000000C804401453697A652E506C61
+          74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6507
+          5852616469757305000000000000009002400759526164697573050000000000
+          0000900240000F54466C6F6174416E696D6174696F6E0007456E61626C656409
+          084475726174696F6E0500000000000000800140044C6F6F70090C50726F7065
+          7274794E616D65060A506F736974696F6E2E790A537461727456616C75650500
+          000000000000C808400953746F7056616C75650500000000000000C804C00754
+          726967676572060E497356697369626C653D7472756500000000000000545046
+          3007544C61796F757400095374796C654E616D65060D73697A65677269707374
+          796C6505416C69676E070643656E7465720A53697A652E576964746805000000
+          00000000B803400B53697A652E4865696768740500000000000000B803401453
+          697A652E506C6174666F726D44656661756C74080756697369626C6508085461
+          624F726465720218000654496D616765000E4D756C74695265734269746D6170
+          0E01055769647468020B06486569676874020B03504E470A6D00000089504E47
+          0D0A1A0A0000000D494844520000000B0000000B0806000000A9AC7726000000
+          0473424954080808087C086488000000244944415418956360A036101616FE4F
+          1B13A96732BA89949B8CCB44F24D26642259260300F02112497749387B000000
+          0049454E44AE426082000005416C69676E070643656E746572064C6F636B6564
+          090748697454657374080A53697A652E57696474680500000000000100B00240
+          0B53697A652E4865696768740500000000000100B002401453697A652E506C61
+          74666F726D44656661756C740808577261704D6F646507084F726967696E616C
+          0000005450463007544C61796F757400095374796C654E616D65060F636F6D62
+          6F706F7075707374796C6505416C69676E070643656E7465720C436C69704368
+          696C6472656E09074F7061636974790500000000003333F3FE3F0A53697A652E
+          57696474680500000000000000B805400B53697A652E48656967687405000000
+          00000000EC04401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C6508085461624F726465720219000A5452656374616E676C65000953
+          74796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E74
+          656E74730A46696C6C2E436F6C6F720709784646343834383438064C6F636B65
+          64090748697454657374080A53697A652E57696474680500000000000000B805
+          400B53697A652E4865696768740500000000000000EC04401453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646
+          314331433143000F54466C6F6174416E696D6174696F6E00084475726174696F
+          6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060E506172656E
+          742E4F7061636974790A537461727456616C7565050000000000000000000009
+          53746F7056616C7565050000000000000080FF3F0754726967676572060F4973
+          44726F70446F776E3D747275650E54726967676572496E766572736506104973
+          44726F70446F776E3D66616C7365000000005450463007544C61796F75740009
+          5374796C654E616D65060D74726565766965777374796C6505416C69676E0706
+          43656E7465720A53697A652E5769647468050000000000FFFFE905400B53697A
+          652E48656967687405000000000000008C06401453697A652E506C6174666F72
+          6D44656661756C74080756697369626C6508085461624F72646572021A000A54
+          52656374616E676C6500095374796C654E616D65060A6261636B67726F756E64
+          05416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F720708636C61
+          5768697465064C6F636B6564090748697454657374080C50616464696E672E4C
+          656674050000000000000080FF3F0B50616464696E672E546F70050000000000
+          000080FF3F0D50616464696E672E5269676874050000000000000080FF3F0E50
+          616464696E672E426F74746F6D050000000000000080FF3F0A53697A652E5769
+          647468050000000000FFFFE905400B53697A652E486569676874050000000000
+          00008C06401453697A652E506C6174666F726D44656661756C74080B5374726F
+          6B652E4B696E6407044E6F6E65000A5452656374616E676C650005416C69676E
+          0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374
+          080A53697A652E5769647468050000000000FFFFE505400B53697A652E486569
+          67687405000000000000008A06401453697A652E506C6174666F726D44656661
+          756C74080B5374726F6B652E4B696E6407044E6F6E65000007544C61796F7574
+          0005416C69676E0706436C69656E740A53697A652E5769647468050000000000
+          FFFFE505400B53697A652E48656967687405000000000000008A06401453697A
+          652E506C6174666F726D44656661756C74080007544C61796F75740009537479
+          6C654E616D650607636F6E74656E7405416C69676E0706436C69656E740C436C
+          69704368696C6472656E090C4D617267696E732E4C6566740500000000000000
+          80FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61726769
+          6E732E5269676874050000000000000080FF3F0E4D617267696E732E426F7474
+          6F6D050000000000000080FF3F0A53697A652E5769647468050000000000FFFF
+          C305400B53697A652E4865696768740500000000000000F205401453697A652E
+          506C6174666F726D44656661756C7408000A5452656374616E676C6500095374
+          796C654E616D65060973656C656374696F6E0A46696C6C2E436F6C6F72070978
+          46464536453645360748697454657374080A53697A652E576964746805000000
+          00000000C804400B53697A652E4865696768740500000000000000C804401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E6500000A5452656374616E676C6500095374796C654E616D650610
+          666F637573656473656C656374696F6E0A46696C6C2E436F6C6F720709784646
+          4536453645360748697454657374080A53697A652E5769647468050000000000
+          0000C804400B53697A652E4865696768740500000000000000C804401453697A
+          652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207
+          08636C6157686974650B5374726F6B652E446173680703446F740000000A5453
+          63726F6C6C42617200095374796C654E616D65060A767363726F6C6C62617205
+          416C69676E070552696768740556616C7565050000000000000080FF3F0B536D
+          616C6C4368616E676505000000000000000000000B4F7269656E746174696F6E
+          0708566572746963616C0A506F736974696F6E2E58050000000000FFFFC70540
+          0A53697A652E57696474680500000000000000F002400B53697A652E48656967
+          68740500000000000000F605401453697A652E506C6174666F726D4465666175
+          6C740800000A545363726F6C6C42617200095374796C654E616D65060A687363
+          726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C4368616E67
+          6505000000000000000000000B4F7269656E746174696F6E070A486F72697A6F
+          6E74616C0A506F736974696F6E2E590500000000000000F605400A53697A652E
+          5769647468050000000000FFFFE505400B53697A652E48656967687405000000
+          00000000F002401453697A652E506C6174666F726D44656661756C740800000F
+          54536D616C6C5363726F6C6C42617200095374796C654E616D65060F76736D61
+          6C6C7363726F6C6C62617205416C69676E070552696768740B536D616C6C4368
+          616E676505000000000000000000000B4F7269656E746174696F6E0708566572
+          746963616C0B4D617267696E732E546F70050000000000000080FF3F0D4D6172
+          67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F
+          74746F6D050000000000000080FF3F0A506F736974696F6E2E58050000000000
+          0000C605400A506F736974696F6E2E5905000000000000008000400A53697A65
+          2E576964746805000000000000008002400B53697A652E486569676874050000
+          00000000008002401453697A652E506C6174666F726D44656661756C74080756
+          697369626C650800000F54536D616C6C5363726F6C6C42617200095374796C65
+          4E616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F74
+          746F6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E
+          746174696F6E070A486F72697A6F6E74616C0C4D617267696E732E4C65667405
+          0000000000000080FF3F0D4D617267696E732E52696768740500000000000000
+          80FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F
+          736974696F6E2E5805000000000000008000400A506F736974696F6E2E590500
+          000000000000E205400A53697A652E576964746805000000000000009606400B
+          53697A652E48656967687405000000000000008002401453697A652E506C6174
+          666F726D44656661756C74080756697369626C65080000000000545046300A54
+          52656374616E676C6500095374796C654E616D65061174726565766965776974
+          656D7374796C6505416C69676E070643656E7465720946696C6C2E4B696E6407
+          044E6F6E650748697454657374080A53697A652E576964746805000000000000
+          00AE05400B53697A652E4865696768740500000000000000A004401453697A65
+          2E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E
+          6F6E650756697369626C6508000C545370656564427574746F6E00095374796C
+          654E616D650606627574746F6E05416C69676E07044C6566740C4D617267696E
+          732E4C6566740500000000000000C000400B4D617267696E732E546F70050000
+          0000000000C000400D4D617267696E732E52696768740500000000000000C000
+          400E4D617267696E732E426F74746F6D0500000000000000C000400A506F7369
+          74696F6E2E580500000000000000C000400A506F736974696F6E2E5905000000
+          00000000C000400A53697A652E57696474680500000000000000A003400B5369
+          7A652E48656967687405000000000000008804401453697A652E506C6174666F
+          726D44656661756C74080B5374796C654C6F6F6B7570061B7472656576696577
+          657870616E646572627574746F6E7374796C65155465787453657474696E6773
+          2E5472696D6D696E6707044E6F6E65000007544C61796F75740005416C69676E
+          0708436F6E74656E74730C4D617267696E732E4C6566740500000000000000A0
+          03400A53697A652E576964746805000000000000008605400B53697A652E4865
+          696768740500000000000000A004401453697A652E506C6174666F726D446566
+          61756C7408000954436865636B426F7800095374796C654E616D650605636865
+          636B05416C69676E07044C6566740843616E466F637573081244697361626C65
+          466F637573456666656374090A53697A652E57696474680500000000000000A0
+          03400B53697A652E4865696768740500000000000000A004401453697A652E50
+          6C6174666F726D44656661756C740800000654476C79706800095374796C654E
+          616D65060A676C7970687374796C650C4D617267696E732E4C65667405000000
+          000000008000400B4D617267696E732E546F70050000000000000080FF3F0D4D
+          617267696E732E526967687405000000000000008000400E4D617267696E732E
+          426F74746F6D050000000000000080FF3F05416C69676E07044C6566740A5369
+          7A652E576964746805000000000000008003400B53697A652E48656967687405
+          000000000000008003401453697A652E506C6174666F726D44656661756C7408
+          000005545465787400095374796C654E616D6506047465787405416C69676E07
+          06436C69656E74064C6F636B6564090748697454657374080A53697A652E5769
+          6474680500000000000000BC04400B53697A652E486569676874050000000000
+          0000A004401453697A652E506C6174666F726D44656661756C74081554657874
+          53657474696E67732E576F72645772617008165465787453657474696E67732E
+          486F727A416C69676E07074C656164696E67000000005450463007544C61796F
+          757400095374796C654E616D65061B7472656576696577657870616E64657262
+          7574746F6E7374796C6505416C69676E070643656E7465720B4D617267696E73
+          2E546F70050000000000000080FF3F0A53697A652E5769647468050000000000
+          0000B003400B53697A652E4865696768740500000000000000B003401453697A
+          652E506C6174666F726D44656661756C74080756697369626C6508085461624F
+          72646572021C000554506174680005416C69676E070643656E74657209446174
+          612E506174680A400000000500000000000000D36D3F431BEF48430100000017
+          49E043BA09E54301000000D36D3F43C73B344401000000D36D3F431BEF484303
+          000000D36D3F431BEF48430A46696C6C2E436F6C6F720708636C61426C61636B
+          064C6F636B6564090748697454657374080A53697A652E576964746805000000
+          000000008002400B53697A652E48656967687405000000000000009002401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F
+          6E05000000000017B7D1F13F0C50726F70657274794E616D65060A46696C6C2E
+          436F6C6F720A537461727456616C75650707636C614E756C6C0953746F705661
+          6C75650708636C61426C61636B075472696767657206104973457870616E6465
+          643D66616C736500000F54436F6C6F72416E696D6174696F6E00084475726174
+          696F6E05000000000017B7D1F13F07496E7665727365090C50726F7065727479
+          4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650707636C61
+          4E756C6C0953746F7056616C75650708636C61426C61636B0754726967676572
+          060F4973457870616E6465643D747275650000000554506174680005416C6967
+          6E070643656E74657209446174612E506174680A400000000500000000000000
+          CB11CF4379E93C4301000000CB11CF4396230A44010000007DBF1E4296230A44
+          01000000CB11CF4379E93C4303000000CB11CF4379E93C430A46696C6C2E436F
+          6C6F720707636C614E756C6C064C6F636B6564090748697454657374080A5369
+          7A652E576964746805000000000000008002400B53697A652E48656967687405
+          000000000000008002401453697A652E506C6174666F726D44656661756C7408
+          0B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D6174
+          696F6E00084475726174696F6E05000000000017B7D1F13F0C50726F70657274
+          794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650707636C
+          614E756C6C0953746F7056616C75650708636C61426C61636B07547269676765
+          72060F4973457870616E6465643D7472756500000F54436F6C6F72416E696D61
+          74696F6E00084475726174696F6E05000000000017B7D1F13F07496E76657273
+          65090C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172
+          7456616C75650707636C614E756C6C0953746F7056616C75650708636C61426C
+          61636B075472696767657206104973457870616E6465643D66616C7365000000
+          005450463007544C61796F757400095374796C654E616D65060D747261636B62
+          61727374796C650A506F736974696F6E2E580500000000000000B207400A506F
+          736974696F6E2E590500000000000000F707400A53697A652E57696474680500
+          0000000000008206400B53697A652E4865696768740500000000000100E00240
+          1453697A652E506C6174666F726D44656661756C74080756697369626C650808
+          5461624F72646572021D000A5452656374616E676C6500095374796C654E616D
+          65060668747261636B05416C69676E070A5665727443656E7465720A46696C6C
+          2E436F6C6F720709784646314631463146064C6F636B65640907486974546573
+          74080C4D617267696E732E4C65667405000000000000008001400B4D61726769
+          6E732E546F7005000000000000008001400D4D617267696E732E526967687405
+          000000000000008001400E4D617267696E732E426F74746F6D05000000000000
+          008001400A506F736974696F6E2E5805000000000000008001400A506F736974
+          696F6E2E5905000000000000008001400A53697A652E57696474680500000000
+          000000F405400B53697A652E4865696768740500000000000200C00140145369
+          7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72
+          0709784646314331433143000B54476C6F774566666563740008536F66746E65
+          73730500000000009A9999FD3F09476C6F77436F6C6F72070978464636354338
+          4530074F706163697479050000000000000080FF3F0754726967676572060E49
+          73466F63757365643D7472756507456E61626C6564080000000A545265637461
+          6E676C6500095374796C654E616D65060676747261636B05416C69676E070A48
+          6F727A43656E7465720A46696C6C2E436F6C6F72070978464631463146314606
+          4C6F636B6564090748697454657374080C4D617267696E732E4C656674050000
+          00000000008001400B4D617267696E732E546F7005000000000000008001400D
+          4D617267696E732E526967687405000000000000008001400E4D617267696E73
+          2E426F74746F6D05000000000000008001400A506F736974696F6E2E58050000
+          0000000000F804400A506F736974696F6E2E5905000000000000008001400A53
+          697A652E57696474680500000000000000C001400B53697A652E486569676874
+          0500000000000200C001401453697A652E506C6174666F726D44656661756C74
+          080C5374726F6B652E436F6C6F720709784646314331433143000B54476C6F77
+          4566666563740008536F66746E6573730500000000009A9999FD3F09476C6F77
+          436F6C6F720709784646363543384530074F7061636974790500000000000000
+          80FF3F0754726967676572060E4973466F63757365643D7472756507456E6162
+          6C65640800000006545468756D6200095374796C654E616D6506057468756D62
+          064C6F636B6564090C4D617267696E732E4C65667405000000000000008000C0
+          0B4D617267696E732E546F7005000000000000008000C00D4D617267696E732E
+          526967687405000000000000008000C00E4D617267696E732E426F74746F6D05
+          000000000000008000C00A506F736974696F6E2E580500000000000000C00040
+          0A506F736974696F6E2E59050000000000000080FF3F0A53697A652E57696474
+          680500000000000000A002400B53697A652E4865696768740500000000000100
+          E002401453697A652E506C6174666F726D44656661756C74080B5374796C654C
+          6F6F6B7570060D7468756D626261727374796C65085461624F72646572020100
+          00005450463007544C61796F757400095374796C654E616D65060E6E756D6265
+          72626F787374796C6505416C69676E070643656E7465720A53697A652E576964
+          74680500000000000000B605400B53697A652E48656967687405000000000000
+          00C003401453697A652E506C6174666F726D44656661756C7408075669736962
+          6C6508085461624F72646572021E000A5452656374616E676C6500095374796C
+          654E616D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74
+          730946696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469
+          656E742E506F696E74730E0105436F6C6F720709784646353835383538064F66
+          667365740500000000000000000000000105436F6C6F72070978464635313531
+          3531064F6666736574050000000000A01BF3FD3F000105436F6C6F7207097846
+          46343934393439064F6666736574050000000000000080FF3F0000064C6F636B
+          6564090748697454657374080C4D617267696E732E4C65667405000000000000
+          008000400B4D617267696E732E546F7005000000000000008000400D4D617267
+          696E732E526967687405000000000000008000400E4D617267696E732E426F74
+          746F6D05000000000000008000400A53697A652E576964746805000000000000
+          00AE05400B53697A652E4865696768740500000000000000A003401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
+          784646364136413641000F54436F6C6F72416E696D6174696F6E000844757261
+          74696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A4669
+          6C6C2E436F6C6F720A537461727456616C756507097846463538353835380953
+          746F7056616C756507097846463438343834380754726967676572061049734D
+          6F7573654F7665723D7472756500000F54436F6C6F72416E696D6174696F6E00
+          084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D
+          65060A46696C6C2E436F6C6F720A537461727456616C75650709784646343834
+          3834380953746F7056616C756507097846463538353835380754726967676572
+          061149734D6F7573654F7665723D66616C736500000A5452656374616E676C65
+          0005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507
+          48697454657374080C4D617267696E732E4C65667405000000000000008000C0
+          0B4D617267696E732E546F7005000000000000008000C00D4D617267696E732E
+          526967687405000000000000008000C00E4D617267696E732E426F74746F6D05
+          000000000000008000C00A53697A652E57696474680500000000000000B60540
+          0B53697A652E4865696768740500000000000000C003401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464635
+          3135313531000A5452656374616E676C650005416C69676E0706436C69656E74
+          0946696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E
+          732E4C656674050000000000000080FF3F0B4D617267696E732E546F70050000
+          000000000080FF3F0D4D617267696E732E5269676874050000000000000080FF
+          3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A65
+          2E57696474680500000000000000B205400B53697A652E486569676874050000
+          0000000000B003401453697A652E506C6174666F726D44656661756C74080C53
+          74726F6B652E436F6C6F7207097846463143314331430000000007544C61796F
+          757400095374796C654E616D650607636F6E74656E7405416C69676E0708436F
+          6E74656E7473064C6F636B6564090C4D617267696E732E4C6566740500000000
+          0000008001400B4D617267696E732E546F7005000000000000008001400D4D61
+          7267696E732E526967687405000000000000008001400E4D617267696E732E42
+          6F74746F6D05000000000000008001400A53697A652E57696474680500000000
+          000000A605400B53697A652E4865696768740500000000000000800340145369
+          7A652E506C6174666F726D44656661756C740800000C5442727573684F626A65
+          637400095374796C654E616D65060A666F726567726F756E640B42727573682E
+          436F6C6F720708636C61426C61636B00000B54476C6F77456666656374000853
+          6F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F7207097846
+          46363543384530074F706163697479050000000000000080FF3F075472696767
+          6572060E4973466F63757365643D7472756507456E61626C6564080000005450
+          463007544C61796F757400095374796C654E616D650609656469747374796C65
+          05416C69676E070643656E7465720A53697A652E576964746805000000000000
+          00B605400B53697A652E4865696768740500000000000000C003401453697A65
+          2E506C6174666F726D44656661756C74080756697369626C6508085461624F72
+          646572021F000A5452656374616E676C6500095374796C654E616D65060A6261
+          636B67726F756E6405416C69676E0708436F6E74656E74730A46696C6C2E436F
+          6C6F720708636C615768697465064C6F636B6564090748697454657374080A53
+          697A652E57696474680500000000000000B605400B53697A652E486569676874
+          0500000000000000C003401453697A652E506C6174666F726D44656661756C74
+          080C5374726F6B652E436F6C6F720709784646453645364536000F54436F6C6F
+          72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C
+          50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172745661
+          6C756507097846463530353035300953746F7056616C75650709784646373037
+          30373000000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
+          0000000000CDCCCCFC3F07496E7665727365090C50726F70657274794E616D65
+          060A46696C6C2E436F6C6F720A537461727456616C7565070978464635303530
+          35300953746F7056616C7565070978464637303730373000000A545265637461
+          6E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E
+          6F6E650748697454657374080C4D617267696E732E4C65667405000000000000
+          0080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A53697A652E576964746805000000000000
+          00B205400B53697A652E4865696768740500000000000000B003401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720707
+          636C614772617900000007544C61796F757400095374796C654E616D65060763
+          6F6E74656E7405416C69676E0706436C69656E74064C6F636B6564090C4D6172
+          67696E732E4C6566740500000000000000C000400B4D617267696E732E546F70
+          0500000000000000C000400D4D617267696E732E526967687405000000000000
+          00C000400E4D617267696E732E426F74746F6D0500000000000000C000400A53
+          697A652E576964746805000000000000008004400B53697A652E486569676874
+          05000000000000009003401453697A652E506C6174666F726D44656661756C74
+          08000007544C61796F757400095374796C654E616D650607627574746F6E7305
+          416C69676E07055269676874064C6F636B6564090B4D617267696E732E546F70
+          0500000000000000C000400D4D617267696E732E526967687405000000000000
+          00C000400E4D617267696E732E426F74746F6D0500000000000000C000400A50
+          6F736974696F6E2E5805000000000000009804400A506F736974696F6E2E5905
+          00000000000000C000400A53697A652E57696474680500000000000000C80440
+          0B53697A652E48656967687405000000000000009003401453697A652E506C61
+          74666F726D44656661756C740800000C5442727573684F626A65637400095374
+          796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F7207
+          08636C61426C61636B00000C5442727573684F626A65637400095374796C654E
+          616D65060973656C656374696F6E0B42727573682E436F6C6F720708636C6142
+          6C61636B0000005450463007544C61796F757400095374796C654E616D65060C
+          7370696E626F787374796C6505416C69676E070643656E7465720A53697A652E
+          57696474680500000000000000B605400B53697A652E48656967687405000000
+          00000000C003401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C6508085461624F726465720220000A5452656374616E676C65000953
+          74796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E74
+          656E74730A46696C6C2E436F6C6F720709784646313931393139064C6F636B65
+          64090748697454657374080A53697A652E57696474680500000000000000B605
+          400B53697A652E4865696768740500000000000000C003401453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646
+          333933393339000F54436F6C6F72416E696D6174696F6E00084475726174696F
+          6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E
+          436F6C6F720A537461727456616C756507097846463530353035300953746F70
+          56616C7565070978464637303730373000000F54436F6C6F72416E696D617469
+          6F6E00084475726174696F6E050000000000CDCCCCFC3F07496E766572736509
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C756507097846463530353035300953746F7056616C756507097846463730
+          3730373000000A5452656374616E676C650005416C69676E0706436C69656E74
+          0946696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E
+          732E4C656674050000000000000080FF3F0B4D617267696E732E546F70050000
+          000000000080FF3F0D4D617267696E732E5269676874050000000000000080FF
+          3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A65
+          2E57696474680500000000000000B205400B53697A652E486569676874050000
+          0000000000B003401453697A652E506C6174666F726D44656661756C74080C53
+          74726F6B652E436F6C6F72070978464631383138313800000007544C61796F75
+          7400095374796C654E616D650607636F6E74656E7405416C69676E0706436C69
+          656E74064C6F636B6564090C4D617267696E732E4C6566740500000000000000
+          C000400B4D617267696E732E546F700500000000000000C000400D4D61726769
+          6E732E52696768740500000000000000C000400E4D617267696E732E426F7474
+          6F6D0500000000000000C000400A53697A652E57696474680500000000000000
+          9404400B53697A652E48656967687405000000000000009003401453697A652E
+          506C6174666F726D44656661756C740800000754427574746F6E00095374796C
+          654E616D65060B6D696E7573627574746F6E05416C69676E07074669744C6566
+          740843616E466F637573080C4D617267696E732E4C6566740500000000000000
+          8000400B4D617267696E732E546F7005000000000000008000400D4D61726769
+          6E732E526967687405000000000000008000400E4D617267696E732E426F7474
+          6F6D05000000000000008000400A506F736974696F6E2E580500000000000000
+          8000400A506F736974696F6E2E5905000000000000008000400A53697A652E57
+          696474680500000000000000A003400B53697A652E4865696768740500000000
+          000000A003401453697A652E506C6174666F726D44656661756C74080B537479
+          6C654C6F6F6B7570061C7472616E73706172656E74636972636C65627574746F
+          6E7374796C65155465787453657474696E67732E5472696D6D696E6707044E6F
+          6E65000554506174680005416C69676E0706436C69656E7409446174612E5061
+          74680A4000000005000000000000000000803F00000000010000000000803F00
+          00803F01000000000000000000003F010000000000803F000000000300000000
+          00803F000000000A46696C6C2E436F6C6F720708636C61576869746507486974
+          54657374080C4D617267696E732E4C6566740500000000000000C001400B4D61
+          7267696E732E546F700500000000000000C001400D4D617267696E732E526967
+          68740500000000000000C001400E4D617267696E732E426F74746F6D05000000
+          00000000C001400A53697A652E576964746805000000000000008002400B5369
+          7A652E48656967687405000000000000008002401453697A652E506C6174666F
+          726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000007
+          54427574746F6E00095374796C654E616D65060A706C7573627574746F6E0541
+          6C69676E070846697452696768740843616E466F637573080C4D617267696E73
+          2E4C65667405000000000000008000400B4D617267696E732E546F7005000000
+          000000008000400D4D617267696E732E52696768740500000000000000800040
+          0E4D617267696E732E426F74746F6D05000000000000008000400A506F736974
+          696F6E2E5805000000000000008A05400A506F736974696F6E2E590500000000
+          0000008000400A53697A652E57696474680500000000000000A003400B53697A
+          652E4865696768740500000000000000A003401453697A652E506C6174666F72
+          6D44656661756C74080B5374796C654C6F6F6B7570061C7472616E7370617265
+          6E74636972636C65627574746F6E7374796C65155465787453657474696E6773
+          2E5472696D6D696E6707044E6F6E65000554506174680005416C69676E070643
+          6C69656E7409446174612E506174680A34000000040000000000000000000000
+          0000000001000000000000000000803F010000000000803F0000003F03000000
+          00000000000000000A46696C6C2E436F6C6F720708636C615768697465074869
+          7454657374080C4D617267696E732E4C6566740500000000000000C001400B4D
+          617267696E732E546F700500000000000000C001400D4D617267696E732E5269
+          6768740500000000000000C001400E4D617267696E732E426F74746F6D050000
+          0000000000C001400A53697A652E576964746805000000000000008002400B53
+          697A652E48656967687405000000000000008002401453697A652E506C617466
+          6F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000000
+          0C5442727573684F626A65637400095374796C654E616D65060A666F72656772
+          6F756E640B42727573682E436F6C6F72070978464645414541454100000C5442
+          727573684F626A65637400095374796C654E616D65060973656C656374696F6E
+          0A42727573682E4B696E6407084772616469656E741542727573682E47726164
+          69656E742E506F696E74730E0105436F6C6F720709783830324237393843064F
+          66667365740500000000000000000000000105436F6C6F720709783830324236
+          453746064F666673657405000000000012A2F8FD3F000105436F6C6F72070978
+          3830324236343732064F6666736574050000000000000080FF3F000000000B54
+          476C6F774566666563740008536F66746E6573730500000000009A9999FD3F09
+          476C6F77436F6C6F720709784646363543384530074F70616369747905000000
+          0000000080FF3F0754726967676572060E4973466F63757365643D7472756507
+          456E61626C6564080000005450463007544C61796F757400095374796C654E61
+          6D650611636C656172696E67656469747374796C650A506F736974696F6E2E58
+          0500000000000000BC07400A506F736974696F6E2E590500000000000080F407
+          400A53697A652E57696474680500000000000000B605400B53697A652E486569
+          6768740500000000000000C003401453697A652E506C6174666F726D44656661
+          756C74080756697369626C6508085461624F726465720221000A545265637461
+          6E676C6500095374796C654E616D65060A6261636B67726F756E6405416C6967
+          6E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846463139313931
+          39064C6F636B6564090748697454657374080A53697A652E5769647468050000
+          0000000000B605400B53697A652E4865696768740500000000000000C0034014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F720709784646333933393339000F54436F6C6F72416E696D6174696F6E0008
+          4475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65
+          060A46696C6C2E436F6C6F720A537461727456616C7565070978464635303530
+          35300953746F7056616C7565070978464637303730373000000F54436F6C6F72
+          416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0749
+          6E7665727365090C50726F70657274794E616D65060A46696C6C2E436F6C6F72
+          0A537461727456616C756507097846463530353035300953746F7056616C7565
+          070978464637303730373000000A5452656374616E676C650005416C69676E07
+          06436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465737408
+          0C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E73
+          2E546F70050000000000000080FF3F0D4D617267696E732E5269676874050000
+          000000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080
+          FF3F0A53697A652E57696474680500000000000000B205400B53697A652E4865
+          696768740500000000000000B003401453697A652E506C6174666F726D446566
+          61756C74080C5374726F6B652E436F6C6F720709784646313831383138000000
+          07544C61796F757400095374796C654E616D650607636F6E74656E7405416C69
+          676E0708436F6E74656E7473064C6F636B6564090C4D617267696E732E4C6566
+          740500000000000000C000400B4D617267696E732E546F700500000000000000
+          C000400D4D617267696E732E52696768740500000000000000B803400E4D6172
+          67696E732E426F74746F6D0500000000000000C000400A53697A652E57696474
+          6805000000000000008205400B53697A652E4865696768740500000000000000
+          9003401453697A652E506C6174666F726D44656661756C740800000754427574
+          746F6E00095374796C654E616D65060B636C656172627574746F6E05416C6967
+          6E070846697452696768740843616E466F637573080C4D617267696E732E4C65
+          667405000000000000008000400B4D617267696E732E546F7005000000000000
+          008000400D4D617267696E732E526967687405000000000000008000400E4D61
+          7267696E732E426F74746F6D05000000000000008000400A506F736974696F6E
+          2E5805000000000000008A05400A506F736974696F6E2E590500000000000000
+          8000400A53697A652E57696474680500000000000000A003400B53697A652E48
+          65696768740500000000000000A003401453697A652E506C6174666F726D4465
+          6661756C74080B5374796C654C6F6F6B7570061C7472616E73706172656E7463
+          6972636C65627574746F6E7374796C65155465787453657474696E67732E5472
+          696D6D696E6707044E6F6E65000554506174680005416C69676E070346697409
+          446174612E506174680AC400000010000000000000000000A0C0000070410100
+          0000000070410000A0C001000000000048420000F041010000000000AA420000
+          A0C0010000000000D242000070410100000000008C4200004842010000000000
+          D2420000B442010000000000AA420000DC42020000003BDF34429E6F8C420200
+          0000FE547D427FAAB04202000000000048420000964201000000000070410000
+          DC42010000000000A0C00000B442010000000000F04100005C42010000000000
+          A0C000007041030000000000000000000000064C6F636B656409074869745465
+          7374080C4D617267696E732E4C65667405000000000000008001400B4D617267
+          696E732E546F7005000000000000008001400D4D617267696E732E5269676874
+          05000000000000008001400E4D617267696E732E426F74746F6D050000000000
+          00008001400A53697A652E57696474680500000000000000C002400B53697A65
+          2E4865696768740500000000000000C002401453697A652E506C6174666F726D
+          44656661756C74080B5374726F6B652E4B696E6407044E6F6E650000000C5442
+          727573684F626A65637400095374796C654E616D65060A666F726567726F756E
+          640B42727573682E436F6C6F72070978464645414541454100000C5442727573
+          684F626A65637400095374796C654E616D65060973656C656374696F6E0A4272
+          7573682E4B696E6407084772616469656E741542727573682E4772616469656E
+          742E506F696E74730E0105436F6C6F720709783830324237393843064F666673
+          65740500000000000000000000000105436F6C6F720709783830324236453746
+          064F666673657405000000000012A2F8FD3F000105436F6C6F72070978383032
+          4236343732064F6666736574050000000000000080FF3F000000000B54476C6F
+          774566666563740008536F66746E6573730500000000009A9999FD3F09476C6F
+          77436F6C6F720709784646363543384530074F70616369747905000000000000
+          0080FF3F0754726967676572060E4973466F63757365643D7472756507456E61
+          626C6564080000005450463007544C61796F757400095374796C654E616D6506
+          096D656D6F7374796C6505416C69676E070643656E7465720C436C6970436869
+          6C6472656E090A53697A652E5769647468050000000000FFFFE905400B53697A
+          652E48656967687405000000000000008306401453697A652E506C6174666F72
+          6D44656661756C74080756697369626C6508085461624F726465720222000A54
+          52656374616E676C6500095374796C654E616D65060A6261636B67726F756E64
+          05416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F720708636C61
+          5768697465064C6F636B6564090748697454657374080C50616464696E672E4C
+          656674050000000000000080FF3F0B50616464696E672E546F70050000000000
+          000080FF3F0D50616464696E672E5269676874050000000000000080FF3F0E50
+          616464696E672E426F74746F6D050000000000000080FF3F0A53697A652E5769
+          647468050000000000FFFFE905400B53697A652E486569676874050000000000
+          00008306401453697A652E506C6174666F726D44656661756C74080B5374726F
+          6B652E4B696E6407044E6F6E65000A5452656374616E676C650005416C69676E
+          0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374
+          080A53697A652E5769647468050000000000FFFFE505400B53697A652E486569
+          67687405000000000000008106401453697A652E506C6174666F726D44656661
+          756C74080B5374726F6B652E4B696E6407044E6F6E65000007544C61796F7574
+          0005416C69676E0706436C69656E740A53697A652E5769647468050000000000
+          FFFFE505400B53697A652E48656967687405000000000000008106401453697A
+          652E506C6174666F726D44656661756C74080007544C61796F75740009537479
+          6C654E616D650607636F6E74656E7405416C69676E0706436C69656E740C4D61
+          7267696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F
+          70050000000000000080FF3F0D4D617267696E732E5269676874050000000000
+          000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A
+          53697A652E5769647468050000000000FFFFC305400B53697A652E4865696768
+          740500000000000000E005401453697A652E506C6174666F726D44656661756C
+          740800000A545363726F6C6C42617200095374796C654E616D65060A76736372
+          6F6C6C62617205416C69676E0705526967687406437572736F72070763724172
+          726F770556616C7565050000000000000080FF3F0B536D616C6C4368616E6765
+          05000000000000000000000B4F7269656E746174696F6E070856657274696361
+          6C0A506F736974696F6E2E58050000000000FFFFC705400A53697A652E576964
+          74680500000000000000F002400B53697A652E48656967687405000000000000
+          00E405401453697A652E506C6174666F726D44656661756C740800000A545363
+          726F6C6C42617200095374796C654E616D65060A687363726F6C6C6261720541
+          6C69676E0706426F74746F6D06437572736F72070763724172726F770B536D61
+          6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07
+          0A486F72697A6F6E74616C0A506F736974696F6E2E590500000000000000E405
+          400A53697A652E5769647468050000000000FFFFE505400B53697A652E486569
+          6768740500000000000000F002401453697A652E506C6174666F726D44656661
+          756C740800000F54536D616C6C5363726F6C6C42617200095374796C654E616D
+          65060F76736D616C6C7363726F6C6C62617205416C69676E0705526967687406
+          437572736F72070763724172726F770B536D616C6C4368616E67650500000000
+          0000000000000B4F7269656E746174696F6E0708566572746963616C0B4D6172
+          67696E732E546F70050000000000000080FF3F0D4D617267696E732E52696768
+          74050000000000000080FF3F0E4D617267696E732E426F74746F6D0500000000
+          00000080FF3F0A506F736974696F6E2E580500000000000000C605400A506F73
+          6974696F6E2E5905000000000000008000400A53697A652E5769647468050000
+          00000000008002400B53697A652E486569676874050000000000000080024014
+          53697A652E506C6174666F726D44656661756C74080756697369626C65080000
+          0F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D
+          616C6C7363726F6C6C62617205416C69676E0706426F74746F6D06437572736F
+          72070763724172726F770B536D616C6C4368616E676505000000000000000000
+          000B4F7269656E746174696F6E070A486F72697A6F6E74616C0C4D617267696E
+          732E4C656674050000000000000080FF3F0D4D617267696E732E526967687405
+          0000000000000080FF3F0E4D617267696E732E426F74746F6D05000000000000
+          0080FF3F0A506F736974696F6E2E5805000000000000008000400A506F736974
+          696F6E2E590500000000000000E205400A53697A652E57696474680500000000
+          0000009606400B53697A652E4865696768740500000000000000800240145369
+          7A652E506C6174666F726D44656661756C74080756697369626C650800000000
+          0C5442727573684F626A65637400095374796C654E616D65060A666F72656772
+          6F756E640B42727573682E436F6C6F720708636C61426C61636B00000C544272
+          7573684F626A65637400095374796C654E616D65060973656C656374696F6E0B
+          42727573682E436F6C6F720708636C61426C61636B0000005450463007544C61
+          796F757400095374796C654E616D65060B627574746F6E7374796C6505416C69
+          676E070643656E7465720A53697A652E57696474680500000000000000B60540
+          0B53697A652E4865696768740500000000000000C003401453697A652E506C61
+          74666F726D44656661756C74080756697369626C6508085461624F7264657202
+          23000A5452656374616E676C6500095374796C654E616D65060A6261636B6772
+          6F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E640708
+          4772616469656E741446696C6C2E4772616469656E742E506F696E74730E0105
+          436F6C6F720709784646443944394439064F6666736574050000000000000000
+          0000000105436F6C6F720709784646444244424442064F666673657405000000
+          00007FB0F1FD3F000105436F6C6F720709784646454245424542064F66667365
+          74050000000000000080FF3F00001D46696C6C2E4772616469656E742E537461
+          7274506F736974696F6E2E58050000000000000080FE3F1D46696C6C2E477261
+          6469656E742E5374617274506F736974696F6E2E59050000000000000080FF3F
+          1C46696C6C2E4772616469656E742E53746F70506F736974696F6E2E58050000
+          000000FFFFFFFD3F1C46696C6C2E4772616469656E742E53746F70506F736974
+          696F6E2E590500000000000000000000064C6F636B6564090748697454657374
+          080C4D617267696E732E4C65667405000000000000008000400B4D617267696E
+          732E546F7005000000000000008000400D4D617267696E732E52696768740500
+          0000000000008000400E4D617267696E732E426F74746F6D0500000000000000
+          8000400A53697A652E57696474680500000000000000AE05400B53697A652E48
+          65696768740500000000000000A003401453697A652E506C6174666F726D4465
+          6661756C74080C5374726F6B652E436F6C6F720709784646384538453845000F
+          54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CD
+          CCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374
+          61727456616C756507097846464439443944390953746F7056616C7565070978
+          46464442444244420754726967676572062049734D6F7573654F7665723D7472
+          75653B4973507265737365643D66616C736500000F54436F6C6F72416E696D61
+          74696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F706572
+          74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978
+          46464442444244420953746F7056616C75650709784646443944394439075472
+          6967676572062149734D6F7573654F7665723D66616C73653B49735072657373
+          65643D66616C736500000F54436F6C6F72416E696D6174696F6E000844757261
+          74696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A4669
+          6C6C2E436F6C6F720A537461727456616C756507097846464442444244420953
+          746F7056616C756507097846464439443944390754726967676572062049734D
+          6F7573654F7665723D66616C73653B4973507265737365643D7472756500000F
+          54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CD
+          CCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374
+          61727456616C756507097846464439443944390953746F7056616C7565070978
+          46464442444244420754726967676572061F49734D6F7573654F7665723D7472
+          75653B4973507265737365643D7472756500000A5452656374616E676C650005
+          416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869
+          7454657374080C4D617267696E732E4C65667405000000000000008000C00B4D
+          617267696E732E546F7005000000000000008000C00D4D617267696E732E5269
+          67687405000000000000008000C00E4D617267696E732E426F74746F6D050000
+          00000000008000C00A53697A652E57696474680500000000000000B605400B53
+          697A652E4865696768740500000000000000C003401453697A652E506C617466
+          6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646444644
+          464446000A5452656374616E676C650005416C69676E0706436C69656E740946
+          696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E
+          4C656674050000000000000080FF3F0B4D617267696E732E546F700500000000
+          00000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E
+          4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E57
+          696474680500000000000000B205400B53697A652E4865696768740500000000
+          000000B003401453697A652E506C6174666F726D44656661756C74080C537472
+          6F6B652E436F6C6F720709784646434643464346000000000654476C79706800
+          095374796C654E616D65060A676C7970687374796C650C4D617267696E732E4C
+          6566740500000000000000A001400B4D617267696E732E546F70050000000000
+          00008000400D4D617267696E732E5269676874050000000000000080FF3F0E4D
+          617267696E732E426F74746F6D050000000000000080004005416C69676E0704
+          4C6566740A53697A652E576964746805000000000000008003400B53697A652E
+          48656967687405000000000000008003401453697A652E506C6174666F726D44
+          656661756C7408000005545465787400095374796C654E616D65060474657874
+          05416C69676E0706436C69656E74064C6F636B6564090748697454657374080C
+          4D617267696E732E4C6566740500000000000000A001400B4D617267696E732E
+          546F7005000000000000008000400D4D617267696E732E526967687405000000
+          00000000A001400E4D617267696E732E426F74746F6D05000000000000008000
+          400A53697A652E57696474680500000000000000A205400B53697A652E486569
+          6768740500000000000000A003401453697A652E506C6174666F726D44656661
+          756C7408045465787406045465787400000B54476C6F77456666656374000853
+          6F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F7207097846
+          46363543384530074F706163697479050000000000000080FF3F075472696767
+          6572060E4973466F63757365643D7472756507456E61626C6564080000005450
+          463007544C61796F757400095374796C654E616D650610636F6C6F7262757474
+          6F6E7374796C650A506F736974696F6E2E580500000000000000BC07400A506F
+          736974696F6E2E590500000000000080F407400A53697A652E57696474680500
+          000000000000B605400B53697A652E4865696768740500000000000000C00340
+          1453697A652E506C6174666F726D44656661756C74080756697369626C650808
+          5461624F726465720224000A5452656374616E676C6500095374796C654E616D
+          65060A6261636B67726F756E6405416C69676E0708436F6E74656E7473094669
+          6C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E
+          506F696E74730E0105436F6C6F720709784646353835383538064F6666736574
+          0500000000000000000000000105436F6C6F720709784646353135313531064F
+          6666736574050000000000A01BF3FD3F000105436F6C6F720709784646343934
+          393439064F6666736574050000000000000080FF3F0000064C6F636B65640907
+          48697454657374080C4D617267696E732E4C6566740500000000000000800040
+          0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E
+          526967687405000000000000008000400E4D617267696E732E426F74746F6D05
+          000000000000008000400A53697A652E57696474680500000000000000AE0540
+          0B53697A652E4865696768740500000000000000A003401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464636
+          4136413641000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
+          050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846463538353835380953746F7056
+          616C756507097846463438343834380754726967676572062049734D6F757365
+          4F7665723D747275653B4973507265737365643D66616C736500000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C756507097846463438343834380953746F7056616C756507097846463538
+          353835380754726967676572062149734D6F7573654F7665723D66616C73653B
+          4973507265737365643D66616C736500000F54436F6C6F72416E696D6174696F
+          6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E
+          616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978464634
+          38343834380953746F7056616C75650709784646343234323432075472696767
+          6572062049734D6F7573654F7665723D66616C73653B4973507265737365643D
+          7472756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
+          050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846463432343234320953746F7056
+          616C756507097846463438343834380754726967676572061F49734D6F757365
+          4F7665723D747275653B4973507265737365643D7472756500000A5452656374
+          616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E640704
+          4E6F6E650748697454657374080C4D617267696E732E4C656674050000000000
+          00008000C00B4D617267696E732E546F7005000000000000008000C00D4D6172
+          67696E732E526967687405000000000000008000C00E4D617267696E732E426F
+          74746F6D05000000000000008000C00A53697A652E5769647468050000000000
+          0000B605400B53697A652E4865696768740500000000000000C003401453697A
+          652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207
+          09784646353135313531000A5452656374616E676C650005416C69676E070643
+          6C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D
+          617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E54
+          6F70050000000000000080FF3F0D4D617267696E732E52696768740500000000
+          00000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F
+          0A53697A652E57696474680500000000000000B205400B53697A652E48656967
+          68740500000000000000B003401453697A652E506C6174666F726D4465666175
+          6C74080C5374726F6B652E436F6C6F720709784646314331433143000000000A
+          5452656374616E676C6500095374796C654E616D65060466696C6C05416C6967
+          6E0706436C69656E740A46696C6C2E436F6C6F720708636C61426C61636B064C
+          6F636B6564090748697454657374080C4D617267696E732E4C65667405000000
+          00000000C001400B4D617267696E732E546F700500000000000000A001400D4D
+          617267696E732E52696768740500000000000000C001400E4D617267696E732E
+          426F74746F6D0500000000000000A001400A53697A652E576964746805000000
+          000000009E05400B53697A652E4865696768740500000000000000E002401453
+          697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F
+          72070978464636413641364100000B54476C6F774566666563740008536F6674
+          6E6573730500000000009A9999FD3F09476C6F77436F6C6F7207097846463635
+          43384530074F706163697479050000000000000080FF3F075472696767657206
+          0E4973466F63757365643D7472756507456E61626C6564080000005450463007
+          544C61796F757400095374796C654E616D650611636F726E6572627574746F6E
+          7374796C6505416C69676E070643656E7465720A53697A652E57696474680500
+          000000000000B605400B53697A652E4865696768740500000000000000C00340
+          1453697A652E506C6174666F726D44656661756C74080756697369626C650808
+          5461624F726465720225000A5452656374616E676C6500095374796C654E616D
+          65060A6261636B67726F756E6405416C69676E0708436F6E74656E7473094669
+          6C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E
+          506F696E74730E0105436F6C6F720709784646353835383538064F6666736574
+          0500000000000000000000000105436F6C6F720709784646353135313531064F
+          6666736574050000000000A01BF3FD3F000105436F6C6F720709784646343934
+          393439064F6666736574050000000000000080FF3F0000064C6F636B65640907
+          48697454657374080A53697A652E57696474680500000000000000B605400B53
+          697A652E4865696768740500000000000000C003401453697A652E506C617466
+          6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646314331
+          433143000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500
+          00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C756507097846463538353835380953746F7056616C
+          756507097846463438343834380754726967676572062049734D6F7573654F76
+          65723D747275653B4973507265737365643D66616C736500000F54436F6C6F72
+          416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50
+          726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C
+          756507097846463438343834380953746F7056616C7565070978464635383538
+          35380754726967676572062149734D6F7573654F7665723D66616C73653B4973
+          507265737365643D66616C736500000F54436F6C6F72416E696D6174696F6E00
+          084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D
+          65060A46696C6C2E436F6C6F720A537461727456616C75650709784646343834
+          3834380953746F7056616C756507097846463432343234320754726967676572
+          062049734D6F7573654F7665723D66616C73653B4973507265737365643D7472
+          756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500
+          00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C756507097846463432343234320953746F7056616C
+          756507097846463438343834380754726967676572061F49734D6F7573654F76
+          65723D747275653B4973507265737365643D747275650000000654476C797068
+          00095374796C654E616D65060A676C7970687374796C650C4D617267696E732E
+          4C65667405000000000000008000400B4D617267696E732E546F700500000000
+          0000008001400D4D617267696E732E526967687405000000000000008000400E
+          4D617267696E732E426F74746F6D050000000000000080004005416C69676E07
+          044C6566740A53697A652E576964746805000000000000008003400B53697A65
+          2E48656967687405000000000000008003401453697A652E506C6174666F726D
+          44656661756C7408000005545465787400095374796C654E616D650604746578
+          7405416C69676E0706436C69656E74064C6F636B656409074869745465737408
+          0C4D617267696E732E4C6566740500000000000000A001400B4D617267696E73
+          2E546F7005000000000000008000400D4D617267696E732E5269676874050000
+          0000000000A001400E4D617267696E732E426F74746F6D050000000000000080
+          00400A53697A652E57696474680500000000000000A205400B53697A652E4865
+          696768740500000000000000A003401453697A652E506C6174666F726D446566
+          61756C740800000B54476C6F774566666563740008536F66746E657373050000
+          0000009A9999FD3F09476C6F77436F6C6F720709784646363543384530074F70
+          6163697479050000000000000080FF3F0754726967676572060E4973466F6375
+          7365643D7472756507456E61626C6564080000005450463007544C61796F7574
+          00095374796C654E616D65060D706F707570626F787374796C6505416C69676E
+          070643656E7465720A53697A652E57696474680500000000000000D605400B53
+          697A652E4865696768740500000000000000B003401453697A652E506C617466
+          6F726D44656661756C74080756697369626C6508085461624F72646572022600
+          0A5452656374616E676C6500095374796C654E616D65060A6261636B67726F75
+          6E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407084772
+          616469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F
+          6C6F720709784646353835383538064F66667365740500000000000000000000
+          000105436F6C6F720709784646353135313531064F6666736574050000000000
+          A01BF3FD3F000105436F6C6F720709784646343934393439064F666673657405
+          0000000000000080FF3F0000064C6F636B6564090748697454657374080C4D61
+          7267696E732E4C65667405000000000000008000400B4D617267696E732E546F
+          7005000000000000008000400D4D617267696E732E5269676874050000000000
+          00008000400E4D617267696E732E426F74746F6D05000000000000008000400A
+          53697A652E57696474680500000000000000CE05400B53697A652E4865696768
+          7405000000000000009003401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F720709784646364136413641000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C756507097846463538353835380953746F7056616C756507097846463438
+          343834380754726967676572061049734D6F7573654F7665723D747275650000
+          0F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000
+          CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53
+          7461727456616C756507097846463438343834380953746F7056616C75650709
+          7846463538353835380754726967676572061149734D6F7573654F7665723D66
+          616C736500000A5452656374616E676C650005416C69676E0706436C69656E74
+          0946696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E
+          732E4C65667405000000000000008000C00B4D617267696E732E546F70050000
+          00000000008000C00D4D617267696E732E526967687405000000000000008000
+          C00E4D617267696E732E426F74746F6D05000000000000008000C00A53697A65
+          2E57696474680500000000000000D605400B53697A652E486569676874050000
+          0000000000B003401453697A652E506C6174666F726D44656661756C74080C53
+          74726F6B652E436F6C6F720709784646353135313531000A5452656374616E67
+          6C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E
+          650748697454657374080C4D617267696E732E4C656674050000000000000080
+          FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E
+          732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F
+          6D050000000000000080FF3F0A53697A652E57696474680500000000000000D2
+          05400B53697A652E4865696768740500000000000000A003401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          463143314331430000000007544C61796F75740005416C69676E070552696768
+          740A506F736974696F6E2E580500000000000000B805400A53697A652E576964
+          74680500000000000000F002400B53697A652E48656967687405000000000000
+          00B003401453697A652E506C6174666F726D44656661756C7408000554506174
+          680005416C69676E070643656E74657209446174612E506174680A4000000005
+          00000000000000000000000000803F010000000000803F0000803F0100000000
+          00003F0000000001000000000000000000803F0300000000000000000000000A
+          46696C6C2E436F6C6F72070C636C614C69676874677261790748697454657374
+          080B4D617267696E732E546F7005000000000000009002C00A53697A652E5769
+          64746805000000000000008002400B53697A652E486569676874050000000000
+          0000A001401453697A652E506C6174666F726D44656661756C74080B5374726F
+          6B652E4B696E6407044E6F6E6500000554506174680005416C69676E07064365
+          6E74657209446174612E506174680A3400000004000000000000000000000000
+          000000010000000000803F00000000010000000000003F0000803F0300000000
+          000000000000000A46696C6C2E436F6C6F720709784646443044304430074869
+          7454657374080B4D617267696E732E546F700500000000000000E001400A5369
+          7A652E576964746805000000000000008002400B53697A652E48656967687405
+          00000000000000A001401453697A652E506C6174666F726D44656661756C7408
+          0B5374726F6B652E4B696E6407044E6F6E650000000554546578740009537479
+          6C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B65
+          64090748697454657374080C4D617267696E732E4C6566740500000000000000
+          A001400B4D617267696E732E546F700500000000000000A001400D4D61726769
+          6E732E52696768740500000000000000A001400E4D617267696E732E426F7474
+          6F6D0500000000000000A001400A53697A652E57696474680500000000000000
+          A405400B53697A652E4865696768740500000000000000C002401453697A652E
+          506C6174666F726D44656661756C7408165465787453657474696E67732E466F
+          6E74436F6C6F720708636C615768697465155465787453657474696E67732E57
+          6F7264577261700800000B54476C6F774566666563740008536F66746E657373
+          0500000000009A9999FD3F09476C6F77436F6C6F720709784646363543384530
+          074F706163697479050000000000000080FF3F0754726967676572060E497346
+          6F63757365643D7472756507456E61626C6564080000005450463007544C6179
+          6F757400095374796C654E616D65060C6172636469616C7374796C650A506F73
+          6974696F6E2E580500000000000080C307400A506F736974696F6E2E59050000
+          0000000080EF07400A53697A652E5769647468050000000000FFFFB304400B53
+          697A652E4865696768740500000000000000B004401453697A652E506C617466
+          6F726D44656661756C74080756697369626C6508085461624F72646572022700
+          0854456C6C6970736500095374796C654E616D65060A6261636B67726F756E64
+          05416C69676E07034669740946696C6C2E4B696E6407084772616469656E7414
+          46696C6C2E4772616469656E742E506F696E74730E0105436F6C6F7207097846
+          46353835383538064F66667365740500000000000000000000000105436F6C6F
+          720709784646353135313531064F6666736574050000000000A01BF3FD3F0001
+          05436F6C6F720709784646343934393439064F66667365740500000000000000
+          80FF3F0000064C6F636B6564090748697454657374080C4D617267696E732E4C
+          65667405000000000000008000400B4D617267696E732E546F70050000000000
+          00008000400D4D617267696E732E526967687405000000000000008000400E4D
+          617267696E732E426F74746F6D05000000000000008000400A53697A652E5769
+          6474680500000000000000A004400B53697A652E486569676874050000000000
+          0000A004401453697A652E506C6174666F726D44656661756C74080C5374726F
+          6B652E436F6C6F720709784646364136413641000F54436F6C6F72416E696D61
+          74696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F706572
+          74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978
+          46463538353835380953746F7056616C75650709784646343834383438075472
+          6967676572061049734D6F7573654F7665723D7472756500000F54436F6C6F72
+          416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50
+          726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C
+          756507097846463438343834380953746F7056616C7565070978464635383538
+          35380754726967676572061149734D6F7573654F7665723D66616C7365000008
+          54456C6C697073650005416C69676E0706436C69656E740946696C6C2E4B696E
+          6407044E6F6E650748697454657374080C4D617267696E732E4C656674050000
+          00000000008000C00B4D617267696E732E546F7005000000000000008000C00D
+          4D617267696E732E526967687405000000000000008000C00E4D617267696E73
+          2E426F74746F6D05000000000000008000C00A53697A652E5769647468050000
+          0000000000B004400B53697A652E4865696768740500000000000000B0044014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F720709784646353135313531000854456C6C697073650005416C69676E0706
+          436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C
+          4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E
+          546F70050000000000000080FF3F0D4D617267696E732E526967687405000000
+          0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF
+          3F0A53697A652E57696474680500000000000000A804400B53697A652E486569
+          6768740500000000000000A804401453697A652E506C6174666F726D44656661
+          756C74080C5374726F6B652E436F6C6F72070978464631433143314300000007
+          544C61796F757400095374796C654E616D6506047469636B05416C69676E0706
+          436C69656E74064C6F636B6564090C4D617267696E732E4C6566740500000000
+          0000008000400B4D617267696E732E546F7005000000000000008000400D4D61
+          7267696E732E526967687405000000000000008000400E4D617267696E732E42
+          6F74746F6D05000000000000008000400A53697A652E57696474680500000000
+          0000009004400B53697A652E4865696768740500000000000000900440145369
+          7A652E506C6174666F726D44656661756C74080007544C61796F75740005416C
+          69676E070552696768740A506F736974696F6E2E580500000000000000F80340
+          0A53697A652E57696474680500000000000000A001400B53697A652E48656967
+          687405000000000000009004401453697A652E506C6174666F726D4465666175
+          6C7408000854456C6C697073650005416C69676E070643656E7465720A46696C
+          6C2E436F6C6F720709784646443044304430064C6F636B656409074869745465
+          7374080A53697A652E57696474680500000000000000A001400B53697A652E48
+          65696768740500000000000000A001401453697A652E506C6174666F726D4465
+          6661756C74080B5374726F6B652E4B696E6407044E6F6E650000000000055454
+          65787400095374796C654E616D6506047465787405416C69676E0706436C6965
+          6E74064C6F636B6564090748697454657374080A53697A652E57696474680500
+          00000000FFFFB304400B53697A652E4865696768740500000000000000B00440
+          1453697A652E506C6174666F726D44656661756C740804546578740604746578
+          74165465787453657474696E67732E466F6E742E53697A650500000000000000
+          900240165465787453657474696E67732E466F6E74436F6C6F72070978464645
+          3045304530155465787453657474696E67732E576F7264577261700800000554
+          5465787400095374796C654E616D650609747261636B7465787405416C69676E
+          0706426F74746F6D064C6F636B6564090748697454657374080E4D617267696E
+          732E426F74746F6D0500000000000000A002C00A506F736974696F6E2E590500
+          000000000000B004400A53697A652E5769647468050000000000FFFFB304400B
+          53697A652E4865696768740500000000000000A002401453697A652E506C6174
+          666F726D44656661756C74080454657874060474657874165465787453657474
+          696E67732E466F6E742E53697A65050000000000000090024016546578745365
+          7474696E67732E466F6E74436F6C6F7207097846464530453045301554657874
+          53657474696E67732E576F726457726170080000005450463007544C61796F75
+          7400095374796C654E616D65060D7468756D626261727374796C650A506F7369
+          74696F6E2E580500000000000080CE07400A506F736974696F6E2E5905000000
+          00000080F607400A53697A652E576964746805000000000000008003400B5369
+          7A652E48656967687405000000000000008003401453697A652E506C6174666F
+          726D44656661756C74080756697369626C6508085461624F726465720228000A
+          5452656374616E676C6500095374796C654E616D65060A6261636B67726F756E
+          6405416C69676E070643656E7465720A46696C6C2E436F6C6F72070978464634
+          3834383438064C6F636B6564090748697454657374080A53697A652E57696474
+          68050000000000FFFFBF02400B53697A652E486569676874050000000000FFFF
+          BF02401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
+          2E436F6C6F720709784646314331433143000A5452656374616E676C65000541
+          6C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507486974
+          54657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D61
+          7267696E732E546F70050000000000000080FF3F0D4D617267696E732E526967
+          6874050000000000000080FF3F0E4D617267696E732E426F74746F6D05000000
+          0000000080FF3F0A53697A652E5769647468050000000000FFFF9F02400B5369
+          7A652E486569676874050000000000FFFF9F02401453697A652E506C6174666F
+          726D44656661756C74080C5374726F6B652E436F6C6F72070978464635393539
+          353900000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500
+          00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C
+          6F720A537461727456616C756507097846463438343834380953746F7056616C
+          756507097846463538353835380754726967676572061049734D6F7573654F76
+          65723D7472756500000F54436F6C6F72416E696D6174696F6E00084475726174
+          696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C
+          6C2E436F6C6F720A537461727456616C75650709784646353835383538095374
+          6F7056616C756507097846463438343834380754726967676572061149734D6F
+          7573654F7665723D66616C736500000000545046300A5452656374616E676C65
+          00095374796C654E616D6506147363726F6C6C62617276747261636B7374796C
+          6505416C69676E070643656E7465720946696C6C2E4B696E6407044E6F6E6507
+          48697454657374080C4D617267696E732E4C656674050000000000000080FF3F
+          0D4D617267696E732E5269676874050000000000000080FF3F0A53697A652E57
+          696474680500000000000000C803400B53697A652E4865696768740500000000
+          00FFFFF304401453697A652E506C6174666F726D44656661756C74080B537472
+          6F6B652E4B696E6407044E6F6E650756697369626C6508000A5452656374616E
+          676C650005416C69676E0706436C69656E740A46696C6C2E436F6C6F72070978
+          4646434343434343064C6F636B6564090748697454657374080B4D617267696E
+          732E546F7005000000000000008000C00E4D617267696E732E426F74746F6D05
+          000000000000008000C00A53697A652E57696474680500000000000000C80340
+          0B53697A652E48656967687405000000000000008205401453697A652E506C61
+          74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500
+          0006545468756D6200095374796C654E616D6506057468756D62064C6F636B65
+          64090D4D617267696E732E526967687405000000000000008000400A506F7369
+          74696F6E2E580500000000000000A001400A506F736974696F6E2E5905000000
+          00000000A001400A53697A652E57696474680500000000000000A002400B5369
+          7A652E4865696768740500000000000000B804401453697A652E506C6174666F
+          726D44656661756C74080B5374796C654C6F6F6B7570060B767468756D627374
+          796C65000000545046300A5452656374616E676C6500095374796C654E616D65
+          06147363726F6C6C62617268747261636B7374796C6505416C69676E07064365
+          6E7465720946696C6C2E4B696E6407044E6F6E650748697454657374080B4D61
+          7267696E732E546F70050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A53697A652E5769647468050000000000FF
+          FFEF05400B53697A652E48656967687405000000000000009803401453697A65
+          2E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E
+          6F6E650756697369626C6508000A5452656374616E676C650005416C69676E07
+          06436C69656E740A46696C6C2E436F6C6F720709784646434343434343064C6F
+          636B6564090748697454657374080C4D617267696E732E4C6566740500000000
+          0000008000C00D4D617267696E732E526967687405000000000000008000C00A
+          53697A652E5769647468050000000000FFFFF705400B53697A652E4865696768
+          7405000000000000009803401453697A652E506C6174666F726D44656661756C
+          74080B5374726F6B652E4B696E6407044E6F6E65000006545468756D62000953
+          74796C654E616D6506057468756D62064C6F636B6564090E4D617267696E732E
+          426F74746F6D05000000000000008000400A506F736974696F6E2E5805000000
+          000000008001400A506F736974696F6E2E5905000000000000008001400A5369
+          7A652E57696474680500000000000000C804400B53697A652E48656967687405
+          00000000000000D002401453697A652E506C6174666F726D44656661756C7408
+          0B5374796C654C6F6F6B7570060B687468756D627374796C6500000054504630
+          0A5452656374616E676C6500095374796C654E616D6506137363726F6C6C6261
+          726C656674627574746F6E05416C69676E070643656E7465720A46696C6C2E43
+          6F6C6F7207097846464343434343430748697454657374080C4D617267696E73
+          2E4C65667405000000000000008000400B4D617267696E732E546F7005000000
+          0000000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F
+          0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E
+          576964746805000000000000009803400B53697A652E48656967687405000000
+          000000009003401453697A652E506C6174666F726D44656661756C74080C5374
+          726F6B652E436F6C6F7207097846464141414141410756697369626C6508000A
+          5452656374616E676C650005416C69676E0706436C69656E740946696C6C2E4B
+          696E6407044E6F6E650748697454657374080C4D617267696E732E4C65667405
+          0000000000000080FF3F0B4D617267696E732E546F70050000000000000080FF
+          3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61726769
+          6E732E426F74746F6D050000000000000080FF3F0A53697A652E576964746805
+          000000000000008803400B53697A652E48656967687405000000000000008003
+          401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E43
+          6F6C6F72070978464643434343434300000554506174680005416C69676E0706
+          43656E74657209446174612E506174680A400000000500000000000000000080
+          3F00000000010000000000803F0000803F01000000000000000000003F010000
+          000000803F000000000300000000000000000000000A46696C6C2E436F6C6F72
+          0708636C61426C61636B064C6F636B6564090748697454657374080A53697A65
+          2E57696474680500000000000000E001400B53697A652E486569676874050000
+          00000000008002401453697A652E506C6174666F726D44656661756C74080B53
+          74726F6B652E4B696E6407044E6F6E65000000545046300A5452656374616E67
+          6C6500095374796C654E616D6506147363726F6C6C6261727269676874627574
+          746F6E05416C69676E070643656E7465720A46696C6C2E436F6C6F7207097846
+          464343434343430748697454657374080C4D617267696E732E4C656674050000
+          000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D
+          4D617267696E732E526967687405000000000000008000400E4D617267696E73
+          2E426F74746F6D050000000000000080FF3F0A53697A652E5769647468050000
+          00000000008803400B53697A652E486569676874050000000000000090034014
+          53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
+          6F7207097846464141414141410756697369626C6508000A5452656374616E67
+          6C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E
+          650748697454657374080C4D617267696E732E4C656674050000000000000080
+          FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E
+          732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F
+          6D050000000000000080FF3F0A53697A652E57696474680500000000000000F0
+          02400B53697A652E48656967687405000000000000008003401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          4643434343434300000554506174680005416C69676E070643656E7465720944
+          6174612E506174680A3400000004000000000000000000000000000000010000
+          00000000000000803F010000000000803F0000003F0300000000000000000000
+          000A46696C6C2E436F6C6F720708636C61426C61636B064C6F636B6564090748
+          697454657374080A53697A652E57696474680500000000000000E001400B5369
+          7A652E48656967687405000000000000008002401453697A652E506C6174666F
+          726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000054
+          5046300A5452656374616E676C6500095374796C654E616D6506127363726F6C
+          6C626172746F70627574746F6E05416C69676E070643656E7465720A46696C6C
+          2E436F6C6F7207097846464343434343430748697454657374080C4D61726769
+          6E732E4C656674050000000000000080FF3F0B4D617267696E732E546F700500
+          0000000000008000400D4D617267696E732E5269676874050000000000000080
+          FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A
+          652E576964746805000000000000008003400B53697A652E4865696768740500
+          0000000000009803401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F7207097846464141414141410756697369626C6508
+          000A5452656374616E676C650005416C69676E0706436C69656E740946696C6C
+          2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C6566
+          74050000000000000080FF3F0B4D617267696E732E546F700500000000000000
+          80FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D6172
+          67696E732E426F74746F6D050000000000000080FF3F0A53697A652E57696474
+          680500000000000000E002400B53697A652E4865696768740500000000000000
+          8803401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
+          2E436F6C6F72070978464643434343434300000554506174680005416C69676E
+          070643656E74657209446174612E506174680A40000000050000000000000000
+          0000000000803F010000000000803F0000803F010000000000003F0000000001
+          000000000000000000803F0300000000000000000000000A46696C6C2E436F6C
+          6F720708636C61426C61636B064C6F636B6564090748697454657374080A5369
+          7A652E576964746805000000000000008002400B53697A652E48656967687405
+          00000000000000E001401453697A652E506C6174666F726D44656661756C7408
+          0B5374726F6B652E4B696E6407044E6F6E65000000545046300A545265637461
+          6E676C6500095374796C654E616D6506157363726F6C6C626172626F74746F6D
+          627574746F6E05416C69676E070643656E7465720A46696C6C2E436F6C6F7207
+          097846464343434343430748697454657374080C4D617267696E732E4C656674
+          050000000000000080FF3F0B4D617267696E732E546F70050000000000000080
+          FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267
+          696E732E426F74746F6D05000000000000008000400A53697A652E5769647468
+          05000000000000008803400B53697A652E486569676874050000000000000088
+          03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F7207097846464141414141410756697369626C6508000A5452656374
+          616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E640704
+          4E6F6E650748697454657374080C4D617267696E732E4C656674050000000000
+          000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D6172
+          67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F
+          74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000
+          0000F002400B53697A652E4865696768740500000000000000F002401453697A
+          652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207
+          0978464643434343434300000554506174680005416C69676E070643656E7465
+          7209446174612E506174680A3400000004000000000000000000000000000000
+          010000000000803F00000000010000000000003F0000803F0300000000000000
+          000000000A46696C6C2E436F6C6F720708636C61426C61636B064C6F636B6564
+          090748697454657374080A53697A652E57696474680500000000000000800240
+          0B53697A652E4865696768740500000000000000E001401453697A652E506C61
+          74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500
+          00005450463007544C61796F757400095374796C654E616D65060B687468756D
+          627374796C6505416C69676E070643656E7465720A53697A652E576964746805
+          0000000000FFFFF304400B53697A652E4865696768740500000000000100E002
+          401453697A652E506C6174666F726D44656661756C74080756697369626C6508
+          085461624F72646572022F000A5452656374616E676C6500095374796C654E61
+          6D65060A6261636B67726F756E6405416C69676E0706436C69656E740A46696C
+          6C2E436F6C6F720709784646424242424242064C6F636B656409074869745465
+          7374080C4D617267696E732E4C656674050000000000000080FFBF0D4D617267
+          696E732E5269676874050000000000000080FFBF0A53697A652E576964746805
+          0000000000FFFFFB04400B53697A652E4865696768740500000000000100E002
+          401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B
+          696E6407044E6F6E65000A5452656374616E676C650005416C69676E0706436C
+          69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61
+          7267696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F
+          70050000000000000080FF3F0D4D617267696E732E5269676874050000000000
+          000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A
+          53697A652E5769647468050000000000FFFFF304400B53697A652E4865696768
+          740500000000000100C002401453697A652E506C6174666F726D44656661756C
+          74080B5374726F6B652E4B696E6407044E6F6E6500000F54436F6C6F72416E69
+          6D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F70
+          657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507
+          097846464242424242420953746F7056616C7565070978464641414141414107
+          54726967676572061049734D6F7573654F7665723D7472756500000F54436F6C
+          6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F
+          0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456
+          616C756507097846464141414141410953746F7056616C756507097846464242
+          424242420754726967676572061149734D6F7573654F7665723D66616C736500
+          0000005450463007544C61796F757400095374796C654E616D65060B76746875
+          6D627374796C6505416C69676E070643656E7465720A53697A652E5769647468
+          050000000000FFFFBF02400B53697A652E4865696768740500000000000000BC
+          04401453697A652E506C6174666F726D44656661756C74080756697369626C65
+          08085461624F726465720230000A5452656374616E676C6500095374796C654E
+          616D65060A6261636B67726F756E6405416C69676E0706436C69656E740A4669
+          6C6C2E436F6C6F720709784646424242424242064C6F636B6564090748697454
+          657374080B4D617267696E732E546F70050000000000000080FFBF0E4D617267
+          696E732E426F74746F6D050000000000000080FFBF0A53697A652E5769647468
+          050000000000FFFFBF02400B53697A652E4865696768740500000000000000C4
+          04401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E
+          4B696E6407044E6F6E65000A5452656374616E676C650005416C69676E070643
+          6C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D
+          617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E54
+          6F70050000000000000080FF3F0D4D617267696E732E52696768740500000000
+          00000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F
+          0A53697A652E5769647468050000000000FFFF9F02400B53697A652E48656967
+          68740500000000000000BC04401453697A652E506C6174666F726D4465666175
+          6C74080B5374726F6B652E4B696E6407044E6F6E6500000F54436F6C6F72416E
+          696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F
+          70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565
+          07097846464242424242420953746F7056616C75650709784646414141414141
+          0754726967676572061049734D6F7573654F7665723D7472756500000F54436F
+          6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB
+          3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C756507097846464141414141410953746F7056616C7565070978464642
+          42424242420754726967676572061149734D6F7573654F7665723D66616C7365
+          000000005450463007544C61796F757400095374796C654E616D65060D636F6D
+          626F626F787374796C6505416C69676E070643656E7465720A53697A652E5769
+          6474680500000000000000B205400B53697A652E486569676874050000000000
+          0000D003401453697A652E506C6174666F726D44656661756C74080756697369
+          626C6508085461624F726465720231000A5452656374616E676C650009537479
+          6C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E74656E
+          74730A46696C6C2E436F6C6F720708636C615768697465064C6F636B65640907
+          48697454657374080C4D617267696E732E4C6566740500000000000000800040
+          0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E
+          526967687405000000000000008000400E4D617267696E732E426F74746F6D05
+          000000000000008000400A53697A652E57696474680500000000000000AA0540
+          0B53697A652E4865696768740500000000000000B003401453697A652E506C61
+          74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500
+          0A5452656374616E676C650005416C69676E0706436C69656E740946696C6C2E
+          4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C656674
+          05000000000000008000C00B4D617267696E732E546F70050000000000000080
+          00C00D4D617267696E732E526967687405000000000000008000C00E4D617267
+          696E732E426F74746F6D05000000000000008000C00A53697A652E5769647468
+          0500000000000000B205400B53697A652E4865696768740500000000000000D0
+          03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E
+          436F6C6F720708636C615768697465000A5452656374616E676C650005416C69
+          676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465
+          7374080C4D617267696E732E4C656674050000000000000080FF3F0B4D617267
+          696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874
+          050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000
+          000080FF3F0A53697A652E57696474680500000000000000AE05400B53697A65
+          2E4865696768740500000000000000C003401453697A652E506C6174666F726D
+          44656661756C74080C5374726F6B652E436F6C6F720707636C61477261790000
+          000007544C61796F75740005416C69676E07055269676874064C6F636B656409
+          0A506F736974696F6E2E5805000000000000008E05400A53697A652E57696474
+          6805000000000000009003400B53697A652E4865696768740500000000000000
+          D003401453697A652E506C6174666F726D44656661756C740800055450617468
+          0005416C69676E070643656E74657209446174612E506174680A640000000800
+          000000000000E5D01C414A0CF241010000005839EB41D7A36E410100000054E3
+          5B42AC1C344201000000BE5F9F425EBA774101000000B448C842A8C6EF410100
+          000054E35B424CB7954201000000E5D01C414A0CF24103000000000000000000
+          00000A46696C6C2E436F6C6F720709784646333333333333064C6F636B656409
+          0748697454657374080A53697A652E57696474680500000000000000A002400B
+          53697A652E4865696768740500000000000000E001401453697A652E506C6174
+          666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650000
+          000C5442727573684F626A65637400095374796C654E616D65060A666F726567
+          726F756E640B42727573682E436F6C6F720708636C61426C61636B000007544C
+          61796F757400095374796C654E616D650607636F6E74656E7405416C69676E07
+          08436F6E74656E7473064C6F636B6564090C4D617267696E732E4C6566740500
+          0000000000008000400B4D617267696E732E546F700500000000000000800040
+          0D4D617267696E732E52696768740500000000000000B803400E4D617267696E
+          732E426F74746F6D05000000000000008000400A53697A652E57696474680500
+          0000000000008005400B53697A652E4865696768740500000000000000B00340
+          1453697A652E506C6174666F726D44656661756C74080000005450463007544C
+          61796F757400095374796C654E616D65060E636F6D626F656469747374796C65
+          05416C69676E070643656E7465720A53697A652E576964746805000000000000
+          00B205400B53697A652E4865696768740500000000000000D003401453697A65
+          2E506C6174666F726D44656661756C74080756697369626C6508085461624F72
+          6465720232000A5452656374616E676C6500095374796C654E616D65060A6261
+          636B67726F756E6405416C69676E0708436F6E74656E74730A46696C6C2E436F
+          6C6F720708636C615768697465064C6F636B6564090748697454657374080C4D
+          617267696E732E4C65667405000000000000008000400B4D617267696E732E54
+          6F7005000000000000008000400D4D617267696E732E52696768740500000000
+          0000008000400E4D617267696E732E426F74746F6D0500000000000000800040
+          0A53697A652E57696474680500000000000000AA05400B53697A652E48656967
+          68740500000000000000B003401453697A652E506C6174666F726D4465666175
+          6C74080C5374726F6B652E436F6C6F720709784646364136413641000A545265
+          6374616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E64
+          07044E6F6E650748697454657374080C4D617267696E732E4C65667405000000
+          000000008000C00B4D617267696E732E546F7005000000000000008000C00D4D
+          617267696E732E526967687405000000000000008000C00E4D617267696E732E
+          426F74746F6D05000000000000008000C00A53697A652E576964746805000000
+          00000000B205400B53697A652E4865696768740500000000000000D003401453
+          697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F
+          720709784646353135313531000A5452656374616E676C650005416C69676E07
+          06436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465737408
+          0C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E73
+          2E546F70050000000000000080FF3F0D4D617267696E732E5269676874050000
+          000000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080
+          FF3F0A53697A652E57696474680500000000000000AE05400B53697A652E4865
+          696768740500000000000000C003401453697A652E506C6174666F726D446566
+          61756C74080C5374726F6B652E436F6C6F720709784646314331433143000000
+          0007544C61796F757400095374796C654E616D6506056172726F7705416C6967
+          6E07055269676874064C6F636B6564090A506F736974696F6E2E580500000000
+          0000008E05400A53697A652E576964746805000000000000009003400B53697A
+          652E4865696768740500000000000000D003401453697A652E506C6174666F72
+          6D44656661756C7408000554506174680005416C69676E070643656E74657209
+          446174612E506174680A640000000800000000000000E5D01C414A0CF2410100
+          00005839EB41D7A36E410100000054E35B42AC1C344201000000BE5F9F425EBA
+          774101000000B448C842A8C6EF410100000054E35B424CB7954201000000E5D0
+          1C414A0CF2410300000000000000000000000A46696C6C2E436F6C6F72070978
+          4646434143414341064C6F636B6564090748697454657374080A53697A652E57
+          696474680500000000000000A002400B53697A652E4865696768740500000000
+          000000E001401453697A652E506C6174666F726D44656661756C74080B537472
+          6F6B652E4B696E6407044E6F6E650000000C5442727573684F626A6563740009
+          5374796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F
+          720708636C61426C61636B00000C5442727573684F626A65637400095374796C
+          654E616D65060973656C656374696F6E0A42727573682E4B696E640708477261
+          6469656E741542727573682E4772616469656E742E506F696E74730E0105436F
+          6C6F720708636C61426C61636B064F6666736574050000000000000000000000
+          0105436F6C6F720709783830324236453746064F666673657405000000000012
+          A2F8FD3F000105436F6C6F720709783830324236343732064F66667365740500
+          00000000000080FF3F0000000007544C61796F757400095374796C654E616D65
+          0607636F6E74656E7405416C69676E0708436F6E74656E7473064C6F636B6564
+          090C4D617267696E732E4C65667405000000000000008001400B4D617267696E
+          732E546F700500000000000000C000400D4D617267696E732E52696768740500
+          000000000000B803400E4D617267696E732E426F74746F6D0500000000000000
+          C000400A53697A652E57696474680500000000000000F804400B53697A652E48
+          65696768740500000000000000A003401453697A652E506C6174666F726D4465
+          6661756C7408000000545046300A5452656374616E676C6500095374796C654E
+          616D65060A747261636B7374796C6505416C69676E070643656E7465720A4669
+          6C6C2E436F6C6F7207097846463438343834380748697454657374080A53697A
+          652E5769647468050000000000FFFFEF05400B53697A652E4865696768740500
+          0000000000009803401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F7207097846463143314331430756697369626C6508
+          000A5452656374616E676C650005416C69676E0706436C69656E740946696C6C
+          2E4B696E6407044E6F6E65064C6F636B6564090748697454657374080C4D6172
+          67696E732E4C65667405000000000000008000400B4D617267696E732E546F70
+          05000000000000008000400D4D617267696E732E526967687405000000000000
+          008000400E4D617267696E732E426F74746F6D05000000000000008000400A53
+          697A652E5769647468050000000000FFFFE705400B53697A652E486569676874
+          0500000000000000F002401453697A652E506C6174666F726D44656661756C74
+          080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500000000
+          000000E0014007595261646975730500000000000000E0014000000654546875
+          6D6200095374796C654E616D6506057468756D62064C6F636B6564090C4D6172
+          67696E732E4C6566740500000000000000C000400B4D617267696E732E546F70
+          05000000000000008000400D4D617267696E732E526967687405000000000000
+          00C000400E4D617267696E732E426F74746F6D05000000000000008000400A50
+          6F736974696F6E2E5805000000000000008001400A506F736974696F6E2E5905
+          000000000000008001400A53697A652E57696474680500000000000000CC0440
+          0B53697A652E48656967687405000000000000008003401453697A652E506C61
+          74666F726D44656661756C74080B5374796C654C6F6F6B7570060B687468756D
+          627374796C650000005450463007544C61796F757400095374796C654E616D65
+          060C6C697374626F787374796C6505416C69676E070643656E7465720A53697A
+          652E5769647468050000000000FFFFE905400B53697A652E4865696768740500
+          0000000000008306401453697A652E506C6174666F726D44656661756C740807
+          56697369626C6508085461624F726465720234000A5452656374616E676C6500
+          095374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F
+          6E74656E74730A46696C6C2E436F6C6F720708636C615768697465064C6F636B
+          6564090748697454657374080C50616464696E672E4C65667405000000000000
+          0080FF3F0B50616464696E672E546F70050000000000000080FF3F0D50616464
+          696E672E5269676874050000000000000080FF3F0E50616464696E672E426F74
+          746F6D050000000000000080FF3F0A53697A652E5769647468050000000000FF
+          FFE905400B53697A652E48656967687405000000000000008306401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
+          784646434143414341000A5452656374616E676C650005416C69676E0706436C
+          69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080A5369
+          7A652E5769647468050000000000FFFFE505400B53697A652E48656967687405
+          000000000000008106401453697A652E506C6174666F726D44656661756C7408
+          0C5374726F6B652E436F6C6F720709784646353935393539000007544C61796F
+          75740005416C69676E0706436C69656E740A53697A652E576964746805000000
+          0000FFFFE505400B53697A652E48656967687405000000000000008106401453
+          697A652E506C6174666F726D44656661756C74080007544C61796F7574000953
+          74796C654E616D650607636F6E74656E7405416C69676E0706436C69656E740C
+          436C69704368696C6472656E090C4D617267696E732E4C656674050000000000
+          000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D6172
+          67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F
+          74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000
+          FFFFC305400B53697A652E4865696768740500000000000000E005401453697A
+          652E506C6174666F726D44656661756C7408000A5452656374616E676C650009
+          5374796C654E616D65060973656C656374696F6E0A46696C6C2E436F6C6F7207
+          097846464536453645360748697454657374080A53697A652E57696474680500
+          000000000000C804400B53697A652E4865696768740500000000000000C80440
+          1453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B69
+          6E6407044E6F6E6500000A5452656374616E676C6500095374796C654E616D65
+          0610666F637573656473656C656374696F6E0A46696C6C2E436F6C6F72070978
+          46464536453645360748697454657374080A53697A652E576964746805000000
+          00000000C804400B53697A652E4865696768740500000000000000C804401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E650B5374726F6B652E446173680703446F740000000A545363726F
+          6C6C42617200095374796C654E616D65060A767363726F6C6C62617205416C69
+          676E070552696768740B536D616C6C4368616E67650500000000000000000000
+          0B4F7269656E746174696F6E0708566572746963616C0A506F736974696F6E2E
+          58050000000000FFFFC705400A53697A652E57696474680500000000000000F0
+          02400B53697A652E4865696768740500000000000000E405401453697A652E50
+          6C6174666F726D44656661756C740800000A545363726F6C6C42617200095374
+          796C654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F
+          6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E7461
+          74696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E590500000000
+          000000E405400A53697A652E5769647468050000000000FFFFE505400B53697A
+          652E4865696768740500000000000000F002401453697A652E506C6174666F72
+          6D44656661756C740800000F54536D616C6C5363726F6C6C4261720009537479
+          6C654E616D65060F76736D616C6C7363726F6C6C62617205416C69676E070552
+          696768740B536D616C6C4368616E676505000000000000000000000B4F726965
+          6E746174696F6E0708566572746963616C0B4D617267696E732E546F70050000
+          000000000080FF3F0D4D617267696E732E5269676874050000000000000080FF
+          3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F7369
+          74696F6E2E580500000000000000C605400A506F736974696F6E2E5905000000
+          000000008000400A53697A652E576964746805000000000000008002400B5369
+          7A652E48656967687405000000000000008002401453697A652E506C6174666F
+          726D44656661756C74080756697369626C650800000F54536D616C6C5363726F
+          6C6C42617200095374796C654E616D65060F68736D616C6C7363726F6C6C6261
+          7205416C69676E0706426F74746F6D0B536D616C6C4368616E67650500000000
+          0000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0C4D
+          617267696E732E4C656674050000000000000080FF3F0D4D617267696E732E52
+          69676874050000000000000080FF3F0E4D617267696E732E426F74746F6D0500
+          00000000000080FF3F0A506F736974696F6E2E5805000000000000008000400A
+          506F736974696F6E2E590500000000000000E205400A53697A652E5769647468
+          05000000000000009606400B53697A652E486569676874050000000000000080
+          02401453697A652E506C6174666F726D44656661756C74080756697369626C65
+          08000000000B54476C6F774566666563740008536F66746E6573730500000000
+          009A9999FD3F09476C6F77436F6C6F720709784646363543384530074F706163
+          697479050000000000000080FF3F0754726967676572060E4973466F63757365
+          643D7472756507456E61626C6564080000005450463007544C61796F75740009
+          5374796C654E616D6506126C697374626F78706C61696E68656164657205416C
+          69676E070643656E7465720A53697A652E57696474680500000000000000B605
+          400B53697A652E4865696768740500000000000000C003401453697A652E506C
+          6174666F726D44656661756C74080756697369626C6508085461624F72646572
+          0235000A5452656374616E676C6500095374796C654E616D65060A6261636B67
+          726F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407
+          084772616469656E741446696C6C2E4772616469656E742E506F696E74730E01
+          05436F6C6F720709784646353835383538064F66667365740500000000000000
+          000000000105436F6C6F720709784646353135313531064F6666736574050000
+          000000A01BF3FD3F000105436F6C6F720709784646343934393439064F666673
+          6574050000000000000080FF3F0000064C6F636B656409074869745465737408
+          0A53697A652E57696474680500000000000000B605400B53697A652E48656967
+          68740500000000000000C003401453697A652E506C6174666F726D4465666175
+          6C74080C5374726F6B652E436F6C6F720709784646314331433143001054496E
+          6E6572476C6F774566666563740008536F66746E657373050000000000CDCCCC
+          FD3F09476C6F77436F6C6F720709784646344634383438074F70616369747905
+          00000000006666E6FE3F0754726967676572060E4973507265737365643D7472
+          756507456E61626C65640800000005545465787400095374796C654E616D6506
+          047465787405416C69676E0706436C69656E74064C6F636B6564090748697454
+          657374080C4D617267696E732E4C6566740500000000000000A001400B4D6172
+          67696E732E546F7005000000000000008000400D4D617267696E732E52696768
+          740500000000000000A001400E4D617267696E732E426F74746F6D0500000000
+          0000008000400A53697A652E57696474680500000000000000A205400B53697A
+          652E4865696768740500000000000000A003401453697A652E506C6174666F72
+          6D44656661756C7408165465787453657474696E67732E466F6E74436F6C6F72
+          0708636C6157686974650000005450463007544C61796F757400095374796C65
+          4E616D65060D6C697374626F78666F6F74657205416C69676E070643656E7465
+          720A53697A652E57696474680500000000000000B605400B53697A652E486569
+          6768740500000000000000C003401453697A652E506C6174666F726D44656661
+          756C74080756697369626C6508085461624F7264657202360005545465787400
+          095374796C654E616D6506047465787405416C69676E0706436C69656E74064C
+          6F636B6564090748697454657374080C4D617267696E732E4C65667405000000
+          00000000A001400B4D617267696E732E546F7005000000000000008000400D4D
+          617267696E732E52696768740500000000000000A001400E4D617267696E732E
+          426F74746F6D05000000000000008000400A53697A652E576964746805000000
+          00000000A205400B53697A652E4865696768740500000000000000A003401453
+          697A652E506C6174666F726D44656661756C7408165465787453657474696E67
+          732E466F6E74436F6C6F720708636C6157686974650000005450463007544C61
+          796F757400095374796C654E616D6506177472616E73706172656E746C697374
+          626F787374796C6505416C69676E070643656E7465720A53697A652E57696474
+          68050000000000FFFFE905400B53697A652E4865696768740500000000000000
+          8306401453697A652E506C6174666F726D44656661756C74080756697369626C
+          6508085461624F7264657202370007544C61796F757400095374796C654E616D
+          65060A6261636B67726F756E6405416C69676E0708436F6E74656E7473064C6F
+          636B6564090A53697A652E5769647468050000000000FFFFE905400B53697A65
+          2E48656967687405000000000000008306401453697A652E506C6174666F726D
+          44656661756C74080007544C61796F75740005416C69676E0706436C69656E74
+          0A53697A652E5769647468050000000000FFFFE905400B53697A652E48656967
+          687405000000000000008306401453697A652E506C6174666F726D4465666175
+          6C74080007544C61796F757400095374796C654E616D650607636F6E74656E74
+          05416C69676E0706436C69656E740C436C69704368696C6472656E090C4D6172
+          67696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F70
+          050000000000000080FF3F0D4D617267696E732E526967687405000000000000
+          0080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53
+          697A652E5769647468050000000000FFFFC705400B53697A652E486569676874
+          0500000000000000E405401453697A652E506C6174666F726D44656661756C74
+          08000A5452656374616E676C6500095374796C654E616D65060973656C656374
+          696F6E0946696C6C2E4B696E6407084772616469656E741446696C6C2E477261
+          6469656E742E506F696E74730E0105436F6C6F72070978383032423739384306
+          4F66667365740500000000000000000000000105436F6C6F7207097838303242
+          36453746064F666673657405000000000012A2F8FD3F000105436F6C6F720709
+          783830324236343732064F6666736574050000000000000080FF3F0000074869
+          7454657374080A53697A652E57696474680500000000000000C804400B53697A
+          652E4865696768740500000000000000C804401453697A652E506C6174666F72
+          6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000A5452
+          656374616E676C6500095374796C654E616D650610666F637573656473656C65
+          6374696F6E0946696C6C2E4B696E6407084772616469656E741446696C6C2E47
+          72616469656E742E506F696E74730E0105436F6C6F7207097838303242373938
+          43064F66667365740500000000000000000000000105436F6C6F720709783830
+          324236453746064F666673657405000000000012A2F8FD3F000105436F6C6F72
+          0709783830324236343732064F6666736574050000000000000080FF3F000007
+          48697454657374080A53697A652E57696474680500000000000000C804400B53
+          697A652E4865696768740500000000000000C804401453697A652E506C617466
+          6F726D44656661756C74080B5374726F6B652E446173680703446F740000000A
+          545363726F6C6C42617200095374796C654E616D65060A767363726F6C6C6261
+          7205416C69676E070552696768740B536D616C6C4368616E6765050000000000
+          00000000000B4F7269656E746174696F6E0708566572746963616C0A506F7369
+          74696F6E2E58050000000000FFFFCB05400A53697A652E576964746805000000
+          00000000F002400B53697A652E4865696768740500000000000000E805401453
+          697A652E506C6174666F726D44656661756C740800000A545363726F6C6C4261
+          7200095374796C654E616D65060A687363726F6C6C62617205416C69676E0706
+          426F74746F6D0B536D616C6C4368616E676505000000000000000000000B4F72
+          69656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E59
+          0500000000000000E805400A53697A652E5769647468050000000000FFFFE905
+          400B53697A652E4865696768740500000000000000F002401453697A652E506C
+          6174666F726D44656661756C740800000F54536D616C6C5363726F6C6C426172
+          00095374796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69
+          676E070552696768740B536D616C6C4368616E67650500000000000000000000
+          0B4F7269656E746174696F6E0708566572746963616C0B4D617267696E732E54
+          6F70050000000000000080FF3F0D4D617267696E732E52696768740500000000
+          00000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F
+          0A506F736974696F6E2E580500000000000000C605400A506F736974696F6E2E
+          5905000000000000008000400A53697A652E5769647468050000000000000080
+          02400B53697A652E48656967687405000000000000008002401453697A652E50
+          6C6174666F726D44656661756C74080756697369626C650800000F54536D616C
+          6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C736372
+          6F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C4368616E6765
+          05000000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E
+          74616C0C4D617267696E732E4C656674050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000000000
+          008000400A506F736974696F6E2E590500000000000000E205400A53697A652E
+          576964746805000000000000009606400B53697A652E48656967687405000000
+          000000008002401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C65080000000000545046300A5452656374616E676C6500095374796C
+          654E616D6506167472616E73706172656E74627574746F6E7374796C6505416C
+          69676E070643656E7465720A46696C6C2E436F6C6F7207097830303830383038
+          300748697454657374080A53697A652E57696474680500000000000000F00240
+          0B53697A652E4865696768740500000000000000F002401453697A652E506C61
+          74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6507
+          56697369626C6508000F54436F6C6F72416E696D6174696F6E00084475726174
+          696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C
+          6C2E436F6C6F720A537461727456616C75650709783030383038303830095374
+          6F7056616C756507097841463830383038300754726967676572061049734D6F
+          7573654F7665723D7472756500000F54436F6C6F72416E696D6174696F6E0008
+          4475726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65
+          060A46696C6C2E636F6C6F720A537461727456616C7565070978414638303830
+          38300953746F7056616C75650709783030383038303830075472696767657206
+          1149734D6F7573654F7665723D66616C736500000F54466C6F6174416E696D61
+          74696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F706572
+          74794E616D65060E506172656E742E4F7061636974790A537461727456616C75
+          65050000000000000080FF3F0953746F7056616C7565050000000000000080FE
+          3F0754726967676572061049734D6F7573654F7665723D7472756500000F5446
+          6C6F6174416E696D6174696F6E00084475726174696F6E050000000000CDCCCC
+          FB3F0C50726F70657274794E616D65060E506172656E742E4F7061636974790A
+          537461727456616C7565050000000000000080FE3F0953746F7056616C756505
+          0000000000000080FF3F0754726967676572061149734D6F7573654F7665723D
+          66616C7365000000545046300854456C6C6970736500095374796C654E616D65
+          061C7472616E73706172656E74636972636C65627574746F6E7374796C650541
+          6C69676E070643656E7465720A46696C6C2E436F6C6F72070978303038303830
+          38300748697454657374080A53697A652E57696474680500000000000000F002
+          400B53697A652E4865696768740500000000000000F002401453697A652E506C
+          6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
+          0756697369626C6508000F54436F6C6F72416E696D6174696F6E000844757261
+          74696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A4669
+          6C6C2E436F6C6F720A537461727456616C756507097830303830383038300953
+          746F7056616C756507097841463830383038300754726967676572061049734D
+          6F7573654F7665723D7472756500000F54436F6C6F72416E696D6174696F6E00
+          084475726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D
+          65060A46696C6C2E636F6C6F720A537461727456616C75650709784146383038
+          3038300953746F7056616C756507097830303830383038300754726967676572
+          061149734D6F7573654F7665723D66616C736500000F54466C6F6174416E696D
+          6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F7065
+          7274794E616D65060E506172656E742E4F7061636974790A537461727456616C
+          7565050000000000000080FF3F0953746F7056616C7565050000000000000080
+          FE3F0754726967676572061049734D6F7573654F7665723D7472756500000F54
+          466C6F6174416E696D6174696F6E00084475726174696F6E050000000000CDCC
+          CCFB3F0C50726F70657274794E616D65060E506172656E742E4F706163697479
+          0A537461727456616C7565050000000000000080FE3F0953746F7056616C7565
+          050000000000000080FF3F0754726967676572061149734D6F7573654F766572
+          3D66616C73650000005450463007544C61796F757400095374796C654E616D65
+          06106C697374626F786974656D7374796C6505416C69676E070643656E746572
+          0A53697A652E57696474680500000000000000B005400B53697A652E48656967
+          68740500000000000000C003401453697A652E506C6174666F726D4465666175
+          6C74080756697369626C6508085461624F72646572023A000654476C79706800
+          095374796C654E616D65060A676C7970687374796C650C4D617267696E732E4C
+          65667405000000000000008000400B4D617267696E732E546F70050000000000
+          000080FF3F0D4D617267696E732E526967687405000000000000008000400E4D
+          617267696E732E426F74746F6D050000000000000080FF3F05416C69676E0704
+          4C6566740A53697A652E576964746805000000000000008003400B53697A652E
+          48656967687405000000000000008003401453697A652E506C6174666F726D44
+          656661756C7408000005545465787400095374796C654E616D65060474657874
+          05416C69676E0706436C69656E740748697454657374080C4D617267696E732E
+          4C6566740500000000000000C000400B4D617267696E732E546F700500000000
+          00000080FF3F0D4D617267696E732E52696768740500000000000000C000400E
+          4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E57
+          696474680500000000000000A405400B53697A652E4865696768740500000000
+          000000B003401453697A652E506C6174666F726D44656661756C740815546578
+          7453657474696E67732E576F72645772617008165465787453657474696E6773
+          2E486F727A416C69676E07074C656164696E6700000954436865636B426F7800
+          095374796C654E616D650605636865636B05416C69676E07084D6F73744C6566
+          740843616E466F637573081244697361626C65466F637573456666656374090A
+          53697A652E57696474680500000000000000A003400B53697A652E4865696768
+          740500000000000000C003401453697A652E506C6174666F726D44656661756C
+          74080756697369626C65080000005450463007544C61796F757400095374796C
+          654E616D650615636F6C6F726C697374626F786974656D7374796C6505416C69
+          676E070643656E7465720A53697A652E57696474680500000000000000B00540
+          0B53697A652E4865696768740500000000000000C003401453697A652E506C61
+          74666F726D44656661756C74080756697369626C6508085461624F7264657202
+          3B000954436865636B426F7800095374796C654E616D650605636865636B0541
+          6C69676E07044C6566740843616E466F637573081244697361626C65466F6375
+          73456666656374090A53697A652E57696474680500000000000000A003400B53
+          697A652E4865696768740500000000000000C003401453697A652E506C617466
+          6F726D44656661756C74080756697369626C650800000A5452656374616E676C
+          6500095374796C654E616D650605636F6C6F7205416C69676E07044C65667406
+          4C6F636B6564090748697454657374080C4D617267696E732E4C656674050000
+          00000000008000400B4D617267696E732E546F7005000000000000008000400D
+          4D617267696E732E526967687405000000000000008000400E4D617267696E73
+          2E426F74746F6D05000000000000008000400A506F736974696F6E2E58050000
+          00000000008000400A506F736974696F6E2E5905000000000000008000400A53
+          697A652E576964746805000000000000008003400B53697A652E486569676874
+          0500000000000000A003401453697A652E506C6174666F726D44656661756C74
+          080C5374726F6B652E436F6C6F72070978464636413641364100000554546578
+          7400095374796C654E616D6506047465787405416C69676E0706436C69656E74
+          0748697454657374080C4D617267696E732E4C6566740500000000000000C000
+          400B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E73
+          2E52696768740500000000000000C000400E4D617267696E732E426F74746F6D
+          050000000000000080FF3F0A53697A652E57696474680500000000000000F804
+          400B53697A652E4865696768740500000000000000B003401453697A652E506C
+          6174666F726D44656661756C7408155465787453657474696E67732E576F7264
+          5772617008165465787453657474696E67732E486F727A416C69676E07074C65
+          6164696E670000005450463007544C61796F757400095374796C654E616D6506
+          0E7363726F6C6C6261727374796C6505416C69676E070643656E7465720A5369
+          7A652E57696474680500000000000000B006400B53697A652E48656967687405
+          00000000000000D404401453697A652E506C6174666F726D44656661756C7408
+          0756697369626C6508085461624F72646572023C000A5452656374616E676C65
+          00095374796C654E616D65060A6261636B67726F756E6405416C69676E070843
+          6F6E74656E74730946696C6C2E4B696E6407044E6F6E65064C6F636B65640907
+          48697454657374080A53697A652E57696474680500000000000000B006400B53
+          697A652E4865696768740500000000000000D404401453697A652E506C617466
+          6F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000C
+          545370656564427574746F6E00095374796C654E616D65060A6C656674627574
+          746F6E05416C69676E07044C656674064C6F636B6564090A506F736974696F6E
+          2E5905000000000000009003400A53697A652E57696474680500000000000000
+          9003400B53697A652E48656967687405000000000000008803401453697A652E
+          506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006137363
+          726F6C6C6261726C656674627574746F6E155465787453657474696E67732E54
+          72696D6D696E6707044E6F6E6500000654547261636B00095374796C654E616D
+          65060668747261636B05416C69676E0706436C69656E74064C6F636B65640903
+          4D6178050000000000000080FF3F0B4F7269656E746174696F6E070A486F7269
+          7A6F6E74616C0A53697A652E576964746805000000000000008C06400B53697A
+          652E48656967687405000000000000008803401453697A652E506C6174666F72
+          6D44656661756C74080B5374796C654C6F6F6B757006147363726F6C6C626172
+          68747261636B7374796C650C56696577706F727453697A650500F8FFFFFFCCCC
+          CCFB3F00000C545370656564427574746F6E00095374796C654E616D65060B72
+          69676874627574746F6E05416C69676E07055269676874064C6F636B6564090A
+          506F736974696F6E2E5805000000000000009E06400A506F736974696F6E2E59
+          05000000000000009003400A53697A652E576964746805000000000000009003
+          400B53697A652E48656967687405000000000000008803401453697A652E506C
+          6174666F726D44656661756C74080B5374796C654C6F6F6B757006147363726F
+          6C6C6261727269676874627574746F6E155465787453657474696E67732E5472
+          696D6D696E6707044E6F6E6500000654547261636B00095374796C654E616D65
+          060676747261636B05416C69676E0706436C69656E74064C6F636B656409034D
+          6178050000000000000080FF3F0B4F7269656E746174696F6E070A486F72697A
+          6F6E74616C0A53697A652E576964746805000000000000008C06400B53697A65
+          2E48656967687405000000000000008803401453697A652E506C6174666F726D
+          44656661756C74080B5374796C654C6F6F6B757006147363726F6C6C62617276
+          747261636B7374796C650C56696577706F727453697A650500F8FFFFFFCCCCCC
+          FB3F00000C545370656564427574746F6E00095374796C654E616D650609746F
+          70627574746F6E05416C69676E0703546F70064C6F636B6564090A53697A652E
+          57696474680500000000000000B006400B53697A652E48656967687405000000
+          000000009003401453697A652E506C6174666F726D44656661756C74080B5374
+          796C654C6F6F6B757006127363726F6C6C626172746F70627574746F6E155465
+          787453657474696E67732E5472696D6D696E6707044E6F6E6500000C54537065
+          6564427574746F6E00095374796C654E616D65060C626F74746F6D627574746F
+          6E05416C69676E0706426F74746F6D064C6F636B6564090A506F736974696F6E
+          2E5905000000000000008C04400A53697A652E57696474680500000000000000
+          B006400B53697A652E48656967687405000000000000009003401453697A652E
+          506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006157363
+          726F6C6C626172626F74746F6D627574746F6E155465787453657474696E6773
+          2E5472696D6D696E6707044E6F6E65000000545046300A5452656374616E676C
+          6500095374796C654E616D650619736D616C6C7363726F6C6C62617276747261
+          636B7374796C6505416C69676E070643656E7465720946696C6C2E4B696E6407
+          044E6F6E650748697454657374080A53697A652E576964746805000000000000
+          00C803400B53697A652E486569676874050000000000FFFFF304401453697A65
+          2E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E
+          6F6E650756697369626C6508000A5452656374616E676C650005416C69676E07
+          06436C69656E740A46696C6C2E436F6C6F720709784646343834383438064C6F
+          636B6564090748697454657374080A53697A652E576964746805000000000000
+          00C803400B53697A652E486569676874050000000000FFFFF304401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
+          784646314331433143000006545468756D6200095374796C654E616D65060574
+          68756D62064C6F636B6564090B4D617267696E732E546F700500000000000000
+          80FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F
+          736974696F6E2E580500000000000000A001400A506F736974696F6E2E590500
+          000000000000A001400A53697A652E57696474680500000000000000A002400B
+          53697A652E4865696768740500000000000000B804401453697A652E506C6174
+          666F726D44656661756C74080B5374796C654C6F6F6B7570060B767468756D62
+          7374796C65000000545046300A5452656374616E676C6500095374796C654E61
+          6D650619736D616C6C7363726F6C6C62617268747261636B7374796C6505416C
+          69676E070643656E7465720946696C6C2E4B696E6407044E6F6E650748697454
+          657374080A53697A652E5769647468050000000000FFFFEF05400B53697A652E
+          48656967687405000000000000009803401453697A652E506C6174666F726D44
+          656661756C74080B5374726F6B652E4B696E6407044E6F6E650756697369626C
+          6508000A5452656374616E676C650005416C69676E0706436C69656E740A4669
+          6C6C2E436F6C6F720709784646343834383438064C6F636B6564090748697454
+          657374080A53697A652E5769647468050000000000FFFFEF05400B53697A652E
+          48656967687405000000000000009803401453697A652E506C6174666F726D44
+          656661756C74080C5374726F6B652E436F6C6F72070978464631433143314300
+          0006545468756D6200095374796C654E616D6506057468756D62064C6F636B65
+          64090C4D617267696E732E4C656674050000000000000080FF3F0D4D61726769
+          6E732E5269676874050000000000000080FF3F0A506F736974696F6E2E580500
+          0000000000008001400A506F736974696F6E2E5905000000000000008001400A
+          53697A652E57696474680500000000000000C804400B53697A652E4865696768
+          740500000000000000D002401453697A652E506C6174666F726D44656661756C
+          74080B5374796C654C6F6F6B7570060B687468756D627374796C650000005450
+          463007544C61796F757400095374796C654E616D650613736D616C6C7363726F
+          6C6C6261727374796C6505416C69676E070643656E7465720A53697A652E5769
+          6474680500000000000000B006400B53697A652E486569676874050000000000
+          0000D404401453697A652E506C6174666F726D44656661756C74080756697369
+          626C6508085461624F72646572023F000654547261636B00095374796C654E61
+          6D65060668747261636B05416C69676E0706436C69656E74064C6F636B656409
+          034D6178050000000000000080FF3F0B4F7269656E746174696F6E070A486F72
+          697A6F6E74616C0A53697A652E57696474680500000000000000B006400B5369
+          7A652E4865696768740500000000000000D404401453697A652E506C6174666F
+          726D44656661756C74080B5374796C654C6F6F6B75700619736D616C6C736372
+          6F6C6C62617268747261636B7374796C650C56696577706F727453697A650500
+          F8FFFFFFCCCCCCFB3F00000654547261636B00095374796C654E616D65060676
+          747261636B05416C69676E0706436C69656E74064C6F636B656409034D617805
+          0000000000000080FF3F0B4F7269656E746174696F6E070A486F72697A6F6E74
+          616C0A53697A652E57696474680500000000000000B006400B53697A652E4865
+          696768740500000000000000D404401453697A652E506C6174666F726D446566
+          61756C74080B5374796C654C6F6F6B75700619736D616C6C7363726F6C6C6261
+          7276747261636B7374796C650C56696577706F727453697A650500F8FFFFFFCC
+          CCCCFB3F0000005450463007544C61796F757400095374796C654E616D65060F
+          64726F707461726765747374796C6505416C69676E070643656E7465720A5369
+          7A652E576964746805000000000000008906400B53697A652E48656967687405
+          000000000000008706401453697A652E506C6174666F726D44656661756C7408
+          0756697369626C6508085461624F726465720240000A5452656374616E676C65
+          0005416C69676E0708436F6E74656E74730946696C6C2E4B696E6407044E6F6E
+          650748697454657374080A53697A652E57696474680500000000000000890640
+          0B53697A652E48656967687405000000000000008706401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464645
+          3645364536105374726F6B652E546869636B6E6573730500000000000000C000
+          400B5374726F6B652E4461736807044461736807585261646975730500000000
+          0000008000400759526164697573050000000000000080004000055454657874
+          00095374796C654E616D6506047465787405416C69676E0706426F74746F6D07
+          48697454657374080C4D617267696E732E4C6566740500000000000000A00240
+          0D4D617267696E732E52696768740500000000000000A002400A506F73697469
+          6F6E2E580500000000000000A002400A506F736974696F6E2E59050000000000
+          0000AA05400A53697A652E57696474680500000000000000EA05400B53697A65
+          2E4865696768740500000000000000C804401453697A652E506C6174666F726D
+          44656661756C7408165465787453657474696E67732E466F6E74436F6C6F7207
+          097846464633463346330000001254466C6F61744B6579416E696D6174696F6E
+          00084475726174696F6E050000000000999999FE3F044B6579730E010001034B
+          6579050000000000000080FE3F0556616C75650500000000000000A003C00001
+          034B6579050000000000000080FF3F0000044C6F6F70090C50726F7065727479
+          4E616D65060B50616464696E672E546F7010537461727446726F6D4375727265
+          6E74080754726967676572060F4973447261674F7665723D7472756500000554
+          506174680005416C69676E070643656E74657209446174612E506174680AC400
+          0000100000000000000008EC8343F087A4430100000008EC8343083CFB430200
+          000035BE7143504DF9430200000012835C43A8E6F54302000000F0674943F803
+          F1430100000008EC8343FC0116440100000008EC8343FC511644010000000040
+          8443FC5116440100000010689A43FC412B4401000000081CD043F803F1430200
+          0000915DC64321E0F54302000000919DBB439643F94302000000087CB043F833
+          FB4301000000087CB043F087A4430100000008EC8343F087A443030000000000
+          0000000000000A46696C6C2E436F6C6F720708636C6157686974650748697454
+          657374080A53697A652E57696474680500000000000000C804400B53697A652E
+          4865696768740500000000000100C804401453697A652E506C6174666F726D44
+          656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000054504630
+          07544C61796F757400095374796C654E616D650609677269647374796C650C43
+          6C69704368696C6472656E090A506F736974696F6E2E580500000000000080B5
+          07400A506F736974696F6E2E590500000000000000DA07400A53697A652E5769
+          647468050000000000FFFFE905400B53697A652E486569676874050000000000
+          00008306401453697A652E506C6174666F726D44656661756C74080756697369
+          626C6508085461624F726465720241000C5442727573684F626A656374000953
+          74796C654E616D6506086C696E6566696C6C0B42727573682E436F6C6F720709
+          78464632303230323000000A5452656374616E676C6500095374796C654E616D
+          65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A4669
+          6C6C2E436F6C6F720709784646343834383438064C6F636B6564090748697454
+          657374080C50616464696E672E4C656674050000000000000080FF3F0B506164
+          64696E672E546F70050000000000000080FF3F0D50616464696E672E52696768
+          74050000000000000080FF3F0E50616464696E672E426F74746F6D0500000000
+          00000080FF3F0A53697A652E5769647468050000000000FFFFE905400B53697A
+          652E48656967687405000000000000008306401453697A652E506C6174666F72
+          6D44656661756C74080C5374726F6B652E436F6C6F7207097846463143314331
+          430007544C61796F75740005416C69676E0706436C69656E740A53697A652E57
+          69647468050000000000FFFFE505400B53697A652E4865696768740500000000
+          0000008106401453697A652E506C6174666F726D44656661756C740800075448
+          656164657200095374796C654E616D6506066865616465720553696465730B06
+          426F74746F6D0005416C69676E0703546F700A53697A652E5769647468050000
+          000000FFFFE505400B53697A652E4865696768740500000000000000A8034014
+          53697A652E506C6174666F726D44656661756C7408000007544C61796F757400
+          095374796C654E616D650607636F6E74656E7405416C69676E0706436C69656E
+          740C436C69704368696C6472656E090C4D617267696E732E4C65667405000000
+          0000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D
+          617267696E732E5269676874050000000000000080FF3F0E4D617267696E732E
+          426F74746F6D050000000000000080FF3F0A53697A652E576964746805000000
+          0000FFFFC305400B53697A652E4865696768740500000000000000B605401453
+          697A652E506C6174666F726D44656661756C7408000A5452656374616E676C65
+          00095374796C654E616D65060973656C656374696F6E0946696C6C2E4B696E64
+          07084772616469656E741446696C6C2E4772616469656E742E506F696E74730E
+          0105436F6C6F720709783830324237393843064F666673657405000000000000
+          00000000000105436F6C6F720709783830324236453746064F66667365740500
+          0000000012A2F8FD3F000105436F6C6F720709783830324236343732064F6666
+          736574050000000000000080FF3F00000748697454657374080A53697A652E57
+          696474680500000000000000C804400B53697A652E4865696768740500000000
+          000000C804401453697A652E506C6174666F726D44656661756C74080B537472
+          6F6B652E4B696E6407044E6F6E6500000A5452656374616E676C650009537479
+          6C654E616D650605666F6375730A46696C6C2E436F6C6F720709784646313931
+          3931390748697454657374080C4D617267696E732E4C65667405000000000000
+          0080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A53697A652E576964746805000000000000
+          00C804400B53697A652E4865696768740500000000000000C804401453697A65
+          2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
+          7846463339333933390000000A545363726F6C6C42617200095374796C654E61
+          6D65060A767363726F6C6C62617205416C69676E070552696768740B536D616C
+          6C4368616E676505000000000000000000000B4F7269656E746174696F6E0708
+          566572746963616C0A506F736974696F6E2E58050000000000FFFFC705400A50
+          6F736974696F6E2E590500000000000000A803400A53697A652E576964746805
+          00000000000000F002400B53697A652E4865696768740500000000000000BA05
+          401453697A652E506C6174666F726D44656661756C740800000A545363726F6C
+          6C42617200095374796C654E616D65060A687363726F6C6C62617205416C6967
+          6E0706426F74746F6D0B536D616C6C4368616E67650500000000000000000000
+          0B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F
+          6E2E590500000000000000E405400A53697A652E5769647468050000000000FF
+          FFE505400B53697A652E4865696768740500000000000000F002401453697A65
+          2E506C6174666F726D44656661756C740800000F54536D616C6C5363726F6C6C
+          42617200095374796C654E616D65060F76736D616C6C7363726F6C6C62617205
+          416C69676E070552696768740B536D616C6C4368616E67650500000000000000
+          0000000B4F7269656E746174696F6E0708566572746963616C0B4D617267696E
+          732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500
+          00000000000080FF3F0E4D617267696E732E426F74746F6D0500000000000000
+          80FF3F0A506F736974696F6E2E580500000000000000C605400A506F73697469
+          6F6E2E5905000000000000008000400A53697A652E5769647468050000000000
+          00008002400B53697A652E48656967687405000000000000008002401453697A
+          652E506C6174666F726D44656661756C74080756697369626C650800000F5453
+          6D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C
+          7363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C436861
+          6E676505000000000000000000000B4F7269656E746174696F6E070A486F7269
+          7A6F6E74616C0C4D617267696E732E4C656674050000000000000080FF3F0D4D
+          617267696E732E5269676874050000000000000080FF3F0E4D617267696E732E
+          426F74746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000
+          000000008000400A506F736974696F6E2E590500000000000000E205400A5369
+          7A652E576964746805000000000000009606400B53697A652E48656967687405
+          000000000000008002401453697A652E506C6174666F726D44656661756C7408
+          0756697369626C6508000000000B54476C6F774566666563740008536F66746E
+          6573730500000000009A9999FD3F09476C6F77436F6C6F720709784646363543
+          384530074F706163697479050000000000000080FF3F0754726967676572060E
+          4973466F63757365643D7472756507456E61626C656408000000545046300754
+          4C61796F757400095374796C654E616D65060F6865616465726974656D737479
+          6C6505416C69676E070643656E7465720A53697A652E57696474680500000000
+          000000B605400B53697A652E4865696768740500000000000000C00340145369
+          7A652E506C6174666F726D44656661756C74080756697369626C650808546162
+          4F726465720242000A5452656374616E676C6500095374796C654E616D65060A
+          6261636B67726F756E6405416C69676E0708436F6E74656E74730946696C6C2E
+          4B696E6407084772616469656E741446696C6C2E4772616469656E742E506F69
+          6E74730E0105436F6C6F720709784646353835383538064F6666736574050000
+          0000000000000000000105436F6C6F720709784646353135313531064F666673
+          6574050000000000A01BF3FD3F000105436F6C6F720709784646343934393439
+          064F6666736574050000000000000080FF3F0000064C6F636B65640907486974
+          54657374080A53697A652E57696474680500000000000000B605400B53697A65
+          2E4865696768740500000000000000C003401453697A652E506C6174666F726D
+          44656661756C74080C5374726F6B652E436F6C6F720709784646314331433143
+          001054496E6E6572476C6F774566666563740008536F66746E65737305000000
+          0000CDCCCCFD3F09476C6F77436F6C6F720709784646344634383438074F7061
+          636974790500000000006666E6FE3F0754726967676572060E49735072657373
+          65643D7472756507456E61626C65640800000005545465787400095374796C65
+          4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409
+          0748697454657374080C4D617267696E732E4C6566740500000000000000A001
+          400B4D617267696E732E546F7005000000000000008000400D4D617267696E73
+          2E52696768740500000000000000A001400E4D617267696E732E426F74746F6D
+          05000000000000008000400A53697A652E57696474680500000000000000A205
+          400B53697A652E4865696768740500000000000000A003401453697A652E506C
+          6174666F726D44656661756C7408165465787453657474696E67732E466F6E74
+          436F6C6F720708636C6157686974650000005450463007544C61796F75740009
+          5374796C654E616D65060D7465787463656C6C7374796C6505416C69676E0706
+          43656E7465720A53697A652E57696474680500000000000000D605400B53697A
+          652E4865696768740500000000000000B003401453697A652E506C6174666F72
+          6D44656661756C74080756697369626C6508085461624F726465720243000C54
+          42727573684F626A65637400095374796C654E616D65060A666F726567726F75
+          6E640B42727573682E436F6C6F72070978464645414541454100000C54427275
+          73684F626A65637400095374796C654E616D65060973656C656374696F6E0A42
+          727573682E4B696E6407084772616469656E741542727573682E477261646965
+          6E742E506F696E74730E0105436F6C6F720709783830324237393843064F6666
+          7365740500000000000000000000000105436F6C6F7207097838303242364537
+          46064F666673657405000000000012A2F8FD3F000105436F6C6F720709783830
+          324236343732064F6666736574050000000000000080FF3F0000000007544C61
+          796F757400095374796C654E616D650607636F6E74656E7405416C69676E0708
+          436F6E74656E7473064C6F636B6564090C4D617267696E732E4C656674050000
+          0000000000C000400B4D617267696E732E546F700500000000000000C000400D
+          4D617267696E732E52696768740500000000000000C000400E4D617267696E73
+          2E426F74746F6D0500000000000000C000400A53697A652E5769647468050000
+          0000000000CA05400B53697A652E486569676874050000000000000080034014
+          53697A652E506C6174666F726D44656661756C74080000005450463007544C61
+          796F757400095374796C654E616D65060E636865636B63656C6C7374796C6505
+          416C69676E070643656E7465720A53697A652E57696474680500000000000000
+          9506400B53697A652E4865696768740500000000000000F003401453697A652E
+          506C6174666F726D44656661756C74080756697369626C6508085461624F7264
+          657202440007544C61796F75740005416C69676E070643656E7465720A53697A
+          652E57696474680500000000000000A003400B53697A652E4865696768740500
+          000000000000F003401453697A652E506C6174666F726D44656661756C740800
+          07544C61796F75740005416C69676E070643656E746572064C6F636B6564090A
+          53697A652E57696474680500000000000000F002400B53697A652E4865696768
+          740500000000000000F002401453697A652E506C6174666F726D44656661756C
+          74080005545061746800095374796C654E616D650609636865636B6D61726B05
+          416C69676E070643656E74657209446174612E506174680ADC00000012000000
+          00000000000000000000000001000000CDCC4C3E00000000010000000000003F
+          9A99993E01000000CDCC4C3F00000000010000000000803F0000000001000000
+          0000803FCDCC4C3E010000003333333F0000003F010000000000803FCDCC4C3F
+          010000000000803F0000803F01000000CDCC4C3F0000803F010000000000003F
+          3333333F01000000CDCC4C3E0000803F01000000000000000000803F01000000
+          00000000CDCC4C3F010000009A99993E0000003F0100000000000000CDCC4C3E
+          0100000000000000000000000300000000000000000000000A46696C6C2E436F
+          6C6F720707636C614E756C6C064C6F636B6564090748697454657374080A5369
+          7A652E576964746805000000000000009002400B53697A652E48656967687405
+          000000000000009002401453697A652E506C6174666F726D44656661756C7408
+          0B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D6174
+          696F6E00084475726174696F6E0500000000006F1283F53F0C50726F70657274
+          794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650707636C
+          614E756C6C0953746F7056616C75650708636C61426C61636B07547269676765
+          72060E4973436865636B65643D7472756500000F54436F6C6F72416E696D6174
+          696F6E00084475726174696F6E0500000000006F1283F53F0C50726F70657274
+          794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650708636C
+          61426C61636B0953746F7056616C75650707636C614E756C6C07547269676765
+          72060F4973436865636B65643D66616C73650000000000005450463007544C61
+          796F757400095374796C654E616D65060E706F70757063656C6C7374796C6505
+          416C69676E070643656E7465720A53697A652E57696474680500000000000000
+          D605400B53697A652E4865696768740500000000000000B003401453697A652E
+          506C6174666F726D44656661756C74080756697369626C6508085461624F7264
+          657202450007544C61796F75740005416C69676E070552696768740A506F7369
+          74696F6E2E580500000000000000B805400A53697A652E576964746805000000
+          00000000F002400B53697A652E4865696768740500000000000000B003401453
+          697A652E506C6174666F726D44656661756C7408000554506174680005416C69
+          676E070643656E74657209446174612E506174680A4000000005000000000000
+          00000000000000803F010000000000803F0000803F010000000000003F000000
+          0001000000000000000000803F0300000000000000000000000A46696C6C2E43
+          6F6C6F7207097846464541454145410748697454657374080B4D617267696E73
+          2E546F7005000000000000009002C00A53697A652E5769647468050000000000
+          00008002400B53697A652E4865696768740500000000000000A001401453697A
+          652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704
+          4E6F6E6500000554506174680005416C69676E070643656E7465720944617461
+          2E506174680A3400000004000000000000000000000000000000010000000000
+          803F00000000010000000000003F0000803F0300000000000000000000000A46
+          696C6C2E436F6C6F7207097846464541454145410748697454657374080B4D61
+          7267696E732E546F700500000000000000E001400A53697A652E576964746805
+          000000000000008002400B53697A652E4865696768740500000000000000A001
+          401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B
+          696E6407044E6F6E6500000005545465787400095374796C654E616D65060474
+          65787405416C69676E0706436C69656E74064C6F636B65640907486974546573
+          74080C4D617267696E732E4C6566740500000000000000A001400B4D61726769
+          6E732E546F700500000000000000A001400D4D617267696E732E526967687405
+          00000000000000A001400E4D617267696E732E426F74746F6D05000000000000
+          00A001400A53697A652E57696474680500000000000000A405400B53697A652E
+          4865696768740500000000000000C002401453697A652E506C6174666F726D44
+          656661756C7408165465787453657474696E67732E466F6E74436F6C6F720708
+          636C615768697465155465787453657474696E67732E576F7264577261700800
+          00005450463007544C61796F757400095374796C654E616D65061170726F6772
+          65737363656C6C7374796C6505416C69676E070643656E7465720A53697A652E
+          576964746805000000000000009005400B53697A652E48656967687405000000
+          0000FFFFF304401453697A652E506C6174666F726D44656661756C7408075669
+          7369626C6508085461624F7264657202460007544C61796F757400095374796C
+          654E616D65060668747261636B05416C69676E0708436F6E74656E7473064C6F
+          636B6564090C4D617267696E732E4C65667405000000000000008000400B4D61
+          7267696E732E546F7005000000000000008000400D4D617267696E732E526967
+          687405000000000000008000400E4D617267696E732E426F74746F6D05000000
+          000000008000400A53697A652E576964746805000000000000008805400B5369
+          7A652E486569676874050000000000FFFFE304401453697A652E506C6174666F
+          726D44656661756C7408000A5452656374616E676C6500095374796C654E616D
+          65060A68696E64696361746F7205416C69676E07044C6566740946696C6C2E4B
+          696E6407084772616469656E741446696C6C2E4772616469656E742E506F696E
+          74730E0105436F6C6F720709784646323637324238064F666673657405000000
+          00000000000000000105436F6C6F720709784646303634353735064F66667365
+          74050000000000000080FF3F0000064C6F636B6564090748697454657374080C
+          4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E
+          546F70050000000000000080FF3F0D4D617267696E732E526967687405000000
+          0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF
+          3F0A506F736974696F6E2E58050000000000000080FF3F0A506F736974696F6E
+          2E59050000000000000080FF3F0A53697A652E57696474680500000000000000
+          C804400B53697A652E486569676874050000000000FFFFDB04401453697A652E
+          506C6174666F726D44656661756C7408000000005450463007544C61796F7574
+          00095374796C654E616D65060E696D61676563656C6C7374796C6505416C6967
+          6E070643656E7465720A53697A652E576964746805000000000000009205400B
+          53697A652E4865696768740500000000000000D003401453697A652E506C6174
+          666F726D44656661756C74080756697369626C6508085461624F726465720247
+          000654496D61676500095374796C654E616D650605696D6167650E4D756C7469
+          5265734269746D61700E01000005416C69676E0706436C69656E74064C6F636B
+          6564090748697454657374080C4D617267696E732E4C65667405000000000000
+          00C000400B4D617267696E732E546F700500000000000000C000400D4D617267
+          696E732E52696768740500000000000000C000400E4D617267696E732E426F74
+          746F6D0500000000000000C000400A53697A652E576964746805000000000000
+          008605400B53697A652E4865696768740500000000000000A003401453697A65
+          2E506C6174666F726D44656661756C7408000000545046300A5452656374616E
+          676C6500095374796C654E616D65060C6D656E756261727374796C6505416C69
+          676E070643656E7465720C436C69704368696C6472656E090946696C6C2E4B69
+          6E6407044E6F6E650748697454657374080A53697A652E576964746805000000
+          00000000C804400B53697A652E4865696768740500000000000000C804401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E650756697369626C6508000A5452656374616E676C650005416C69
+          676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465
+          7374080C4D617267696E732E4C656674050000000000000080FF3F0B4D617267
+          696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874
+          050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000
+          000080FF3F0A53697A652E57696474680500000000000000C004400B53697A65
+          2E4865696768740500000000000000C004401453697A652E506C6174666F726D
+          44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000000545046
+          300A5452656374616E676C6500095374796C654E616D65060D6D656E75766965
+          777374796C6505416C69676E070643656E7465720D50616464696E672E526967
+          687405000000000000008002400E50616464696E672E426F74746F6D05000000
+          000000008002400A53697A652E57696474680500000000000000C804400B5369
+          7A652E4865696768740500000000000000C804401453697A652E506C6174666F
+          726D44656661756C74080C5374726F6B652E436F6C6F720708636C6157686974
+          650756697369626C6508000A5452656374616E676C650005416C69676E070643
+          6C69656E740A46696C6C2E436F6C6F720708636C615768697465074869745465
+          7374080D4D617267696E732E526967687405000000000000008002C00E4D6172
+          67696E732E426F74746F6D05000000000000008002C00A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          C804401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
+          2E436F6C6F720709784646444444444444000D54536861646F77456666656374
+          000844697374616E6365050000000000000080014009446972656374696F6E05
+          00000000000000B4044008536F66746E657373050000000000CECCCCFC3F074F
+          706163697479050000000000000080FE3F0B536861646F77436F6C6F72070863
+          6C61426C61636B00000007544C61796F757400095374796C654E616D65060763
+          6F6E74656E7405416C69676E0706436C69656E740C4D617267696E732E4C6566
+          740500000000000000C000400B4D617267696E732E546F700500000000000000
+          C000400D4D617267696E732E52696768740500000000000000C000400E4D6172
+          67696E732E426F74746F6D0500000000000000C000400A53697A652E57696474
+          6805000000000000009004400B53697A652E4865696768740500000000000000
+          9004401453697A652E506C6174666F726D44656661756C740800000054504630
+          07544C61796F757400095374796C654E616D6506126D656E756974656D737479
+          6C655F6C69746505416C69676E070643656E7465720C4D617267696E732E4C65
+          6674050000000000000080FF3F0B4D617267696E732E546F7005000000000000
+          0080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61
+          7267696E732E426F74746F6D050000000000000080FF3F0A53697A652E576964
+          746805000000000000009205400B53697A652E48656967687405000000000000
+          00D003401453697A652E506C6174666F726D44656661756C7408075669736962
+          6C6508085461624F72646572024B000A5452656374616E676C650005416C6967
+          6E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846464536453645
+          36074869745465737408074F70616369747905000000000017B7D1F13F0A5369
+          7A652E576964746805000000000000009205400B53697A652E48656967687405
+          00000000000000D003401453697A652E506C6174666F726D44656661756C7408
+          0C5374726F6B652E436F6C6F720709784646453645364536000F54466C6F6174
+          416E696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C50
+          726F70657274794E616D6506074F7061636974790A537461727456616C756505
+          000000000000000000000953746F7056616C7565050000000000000080FF3F07
+          54726967676572060F497353656C65637465643D747275650E54726967676572
+          496E76657273650610497353656C65637465643D66616C73650000000A545265
+          6374616E676C6500095374796C654E616D65060A6261636B67726F756E640541
+          6C69676E0708436F6E74656E7473074869745465737408074F70616369747905
+          000000000017B7D1F13F0A53697A652E57696474680500000000000000920540
+          0B53697A652E4865696768740500000000000000D003401453697A652E506C61
+          74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464645
+          3645364536000F54466C6F6174416E696D6174696F6E00084475726174696F6E
+          05000000000018B7D1F23F0C50726F70657274794E616D6506074F7061636974
+          790A537461727456616C756505000000000000000000000953746F7056616C75
+          65050000000000000080FF3F0754726967676572061049734D6F7573654F7665
+          723D747275650E54726967676572496E7665727365061149734D6F7573654F76
+          65723D66616C736500000005545465787400095374796C654E616D6506047465
+          787405416C69676E07044C656674064C6F636B6564090748697454657374080C
+          4D617267696E732E4C6566740500000000000000F002400D4D617267696E732E
+          52696768740500000000000000F002400A506F736974696F6E2E580500000000
+          000000F002400A53697A652E57696474680500000000000000C804400B53697A
+          652E4865696768740500000000000000D003401453697A652E506C6174666F72
+          6D44656661756C74080454657874060454657874165465787453657474696E67
+          732E486F727A416C69676E07074C656164696E67000005545465787400095374
+          796C654E616D65060873686F727463757405416C69676E07055269676874064C
+          6F636B6564090748697454657374080C4D617267696E732E4C65667405000000
+          00000000C002400D4D617267696E732E52696768740500000000000000C00140
+          0A506F736974696F6E2E580500000000000000C000C00A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          D003401453697A652E506C6174666F726D44656661756C740816546578745365
+          7474696E67732E466F6E74436F6C6F720708636C615768697465165465787453
+          657474696E67732E486F727A416C69676E07074C656164696E67000007544C61
+          796F757400095374796C654E616D6506077375626D61726B05416C69676E0705
+          52696768740A506F736974696F6E2E580500000000000000D404400A53697A65
+          2E57696474680500000000000000A003400B53697A652E486569676874050000
+          0000000000D003401453697A652E506C6174666F726D44656661756C74080005
+          54506174680005416C69676E070643656E74657209446174612E506174680A34
+          0000000400000000000000000000000000000001000000000000000000803F01
+          0000000000803F0000003F0300000000000000000000000A46696C6C2E436F6C
+          6F720707636C6147726179064C6F636B6564090748697454657374080A53697A
+          652E57696474680500000000000000E001400B53697A652E4865696768740500
+          0000000000008002401453697A652E506C6174666F726D44656661756C74080B
+          5374726F6B652E4B696E6407044E6F6E65000000005450463007544C61796F75
+          7400095374796C654E616D6506106D656E756261726974656D7374796C650541
+          6C69676E070643656E7465720C4D617267696E732E4C65667405000000000000
+          0080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267
+          696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F74
+          746F6D050000000000000080FF3F0A53697A652E576964746805000000000000
+          009205400B53697A652E4865696768740500000000000000D003401453697A65
+          2E506C6174666F726D44656661756C74080756697369626C6508085461624F72
+          646572024C000A5452656374616E676C650005416C69676E0708436F6E74656E
+          7473074869745465737408074F70616369747905000000000017B7D1F13F0A53
+          697A652E576964746805000000000000009205400B53697A652E486569676874
+          0500000000000000D003401453697A652E506C6174666F726D44656661756C74
+          080B5374726F6B652E4B696E6407044E6F6E65000F54466C6F6174416E696D61
+          74696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F706572
+          74794E616D6506074F7061636974790A537461727456616C7565050000000000
+          00000000000953746F7056616C7565050000000000000080FF3F075472696767
+          6572060F497353656C65637465643D747275650E54726967676572496E766572
+          73650610497353656C65637465643D66616C73650000000A5452656374616E67
+          6C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E07
+          08436F6E74656E74730946696C6C2E4B696E6407084772616469656E74144669
+          6C6C2E4772616469656E742E506F696E74730E0105436F6C6F72070978464645
+          3345334533064F66667365740500000000000000000000000105436F6C6F7207
+          09784646454445444544064F6666736574050000000000A01BF3FD3F00010543
+          6F6C6F720709784646453345334533064F6666736574050000000000000080FF
+          3F00001D46696C6C2E4772616469656E742E5374617274506F736974696F6E2E
+          58050000000000000080FE3F1D46696C6C2E4772616469656E742E5374617274
+          506F736974696F6E2E59050000000000000080FF3F1C46696C6C2E4772616469
+          656E742E53746F70506F736974696F6E2E58050000000000FFFFFFFD3F1C4669
+          6C6C2E4772616469656E742E53746F70506F736974696F6E2E59050000000000
+          0000000000074869745465737408074F70616369747905000000000017B7D1F1
+          3F0A53697A652E576964746805000000000000009205400B53697A652E486569
+          6768740500000000000000D003401453697A652E506C6174666F726D44656661
+          756C74080B5374726F6B652E4B696E6407044E6F6E65000F54466C6F6174416E
+          696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F
+          70657274794E616D6506074F7061636974790A537461727456616C7565050000
+          00000000000000000953746F7056616C7565050000000000000080FF3F075472
+          6967676572061049734D6F7573654F7665723D747275650E5472696767657249
+          6E7665727365061149734D6F7573654F7665723D66616C736500000007544C61
+          796F757400095374796C654E616D650605676C79706805416C69676E07084D6F
+          73744C6566740A53697A652E57696474680500000000000000C803400B53697A
+          652E4865696768740500000000000000D003401453697A652E506C6174666F72
+          6D44656661756C74080007544C61796F757400095374796C654E616D65060963
+          6865636B6D61726B05416C69676E0708436F6E74656E7473074F706163697479
+          0500000000006F1283F53F0A53697A652E57696474680500000000000000C803
+          400B53697A652E4865696768740500000000000000D003401453697A652E506C
+          6174666F726D44656661756C74080005545061746800095374796C654E616D65
+          060E636865636B6D61726B7374796C6505416C69676E070643656E7465720944
+          6174612E506174680A58000000070000000000000056D9524391AE2C43010000
+          009276664365021643010000009F3983432B7C3C43010000009E9AA64382D2B4
+          42010000006F1CB04375A4D1420100000026DF8243263F67430300000056D952
+          4391AE2C430A46696C6C2E436F6C6F720708636C615768697465074869745465
+          7374080A53697A652E57696474680500000000000000B002400B53697A652E48
+          65696768740500000000000000B002401453697A652E506C6174666F726D4465
+          6661756C74080B5374726F6B652E4B696E6407044E6F6E6500000F54466C6F61
+          74416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C
+          50726F70657274794E616D6506074F7061636974790A537461727456616C7565
+          05000000000000000000000953746F7056616C7565050000000000000080FF3F
+          0754726967676572060E4973436865636B65643D747275650E54726967676572
+          496E7665727365060F4973436865636B65643D66616C73650000000654476C79
+          706800095374796C654E616D65060A676C7970687374796C650C4D617267696E
+          732E4C656674050000000000000080FF3F0B4D617267696E732E546F70050000
+          00000000008000400D4D617267696E732E52696768740500000000000000C000
+          400E4D617267696E732E426F74746F6D050000000000000080FF3F05416C6967
+          6E070552696768740A53697A652E576964746805000000000000008003400B53
+          697A652E48656967687405000000000000008003401453697A652E506C617466
+          6F726D44656661756C740800000654496D61676500095374796C654E616D6506
+          066269746D61700E4D756C74695265734269746D61700E01000005416C69676E
+          070552696768740C4D617267696E732E4C65667405000000000000008000400B
+          4D617267696E732E546F7005000000000000008000400D4D617267696E732E52
+          6967687405000000000000008000400E4D617267696E732E426F74746F6D0500
+          0000000000008000400A506F736974696F6E2E5805000000000000008000400A
+          506F736974696F6E2E5905000000000000008000400A53697A652E5769647468
+          0500000000000000A803400B53697A652E4865696768740500000000000000B0
+          03401453697A652E506C6174666F726D44656661756C74080000000554546578
+          7400095374796C654E616D6506047465787405416C69676E07044C656674064C
+          6F636B6564090748697454657374080C4D617267696E732E4C65667405000000
+          000000008002400D4D617267696E732E52696768740500000000000000800240
+          0A506F736974696F6E2E5805000000000000008404400A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          D003401453697A652E506C6174666F726D44656661756C740804546578740604
+          54657874165465787453657474696E67732E486F727A416C69676E07074C6561
+          64696E67000005545465787400095374796C654E616D65060873686F72746375
+          7405416C69676E07055269676874064C6F636B6564090748697454657374080C
+          4D617267696E732E4C6566740500000000000000C002400D4D617267696E732E
+          52696768740500000000000000C001400A506F736974696F6E2E580500000000
+          000000C000C00A53697A652E57696474680500000000000000C804400B53697A
+          652E4865696768740500000000000000D003401453697A652E506C6174666F72
+          6D44656661756C7408165465787453657474696E67732E486F727A416C69676E
+          07074C656164696E67000007544C61796F757400095374796C654E616D650607
+          7375626D61726B05416C69676E070552696768740A506F736974696F6E2E5805
+          00000000000000D404400A53697A652E57696474680500000000000000A00340
+          0B53697A652E4865696768740500000000000000D003401453697A652E506C61
+          74666F726D44656661756C7408000554506174680005416C69676E070643656E
+          74657209446174612E506174680A340000000400000000000000000000000000
+          000001000000000000000000803F010000000000803F0000003F030000000000
+          0000000000000A46696C6C2E436F6C6F720707636C6147726179064C6F636B65
+          64090748697454657374080A53697A652E57696474680500000000000000E001
+          400B53697A652E48656967687405000000000000008002401453697A652E506C
+          6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
+          000000005450463007544C61796F757400095374796C654E616D6506126D656E
+          75736570617261746F727374796C6505416C69676E070643656E7465720C4D61
+          7267696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F
+          70050000000000000080FF3F0D4D617267696E732E5269676874050000000000
+          000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A
+          53697A652E57696474680500000000000000C804400B53697A652E4865696768
+          740500000000000000C804401453697A652E506C6174666F726D44656661756C
+          74080756697369626C6508085461624F72646572024D0005544C696E65000541
+          6C69676E0703546F70084C696E65547970650703546F700C4D617267696E732E
+          4C6566740500000000000000C000400B4D617267696E732E546F700500000000
+          0000008000400D4D617267696E732E52696768740500000000000000C000400A
+          506F736974696F6E2E580500000000000000C000400A506F736974696F6E2E59
+          05000000000000008000400A53697A652E57696474680500000000000000B004
+          400B53697A652E486569676874050000000000000080FF3F1453697A652E506C
+          6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709636C61
+          53696C766572000000545046300654496D61676500095374796C654E616D6506
+          11616E69696E64696361746F727374796C650E4D756C74695265734269746D61
+          700E0100000A53697A652E57696474680500000000000000C804400B53697A65
+          2E4865696768740500000000000000C804401453697A652E506C6174666F726D
+          44656661756C74080756697369626C6508000C5442727573684F626A65637400
+          095374796C654E616D65060466696C6C0000005450463007544C61796F757400
+          095374796C654E616D65060D74696D65656469747374796C650A53697A652E57
+          696474680500000000000000C804400B53697A652E4865696768740500000000
+          000000C804401453697A652E506C6174666F726D44656661756C740807566973
+          69626C6508085461624F72646572024F000B54476C6F77456666656374000853
+          6F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F7207097846
+          46363543384530074F706163697479050000000000000080FF3F075472696767
+          6572060E4973466F63757365643D7472756507456E61626C65640800000A5452
+          656374616E676C6500095374796C654E616D65060A6261636B67726F756E6405
+          416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978464631
+          3931393139064C6F636B6564090748697454657374080A53697A652E57696474
+          680500000000000000C804400B53697A652E4865696768740500000000000000
+          C804401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
+          2E436F6C6F720709784646333933393339000F54436F6C6F72416E696D617469
+          6F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F7065727479
+          4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709784646
+          3530353035300953746F7056616C7565070978464637303730373000000F5443
+          6F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCC
+          FC3F07496E7665727365090C50726F70657274794E616D65060A46696C6C2E43
+          6F6C6F720A537461727456616C756507097846463530353035300953746F7056
+          616C7565070978464637303730373000000A5452656374616E676C650005416C
+          69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454
+          657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D6172
+          67696E732E546F70050000000000000080FF3F0D4D617267696E732E52696768
+          74050000000000000080FF3F0E4D617267696E732E426F74746F6D0500000000
+          00000080FF3F0A53697A652E57696474680500000000000000C004400B53697A
+          652E4865696768740500000000000000C004401453697A652E506C6174666F72
+          6D44656661756C74080C5374726F6B652E436F6C6F7207097846463138313831
+          380000000B54477269644C61796F75740005416C69676E07094D6F7374526967
+          68740A4974656D486569676874050000000000000080FFBF094974656D576964
+          746805000000000000008005400B4F7269656E746174696F6E07085665727469
+          63616C0C4D617267696E732E4C65667405000000000000008000400B4D617267
+          696E732E546F7005000000000000008000400D4D617267696E732E5269676874
+          05000000000000008000400E4D617267696E732E426F74746F6D050000000000
+          00008000400A506F736974696F6E2E580500000000000000E003400A506F7369
+          74696F6E2E5905000000000000008000400A53697A652E576964746805000000
+          00000000A003400B53697A652E4865696768740500000000000000B804401453
+          697A652E506C6174666F726D44656661756C74080007544C61796F7574000A53
+          697A652E57696474680500000000000000A003400B53697A652E486569676874
+          0500000000000000B803401453697A652E506C6174666F726D44656661756C74
+          08000754427574746F6E00095374796C654E616D6506087570627574746F6E05
+          416C69676E0706436C69656E740843616E466F637573080A53697A652E576964
+          74680500000000000000A003400B53697A652E48656967687405000000000000
+          00B803401453697A652E506C6174666F726D44656661756C74080B5374796C65
+          4C6F6F6B757006127363726F6C6C626172746F70627574746F6E085461624F72
+          6465720200155465787453657474696E67732E5472696D6D696E6707044E6F6E
+          6500000007544C61796F7574000A506F736974696F6E2E590500000000000000
+          B803400A53697A652E57696474680500000000000000A003400B53697A652E48
+          65696768740500000000000000B803401453697A652E506C6174666F726D4465
+          6661756C7408000754427574746F6E00095374796C654E616D65060A646F776E
+          627574746F6E05416C69676E0706436C69656E740843616E466F637573080A53
+          697A652E57696474680500000000000000A003400B53697A652E486569676874
+          0500000000000000B803401453697A652E506C6174666F726D44656661756C74
+          080B5374796C654C6F6F6B757006157363726F6C6C626172626F74746F6D6275
+          74746F6E085461624F726465720200155465787453657474696E67732E547269
+          6D6D696E6707044E6F6E650000000010545374796C65546578744F626A656374
+          00095374796C654E616D6506045465787405416C69676E0706436C69656E7406
+          4C6F636B6564090C4D617267696E732E4C65667405000000000000008000400B
+          4D617267696E732E546F7005000000000000008000400D4D617267696E732E52
+          6967687405000000000000008000400E4D617267696E732E426F74746F6D0500
+          0000000000008000400A53697A652E576964746805000000000000000000000B
+          53697A652E4865696768740500000000000000B804401453697A652E506C6174
+          666F726D44656661756C7408165465787453657474696E67732E466F6E74436F
+          6C6F7207097846464541454145410D536861646F7756697369626C650800000C
+          5442727573684F626A65637400095374796C654E616D65060973656C65637469
+          6F6E0A42727573682E4B696E6407084772616469656E741542727573682E4772
+          616469656E742E506F696E74730E0105436F6C6F720709783830324237393843
+          064F66667365740500000000000000000000000105436F6C6F72070978383032
+          4236453746064F666673657405000000000012A2F8FD3F000105436F6C6F7207
+          09783830324236343732064F6666736574050000000000000080FF3F00000000
+          0954436865636B426F7800095374796C654E616D650605636865636B05416C69
+          676E07084D6F73744C6566740843616E466F637573081244697361626C65466F
+          637573456666656374090C4D617267696E732E4C656674050000000000000080
+          00400A53697A652E57696474680500000000000000A003400B53697A652E4865
+          6967687405000000000000009803401453697A652E506C6174666F726D446566
+          61756C7408085461624F7264657202030756697369626C650800000754427574
+          746F6E00095374796C654E616D65060B636C656172627574746F6E05416C6967
+          6E070552696768740843616E466F637573080C4D617267696E732E4C65667405
+          000000000000008000400B4D617267696E732E546F7005000000000000008000
+          400D4D617267696E732E526967687405000000000000008000400E4D61726769
+          6E732E426F74746F6D05000000000000008000400A506F736974696F6E2E5805
+          000000000000008001400A506F736974696F6E2E590500000000000000800040
+          0A53697A652E57696474680500000000000000A003400B53697A652E48656967
+          68740500000000000000B804401453697A652E506C6174666F726D4465666175
+          6C74080B5374796C654C6F6F6B7570061C7472616E73706172656E7463697263
+          6C65627574746F6E7374796C65155465787453657474696E67732E5472696D6D
+          696E6707044E6F6E65000554506174680005416C69676E070346697409446174
+          612E506174680AC400000010000000000000000000A0C0000070410100000000
+          0070410000A0C001000000000048420000F041010000000000AA420000A0C001
+          0000000000D242000070410100000000008C4200004842010000000000D24200
+          00B442010000000000AA420000DC42020000003BDF34429E6F8C4202000000FE
+          547D427FAAB04202000000000048420000964201000000000070410000DC4201
+          0000000000A0C00000B442010000000000F04100005C42010000000000A0C000
+          007041030000000000000000000000064C6F636B656409074869745465737408
+          0C4D617267696E732E4C65667405000000000000008001400B4D617267696E73
+          2E546F7005000000000000008001400D4D617267696E732E5269676874050000
+          00000000008001400E4D617267696E732E426F74746F6D050000000000000080
+          01400A53697A652E57696474680500000000000000C002400B53697A652E4865
+          696768740500000000000000C002401453697A652E506C6174666F726D446566
+          61756C74080B5374726F6B652E4B696E6407044E6F6E65000000005450463007
+          544C61796F757400095374796C654E616D65060D64617465656469747374796C
+          6505416C69676E070643656E7465720A53697A652E5769647468050000000000
+          0000C804400B53697A652E4865696768740500000000000000C804401453697A
+          652E506C6174666F726D44656661756C74080756697369626C6508085461624F
+          726465720250000B54476C6F774566666563740008536F66746E657373050000
+          0000009A9999FD3F09476C6F77436F6C6F720709784646363543384530074F70
+          6163697479050000000000000080FF3F0754726967676572060E4973466F6375
+          7365643D7472756507456E61626C65640800000A5452656374616E676C650009
+          5374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E
+          74656E74730A46696C6C2E436F6C6F720709784646313931393139064C6F636B
+          6564090748697454657374080A53697A652E57696474680500000000000000C8
+          04400B53697A652E4865696768740500000000000000C804401453697A652E50
+          6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
+          46333933393339000F54436F6C6F72416E696D6174696F6E0008447572617469
+          6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C
+          2E436F6C6F720A537461727456616C756507097846463530353035300953746F
+          7056616C7565070978464637303730373000000F54436F6C6F72416E696D6174
+          696F6E00084475726174696F6E050000000000CDCCCCFC3F07496E7665727365
+          090C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274
+          56616C756507097846463530353035300953746F7056616C7565070978464637
+          303730373000000A5452656374616E676C650005416C69676E0706436C69656E
+          740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61726769
+          6E732E4C656674050000000000000080FF3F0B4D617267696E732E546F700500
+          00000000000080FF3F0D4D617267696E732E5269676874050000000000000080
+          FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A
+          652E57696474680500000000000000C004400B53697A652E4865696768740500
+          000000000000C004401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F720709784646313831383138000000075442757474
+          6F6E00095374796C654E616D6506056172726F7705416C69676E07094D6F7374
+          52696768740843616E466F637573080C4D617267696E732E4C65667405000000
+          000000008000400B4D617267696E732E546F7005000000000000008000400D4D
+          617267696E732E526967687405000000000000008000400E4D617267696E732E
+          426F74746F6D05000000000000008000400A506F736974696F6E2E5805000000
+          00000000E003400A506F736974696F6E2E5905000000000000008000400A5369
+          7A652E57696474680500000000000000A003400B53697A652E48656967687405
+          00000000000000B804401453697A652E506C6174666F726D44656661756C7408
+          0B5374796C654C6F6F6B757006157363726F6C6C626172626F74746F6D627574
+          746F6E155465787453657474696E67732E5472696D6D696E6707044E6F6E6500
+          0010545374796C65546578744F626A65637400095374796C654E616D65060454
+          65787405416C69676E0706436C69656E74064C6F636B6564090C4D617267696E
+          732E4C65667405000000000000008000400B4D617267696E732E546F70050000
+          00000000008000400D4D617267696E732E526967687405000000000000008000
+          400E4D617267696E732E426F74746F6D05000000000000008000400A53697A65
+          2E576964746805000000000000000000000B53697A652E486569676874050000
+          0000000000B804401453697A652E506C6174666F726D44656661756C74081654
+          65787453657474696E67732E466F6E74436F6C6F720709784646454145414541
+          0D536861646F7756697369626C650800000C5442727573684F626A6563740009
+          5374796C654E616D65060973656C656374696F6E0A42727573682E4B696E6407
+          084772616469656E741542727573682E4772616469656E742E506F696E74730E
+          0105436F6C6F720709783830324237393843064F666673657405000000000000
+          00000000000105436F6C6F720709783830324236453746064F66667365740500
+          0000000012A2F8FD3F000105436F6C6F720709783830324236343732064F6666
+          736574050000000000000080FF3F000000000954436865636B426F7800095374
+          796C654E616D650605636865636B05416C69676E07084D6F73744C6566740843
+          616E466F637573081244697361626C65466F637573456666656374090C4D6172
+          67696E732E4C65667405000000000000008000400A53697A652E576964746805
+          00000000000000A003400B53697A652E48656967687405000000000000009803
+          401453697A652E506C6174666F726D44656661756C7408085461624F72646572
+          02030756697369626C650800000754427574746F6E00095374796C654E616D65
+          060B636C656172627574746F6E05416C69676E070552696768740843616E466F
+          637573080C4D617267696E732E4C65667405000000000000008000400B4D6172
+          67696E732E546F7005000000000000008000400D4D617267696E732E52696768
+          7405000000000000008000400E4D617267696E732E426F74746F6D0500000000
+          0000008000400A506F736974696F6E2E5805000000000000008001400A506F73
+          6974696F6E2E5905000000000000008000400A53697A652E5769647468050000
+          0000000000A003400B53697A652E4865696768740500000000000000B8044014
+          53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75
+          70061C7472616E73706172656E74636972636C65627574746F6E7374796C6515
+          5465787453657474696E67732E5472696D6D696E6707044E6F6E650005545061
+          74680005416C69676E070346697409446174612E506174680AC4000000100000
+          00000000000000A0C00000704101000000000070410000A0C001000000000048
+          420000F041010000000000AA420000A0C0010000000000D24200007041010000
+          0000008C4200004842010000000000D2420000B442010000000000AA420000DC
+          42020000003BDF34429E6F8C4202000000FE547D427FAAB04202000000000048
+          420000964201000000000070410000DC42010000000000A0C00000B442010000
+          000000F04100005C42010000000000A0C0000070410300000000000000000000
+          00064C6F636B6564090748697454657374080C4D617267696E732E4C65667405
+          000000000000008001400B4D617267696E732E546F7005000000000000008001
+          400D4D617267696E732E526967687405000000000000008001400E4D61726769
+          6E732E426F74746F6D05000000000000008001400A53697A652E576964746805
+          00000000000000C002400B53697A652E4865696768740500000000000000C002
+          401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B
+          696E6407044E6F6E6500000000545046300B54477269644C61796F7574000953
+          74796C654E616D65060E7370696E65646974627574746F6E05416C69676E0706
+          43656E7465720A4974656D486569676874050000000000000080FFBF09497465
+          6D576964746805000000000000008005400B4F7269656E746174696F6E070856
+          6572746963616C0A53697A652E57696474680500000000000000C804400B5369
+          7A652E4865696768740500000000000000C804401453697A652E506C6174666F
+          726D44656661756C74080756697369626C6508085461624F7264657202510007
+          544C61796F7574000A53697A652E57696474680500000000000000C804400B53
+          697A652E4865696768740500000000000000C803401453697A652E506C617466
+          6F726D44656661756C7408000754427574746F6E00095374796C654E616D6506
+          087570627574746F6E05416C69676E0706436C69656E740843616E466F637573
+          080A53697A652E57696474680500000000000000C804400B53697A652E486569
+          6768740500000000000000C803401453697A652E506C6174666F726D44656661
+          756C74080B5374796C654C6F6F6B757006127363726F6C6C626172746F706275
+          74746F6E085461624F726465720200155465787453657474696E67732E547269
+          6D6D696E6707044E6F6E6500000007544C61796F7574000A506F736974696F6E
+          2E590500000000000000C803400A53697A652E57696474680500000000000000
+          C804400B53697A652E4865696768740500000000000000C803401453697A652E
+          506C6174666F726D44656661756C7408000754427574746F6E00095374796C65
+          4E616D65060A646F776E627574746F6E05416C69676E0706436C69656E740843
+          616E466F637573080A53697A652E57696474680500000000000000C804400B53
+          697A652E4865696768740500000000000000C803401453697A652E506C617466
+          6F726D44656661756C74080B5374796C654C6F6F6B757006157363726F6C6C62
+          6172626F74746F6D627574746F6E085461624F72646572020015546578745365
+          7474696E67732E5472696D6D696E6707044E6F6E65000000005450463007544C
+          61796F757400095374796C654E616D6506146D656E756974656D7374796C655F
+          6E6F5F696D6705416C69676E070643656E7465720C4D617267696E732E4C6566
+          74050000000000000080FF3F0B4D617267696E732E546F700500000000000000
+          80FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D6172
+          67696E732E426F74746F6D050000000000000080FF3F0A53697A652E57696474
+          6805000000000000009205400B53697A652E4865696768740500000000000000
+          D003401453697A652E506C6174666F726D44656661756C74080756697369626C
+          6508085461624F72646572024A000A5452656374616E676C650005416C69676E
+          0708436F6E74656E74730A46696C6C2E436F6C6F720709784646453645364536
+          074869745465737408074F70616369747905000000000017B7D1F13F0A53697A
+          652E576964746805000000000000009205400B53697A652E4865696768740500
+          000000000000D003401453697A652E506C6174666F726D44656661756C74080C
+          5374726F6B652E436F6C6F720709784646453645364536000F54466C6F617441
+          6E696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C5072
+          6F70657274794E616D6506074F7061636974790A537461727456616C75650500
+          0000000000000000000953746F7056616C7565050000000000000080FF3F0754
+          726967676572060F497353656C65637465643D747275650E5472696767657249
+          6E76657273650610497353656C65637465643D66616C73650000000A54526563
+          74616E676C6500095374796C654E616D65060A6261636B67726F756E6405416C
+          69676E0708436F6E74656E7473074869745465737408074F7061636974790500
+          0000000017B7D1F13F0A53697A652E576964746805000000000000009205400B
+          53697A652E4865696768740500000000000000D003401453697A652E506C6174
+          666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846464536
+          45364536000F54466C6F6174416E696D6174696F6E00084475726174696F6E05
+          000000000018B7D1F23F0C50726F70657274794E616D6506074F706163697479
+          0A537461727456616C756505000000000000000000000953746F7056616C7565
+          050000000000000080FF3F0754726967676572061049734D6F7573654F766572
+          3D747275650E54726967676572496E7665727365061149734D6F7573654F7665
+          723D66616C736500000007544C61796F757400095374796C654E616D65060567
+          6C79706805416C69676E07084D6F73744C6566740A53697A652E576964746805
+          00000000000000C803400B53697A652E4865696768740500000000000000D003
+          401453697A652E506C6174666F726D44656661756C74080007544C61796F7574
+          00095374796C654E616D650609636865636B6D61726B05416C69676E0708436F
+          6E74656E7473074F7061636974790500000000006F1283F53F0A53697A652E57
+          696474680500000000000000C803400B53697A652E4865696768740500000000
+          000000D003401453697A652E506C6174666F726D44656661756C740800055450
+          61746800095374796C654E616D65060E636865636B6D61726B7374796C650541
+          6C69676E070643656E74657209446174612E506174680A580000000700000000
+          00000056D9524391AE2C43010000009276664365021643010000009F3983432B
+          7C3C43010000009E9AA64382D2B442010000006F1CB04375A4D1420100000026
+          DF8243263F67430300000056D9524391AE2C430A46696C6C2E436F6C6F720708
+          636C6157686974650748697454657374080A53697A652E576964746805000000
+          00000000B002400B53697A652E4865696768740500000000000000B002401453
+          697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
+          07044E6F6E6500000F54466C6F6174416E696D6174696F6E0008447572617469
+          6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D6506074F706163
+          6974790A537461727456616C756505000000000000000000000953746F705661
+          6C7565050000000000000080FF3F0754726967676572060E4973436865636B65
+          643D747275650E54726967676572496E7665727365060F4973436865636B6564
+          3D66616C73650000000654476C79706800095374796C654E616D65060A676C79
+          70687374796C650C4D617267696E732E4C656674050000000000000080FF3F0B
+          4D617267696E732E546F7005000000000000008000400D4D617267696E732E52
+          696768740500000000000000C000400E4D617267696E732E426F74746F6D0500
+          00000000000080FF3F05416C69676E07044C6566740A53697A652E5769647468
+          05000000000000008003400B53697A652E486569676874050000000000000080
+          03401453697A652E506C6174666F726D44656661756C740800000654496D6167
+          6500095374796C654E616D6506066269746D61700E4D756C7469526573426974
+          6D61700E01000005416C69676E07044C6566740C4D617267696E732E4C656674
+          05000000000000008000400B4D617267696E732E546F70050000000000000080
+          00400D4D617267696E732E526967687405000000000000008000400E4D617267
+          696E732E426F74746F6D05000000000000008000400A506F736974696F6E2E58
+          05000000000000008000400A506F736974696F6E2E5905000000000000008000
+          400A53697A652E57696474680500000000000000A803400B53697A652E486569
+          6768740500000000000000B003401453697A652E506C6174666F726D44656661
+          756C740800000005545465787400095374796C654E616D650604746578740541
+          6C69676E07044C656674064C6F636B6564090748697454657374080C4D617267
+          696E732E4C65667405000000000000008002400D4D617267696E732E52696768
+          740500000000000000F002400A506F736974696F6E2E58050000000000000084
+          04400A53697A652E57696474680500000000000000C804400B53697A652E4865
+          696768740500000000000000D003401453697A652E506C6174666F726D446566
+          61756C7408165465787453657474696E67732E486F727A416C69676E07074C65
+          6164696E67000005545465787400095374796C654E616D65060873686F727463
+          757405416C69676E07055269676874064C6F636B656409074869745465737408
+          0C4D617267696E732E4C6566740500000000000000C002400D4D617267696E73
+          2E52696768740500000000000000C001400A506F736974696F6E2E5805000000
+          00000000C000C00A53697A652E57696474680500000000000000C804400B5369
+          7A652E4865696768740500000000000000D003401453697A652E506C6174666F
+          726D44656661756C7408165465787453657474696E67732E466F6E74436F6C6F
+          720708636C615768697465165465787453657474696E67732E486F727A416C69
+          676E07074C656164696E67000007544C61796F757400095374796C654E616D65
+          06077375626D61726B05416C69676E070552696768740A506F736974696F6E2E
+          580500000000000000D404400A53697A652E57696474680500000000000000A0
+          03400B53697A652E4865696768740500000000000000D003401453697A652E50
+          6C6174666F726D44656661756C7408000554506174680005416C69676E070643
+          656E74657209446174612E506174680A34000000040000000000000000000000
+          0000000001000000000000000000803F010000000000803F0000003F03000000
+          00000000000000000A46696C6C2E436F6C6F720707636C6147726179064C6F63
+          6B6564090748697454657374080A53697A652E57696474680500000000000000
+          E001400B53697A652E48656967687405000000000000008002401453697A652E
+          506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F
+          6E6500000000545046300A5452656374616E676C6500095374796C654E616D65
+          061170616E656C7374796C655F72616469757305416C69676E070643656E7465
+          720A46696C6C2E436F6C6F720708636C6157686974650748697454657374080A
+          53697A652E57696474680500000000000000C804400B53697A652E4865696768
+          740500000000000000C804401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F720709784646453645364536075669736962
+          6C650807585261646975730500000000000000A0014007595261646975730500
+          000000000000A00140000A5452656374616E676C650005416C69676E0706436C
+          69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61
+          7267696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F
+          70050000000000000080FF3F0D4D617267696E732E5269676874050000000000
+          000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A
+          53697A652E57696474680500000000000000C004400B53697A652E4865696768
+          740500000000000000C004401453697A652E506C6174666F726D44656661756C
+          74080C5374726F6B652E436F6C6F720709784646453645364536075852616469
+          75730500000000000000A0014007595261646975730500000000000000A00140
+          000000545046300A5452656374616E676C6500095374796C654E616D65061670
+          616E656C7374796C655F6D61636F735F6672616D6505416C69676E070643656E
+          7465720A46696C6C2E436F6C6F720708636C6157686974650748697454657374
+          080A53697A652E57696474680500000000000000C804400B53697A652E486569
+          6768740500000000000000C804401453697A652E506C6174666F726D44656661
+          756C74080B5374726F6B652E4B696E6407044E6F6E65000A5452656374616E67
+          6C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E
+          650748697454657374080C4D617267696E732E4C656674050000000000000080
+          FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E
+          732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F
+          6D050000000000000080FF3F0A53697A652E57696474680500000000000000C0
+          04400B53697A652E4865696768740500000000000000C004401453697A652E50
+          6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
+          65000000}
+      end>
+    Left = 40
+    Top = 108
+  end
+  object OpenDialog: TOpenDialog
+    Filter = 'Json'#25991#20214'|*.json|'#25991#26412#25991#20214'|*.txt|'#20840#37096#25991#20214'|*.*'
+    Left = 32
+    Top = 12
+  end
+  object mmMain: TMainMenu
+    Left = 296
+    Top = 16
+    object miNone: TMenuItem
+      Text = #21344#20301
+    end
+    object miSystem: TMenuItem
+      Text = 'galeJSON'
+      object miHelpAbout: TMenuItem
+        Action = actHelpAbout
+        Locked = True
+        Text = 'About ...'
+        ImageIndex = -1
+      end
+      object miSystemUpdate: TMenuItem
+        Action = actSystemUpdate
+        Locked = True
+        ImageIndex = -1
+      end
+      object TMenuItem
+        Locked = True
+        Text = '-'
+      end
+      object miOption: TMenuItem
+        Enabled = False
+        Locked = True
+        Text = 'Option'
+      end
+      object TMenuItem
+        Locked = True
+        Text = '-'
+      end
+      object miSystemExit: TMenuItem
+        Locked = True
+        Text = 'Exit'
+        OnClick = miSystemExitClick
+      end
+    end
+    object miFile: TMenuItem
+      Action = actFile
+      ImageIndex = -1
+      object miFileNew: TMenuItem
+        Action = actFileNew
+        Locked = True
+        ImageIndex = -1
+      end
+      object miFileOpen: TMenuItem
+        Action = actFileOpen
+        Locked = True
+        ImageIndex = -1
+      end
+      object miFileOpenRecent: TMenuItem
+        Action = actFileOpenRecent
+        Locked = True
+        ImageIndex = -1
+        object mi1: TMenuItem
+          Locked = True
+          Text = 'mi1'
+        end
+        object mi2: TMenuItem
+          Locked = True
+          Text = 'mi2'
+        end
+      end
+      object TMenuItem
+        Locked = True
+        Text = '-'
+      end
+      object miFileSave: TMenuItem
+        Action = actFileSave
+        Locked = True
+        ImageIndex = -1
+      end
+      object miFileSaveAs: TMenuItem
+        Action = actFileSaveAs
+        Locked = True
+        ImageIndex = -1
+      end
+      object TMenuItem
+        Locked = True
+        Text = '-'
+      end
+      object miFileClose: TMenuItem
+        Action = actFileClose
+        Locked = True
+        ImageIndex = -1
+      end
+    end
+    object miEdit: TMenuItem
+      Action = actEdit
+      ImageIndex = -1
+      object miEditMoveUp: TMenuItem
+        Action = actEditMoveUp
+        Locked = True
+        ImageIndex = -1
+      end
+      object miEditMoveDown: TMenuItem
+        Action = actEditMoveDown
+        Locked = True
+        ImageIndex = -1
+      end
+    end
+    object miView: TMenuItem
+      Action = actView
+      ImageIndex = -1
+      object miViewLang: TMenuItem
+        Action = actViewLang
+        Locked = True
+        ImageIndex = -1
+      end
+      object miViewShowLog: TMenuItem
+        Action = actViewShowLog
+        Locked = True
+        ImageIndex = -1
+      end
+      object miViewDarkStyle: TMenuItem
+        Action = actViewDarkStyle
+        Locked = True
+        ImageIndex = -1
+      end
+    end
+  end
+  object actsMain: TActionList
+    Left = 192
+    Top = 16
+    object actFile: TAction
+      Text = 'File'
+      OnExecute = actNoneExecute
+    end
+    object actFileNew: TAction
+      Text = 'New'
+      ShortCut = 16462
+      OnExecute = actFileNewExecute
+    end
+    object actFileOpen: TAction
+      Text = 'Open'
+      ShortCut = 16463
+      OnExecute = actFileOpenExecute
+    end
+    object actFileSave: TAction
+      Text = 'Save'
+      ShortCut = 16467
+      OnExecute = actFileSaveExecute
+    end
+    object actFileOpenRecent: TAction
+      Text = 'Open Recent'
+      OnExecute = actNoneExecute
+    end
+    object actFileClearRecent: TAction
+      Text = 'Clear'
+      OnExecute = actFileClearRecentExecute
+    end
+    object actFileSaveAs: TAction
+      Text = 'SaveAs'
+      OnExecute = actFileSaveAsExecute
+    end
+    object actFileClose: TAction
+      Text = 'Close'
+      OnExecute = actFileCloseExecute
+    end
+    object actEdit: TAction
+      Text = 'Edit'
+      OnExecute = actNoneExecute
+    end
+    object actEditMoveUp: TAction
+      Text = 'Move Up'
+      OnExecute = actEditMoveUpExecute
+    end
+    object actEditMoveDown: TAction
+      Text = 'Move Down'
+      OnExecute = actEditMoveDownExecute
+    end
+    object actView: TAction
+      Text = 'View'
+      OnExecute = actNoneExecute
+    end
+    object actViewLang: TAction
+      Text = 'Language'
+      OnExecute = actViewLangExecute
+    end
+    object actViewShowLog: TAction
+      Text = 'Show Log'
+      OnExecute = actViewShowLogExecute
+    end
+    object actViewDarkStyle: TAction
+      Text = 'Dark Style'
+      OnExecute = actViewDarkStyleExecute
+    end
+    object actViewFont: TAction
+      Text = 'Font'
+      OnExecute = actViewFontExecute
+    end
+    object actWindow: TAction
+      Text = 'Window'
+      OnExecute = actNoneExecute
+    end
+    object actWindowItems: TAction
+      Text = 'Document List'
+      OnExecute = actNoneExecute
+    end
+    object actHelp: TAction
+      Text = 'Help'
+      OnExecute = actNoneExecute
+    end
+    object actHelpHelp: TAction
+      Text = 'Help'
+    end
+    object actHelpAbout: TAction
+      Text = 'About...'
+      OnExecute = actHelpAboutExecute
+    end
+    object actSystemUpdate: TAction
+      Text = 'Check Update'
+    end
+    object actWindowShowAll: TAction
+      Text = 'Show All'
+      OnExecute = actWindowShowAllExecute
+    end
+  end
+end

+ 657 - 0
FormMain.pas

@@ -0,0 +1,657 @@
+unit FormMain;
+
+interface
+
+uses
+{$IFDEF MACOS}
+  MacOpenFileDelegate, Macapi.AppKit, Macapi.ObjectiveC, Macapi.Foundation,
+  Macapi.Helpers, FMX.Platform.Mac,
+{$ELSE}
+  FMXTrayIcon, FMX.Platform.Win, Winapi.Windows,
+{$ENDIF}
+  SaveDialogsEnhanced,
+  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.IOUtils,
+  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, System.Actions,
+  FMX.ActnList, FMX.Menus;
+
+type
+  TfmMain = class(TForm)
+    StyleBookBlack: TStyleBook;
+    StyleBookWhite: TStyleBook;
+    actsMain: TActionList;
+    actFileNew: TAction;
+    actFileOpen: TAction;
+    OpenDialog: TOpenDialog;
+    actFileSave: TAction;
+    actFileSaveAs: TAction;
+    actFileClose: TAction;
+    actViewShowLog: TAction;
+    actViewDarkStyle: TAction;
+    actViewFont: TAction;
+    actHelpHelp: TAction;
+    actHelpAbout: TAction;
+    actEditMoveUp: TAction;
+    actEditMoveDown: TAction;
+    mmMain: TMainMenu;
+    miFile: TMenuItem;
+    miEdit: TMenuItem;
+    miNone: TMenuItem;
+    miFileNew: TMenuItem;
+    miFileOpen: TMenuItem;
+    miSystem: TMenuItem;
+    miHelpAbout: TMenuItem;
+    miOption: TMenuItem;
+    miSystemExit: TMenuItem;
+    miSystemUpdate: TMenuItem;
+    miFileSave: TMenuItem;
+    miFileSaveAs: TMenuItem;
+    miEditMoveUp: TMenuItem;
+    miEditMoveDown: TMenuItem;
+    miView: TMenuItem;
+    miViewShowLog: TMenuItem;
+    miViewDarkStyle: TMenuItem;
+    miFileClose: TMenuItem;
+    miFileOpenRecent: TMenuItem;
+    mi1: TMenuItem;
+    mi2: TMenuItem;
+    actFile: TAction;
+    actViewLang: TAction;
+    actEdit: TAction;
+    miViewLang: TMenuItem;
+    actView: TAction;
+    actWindow: TAction;
+    actHelp: TAction;
+    actSystemUpdate: TAction;
+    actFileOpenRecent: TAction;
+    actWindowItems: TAction;
+    actWindowShowAll: TAction;
+    actFileClearRecent: TAction;
+    procedure FormCreate(Sender: TObject);
+    procedure FormClose(Sender: TObject; var Action: TCloseAction);
+    procedure FormDestroy(Sender: TObject);
+    procedure FormActivate(Sender: TObject);
+    procedure actFileNewExecute(Sender: TObject);
+    procedure actFileOpenExecute(Sender: TObject);
+    procedure actFileSaveExecute(Sender: TObject);
+    procedure actFileSaveAsExecute(Sender: TObject);
+    procedure actFileCloseExecute(Sender: TObject);
+    procedure actViewShowLogExecute(Sender: TObject);
+    procedure actViewDarkStyleExecute(Sender: TObject);
+    procedure actViewFontExecute(Sender: TObject);
+    procedure actHelpAboutExecute(Sender: TObject);
+    procedure actEditMoveUpExecute(Sender: TObject);
+    procedure actEditMoveDownExecute(Sender: TObject);
+    procedure miSystemExitClick(Sender: TObject);
+    procedure actViewLangExecute(Sender: TObject);
+    procedure actNoneExecute(Sender: TObject);
+    procedure actWindowShowAllExecute(Sender: TObject);
+    procedure actFileClearRecentExecute(Sender: TObject);
+  private
+    FSaveDialog: TEnhancedSaveDialog;
+{$IFDEF MSWINDOWS}
+    FTrayIcon: TTrayIcon;
+    procedure OnRunOnlyOnce(ASender: TObject; AParams: TArray<String>);
+{$ELSE}
+    procedure InitMacOsMenu;
+{$ENDIF}
+  public
+{$IFDEF MACOS}
+    procedure InitMacOsRecentFile;
+    procedure RecentFileClick(Sender: TObject);
+{$ENDIF}
+    procedure SetLang;
+  end;
+
+var
+  fmMain: TfmMain;
+
+implementation
+
+{$R *.fmx}
+
+
+uses JsonDocument, pub, Logger, FormLogger, FormAbout, JSONTreeView;
+
+{$IFDEF MSWINDOWS}
+
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.OnRunOnlyOnce
+  说明: 程序重复运行事件
+  参数: ASender
+        AParams
+-------------------------------------------------------------------------------}
+procedure TfmMain.OnRunOnlyOnce(ASender: TObject; AParams: TArray<String>);
+begin
+  if Length(AParams) > 1 then
+  begin
+    for var item in g_pub.DocumentWindowList do
+    begin
+      if item.Doc.FileName = AParams[1] then
+      begin
+        item.Show;
+        item.Activate;
+        item.BringToFront;
+        Exit;
+      end;
+    end;
+    var
+    lastForm := g_pub.DocumentWindowList.ActiveWindow;
+    if lastForm = nil then
+      lastForm := g_pub.DocumentWindowList.Last;
+    with TDocumentWindow.Create(nil) do
+    begin
+      Show;
+      OpenFile(AParams[1]);
+      Left := lastForm.Left + 20;
+      Top := lastForm.Top + 28;
+    end;
+  end
+  else
+  begin
+    var
+    lastForm := g_pub.DocumentWindowList.Last;
+    with TDocumentWindow.Create(nil) do
+    begin
+      Show;
+      NewFile;
+      Left := lastForm.Left + 20;
+      Top := lastForm.Top + 28;
+    end;
+  end;
+end;
+
+{$ELSE}
+
+
+{-------------------------------------------------------------------------------
+  名称: OpenFileDelegate
+  说明: 处理文件关联打开
+  参数: AFilename
+-------------------------------------------------------------------------------}
+procedure OpenFileDelegate(const AFilename: string);
+var
+  LDocForm: TDocumentWindow;
+begin
+  if FileExists(AFilename) then
+  begin
+    if (g_pub.DocumentWindowList.Count = 1) and (g_pub.DocumentWindowList.First.Doc.FileName = '') then
+    begin
+      g_pub.DocumentWindowList.Last.OpenFile(AFilename);
+    end
+    else
+    begin
+      for var item in g_pub.DocumentWindowList do
+      begin
+        if item.Doc.FileName = AFilename then
+        begin
+          item.Activate;
+          item.BringToFront;
+          Exit;
+        end;
+      end;
+      var
+      lastForm := g_pub.DocumentWindowList.Last;
+      LDocForm := TDocumentWindow.Create(nil);
+      LDocForm.Show;
+      LDocForm.OpenFile(AFilename);
+      LDocForm.Left := lastForm.Left + 20;
+      LDocForm.Top := lastForm.Top + 28;
+    end;
+  end
+  else
+  begin
+    g_Logger.Error('file does not exist - ' + AFilename);
+  end;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.InitMacOsMenu
+  说明: 初始化MacOS菜单
+-------------------------------------------------------------------------------}
+procedure TfmMain.InitMacOsMenu;
+var
+  NSApp: NSApplication;
+  LMainMenu: NSMenu;
+begin
+  NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
+  LMainMenu := NSApp.MainMenu;
+  LMainMenu.itemAtIndex(0).setHidden(True);
+  actFileNew.ShortCut := scCommand + Ord('N');
+  actFileOpen.ShortCut := scCommand + Ord('O');
+  actFileClose.ShortCut := scCommand + Ord('W');
+  actFileSave.ShortCut := scCommand + Ord('S');
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.InitMacOsRecentFile
+  说明: 初始化Mac下的历史文件菜单
+-------------------------------------------------------------------------------}
+procedure TfmMain.InitMacOsRecentFile;
+var
+  miTmp: TMenuItem;
+begin
+  miFileOpenRecent.Clear;
+  for var item in g_pub.Config['recent'] do
+  begin
+    miTmp := TMenuItem.Create(fmMain.miFileOpenRecent);
+    miTmp.Text := item;
+    miTmp.OnClick := RecentFileClick;
+    miFileOpenRecent.AddObject(miTmp);
+    miTmp.Enabled := FileExists(miTmp.Text);
+  end;
+  if miFileOpenRecent.ItemsCount > 0 then
+  begin
+    miTmp := TMenuItem.Create(miFileOpenRecent);
+    miTmp.Text := '-';
+    miFileOpenRecent.AddObject(miTmp);
+    miTmp := TMenuItem.Create(miFileOpenRecent);
+    miTmp.Action := actFileClearRecent;
+    miFileOpenRecent.AddObject(miTmp);
+  end
+  else
+  begin
+    miTmp := TMenuItem.Create(miFileOpenRecent);
+    miTmp.Text := 'No file';
+    miTmp.Enabled := False;
+    miFileOpenRecent.AddObject(miTmp);
+  end;
+end;
+
+procedure TfmMain.RecentFileClick(Sender: TObject);
+var
+  LFilename: string;
+  LDocWin: TDocumentWindow;
+begin
+  LFilename := TMenuItem(Sender).Text;
+  LDocWin := g_pub.DocumentWindowList.GetWindowByFilename(LFilename);
+  if LDocWin <> nil then
+  begin
+    LDocWin.Show;
+  end
+  else
+  begin
+    LDocWin := TDocumentWindow.Create(nil);
+    LDocWin.Show;
+    LDocWin.OpenFile(LFilename);
+  end;
+end;
+
+{$ENDIF}
+
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.miSystemExitClick
+  说明: 退出
+-------------------------------------------------------------------------------}
+procedure TfmMain.miSystemExitClick(Sender: TObject);
+begin
+  Close;
+end;
+
+procedure TfmMain.FormCreate(Sender: TObject);
+var
+  LDocForm: TDocumentWindow;
+begin
+  Left := -102400;
+  fmLogger := TfmLogger.Create(nil);
+{$IFDEF MACOS} // 初始化mac下的语言选择菜单
+  miViewLang.Clear;
+  for var item in g_pub.Languages do
+  begin
+    var
+    mi := TMenuItem.Create(miViewLang);
+    mi.Text := item['caption'].ToStr('None');
+    mi.RadioItem := True;
+    mi.GroupIndex := 10;
+    mi.OnClick := actViewLangExecute;
+    miViewLang.AddObject(mi);
+  end;
+{$ENDIF}
+  FSaveDialog := TEnhancedSaveDialog.Create(self);
+  FSaveDialog.Filter := '缩进格式|*.json|缩进格式、转义非ASCII字符|*.json|紧凑格式|*.json|紧凑格式、转义非ASCII字符|*.json';
+  SetLang;
+  LDocForm := TDocumentWindow.Create(nil);
+  LDocForm.Show;
+  LDocForm.NewFile;
+{$IFDEF MSWINDOWS}
+  FTrayIcon := TTrayIcon.Create(self);
+  FTrayIcon.RunOnlyOnce := True;
+  FTrayIcon.OnRunOnlyOnce := OnRunOnlyOnce;
+  if ParamCount > 0 then
+  begin
+    if FileExists(ParamStr(1)) then
+    begin
+      LDocForm.OpenFile(ParamStr(1));
+    end
+    else
+    begin
+      g_Logger.Error('File does not exist - ' + ParamStr(1));
+    end;
+  end;
+{$ELSE}
+  width := 1;
+  height := 1;
+  InitMacOsMenu;
+  InitMacOsRecentFile;
+  InstallApplicationOpenFileDelegate(OpenFileDelegate);
+
+{$ENDIF}
+end;
+
+procedure TfmMain.FormDestroy(Sender: TObject);
+begin
+  fmLogger.Free;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.FormActivate
+  说明: 窗口激活
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.FormActivate(Sender: TObject);
+begin
+{$IFDEF MSWINDOWS}
+  g_pub.DocumentWindowList.ShowAll;
+{$ENDIF}
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.FormClose
+  说明: 窗口关闭
+  参数: Sender
+        Action
+-------------------------------------------------------------------------------}
+procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+{$IFDEF MSWINDOWS}
+  for var item in g_pub.DocumentWindowList do
+  begin
+    item.OnClose := nil;
+    item.Free;
+  end;
+{$ENDIF}
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actFileClearRecentExecute
+  说明: 清除历史文件
+-------------------------------------------------------------------------------}
+procedure TfmMain.actFileClearRecentExecute(Sender: TObject);
+begin
+  g_pub.Config['recent'] := nil;
+{$IFDEF MACOS}
+  InitMacOsRecentFile;
+{$ENDIF}
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actFileCloseExecute
+  说明: 关闭文件
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actFileCloseExecute(Sender: TObject);
+begin
+  if g_pub.DocumentWindowList.ActiveWindow <> nil then
+    g_pub.DocumentWindowList.ActiveWindow.Close;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actNoneExecute
+  说明: 空函数,为了使Action生效
+-------------------------------------------------------------------------------}
+procedure TfmMain.actNoneExecute(Sender: TObject);
+begin
+  //
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actFileNewExecute
+  说明: 新建文件
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actFileNewExecute(Sender: TObject);
+var
+  LDocWin: TDocumentWindow;
+begin
+  LDocWin := TDocumentWindow.Create(nil);
+  LDocWin.Show;
+  LDocWin.NewFile;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actFileOpenExecute
+  说明: 打开文件
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actFileOpenExecute(Sender: TObject);
+var
+  LDocWin: TDocumentWindow;
+begin
+  if not OpenDialog.Execute then
+    Exit;
+  LDocWin := g_pub.DocumentWindowList.GetWindowByFilename(OpenDialog.FileName);
+  if LDocWin <> nil then
+  begin
+    LDocWin.Show;
+  end
+  else
+  begin
+    LDocWin := TDocumentWindow.Create(nil);
+    LDocWin.Show;
+    LDocWin.OpenFile(OpenDialog.FileName);
+  end;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actFileSaveExecute
+  说明: 保存文件
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actFileSaveExecute(Sender: TObject);
+begin
+  if not g_pub.DocumentWindowList.HasActiveWindow then
+    Exit;
+  if g_pub.DocumentWindowList.ActiveWindow.Doc.FileName <> '' then
+  begin
+    g_pub.DocumentWindowList.ActiveWindow.Doc.Save(g_pub.DocumentWindowList.ActiveWindow.Doc.FileName, g_pub.Config['editor.indent'].ToInt(4));
+    g_pub.DocumentWindowList.ActiveWindow.ShowInfo('文件保存成功!');
+  end
+  else
+  begin
+    actFileSaveAsExecute(nil);
+  end;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actFileSaveAsExecute
+  说明: 另存为
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actFileSaveAsExecute(Sender: TObject);
+begin
+
+  if g_pub.DocumentWindowList.LastActive.Doc.FileName = '' then
+  begin
+    FSaveDialog.FileName := c_untitled_filename;
+  end
+  else
+  begin
+    FSaveDialog.InitialDir := ExtractFileDir(g_pub.DocumentWindowList.LastActive.Doc.FileName);
+    FSaveDialog.FileName := ExtractFileName(g_pub.DocumentWindowList.LastActive.Doc.FileName);
+  end;
+
+  if FSaveDialog.Execute then
+  begin
+    case FSaveDialog.FilterIndex of
+      1:
+        g_pub.DocumentWindowList.LastActive.Doc.Save(FSaveDialog.FileName, g_pub.Config['editor.indent'].ToInt(4), True, False, False);
+      2:
+        g_pub.DocumentWindowList.LastActive.Doc.Save(FSaveDialog.FileName, g_pub.Config['editor.indent'].ToInt(4), True, True, False);
+      3:
+        g_pub.DocumentWindowList.LastActive.Doc.Save(FSaveDialog.FileName, -1, True, False, False);
+      4:
+        g_pub.DocumentWindowList.LastActive.Doc.Save(FSaveDialog.FileName, -1, True, True, False);
+    end;
+    g_pub.DocumentWindowList.LastActive.ShowInfo('文件另存成功!');
+  end;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actEditMoveDownExecute
+  说明: 上移
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actEditMoveDownExecute(Sender: TObject);
+var
+  LItem: TJSONTreeViewItem;
+  LDocWin: TDocumentWindow;
+begin
+  if not g_pub.DocumentWindowList.HasActiveWindow then
+    Exit;
+  LDocWin := g_pub.DocumentWindowList.ActiveWindow;
+  LItem := TJSONTreeViewItem(LDocWin.tvJson.Selected);
+  if LItem = nil then
+    Exit;
+  if (LItem.ParentItem = nil) then
+    Exit;
+  if (LItem.Index >= LItem.ParentItem.Count - 1) then
+    Exit;
+  LItem.TreeView.Selected := nil;
+  TJSONTreeViewItem(LItem.ParentItem).MoveItem(LItem.Index, LItem.Index + 1, True);
+  LItem.Select;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actEditMoveUpExecute
+  说明: 下移
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actEditMoveUpExecute(Sender: TObject);
+var
+  LItem: TJSONTreeViewItem;
+  LDocWin: TDocumentWindow;
+begin
+  if not g_pub.DocumentWindowList.HasActiveWindow then
+    Exit;
+  LDocWin := g_pub.DocumentWindowList.ActiveWindow;
+  LItem := TJSONTreeViewItem(LDocWin.tvJson.Selected);
+  if LItem = nil then
+    Exit;
+  if (LItem.ParentItem = nil) or (LItem.Index <= 0) then
+    Exit;
+  if (LItem.Index = 0) then
+    Exit;
+  LItem.TreeView.Selected := nil;
+  TJSONTreeViewItem(LItem.ParentItem).MoveItem(LItem.Index, LItem.Index - 1, True);
+  LItem.Select;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actViewDarkStyleExecute
+  说明: 设置暗黑风格
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actViewDarkStyleExecute(Sender: TObject);
+begin
+  g_pub.IsDarkStyle := not g_pub.IsDarkStyle;
+  actViewDarkStyle.Checked := g_pub.IsDarkStyle;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actViewFontExecute
+  说明: 设置字体
+-------------------------------------------------------------------------------}
+procedure TfmMain.actViewFontExecute(Sender: TObject);
+//var
+//  LDialog: TFontDialog;
+begin
+  {LDialog := TFontDialog.Create(nil);
+  try
+    LDialog.StyleBook := StyleBook;
+    LDialog.rctTitleBar.Fill.Color := rctTitleBar.Fill.Color; // 标题栏背景
+    LDialog.pathCloseBtn.Fill.Color := pathCloseBtn.Fill.Color;
+    if LDialog.ShowModal(mmoEdit.TextSettings) = mrOK then
+    begin
+      g_pub.Config[ActiveControl.Name + '.TextSettings'].LoadFromObject(mmoEdit.TextSettings);
+      g_pub.SaveConfig;
+    end;
+  finally
+    FreeAndNil(LDialog);
+  end;}
+end;
+
+procedure TfmMain.actViewLangExecute(Sender: TObject);
+begin
+  if Sender is TMenuItem then
+  begin
+    g_pub.LangIndex := TMenuItem(Sender).Index;
+    SetLang;
+  end;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actViewShowLogExecute
+  说明: 显示日志
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actViewShowLogExecute(Sender: TObject);
+begin
+  fmLogger.Show;
+end;
+
+procedure TfmMain.actWindowShowAllExecute(Sender: TObject);
+var
+  LOldOnActivate: TNotifyEvent;
+begin
+  for var item in g_pub.DocumentWindowList do
+  begin
+    LOldOnActivate := item.OnActivate;
+    item.OnActivate := nil;
+    item.Show;
+    item.OnActivate := LOldOnActivate;
+  end;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.actHelpAboutExecute
+  说明: 关于...
+  参数: Sender
+-------------------------------------------------------------------------------}
+procedure TfmMain.actHelpAboutExecute(Sender: TObject);
+begin
+  TfmAbout.Create(nil).Show;
+end;
+
+{-------------------------------------------------------------------------------
+  名称: TfmMain.SetLang
+  说明: 设置语言
+-------------------------------------------------------------------------------}
+procedure TfmMain.SetLang;
+var
+  actItem: TAction;
+  strTmp: string;
+begin
+  for var item in actsMain do
+  begin
+    actItem := TAction(item);
+    strTmp := g_pub.LangStr(actItem.Name);
+    if strTmp <> '' then
+    begin
+      actItem.Text := g_pub.LangStr(actItem.Name);
+    end;
+  end;
+{$IFDEF MACOS}
+  miViewLang.Items[g_pub.LangIndex].IsChecked := True;
+  miHelpAbout.Text := actHelpAbout.Text;
+{$ENDIF}
+  for var item in g_pub.DocumentWindowList do
+  begin
+    item.SetLang;
+  end;
+end;
+
+initialization
+
+end.

+ 590 - 0
JSONTreeView.pas

@@ -0,0 +1,590 @@
+unit JSONTreeView;
+
+interface
+
+uses
+  System.JSON, System.Generics.Collections, System.Math, System.SysUtils,
+  System.Types, System.Classes, System.UITypes,
+  FMX.Types, FMX.Graphics, FMX.Controls, FMX.StdCtrls, FMX.TreeView, FMX.Objects,
+  FMX.Forms, FMX.Menus;
+
+type
+  // 自定义的树视图项类,用于处理JSON数据
+  TJSONTreeViewItem = class(TTreeViewItem)
+  private
+    FJsonData: TJSONAncestor; // 存储JSON数据
+    FMouseDowned: Boolean; // 鼠标是否按下
+    FMouseDownPos: TPointF; // 鼠标按下位置
+  private
+    // 设置JSON数据
+    procedure SetJsonData(const AValue: TJSONAncestor);
+    // 获取JSON值
+    function GetJsonValue: TJSONValue;
+    // 设置JSON值
+    procedure SetJsonValue(const AValue: TJSONValue);
+    // 获取键名
+    function GetKey: string;
+    // 获取值
+    function GetValue: string;
+    // 获取最后一个路径
+    function GetLastPath: string;
+    // 获取完整路径
+    function GetPath: string;
+  protected
+    // 重载绘制函数
+    procedure Paint; override;
+  public
+    property JsonData: TJSONAncestor read FJsonData write SetJsonData; // JSON数据属性
+    property JsonValue: TJSONValue read GetJsonValue write SetJsonValue; // JSON值属性
+    property Key: string read GetKey; // 键名属性
+    property LastPath: string read GetLastPath; // 最后一个路径属性
+    property Path: string read GetPath; // 完整路径属性
+    property Value: string read GetValue; // 值属性
+  public
+    // 鼠标按下事件处理
+    procedure TreeViewItemMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    // 鼠标移动事件处理
+    procedure TreeViewItemMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
+    // 鼠标释放事件处理
+    procedure TreeViewItemMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+  public
+    // 构造函数
+    constructor Create(AOwner: TComponent); override;
+    // 获取第一个子项
+    function First: TJSONTreeViewItem;
+    // 获取最后一个子项
+    function Last: TJSONTreeViewItem;
+    // 获取层级
+    function Level: integer;
+    // 是否有子项
+    function HasSubItem: Boolean;
+    // 是否有选中的子项
+    function HasSUbItemIsSelected: Boolean;
+    // 获取父项
+    function MyParentItem: TJSONTreeViewItem;
+    // 移除子项
+    procedure RemoveItem(const AItem: TJSONTreeViewItem; AReTextSubItem: Boolean = False);
+    // 从父项中提取
+    function ExtractFromParent(AParentReTextSubItem: Boolean = False): TJSONTreeViewItem;
+    // 添加子项
+    procedure AddItem(const AItem: TJSONTreeViewItem; AItemReText: Boolean = False);
+    // 插入子项
+    procedure InsertItem(const AIndex: integer; const AItem: TJSONTreeViewItem;
+      AReTextSubItem: Boolean = False);
+    // 移动子项
+    procedure MoveItem(const ACurIndex, ANewIndex: integer; AReTextSubItem: Boolean = False);
+    // 清除子条目
+    procedure ClearItem;
+    // 重新设置文本
+    procedure ReText;
+    // 重新设置所有子项的文本
+    procedure ReTextSubItem;
+  end;
+
+// 设置树视图项,递归地将JSON数据添加到树视图中
+procedure SetTreeItem(const AParentItem: TStyledControl; const AJData: TJSONAncestor; APopupMenu: TPopupMenu = nil);
+procedure SetTreeItems(const AParentItem: TStyledControl; const AJData: TJSONAncestor; APopupMenu: TPopupMenu = nil);
+
+implementation
+
+uses pub, jsonhelper, Logger;
+
+////////////////////////////////////////////////////////////////////////////////
+// 为树形控件的项目设置JSON数据和PopupMenu
+////////////////////////////////////////////////////////////////////////////////
+procedure SetTreeItem(const AParentItem: TStyledControl; const AJData: TJSONAncestor; APopupMenu: TPopupMenu);
+var
+  tvItem: TJSONTreeViewItem;
+begin
+  tvItem := TJSONTreeViewItem.Create(nil);
+  AParentItem.AddObject(tvItem);
+  tvItem.PopupMenu := APopupMenu;
+  tvItem.JsonData := AJData;
+  for var i := 0 to tvItem.JsonValue.ItemCount - 1 do
+  begin
+    SetTreeItem(tvItem, tvItem.JsonValue.Items[i]);
+  end;
+end;
+
+procedure SetTreeItems(const AParentItem: TStyledControl; const AJData: TJSONAncestor; APopupMenu: TPopupMenu = nil);
+begin
+  if AJData is TJSONObject then
+  begin
+    for var i := 0 to TJSONObject(AJData).Count - 1 do
+    begin
+      SetTreeItem(AParentItem, TJSONObject(AJData).Pairs[i]);
+    end;
+  end
+  else if AJData is TJSONArray then
+  begin
+    for var i := 0 to TJSONArray(AJData).Count - 1 do
+    begin
+      SetTreeItem(AParentItem, TJSONArray(AJData)[i]);
+    end;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// TJSONTreeViewItem类的构造函数
+////////////////////////////////////////////////////////////////////////////////
+constructor TJSONTreeViewItem.Create(AOwner: TComponent);
+begin
+  inherited;
+  FJsonData := nil;
+  OnMouseDown := TreeViewItemMouseDown;
+  OnMouseMove := TreeViewItemMouseMove;
+  OnMouseUp := TreeViewItemMouseUp;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取JSONTreeViewItem的第一个子项
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.First: TJSONTreeViewItem;
+begin
+  if Count > 0 then
+    Result := TJSONTreeViewItem(Items[0])
+  else
+    Result := nil;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取JSONTreeViewItem的最后一个子项
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.Last: TJSONTreeViewItem;
+begin
+  if Count > 0 then
+    Result := TJSONTreeViewItem(Items[Count - 1])
+  else
+    Result := nil;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取JSONTreeViewItem的层级深度
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.Level: integer;
+var
+  LCurItem: TJSONTreeViewItem;
+begin
+  Result := 0;
+  LCurItem := self;
+  while LCurItem.ParentItem <> nil do
+  begin
+    Inc(Result);
+    LCurItem := LCurItem.MyParentItem;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 判断JSONTreeViewItem是否有子项
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.HasSubItem: Boolean;
+begin
+  Result := Count > 0;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 判断JSONTreeViewItem是否有被选中的子项
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.HasSUbItemIsSelected: Boolean;
+begin
+  Result := False;
+  for var i := 0 to Count - 1 do
+  begin
+    if Items[i].IsSelected then
+      Exit(True);
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取当前项的父项
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.MyParentItem: TJSONTreeViewItem;
+begin
+  Result := TJSONTreeViewItem(ParentItem);
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 从当前项中移除子项
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.RemoveItem(const AItem: TJSONTreeViewItem; AReTextSubItem: Boolean = False);
+begin
+  if JsonValue is TJSONObject then
+  begin
+    TJSONObject(JsonValue).DeletePair(TJSONPair(AItem.FJsonData));
+    RemoveObject(AItem);
+  end
+  else if JsonValue is TJSONArray then
+  begin
+    TJSONArray(JsonValue).Delete(AItem.JsonValue);
+    RemoveObject(AItem);
+    if AReTextSubItem then
+    begin
+      ReTextSubItem;
+    end;
+  end
+  else
+  begin
+    raise Exception.Create('TJSONTreeViewItem.RemoveItem: must be TJSONObject or TJSONArray');
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 从父项中提取当前项
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.ExtractFromParent(AParentReTextSubItem: Boolean = False): TJSONTreeViewItem;
+begin
+  Result := TJSONTreeViewItem(ParentItem);
+  if Result <> nil then
+    Result.RemoveItem(self, AParentReTextSubItem);
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 向当前项中添加子项
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.AddItem(const AItem: TJSONTreeViewItem; AItemReText: Boolean = False);
+var
+  LValue: TJSONValue;
+begin
+  if JsonValue is TJSONObject then
+  begin
+    if not(AItem.JsonData is TJSONPair) then
+    begin
+      AItem.JsonData := TJSONPair.Create('untitled', AItem.JsonValue);
+    end;
+    TJSONObject(JsonValue).AddPair(TJSONPair(AItem.JsonData));
+  end
+  else if JsonValue is TJSONArray then
+  begin
+    if AItem.JsonData is TJSONPair then
+    begin
+      LValue := AItem.JsonValue;
+      LValue.Owned := False;
+      FreeAndNil(AItem.JsonData);
+      LValue.Owned := True;
+      AItem.JsonData := LValue;
+    end;
+    TJSONArray(JsonValue).AddElement(AItem.JsonValue);
+  end;
+  AddObject(AItem);
+  if AItemReText then
+  begin
+    AItem.ReText;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 在当前JSON树视图项中插入一个新项
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.InsertItem(const AIndex: integer; const AItem: TJSONTreeViewItem; AReTextSubItem: Boolean = False);
+var
+  LValue: TJSONValue;
+begin
+  if JsonValue is TJSONObject then
+  begin
+    if not(AItem.JsonData is TJSONPair) then
+    begin
+      AItem.JsonData := TJSONPair.Create('untitled', AItem.JsonValue);
+    end;
+    TJSONObject(JsonValue).InsertPair(AIndex, TJSONPair(AItem.JsonData));
+    InsertObject(AIndex, AItem);
+    AItem.ReText;
+  end
+  else if JsonValue is TJSONArray then
+  begin
+    if AItem.JsonData is TJSONPair then
+    begin
+      LValue := AItem.JsonValue;
+      LValue.Owned := False;
+      FreeAndNil(AItem.JsonData);
+      LValue.Owned := True;
+      AItem.JsonData := LValue;
+    end;
+    TJSONArray(JsonValue).InsertElement(AIndex, AItem.JsonValue);
+    InsertObject(AIndex, AItem);
+    if AReTextSubItem then
+    begin
+      ReTextSubItem;
+    end;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 移动JSON树视图项的位置
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.MoveItem(const ACurIndex, ANewIndex: integer; AReTextSubItem: Boolean = False);
+var
+  LItem: TJSONTreeViewItem;
+begin
+  if JsonValue is TJSONObject then
+  begin
+    TJSONObject(JsonValue).Move(ACurIndex, ANewIndex);
+    LItem := TJSONTreeViewItem(Items[ACurIndex]);
+    RemoveObject(LItem);
+    InsertObject(ANewIndex, LItem);
+  end
+  else
+  begin
+    TJSONArray(JsonValue).Move(ACurIndex, ANewIndex);
+    LItem := TJSONTreeViewItem(Items[ACurIndex]);
+    RemoveObject(LItem);
+    InsertObject(ANewIndex, LItem);
+    if AReTextSubItem then
+    begin
+      ReTextSubItem;
+    end;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 清除子条目
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.ClearItem;
+begin
+  for var i := Count - 1 downto 0 do
+  begin
+    Items[i].Free;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 处理JSON树视图项的鼠标按下事件
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.TreeViewItemMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  if (Button = TMouseButton.mbLeft) and (ParentItem <> nil) then
+  begin
+    FMouseDownPos := Screen.MousePos;
+    FMouseDowned := True;
+  end
+  else
+  begin
+    FMouseDowned := False;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 处理JSON树视图项的鼠标移动事件
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.TreeViewItemMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
+begin
+  if FMouseDowned then
+  begin
+    if not(ssLeft in Shift) then
+    begin
+      FMouseDowned := False;
+    end
+    else if FMouseDowned and ((Abs(FMouseDownPos.X - Screen.MousePos.X) > 4) or (Abs(FMouseDownPos.Y - Screen.MousePos.Y) > 2)) then
+    begin
+      BeginAutoDrag;
+    end;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 处理鼠标抬起事件
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.TreeViewItemMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  FMouseDowned := False;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 绘制树视图项
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.Paint;
+const
+  c_add_line = {$IFDEF MACOS}0{$ELSE}1{$ENDIF};
+  c_color_default = $FF808080;
+  c_color_brother = $FFFF8080;
+  c_color_sub = $FF00AA00;
+var
+  LParentItem, LCurItem: TJSONTreeViewItem;
+  LLeft: Single;
+begin
+  inherited;
+  if ParentItem <> nil then
+  begin
+    LParentItem := MyParentItem;
+    Canvas.Stroke.Kind := TBrushKind.Solid;
+    Canvas.Stroke.Thickness := 1.0;
+    // 根据父项的状态设置绘制颜色
+    if LParentItem.IsSelected then
+      Canvas.Stroke.Color := c_color_sub
+    else if LParentItem.HasSUbItemIsSelected then
+      Canvas.Stroke.Color := c_color_brother
+    else
+      Canvas.Stroke.Color := c_color_default;
+    // 绘制连接线
+    Canvas.DrawLine(PointF(0, c_add_line), PointF(0, LocalRect.Height / IfThen(self = LParentItem.Last, 2, 1)), 1.0);
+    Canvas.DrawLine(PointF(c_add_line, LocalRect.Height / 2), PointF(IfThen(HasSubItem, 7.5, 15), LocalRect.Height / 2), 1.0);
+    LLeft := 0;
+    LCurItem := LParentItem;
+    // 绘制父项及其所有子项的连接线
+    while LCurItem.ParentItem <> nil do
+    begin
+      LLeft := LLeft - 20;
+      LParentItem := LCurItem.MyParentItem;
+      if (LCurItem <> LParentItem.Last) and LParentItem.IsExpanded then
+      begin
+        if LParentItem.IsSelected then
+          Canvas.Stroke.Color := c_color_sub
+        else if LParentItem.HasSUbItemIsSelected then
+          Canvas.Stroke.Color := c_color_brother
+        else
+          Canvas.Stroke.Color := c_color_default;
+        Canvas.DrawLine(PointF(LLeft, c_add_line), PointF(LLeft, LocalRect.Bottom), 1.0);
+      end;
+      LCurItem := LParentItem;
+    end;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取JSON值
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.GetJsonValue: TJSONValue;
+begin
+  if FJsonData is TJSONPair then
+    Result := TJSONPair(FJsonData).JsonValue
+  else
+    Result := TJSONValue(FJsonData);
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 设置JSON值
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.SetJsonValue(const AValue: TJSONValue);
+var
+  LArr: TJSONArray;
+  LIndex: integer;
+begin
+  if FJsonData is TJSONPair then
+  begin
+    TJSONPair(FJsonData).JsonValue := AValue;
+  end
+  else
+  begin
+    if ParentItem <> nil then
+    begin
+      LArr := TJSONArray(TJSONTreeViewItem(ParentItem).JsonValue);
+      LIndex := LArr.IndexOf(JsonValue);
+      LArr.SetValue(LIndex, AValue);
+    end;
+    FJsonData := AValue;
+  end;
+  ImageIndex := Ord(AValue.JsonKind);
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取JSON键
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.GetKey: string;
+begin
+  if FJsonData is TJSONPair then
+  begin
+    Result := TJSONPair(FJsonData).JsonString.Value;
+  end
+  else
+  begin
+    Result := '';
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取JSON值的字符串表示
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.GetValue: string;
+begin
+  Result := GetJsonValue.Value;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取当前项的最后路径
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.GetLastPath: string;
+begin
+  if ParentItem = nil then
+  begin
+    Exit('');
+  end;
+
+  if FJsonData is TJSONPair then
+  begin
+    Result := TJSONPair(FJsonData).JsonString.Value;
+  end
+  else
+  begin
+    Result := '[' + Index.ToString + ']';
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 获取当前项的完整路径
+////////////////////////////////////////////////////////////////////////////////
+function TJSONTreeViewItem.GetPath: string;
+var
+  tmpStr: string;
+  ptItem: TJSONTreeViewItem;
+begin
+  ptItem := TJSONTreeViewItem(ParentItem);
+  if ptItem = nil then
+    Exit('');
+
+  tmpStr := GetLastPath;
+  while ptItem.ParentItem <> nil do
+  begin
+    if ptItem.JsonValue is TJSONObject then
+    begin
+      tmpStr := ptItem.GetLastPath + '.' + tmpStr;
+    end
+    else
+    begin
+      tmpStr := ptItem.GetLastPath + tmpStr;
+    end;
+
+    ptItem := TJSONTreeViewItem(ptItem.ParentItem);
+  end;
+
+  Result := tmpStr;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 设置JSON数据
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.SetJsonData(const AValue: TJSONAncestor);
+begin
+  if FJsonData = AValue then
+    Exit;
+  FJsonData := AValue;
+  ReText;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 重新设置文本
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.ReText;
+begin
+  Text := GetLastPath + ': ' + JsonValue.Value;
+  ImageIndex := Ord(JsonValue.JsonKind);
+  if JsonValue.ClassType = TJSONString then
+  begin
+    Text := Text.Replace(#13, '\r').Replace(#10, '\n');
+    if Text.Length > 100 then
+    begin
+      Text := Text.Substring(0, 100) + ' ...';
+    end;
+  end;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// 重新设置所有子项的文本
+////////////////////////////////////////////////////////////////////////////////
+procedure TJSONTreeViewItem.ReTextSubItem;
+begin
+  for var i := 0 to Count - 1 do
+  begin
+    TJSONTreeViewItem(Items[i]).ReText;
+  end;
+end;
+
+end.

+ 133 - 0
JsonDocument.pas

@@ -0,0 +1,133 @@
+unit JsonDocument;
+
+interface
+
+uses
+  System.Classes, System.JSON, System.SysUtils, System.IOUtils;
+
+type
+  TOnFilenameChanged = reference to procedure(ASender: TObject);
+
+  TJsonDocument = class
+  private
+    FFilename: string;
+    FLastWriteTime: TDateTime;
+    FJsonRoot: TJsonValue;
+    FOnFilenameChanged: TOnFilenameChanged;
+    procedure SetJsonRoot(const AValue: TJsonValue);
+    procedure SetFilename(const AValue: string);
+  public
+    property Filename: string read FFilename write SetFilename;
+    property LastWriteTime: TDateTime read FLastWriteTime;
+
+    property JsonRoot: TJsonValue read FJsonRoot write SetJsonRoot;
+    property OnFilenameChanged: TOnFilenameChanged read FOnFilenameChanged write FOnFilenameChanged;
+  public
+    constructor Create;
+    destructor Destroy; override;
+    procedure New(AValue: TJsonValue = nil);
+    function Open(const AFileName: string; AUseBool: Boolean = False; ARaiseExc: Boolean = False): Boolean;
+    procedure Save(const AFileName: string; AIndentation: Integer = 4; AEncodeBelow32: Boolean = True; AEncodeAbove127: Boolean = False; AWriteBOM: Boolean = False);
+  end;
+
+implementation
+
+uses Logger, jsonhelper, pub;
+
+constructor TJsonDocument.Create;
+begin
+  inherited;
+  FJsonRoot := nil;
+  FFilename := '';
+end;
+
+destructor TJsonDocument.Destroy;
+begin
+  FJsonRoot.Free;
+  inherited;
+end;
+
+procedure TJsonDocument.SetJsonRoot(const AValue: TJsonValue);
+begin
+  if FJsonRoot = AValue then
+    Exit;
+  FJsonRoot.Free;
+  FJsonRoot := AValue;
+end;
+
+procedure TJsonDocument.SetFilename(const AValue: string);
+begin
+  //if FFilename = AValue then
+   // Exit;
+  FFilename := AValue;
+  if FFilename <> '' then
+  begin
+    for var i := g_pub.Config['recent'].Count - 1 downto 0 do
+    begin
+      if (i > 10) or (g_pub.Config['recent'][i] = FFilename) then
+      begin
+        g_pub.Config['recent'][i].Delete;
+      end;
+    end;
+    g_pub.Config['recent'].Add(FFilename);
+    g_pub.Config['recent'].LastItem.MoveToFirst;
+    g_pub.SaveConfig;
+  end;
+  if Assigned(FOnFilenameChanged) then
+    FOnFilenameChanged(Self);
+end;
+
+procedure TJsonDocument.New(AValue: TJsonValue = nil);
+begin
+  if AValue = nil then
+    JsonRoot := TJSONObject.Create
+  else
+    JsonRoot := AValue;
+  Filename := '';
+end;
+
+function TJsonDocument.Open(const AFileName: string; AUseBool: Boolean = False; ARaiseExc: Boolean = False): Boolean;
+var
+  LValue: TJsonValue;
+begin
+  g_Logger.Info('Open File: ' + AFileName);
+  Result := False;
+  try
+    LValue := TJsonValue.ParseJSONValue(TFile.ReadAllText(AFileName, TEncoding.UTF8), AUseBool, True);
+    if LValue = nil then
+    begin
+      Exit;
+    end;
+    Filename := AFileName;
+    JsonRoot := LValue;
+    FLastWriteTime := TFile.GetLastWriteTime(FFilename);
+    Result := True;
+  except
+    on E: Exception do
+    begin
+      g_Logger.Error('fail to open file: ' + E.Message);
+      if ARaiseExc then
+      begin
+        raise Exception.Create(E.Message);
+      end;
+    end;
+  end;
+end;
+
+procedure TJsonDocument.Save(const AFileName: string; AIndentation: Integer = 4; AEncodeBelow32: Boolean = True; AEncodeAbove127: Boolean = False; AWriteBOM: Boolean = False);
+var
+  strs: TStrings;
+begin
+  g_Logger.Info('Save File: ' + AFileName);
+  strs := TStringList.Create;
+  try
+    strs.WriteBOM := AWriteBOM;
+    strs.Text := JSONFormat(FJsonRoot, AIndentation, AEncodeBelow32, AEncodeAbove127);
+    strs.SaveToFile(AFileName, TEncoding.UTF8);
+    Filename := AFileName;
+  finally
+    strs.Free;
+  end;
+end;
+
+end.

+ 291 - 0
MacOpenFileDelegate.pas

@@ -0,0 +1,291 @@
+{
+   Модуль содержит обработчик сообщения открытия файла для MAC OS GUI приложедля.
+
+   При открытии файла приложением на MAC OS имя файла передается не через
+   командную строку, как это делается в Windows, а посылается сообщение application:openFile:
+   объектом NSApplication.
+
+   Для того что бы обработать данное сообщение, нужно назначить делегат объекту
+   NSApplication приложения, в котором и произвести всю работу.
+
+   Подробнее https://delphihaven.wordpress.com/2012/08/14/associating-a-file-type-on-osx-part3/
+
+   code by: Victor Fedorenkov
+   mail: victor.fedorenkov[at]gmail.com
+}
+unit MacOpenFileDelegate;
+
+interface
+
+type
+  TOpenURLEvent = reference to procedure(const AURL: string);
+  TOpenFileEvent = reference to procedure(const AFileName: string);
+
+procedure InstallApplicationOpenFileDelegate(AOnOpenFile: TOpenFileEvent;
+  AOpenURLEvent: TOpenURLEvent = nil);
+
+implementation
+
+uses
+  System.SysUtils, System.RTLConsts, System.Messaging, System.Classes,
+  Macapi.ObjectiveC, Macapi.CoreFoundation, Macapi.CocoaTypes, Macapi.AppKit, Macapi.Foundation, FMX.Forms,
+  Macapi.ObjCRuntime,
+
+  FMX.Platform, FMX.Platform.Mac, FMX.Helpers.Mac; //,
+
+ // suStringUtilsUnit;
+
+type
+  IFMXApplicationDelegate = interface(NSApplicationDelegate)
+    ['{A54E08CA-77CC-4F22-B6D9-833DD6AB696D}']
+    procedure onMenuClicked(sender: NSMenuItem); cdecl;
+  end;
+
+  NSApplicationDelegate2 = interface(IFMXApplicationDelegate)
+    ['{BE9AEDB7-80AC-49B1-8921-F226CC9310F4}']
+    procedure applicationWillFinishLaunching(Notification: NSNotification); cdecl;
+    function application(theApplication: Pointer; openFile: CFStringRef): Boolean; cdecl;
+  end;
+
+  IURLEventHandler = interface(IObjectiveC)
+    ['{29B79998-AB68-4694-93D7-AA09A1BF08F7}']
+    procedure Handle(Event, ReplyEvent: NSAppleEventDescriptor); cdecl;
+  end;
+
+  TURLEventHandler = class(TOCLocal, IURLEventHandler)
+    FOpenURLEvent: TOpenURLEvent;
+  public
+    constructor Create(AOpenURLEvent: TOpenURLEvent);
+
+    procedure Handle(Event, ReplyEvent: NSAppleEventDescriptor); cdecl;
+  end;
+
+  TNSApplicationDelegate2 = class(TOCLocal, NSApplicationDelegate2)
+  private
+    FOnOpenFile: TOpenFileEvent;
+    FURLEventHandler: TURLEventHandler;
+  public
+    constructor Create(AOnOpenFile: TOpenFileEvent; AOpenURLEvent: TOpenURLEvent = nil);
+    destructor Destroy; override;
+
+    procedure applicationDidFinishLaunching(Notification: NSNotification); cdecl;
+    procedure applicationWillTerminate(Notification: NSNotification); cdecl;
+    function applicationShouldTerminate(Notification: NSNotification): NSInteger; cdecl;
+    function applicationDockMenu(sender: NSApplication): NSMenu; cdecl;
+    procedure onMenuClicked(sender: NSMenuItem); cdecl;
+    procedure applicationWillFinishLaunching(Notification: NSNotification); cdecl;
+
+    procedure applicationDidHide(Notification: NSNotification); cdecl;
+    procedure applicationDidUnhide(Notification: NSNotification); cdecl;
+
+    function application(theApplication: Pointer; openFile: CFStringRef): Boolean; cdecl;
+  end;
+
+var
+  Delegate: NSApplicationDelegate2;
+
+procedure InstallApplicationOpenFileDelegate(AOnOpenFile: TOpenFileEvent;
+  AOpenURLEvent: TOpenURLEvent = nil);
+var
+  NSApp: NSApplication;
+  AutoReleasePool: NSAutoreleasePool;
+begin
+  AutoReleasePool := TNSAutoreleasePool.Alloc;
+  try
+    AutoReleasePool.init;
+    NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
+    Delegate := TNSApplicationDelegate2.Create(AOnOpenFile, AOpenURLEvent);
+    NSApp.setDelegate(NSApplicationDelegate2(Delegate));
+  finally
+    AutoReleasePool.release;
+  end;
+end;
+
+//Функция скопирована из FMX.Platform.Mac
+function SendOSXMessage(const sender: TObject; const OSXMessageClass: TOSXMessageClass;
+  const NSSender: NSObject): NSObject;
+var
+  MessageObject: TOSXMessageObject;
+begin
+  if OSXMessageClass = nil then
+    raise EArgumentNilException.Create(SArgumentNil);
+  MessageObject := TOSXMessageObject.Create(NSSender);
+  try
+    TMessageManager.DefaultManager.SendMessage(sender, OSXMessageClass.Create(MessageObject, False), True);
+    Result := MessageObject.ReturnValue;
+  finally
+    MessageObject.Free;
+  end;
+end;
+
+//Проверка, занилена ли глобальная переменная PlatformCocoa из FMX.Platform.Mac
+function PlatformCocoaIsNil: Boolean;
+begin
+ //но так как оно нам недоступно, то проверим по последнему элементу созданному
+ //в конструкторе
+  Result := (@System.Classes.WakeMainThread = nil);
+end;
+
+function PlatformCocoaTerminating: Boolean;
+begin
+  Result := IFMXApplicationService(TPlatformServices.Current.GetPlatformService(IFMXApplicationService)).Terminating;
+end;
+
+//Эмуляция PlatformCocoa.DefaultAction('Q', [ssCommand])
+function PlatformCocoa_DefaultAction_Commad_Q: Boolean;
+begin
+  //Копия ветки кода из TPlatformCocoa.DefaultAction выполняющаяся при входящих параметрах
+  //PlatformCocoa.DefaultAction('Q', [ssCommand])
+  Result := False;
+  try
+    if FMX.Forms.application.MainForm <> nil then
+    begin
+      FMX.Forms.application.MainForm.Close;
+      if not PlatformCocoaTerminating then
+        Exit;
+    end
+    else
+    begin
+      if Screen <> nil then
+        Screen.ActiveForm := nil;
+      application.Terminate;
+    end;
+  except
+    HandleException(application);
+  end;
+
+  Result := True;
+end;
+
+{ TNSApplicationDelegate2 }
+
+constructor TNSApplicationDelegate2.Create(AOnOpenFile: TOpenFileEvent;
+  AOpenURLEvent: TOpenURLEvent = nil);
+begin
+  inherited Create;
+
+  FOnOpenFile := AOnOpenFile;
+
+  if Assigned(AOpenURLEvent) then
+    FURLEventHandler := TURLEventHandler.Create(AOpenURLEvent);
+end;
+
+destructor TNSApplicationDelegate2.Destroy;
+begin
+  FreeAndNil(FURLEventHandler);
+
+  inherited;
+end;
+
+procedure TNSApplicationDelegate2.onMenuClicked(sender: NSMenuItem);
+begin
+  SendOSXMessage(Self, TApplicationMenuClickedMessage, sender);
+end;
+
+procedure TNSApplicationDelegate2.applicationDidFinishLaunching(
+  Notification: NSNotification);
+begin
+  SendOSXMessage(Self, TApplicationDidFinishLaunchingMessage, Notification);
+end;
+
+function TNSApplicationDelegate2.applicationShouldTerminate(
+  Notification: NSNotification): NSInteger;
+begin
+  if (FMX.Forms.application = nil) or PlatformCocoaIsNil or PlatformCocoaTerminating
+    or PlatformCocoa_DefaultAction_Commad_Q then
+    Result := NSTerminateNow
+  else
+    Result := NSTerminateCancel;
+end;
+
+//Перед загрузкой приложения попадаем сюда
+procedure TNSApplicationDelegate2.applicationWillFinishLaunching(
+  Notification: NSNotification);
+const
+  kAEGetURL: Integer = Ord('G') shl 24 + Ord('U') shl 16 + Ord('R') shl 8 + Ord('L'); //'GURL'
+  kInternetEventClass: Integer = Ord('G') shl 24 + Ord('U') shl 16 + Ord('R') shl 8 + Ord('L'); //'GURL'
+var
+  selector: SEL;
+  sharedAppleEventManager: NSAppleEventManager;
+begin
+  if Assigned(FURLEventHandler) then
+  begin
+    sharedAppleEventManager := TNSAppleEventManager.Wrap(
+      TNSAppleEventManager.OCClass.sharedAppleEventManager);
+
+    selector := sel_registerName(PAnsiChar('Handle:ReplyEvent:'));
+    sharedAppleEventManager.setEventHandler(FURLEventHandler.GetObjectID, selector,
+      kInternetEventClass, kAEGetURL);
+  end;
+end;
+
+// 应用程序取消隐藏
+procedure TNSApplicationDelegate2.applicationDidHide(Notification: NSNotification);
+begin
+  //ShowMessage('applicationDidHide');
+end;
+
+procedure TNSApplicationDelegate2.applicationDidUnhide(Notification: NSNotification);
+begin
+  //ShowMessage('applicationDidUnhide');
+end;
+
+procedure TNSApplicationDelegate2.applicationWillTerminate(
+  Notification: NSNotification);
+begin
+  SendOSXMessage(Self, TApplicationWillTerminateMessage, Notification);
+  Halt;
+end;
+
+function TNSApplicationDelegate2.applicationDockMenu(
+  sender: NSApplication): NSMenu;
+var
+  ReturnValue: NSObject;
+begin
+  ReturnValue := SendOSXMessage(Self, TApplicationDockMenuMessage, sender);
+  if ReturnValue <> nil then
+    Result := ReturnValue as NSMenu
+  else
+    Result := nil;
+end;
+
+function TNSApplicationDelegate2.application(theApplication: Pointer;
+  openFile: CFStringRef): Boolean;
+var
+  Range: CFRange;
+  S: string;
+begin
+  Result := Assigned(FOnOpenFile);
+  if not Result then
+    Exit;
+
+  Range.location := 0;
+  Range.length := CFStringGetLength(openFile);
+  SetLength(S, Range.length);
+  CFStringGetCharacters(openFile, Range, PChar(S));
+  try
+    FOnOpenFile(S);
+  except
+    FMX.Forms.application.HandleException(ExceptObject);
+    Result := False;
+  end;
+end;
+
+{ TURLEventHandler }
+
+constructor TURLEventHandler.Create(AOpenURLEvent: TOpenURLEvent);
+begin
+  inherited Create;
+
+  FOpenURLEvent := AOpenURLEvent;
+end;
+
+procedure TURLEventHandler.Handle(Event, ReplyEvent: NSAppleEventDescriptor);
+const
+  keyDirectObject: Integer = Ord('-') shl 24 + Ord('-') shl 16 + Ord('-') shl 8 + Ord('-'); //'----'
+begin
+  //FOpenURLEvent(NSToString(Event.paramDescriptorForKeyword(keyDirectObject).stringValue));
+  FOpenURLEvent(string(Event.paramDescriptorForKeyword(keyDirectObject).stringValue));
+end;
+
+end.

+ 166 - 0
Pub.pas

@@ -0,0 +1,166 @@
+unit Pub;
+
+interface
+
+uses
+  FormDocument, DocWinList, rjson, JsonDocument, System.JSON, System.Generics.Collections,
+  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+  FMX.Types, FMX.Controls, System.IOUtils;
+
+const
+  app_name = 'gsJSON';
+  app_version = 'v0.7.0';
+  url_github = 'https://github.com/higale/galeJSON';
+
+  c_untitled_filename = 'untitled.json';
+
+type
+  TDocumentWindow = TfmDocument;
+
+  TPub = class
+  private
+    FIniPath: string;
+    FLangIndex: integer;
+    FDocumentWindowList: TDocumentWindowList;
+    function GetIsDarkStyle: Boolean;
+    procedure SetIsDarkStyle(AValue: Boolean);
+    function GetStyleBook: TStyleBook;
+    procedure SetLangIndex(AValue: integer);
+  public
+    Config: TRJSON;
+    Languages: TRJSON;
+    property LangIndex: integer read FLangIndex write SetLangIndex;
+    property IniPath: string read FIniPath;
+    property DocumentWindowList: TDocumentWindowList read FDocumentWindowList;
+    property IsDarkStyle: Boolean read GetIsDarkStyle write SetIsDarkStyle;
+    property StyleBook: TStyleBook read GetStyleBook;
+  public
+    constructor Create;
+    destructor Destroy; override;
+    procedure LoadConfig;
+    procedure LoadLanguages;
+    function LangStr(const AKey: string): string;
+    procedure SaveConfig;
+    procedure ResetConfig;
+  end;
+
+var
+  g_pub: TPub;
+
+implementation
+
+uses FormMain, FormLogger;
+
+constructor TPub.Create;
+begin
+  inherited;
+{$IFDEF MSWINDOWS}
+  // C:\Users\xxx\AppData\Roaming\gsJSON\
+  //FIniPath := TPath.GetHomePath + TPath.DirectorySeparatorChar + TPath.GetFileNameWithoutExtension(ParamStr(0)) + TPath.DirectorySeparatorChar;
+  FIniPath := ExtractFilePath(ParamStr(0));
+  //ForceDirectories(FIniPath);
+{$ELSE}
+  FIniPath := ExtractFilePath(TPath.GetDocumentsPath) + '.' + TPath.GetFileNameWithoutExtension(ParamStr(0)) + TPath.DirectorySeparatorChar;
+  ForceDirectories(FIniPath);
+{$ENDIF}
+  FDocumentWindowList := TDocumentWindowList.Create;
+  FDocumentWindowList.OwnsObjects := False;
+end;
+
+destructor TPub.Destroy;
+begin
+  FDocumentWindowList.Free;
+  inherited;
+end;
+
+procedure TPub.LoadConfig;
+begin
+  Config.LoadFromFile(FIniPath + 'config.json');
+  if Config.IsNil then
+  begin
+    Config['appName'] := app_name;
+    Config['appVer'] := app_version;
+    Config['ui.lang'] := 0;
+    SaveConfig;
+  end;
+  FLangIndex := Config['ui.lang']
+end;
+
+procedure TPub.LoadLanguages;
+begin
+{$IFDEF MSWINDOWS}
+  Languages.LoadFromFile(FIniPath + 'lang.json');
+{$ELSE}
+  var
+  AppPath := System.IOUtils.TPath.GetDirectoryName(ParamStr(0));
+  Languages.LoadFromFile(ExtractFilePath(AppPath) + 'Resources/lang.json');
+{$ENDIF}
+end;
+
+function TPub.LangStr(const AKey: string): string;
+begin
+  Result := Languages[FLangIndex]['items.' + AKey];
+  if Result = '' then
+    Result := Languages[0]['items.' + AKey].ToStr('NoLangString');
+end;
+
+procedure TPub.SaveConfig;
+begin
+  Config.SaveToFile(FIniPath + 'config.json', 4, True, False)
+end;
+
+procedure TPub.ResetConfig;
+begin
+  Config.Reset;
+  SaveConfig;
+end;
+
+function TPub.GetIsDarkStyle: Boolean;
+begin
+  Result := Config['ui.isDarkStyle'].ToBool(True);
+end;
+
+procedure TPub.SetIsDarkStyle(AValue: Boolean);
+begin
+  Config['ui.isDarkStyle'] := AValue;
+  SaveConfig;
+  for var item in g_pub.DocumentWindowList do
+    item.SetStyleBook;
+  if AValue then
+  begin
+    fmLogger.StyleBook := fmMain.StyleBookBlack;
+  end
+  else
+  begin
+    fmLogger.StyleBook := fmMain.StyleBookWhite;
+  end;
+end;
+
+function TPub.GetStyleBook: TStyleBook;
+begin
+  if IsDarkStyle then
+    Result := fmMain.StyleBookBlack
+  else
+    Result := fmMain.StyleBookWhite;
+end;
+
+procedure TPub.SetLangIndex(AValue: integer);
+begin
+  if FLangIndex = AValue then
+    Exit;
+  FLangIndex := AValue;
+  Config['ui.lang'] := FLangIndex;
+end;
+
+initialization
+
+g_pub := TPub.Create;
+g_pub.LoadConfig;
+g_pub.LoadLanguages;
+
+finalization
+
+g_pub.SaveConfig;
+FreeAndNil(g_pub);
+
+end.

+ 35 - 1
README.md

@@ -1,2 +1,36 @@
 # galeJSON
-跨平台 JSON 编辑器
+
+跨平台 JSON 编辑器,支持多语言界面,基于 Delphi FMX 开发。
+
+## 功能特性
+- 支持 Windows/macOS
+- 多标签文档编辑
+- JSON 语法高亮与格式化
+- 多语言界面(简体中文、繁體中文、English、日本語、한국어、Français、Deutsch、Español、Русский、Italiano、Português、Nederlands)
+- 最近文件、自动保存、日志查看
+- 支持暗黑模式
+
+## 目录结构
+```
+├── galeJSON.dpr / .dproj   # Delphi项目文件
+├── FormMain.fmx/.pas       # 主窗体
+├── lang.json               # 多语言资源文件
+├── Win64/Win32/OSX64       # 各平台输出目录
+├── utils/                  # 工具单元
+└── ...
+```
+
+## 快速开始
+1. 使用 Delphi 11 或更高版本打开 `galeJSON.dproj`
+2. 编译并运行(支持 Win64/Win32/OSX64 平台)
+3. 多语言界面自动根据 `lang.json` 加载
+
+## 多语言支持
+- 所有界面文本均可在 `lang.json` 中自定义
+- 新增语言只需仿照现有结构添加即可
+
+## 参与贡献
+欢迎提交 issue 或 PR,完善翻译、功能或修复 bug。
+
+## License
+MIT

+ 20 - 0
data_const.pas

@@ -0,0 +1,20 @@
+unit data_const;
+
+interface
+
+const
+  // maximize icon path data
+  c_MaxPathData =
+    'M233,128C175,128 128,175 128,233L128,790C128,848 175,896 233,896L790,896C848,896 896,848 896,790L896,'
+    + '233C896,175 848,127 790,128L233,128Z M214,233C214,223 223,214 233,214L790,214C800,214 809,223 809,'
+    + '233L809,790C809,800 800,809 790,809L233,809C223,809 214,800 214,790L214,233Z';
+  // restore icon path data
+  c_ResPathData =
+    'M897,65 L326,65 C301,65 281,85 281,110 L281,276 L111,276 C86,276 66,296 66,321 L66,904 C66,929 86,949 111,'
+    + '949 L694,949 C719,949 739,929 739,904 L739,726 L897,726 C922,726 942,706 942,681 L942,110 C942,85 922,'
+    + '65 897,65 Z M650,859 L156,859 L156,366 L650,366 L650,857 Z M850,636 L740,636 L740,321 C740,296 720,276 695,'
+    + '276 L371,276 L371,155 L852,155 L852,636Z';
+
+implementation
+
+end.

TEMPAT SAMPAH
galeJSON.Artwork/Windows/AppIcon.icns


TEMPAT SAMPAH
galeJSON.Artwork/Windows/AppIcon.ico


TEMPAT SAMPAH
galeJSON.Artwork/Windows/Uwp_150.png


TEMPAT SAMPAH
galeJSON.Artwork/Windows/Uwp_44.png


TEMPAT SAMPAH
galeJSON.Artwork/macOS/AppIcon.icns


TEMPAT SAMPAH
galeJSON.Artwork/macOS/AppIcon.ico


+ 173 - 0
galeJSON.deployproj

@@ -0,0 +1,173 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <Import Condition="Exists('$(BDS)\bin\CodeGear.Deployment.targets')" Project="$(BDS)\bin\CodeGear.Deployment.targets"/>
+    <ProjectExtensions>
+        <ProjectFileVersion>12</ProjectFileVersion>
+    </ProjectExtensions>
+    <PropertyGroup/>
+    <ItemGroup Condition="'$(Platform)'=='OSX64'">
+        <DeployFile Include="$(ProjectName).Artwork\macOS\AppIcon.icns" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON.app\Contents\Resources\</RemoteDir>
+            <RemoteName>gsJSON.icns</RemoteName>
+            <DeployClass>ProjectOSXResource</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="$(ProjectName).Artwork\macOS\AppIcon.icns" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON.app\Contents\Resources\</RemoteDir>
+            <RemoteName>galeJSON.icns</RemoteName>
+            <DeployClass>ProjectOSXResource</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="OSX64\Debug\gsJSON.entitlements" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON.app\..\</RemoteDir>
+            <RemoteName>gsJSON.entitlements</RemoteName>
+            <DeployClass>ProjectOSXEntitlements</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="lang.json" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON.app\Contents\Resources\</RemoteDir>
+            <RemoteName>lang.json</RemoteName>
+            <DeployClass>File</DeployClass>
+            <Operation>0</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="lang.json" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON.app\Contents\Resources\</RemoteDir>
+            <RemoteName>lang.json</RemoteName>
+            <DeployClass>File</DeployClass>
+            <Operation>0</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="OSX64\Debug\galeJSON" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON.app\Contents\MacOS\</RemoteDir>
+            <RemoteName>galeJSON</RemoteName>
+            <DeployClass>ProjectOutput</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+            <Required>True</Required>
+        </DeployFile>
+        <DeployFile Include="OSX64\Release\galeJSON.info.plist" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON.app\Contents\</RemoteDir>
+            <RemoteName>Info.plist</RemoteName>
+            <DeployClass>ProjectOSXInfoPList</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="OSX64\Release\galeJSON" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON.app\Contents\MacOS\</RemoteDir>
+            <RemoteName>galeJSON</RemoteName>
+            <DeployClass>ProjectOutput</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+            <Required>True</Required>
+        </DeployFile>
+        <DeployFile Include="OSX64\Debug\gsJSON.info.plist" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON.app\Contents\</RemoteDir>
+            <RemoteName>Info.plist</RemoteName>
+            <DeployClass>ProjectOSXInfoPList</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="OSX64\Release\galeJSON.entitlements" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON.app\..\</RemoteDir>
+            <RemoteName>galeJSON.entitlements</RemoteName>
+            <DeployClass>ProjectOSXEntitlements</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+    </ItemGroup>
+    <ItemGroup Condition="'$(Platform)'=='Win32'">
+        <DeployFile Include="lang.json" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON\</RemoteDir>
+            <RemoteName>lang.json</RemoteName>
+            <DeployClass>File</DeployClass>
+            <Operation>0</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="lang.json" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON\</RemoteDir>
+            <RemoteName>lang.json</RemoteName>
+            <DeployClass>File</DeployClass>
+            <Operation>0</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="Win32\Debug\galeJSON.exe" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON\</RemoteDir>
+            <RemoteName>galeJSON.exe</RemoteName>
+            <DeployClass>ProjectOutput</DeployClass>
+            <Operation>0</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+            <Required>True</Required>
+        </DeployFile>
+    </ItemGroup>
+    <ItemGroup Condition="'$(Platform)'=='OSXARM64'"/>
+    <ItemGroup Condition="'$(Platform)'=='Win64'">
+        <DeployFile Include="Win64\Debug\galeJSON.exe" Condition="'$(Config)'=='Debug'">
+            <RemoteDir>galeJSON\</RemoteDir>
+            <RemoteName>galeJSON.exe</RemoteName>
+            <DeployClass>ProjectOutput</DeployClass>
+            <Operation>0</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+            <Required>True</Required>
+        </DeployFile>
+        <DeployFile Include="$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON\Assets\</RemoteDir>
+            <RemoteName>Logo44x44.png</RemoteName>
+            <DeployClass>UWP_DelphiLogo44</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON\Assets\</RemoteDir>
+            <RemoteName>Logo150x150.png</RemoteName>
+            <DeployClass>UWP_DelphiLogo150</DeployClass>
+            <Operation>1</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+        </DeployFile>
+        <DeployFile Include="Win64\Release\galeJSON.exe" Condition="'$(Config)'=='Release'">
+            <RemoteDir>galeJSON\</RemoteDir>
+            <RemoteName>galeJSON.exe</RemoteName>
+            <DeployClass>ProjectOutput</DeployClass>
+            <Operation>0</Operation>
+            <LocalCommand/>
+            <RemoteCommand/>
+            <Overwrite>True</Overwrite>
+            <Required>True</Required>
+        </DeployFile>
+    </ItemGroup>
+    <ItemGroup Condition="'$(Platform)'=='Win64x'"/>
+</Project>

+ 41 - 0
galeJSON.dpr

@@ -0,0 +1,41 @@
+program galeJSON;
+
+uses
+  System.StartUpCopy,
+  FMX.Forms,
+  FormDocument in 'FormDocument.pas' {fmDocument},
+  JSONTreeView in 'JSONTreeView.pas',
+  rjson in 'utils\rjson.pas',
+  memo_json_auto in 'utils\memo_json_auto.pas',
+  WinSizeUtil in 'utils\WinSizeUtil.pas',
+  data_const in 'data_const.pas',
+  jsonhelper in 'utils\jsonhelper.pas',
+  JsonDocument in 'JsonDocument.pas',
+  Logger in 'utils\Logger.pas',
+  fmFontDialog in 'utils\fmFontDialog.pas',
+  LineNumbersMemoFMX in 'utils\LineNumbersMemoFMX.pas',
+  galeNotice in 'utils\galeNotice.pas',
+  FormMain in 'FormMain.pas' {fmMain},
+  FormLogger in 'FormLogger.pas' {fmLogger},
+  FormAbout in 'FormAbout.pas' {fmAbout},
+  FMXTrayIcon in 'utils\FMXTrayIcon.pas',
+  DocWinList in 'DocWinList.pas',
+  SaveDialogsEnhanced in 'utils\SaveDialogsEnhanced.pas',
+  Pub in 'Pub.pas';
+
+{$R *.res}
+
+
+begin
+{$IFDEF DEBUG}
+  ReportMemoryLeaksOnShutdown := True;
+{$ENDIF}
+{$IFDEF MSWINDOWS}
+  if TTrayIcon.HasOtherRunning then
+    Exit;
+{$ENDIF}
+  Application.Initialize;
+  Application.CreateForm(TfmMain, fmMain);
+  Application.Run;
+
+end.

+ 1336 - 0
galeJSON.dproj

@@ -0,0 +1,1336 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <PropertyGroup>
+        <ProjectGuid>{01B7A227-7FEE-455F-96BF-EEF7D953534C}</ProjectGuid>
+        <ProjectVersion>20.1</ProjectVersion>
+        <FrameworkType>FMX</FrameworkType>
+        <Base>True</Base>
+        <Config Condition="'$(Config)'==''">Release</Config>
+        <Platform Condition="'$(Platform)'==''">Win64</Platform>
+        <TargetedPlatforms>4098</TargetedPlatforms>
+        <AppType>Application</AppType>
+        <MainSource>galeJSON.dpr</MainSource>
+        <ProjectName Condition="'$(ProjectName)'==''">galeJSON</ProjectName>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='OSX64' and '$(Base)'=='true') or '$(Base_OSX64)'!=''">
+        <Base_OSX64>true</Base_OSX64>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='OSXARM64' and '$(Base)'=='true') or '$(Base_OSXARM64)'!=''">
+        <Base_OSXARM64>true</Base_OSXARM64>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
+        <Base_Win32>true</Base_Win32>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
+        <Base_Win64>true</Base_Win64>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+        <Cfg_1>true</Cfg_1>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
+        <Cfg_1_Win32>true</Cfg_1_Win32>
+        <CfgParent>Cfg_1</CfgParent>
+        <Cfg_1>true</Cfg_1>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
+        <Cfg_1_Win64>true</Cfg_1_Win64>
+        <CfgParent>Cfg_1</CfgParent>
+        <Cfg_1>true</Cfg_1>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+        <Cfg_2>true</Cfg_2>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='OSX64' and '$(Cfg_2)'=='true') or '$(Cfg_2_OSX64)'!=''">
+        <Cfg_2_OSX64>true</Cfg_2_OSX64>
+        <CfgParent>Cfg_2</CfgParent>
+        <Cfg_2>true</Cfg_2>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
+        <Cfg_2_Win32>true</Cfg_2_Win32>
+        <CfgParent>Cfg_2</CfgParent>
+        <Cfg_2>true</Cfg_2>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
+        <Cfg_2_Win64>true</Cfg_2_Win64>
+        <CfgParent>Cfg_2</CfgParent>
+        <Cfg_2>true</Cfg_2>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base)'!=''">
+        <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
+        <DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
+        <DCC_E>false</DCC_E>
+        <DCC_N>false</DCC_N>
+        <DCC_S>false</DCC_S>
+        <DCC_F>false</DCC_F>
+        <DCC_K>false</DCC_K>
+        <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
+        <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
+        <Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns>
+        <SanitizedProjectName>galeJSON</SanitizedProjectName>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base_OSX64)'!=''">
+        <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple&apos;s speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface</VerInfo_Keys>
+        <BT_BuildType>Debug</BT_BuildType>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <Debugger_Launcher>/usr/X11/bin/xterm -e &quot;%debuggee%&quot;</Debugger_Launcher>
+        <Icon_MainIcon>$(ProjectName).Artwork\macOS\AppIcon.ico</Icon_MainIcon>
+        <Manifest_File>(None)</Manifest_File>
+        <Icns_MainIcns>$(ProjectName).Artwork\macOS\AppIcon.icns</Icns_MainIcns>
+        <AppDPIAwarenessMode>none</AppDPIAwarenessMode>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base_OSXARM64)'!=''">
+        <VerInfo_Keys>CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple&apos;s speech recognition servers;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing the Bluetooth interface</VerInfo_Keys>
+        <BT_BuildType>Debug</BT_BuildType>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <Icon_MainIcon>$(ProjectName).Artwork\macOS\AppIcon.ico</Icon_MainIcon>
+        <Icns_MainIcns>$(ProjectName).Artwork\macOS\AppIcon.icns</Icns_MainIcns>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base_Win32)'!=''">
+        <DCC_UsePackage>DataSnapServer;vclwinx;emshosting;fmx;DbxCommonDriver;vclie;bindengine;VCLRESTComponents;FireDACCommonODBC;DBXMSSQLDriver;IndyIPCommon;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;dbxcds;vcledge;IndyIPClient;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;fmxase;vcltouch;DBXOdbcDriver;dbrtl;FireDACOracleDriver;FireDACDBXDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;DBXInterBaseDriver;vcldsnap;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;adortl;dsnapxml;IndyIPServer;DataSnapClient;DataSnapProviderClient;dsnapcon;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;DBXSybaseASADriver;CloudService;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;DataSnapNativeClient;bindcompvclsmp;fmxobj;FMXTee;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage>
+        <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
+        <BT_BuildType>Debug</BT_BuildType>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
+        <VerInfo_Locale>1033</VerInfo_Locale>
+        <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
+        <UWP_DelphiLogo44>$(ProjectName).Artwork\Windows\Uwp_44.png</UWP_DelphiLogo44>
+        <UWP_DelphiLogo150>$(ProjectName).Artwork\Windows\Uwp_150.png</UWP_DelphiLogo150>
+        <Icon_MainIcon>$(ProjectName).Artwork\Windows\AppIcon.ico</Icon_MainIcon>
+        <Icns_MainIcns>$(ProjectName).Artwork\Windows\AppIcon.icns</Icns_MainIcns>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base_Win64)'!=''">
+        <DCC_UsePackage>DataSnapServer;vclwinx;emshosting;fmx;DbxCommonDriver;vclie;bindengine;VCLRESTComponents;FireDACCommonODBC;DBXMSSQLDriver;IndyIPCommon;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;dbxcds;vcledge;IndyIPClient;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;fmxase;vcltouch;DBXOdbcDriver;dbrtl;FireDACOracleDriver;FireDACDBXDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;DBXInterBaseDriver;vcldsnap;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;adortl;dsnapxml;IndyIPServer;DataSnapClient;DataSnapProviderClient;dsnapcon;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;DBXSybaseASADriver;CloudService;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;DataSnapNativeClient;bindcompvclsmp;fmxobj;FMXTee;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage>
+        <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
+        <BT_BuildType>Debug</BT_BuildType>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
+        <VerInfo_Locale>1033</VerInfo_Locale>
+        <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
+        <UWP_DelphiLogo44>$(ProjectName).Artwork\Windows\Uwp_44.png</UWP_DelphiLogo44>
+        <UWP_DelphiLogo150>$(ProjectName).Artwork\Windows\Uwp_150.png</UWP_DelphiLogo150>
+        <Icon_MainIcon>$(ProjectName).Artwork\Windows\AppIcon.ico</Icon_MainIcon>
+        <AppDPIAwarenessMode>none</AppDPIAwarenessMode>
+        <Icns_MainIcns>$(ProjectName).Artwork\Windows\AppIcon.icns</Icns_MainIcns>
+        <PostBuildEvent><![CDATA[copy "$(PROJECTDIR)\lang.json" "$(OUTPUTDIR)" /Y
+$(PostBuildEvent)]]></PostBuildEvent>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_1)'!=''">
+        <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+        <DCC_DebugDCUs>true</DCC_DebugDCUs>
+        <DCC_Optimize>false</DCC_Optimize>
+        <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+        <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+        <DCC_RemoteDebug>true</DCC_RemoteDebug>
+        <DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck>
+        <DCC_RangeChecking>true</DCC_RangeChecking>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
+        <DCC_RemoteDebug>false</DCC_RemoteDebug>
+        <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
+        <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <VerInfo_Locale>1033</VerInfo_Locale>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_2)'!=''">
+        <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+        <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+        <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+        <DCC_DebugInformation>0</DCC_DebugInformation>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_2_OSX64)'!=''">
+        <Debugger_Launcher>/usr/X11/bin/xterm -e &quot;%debuggee%&quot;</Debugger_Launcher>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <Icon_MainIcon>$(ProjectName).Artwork\macOS\AppIcon.ico</Icon_MainIcon>
+        <Icns_MainIcns>$(ProjectName).Artwork\macOS\AppIcon.icns</Icns_MainIcns>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
+        <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
+        <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <VerInfo_Locale>1033</VerInfo_Locale>
+        <Icon_MainIcon>$(ProjectName).Artwork\Windows\AppIcon.ico</Icon_MainIcon>
+        <Icns_MainIcns>$(ProjectName).Artwork\Windows\AppIcon.icns</Icns_MainIcns>
+    </PropertyGroup>
+    <ItemGroup>
+        <DelphiCompile Include="$(MainSource)">
+            <MainSource>MainSource</MainSource>
+        </DelphiCompile>
+        <DCCReference Include="FormDocument.pas">
+            <Form>fmDocument</Form>
+            <FormType>fmx</FormType>
+        </DCCReference>
+        <DCCReference Include="JSONTreeView.pas"/>
+        <DCCReference Include="utils\rjson.pas"/>
+        <DCCReference Include="utils\memo_json_auto.pas"/>
+        <DCCReference Include="utils\WinSizeUtil.pas"/>
+        <DCCReference Include="data_const.pas"/>
+        <DCCReference Include="utils\jsonhelper.pas"/>
+        <DCCReference Include="JsonDocument.pas"/>
+        <DCCReference Include="utils\Logger.pas"/>
+        <DCCReference Include="utils\fmFontDialog.pas"/>
+        <DCCReference Include="utils\LineNumbersMemoFMX.pas"/>
+        <DCCReference Include="utils\galeNotice.pas"/>
+        <DCCReference Include="FormMain.pas">
+            <Form>fmMain</Form>
+            <FormType>fmx</FormType>
+        </DCCReference>
+        <DCCReference Include="FormLogger.pas">
+            <Form>fmLogger</Form>
+            <FormType>fmx</FormType>
+        </DCCReference>
+        <DCCReference Include="FormAbout.pas">
+            <Form>fmAbout</Form>
+            <FormType>fmx</FormType>
+        </DCCReference>
+        <DCCReference Include="utils\FMXTrayIcon.pas"/>
+        <DCCReference Include="DocWinList.pas"/>
+        <DCCReference Include="utils\SaveDialogsEnhanced.pas"/>
+        <DCCReference Include="Pub.pas"/>
+        <BuildConfiguration Include="Base">
+            <Key>Base</Key>
+        </BuildConfiguration>
+        <BuildConfiguration Include="Debug">
+            <Key>Cfg_1</Key>
+            <CfgParent>Base</CfgParent>
+        </BuildConfiguration>
+        <BuildConfiguration Include="Release">
+            <Key>Cfg_2</Key>
+            <CfgParent>Base</CfgParent>
+        </BuildConfiguration>
+    </ItemGroup>
+    <ProjectExtensions>
+        <Borland.Personality>Delphi.Personality.12</Borland.Personality>
+        <Borland.ProjectType>Application</Borland.ProjectType>
+        <BorlandProject>
+            <Delphi.Personality>
+                <Source>
+                    <Source Name="MainSource">galeJSON.dpr</Source>
+                </Source>
+                <Excluded_Packages>
+                    <Excluded_Packages Name="$(BDSBIN)\dcloffice2k290.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
+                    <Excluded_Packages Name="$(BDSBIN)\dclofficexp290.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
+                </Excluded_Packages>
+            </Delphi.Personality>
+            <Deployment Version="4">
+                <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule">
+                    <Platform Name="iOSSimulator">
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule">
+                    <Platform Name="iOSSimulator">
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule">
+                    <Platform Name="OSX32">
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png" Configuration="Release" Class="UWP_DelphiLogo150">
+                    <Platform Name="Win64">
+                        <RemoteDir>Assets\</RemoteDir>
+                        <RemoteName>Logo150x150.png</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png" Configuration="Release" Class="UWP_DelphiLogo44">
+                    <Platform Name="Win64">
+                        <RemoteDir>Assets\</RemoteDir>
+                        <RemoteName>Logo44x44.png</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="$(ProjectName).Artwork\macOS\AppIcon.icns" Configuration="Debug" Class="ProjectOSXResource">
+                    <Platform Name="OSX64">
+                        <RemoteName>gsJSON.icns</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="$(ProjectName).Artwork\macOS\AppIcon.icns" Configuration="Release" Class="ProjectOSXResource">
+                    <Platform Name="OSX64">
+                        <RemoteName>galeJSON.icns</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="OSX64\Debug\galeJSON" Configuration="Debug" Class="ProjectOutput">
+                    <Platform Name="OSX64">
+                        <RemoteName>galeJSON</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="OSX64\Debug\gsJSON.entitlements" Configuration="Debug" Class="ProjectOSXEntitlements">
+                    <Platform Name="OSX64">
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="OSX64\Debug\gsJSON.info.plist" Configuration="Debug" Class="ProjectOSXInfoPList">
+                    <Platform Name="OSX64">
+                        <RemoteName>Info.plist</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="OSX64\Release\galeJSON.entitlements" Configuration="Release" Class="ProjectOSXEntitlements">
+                    <Platform Name="OSX64">
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="OSX64\Release\galeJSON.info.plist" Configuration="Release" Class="ProjectOSXInfoPList">
+                    <Platform Name="OSX64">
+                        <RemoteName>Info.plist</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="OSX64\Release\galeJSON" Configuration="Release" Class="ProjectOutput">
+                    <Platform Name="OSX64">
+                        <RemoteName>galeJSON</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="Win32\Debug\galeJSON.exe" Configuration="Debug" Class="ProjectOutput">
+                    <Platform Name="Win32">
+                        <RemoteName>galeJSON.exe</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="Win64\Debug\galeJSON.exe" Configuration="Debug" Class="ProjectOutput">
+                    <Platform Name="Win64">
+                        <RemoteName>galeJSON.exe</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="Win64\Release\galeJSON.exe" Configuration="Release" Class="ProjectOutput">
+                    <Platform Name="Win64">
+                        <RemoteName>galeJSON.exe</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="lang.json" Configuration="Debug" Class="File">
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\Resources\</RemoteDir>
+                        <RemoteName>lang.json</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="lang.json" Configuration="Debug" Class="File">
+                    <Platform Name="Win32">
+                        <RemoteName>lang.json</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="lang.json" Configuration="Release" Class="File">
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\Resources\</RemoteDir>
+                        <RemoteName>lang.json</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployFile LocalName="lang.json" Configuration="Release" Class="File">
+                    <Platform Name="Win32">
+                        <RemoteName>lang.json</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployClass Name="AdditionalDebugSymbols">
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidClasses">
+                    <Platform Name="Android">
+                        <RemoteDir>classes</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>classes</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidFileProvider">
+                    <Platform Name="Android">
+                        <RemoteDir>res\xml</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\xml</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidLibnativeArmeabiFile">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\armeabi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidLibnativeArmeabiv7aFile">
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidLibnativeMipsFile">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\mips</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\mips</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidServiceOutput">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\arm64-v8a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidServiceOutput_Android32">
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashImageDef">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashImageDefV21">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-anydpi-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-anydpi-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashStyles">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashStylesV21">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashStylesV31">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values-v31</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values-v31</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_AdaptiveIcon">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-anydpi-v26</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-anydpi-v26</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_AdaptiveIconBackground">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_AdaptiveIconForeground">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_AdaptiveIconMonochrome">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_AdaptiveIconV33">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-anydpi-v33</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-anydpi-v33</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_Colors">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_ColorsDark">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values-night-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values-night-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_DefaultAppIcon">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon144">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon192">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon36">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-ldpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-ldpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon48">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon72">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon96">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon24">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon36">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon48">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon72">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon96">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage426">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-small</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-small</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage470">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-normal</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-normal</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage640">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-large</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-large</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage960">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xlarge</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xlarge</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_Strings">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_VectorizedNotificationIcon">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-anydpi-v24</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-anydpi-v24</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_VectorizedSplash">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_VectorizedSplashDark">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_VectorizedSplashV31">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-anydpi-v31</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-anydpi-v31</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_VectorizedSplashV31Dark">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="DebugSymbols">
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="DependencyFramework">
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.framework</Extensions>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.framework</Extensions>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.framework</Extensions>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="DependencyModule">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                        <Extensions>.dll;.bpl</Extensions>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Required="true" Name="DependencyPackage">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                        <Extensions>.bpl</Extensions>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="File">
+                    <Platform Name="Android">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice32">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectAndroidManifest">
+                    <Platform Name="Android">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXDebug">
+                    <Platform Name="OSX64">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXEntitlements">
+                    <Platform Name="OSX32">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXInfoPList">
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXResource">
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\Resources</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\Resources</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\Resources</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Required="true" Name="ProjectOutput">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\arm64-v8a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Linux64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOutput_Android32">
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectUWPManifest">
+                    <Platform Name="Win32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win64x">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSDeviceDebug">
+                    <Platform Name="iOSDevice32">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSEntitlements">
+                    <Platform Name="iOSDevice32">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSInfoPList">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSLaunchScreen">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSResource">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="UWP_DelphiLogo150">
+                    <Platform Name="Win32">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win64">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="UWP_DelphiLogo44">
+                    <Platform Name="Win32">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win64">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iOS_AppStore1024">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_AppIcon152">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_AppIcon167">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_Launch2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_LaunchDark2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_Notification40">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_Setting58">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_SpotLight80">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_AppIcon120">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_AppIcon180">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Launch2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Launch3x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_LaunchDark2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_LaunchDark3x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Notification40">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Notification60">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Setting58">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Setting87">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Spotlight120">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Spotlight80">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimARM64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="iOSSimARM64" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
+            </Deployment>
+            <Platforms>
+                <Platform value="OSX64">True</Platform>
+                <Platform value="OSXARM64">False</Platform>
+                <Platform value="Win32">False</Platform>
+                <Platform value="Win64">True</Platform>
+            </Platforms>
+        </BorlandProject>
+        <ProjectFileVersion>12</ProjectFileVersion>
+    </ProjectExtensions>
+    <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
+    <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
+    <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
+    <PropertyGroup Condition="'$(Config)'=='Debug' And '$(Platform)'=='Win64'">
+        <PreBuildEvent/>
+        <PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
+        <PreLinkEvent/>
+        <PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
+        <PostBuildEvent>copy &quot;$(PROJECTDIR)\lang.json&quot; &quot;$(OUTPUTDIR)&quot; /Y</PostBuildEvent>
+        <PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Config)'=='Release' And '$(Platform)'=='Win64'">
+        <PreBuildEvent/>
+        <PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
+        <PreLinkEvent/>
+        <PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
+        <PostBuildEvent>copy &quot;$(PROJECTDIR)\lang.json&quot; &quot;$(OUTPUTDIR)&quot; /Y</PostBuildEvent>
+        <PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
+    </PropertyGroup>
+</Project>

TEMPAT SAMPAH
galeJSON.res


TEMPAT SAMPAH
galeJSON_Icon.ico


File diff ditekan karena terlalu besar
+ 0 - 0
image/json.svg


TEMPAT SAMPAH
image/json_1024.png


TEMPAT SAMPAH
image/json_16.png


TEMPAT SAMPAH
image/json_24.png


TEMPAT SAMPAH
image/json_32.png


TEMPAT SAMPAH
image/json_48.png


+ 13 - 0
info.plist.TemplateOSX.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+<%VersionInfoPListKeys%>
+<%ExtraInfoPListKeys%>
+<key>CFBundleLocalizations</key>
+<array>
+    <string>zh_CN</string>
+    <string>en</string>
+</array>
+</dict>
+</plist>

+ 386 - 0
lang.json

@@ -0,0 +1,386 @@
+[
+    {
+        "caption": "English(Default)",
+        "items": {
+            "actSystemUpdate": "Checking for updates...",
+            "actFile": "File",
+            "actFileNew": "New",
+            "actFileOpen": "Open",
+            "actFileOpenRecent": "Recent File",
+            "actFileClearRecent": "Clear",
+            "actFileSave": "Save",
+            "actFileSaveAs": "Save As",
+            "actFileClose": "Close",
+            "actEdit": "Edit",
+            "actEditMoveUp": "Move Up",
+            "actEditMoveDown": "Move Down",
+            "actView": "View",
+            "actViewLang": "Language",
+            "actViewShowLog": "Show Log",
+            "actViewDarkStyle": "Dark Mode",
+            "actViewFont": "Font",
+            "actWindow": "Window",
+            "actWindowItems": "Document List",
+            "actWindowShowAll": "Show All",
+            "actHelp": "Help",
+            "actHelpHelp": "Help",
+            "actHelpAbout": "About...",
+            "strIndent": "Number of indentation spaces",
+            "strWordWarp": "Word Wrap",
+            "strTrue": "Yes",
+            "strFalse": "No"
+        }
+    },
+    {
+        "caption": "简体中文",
+        "items": {
+            "actSystemUpdate": "检查更新...",
+            "actFile": "文件",
+            "actFileNew": "新建",
+            "actFileOpen": "打开",
+            "actFileOpenRecent": "历史文件",
+            "actFileClearRecent": "清除",
+            "actFileSave": "保存",
+            "actFileSaveAs": "另存为...",
+            "actFileClose": "关闭",
+            "actEdit": "编辑",
+            "actEditMoveUp": "上移",
+            "actEditMoveDown": "下移",
+            "actView": "视图",
+            "actViewLang": "语言",
+            "actViewShowLog": "显示日志",
+            "actViewDarkStyle": "暗黑风格",
+            "actViewFont": "字体",
+            "actWindow": "窗口",
+            "actWindowItems": "文档列表",
+            "actWindowShowAll": "显示全部",
+            "actHelp": "帮助",
+            "actHelpHelp": "帮助",
+            "actHelpAbout": "关于...",
+            "strIndent": "缩进格数",
+            "strWordWarp": "自动换行",
+            "strTrue": "是",
+            "strFalse": "否"
+        }
+    },
+    {
+        "caption": "繁體中文",
+        "items": {
+            "actSystemUpdate": "檢查更新...",
+            "actFile": "檔案",
+            "actFileNew": "新建",
+            "actFileOpen": "開啟",
+            "actFileOpenRecent": "歷史檔案",
+            "actFileClearRecent": "清除",
+            "actFileSave": "儲存",
+            "actFileSaveAs": "另存",
+            "actFileClose": "關閉",
+            "actEdit": "編輯",
+            "actEditMoveUp": "上移",
+            "actEditMoveDown": "下移",
+            "actView": "檢視",
+            "actViewLang": "語言",
+            "actViewShowLog": "顯示日誌",
+            "actViewDarkStyle": "暗黑風格",
+            "actViewFont": "字型",
+            "actWindow": "視窗",
+            "actWindowItems": "文件清單",
+            "actWindowShowAll": "顯示全部",
+            "actHelp": "說明",
+            "actHelpHelp": "說明",
+            "actHelpAbout": "關於...",
+            "strIndent": "縮排格數",
+            "strWordWarp": "自動換行",
+            "strTrue": "是",
+            "strFalse": "否"
+        }
+    },
+    {
+        "caption": "日本語",
+        "items": {
+            "actSystemUpdate": "更新を確認中...",
+            "actFile": "ファイル",
+            "actFileNew": "新規作成",
+            "actFileOpen": "開く",
+            "actFileOpenRecent": "最近のファイル",
+            "actFileClearRecent": "クリア",
+            "actFileSave": "保存",
+            "actFileSaveAs": "名前を付けて保存",
+            "actFileClose": "閉じる",
+            "actEdit": "編集",
+            "actEditMoveUp": "上に移動",
+            "actEditMoveDown": "下に移動",
+            "actView": "表示",
+            "actViewLang": "言語",
+            "actViewShowLog": "ログを表示",
+            "actViewDarkStyle": "ダークモード",
+            "actViewFont": "フォント",
+            "actWindow": "ウィンドウ",
+            "actWindowItems": "ドキュメント一覧",
+            "actWindowShowAll": "すべて表示",
+            "actHelp": "ヘルプ",
+            "actHelpHelp": "ヘルプ",
+            "actHelpAbout": "バージョン情報...",
+            "strIndent": "インデント幅",
+            "strWordWarp": "自動改行",
+            "strTrue": "はい",
+            "strFalse": "いいえ"
+        }
+    },
+    {
+        "caption": "한국어",
+        "items": {
+            "actSystemUpdate": "업데이트 확인 중...",
+            "actFile": "파일",
+            "actFileNew": "새로 만들기",
+            "actFileOpen": "열기",
+            "actFileOpenRecent": "최근 파일",
+            "actFileClearRecent": "지우기",
+            "actFileSave": "저장",
+            "actFileSaveAs": "다른 이름으로 저장",
+            "actFileClose": "닫기",
+            "actEdit": "편집",
+            "actEditMoveUp": "위로 이동",
+            "actEditMoveDown": "아래로 이동",
+            "actView": "보기",
+            "actViewLang": "언어",
+            "actViewShowLog": "로그 표시",
+            "actViewDarkStyle": "다크 모드",
+            "actViewFont": "글꼴",
+            "actWindow": "창",
+            "actWindowItems": "문서 목록",
+            "actWindowShowAll": "모두 표시",
+            "actHelp": "도움말",
+            "actHelpHelp": "도움말",
+            "actHelpAbout": "프로그램 정보...",
+            "strIndent": "들여쓰기 크기",
+            "strWordWarp": "자동 줄바꿈",
+            "strTrue": "예",
+            "strFalse": "아니오"
+        }
+    },
+    {
+        "caption": "Français",
+        "items": {
+            "actSystemUpdate": "Vérification des mises à jour...",
+            "actFile": "Fichier",
+            "actFileNew": "Nouveau",
+            "actFileOpen": "Ouvrir",
+            "actFileOpenRecent": "Fichiers récents",
+            "actFileClearRecent": "Effacer",
+            "actFileSave": "Enregistrer",
+            "actFileSaveAs": "Enregistrer sous",
+            "actFileClose": "Fermer",
+            "actEdit": "Édition",
+            "actEditMoveUp": "Déplacer vers le haut",
+            "actEditMoveDown": "Déplacer vers le bas",
+            "actView": "Affichage",
+            "actViewLang": "Langue",
+            "actViewShowLog": "Afficher le journal",
+            "actViewDarkStyle": "Mode sombre",
+            "actViewFont": "Police",
+            "actWindow": "Fenêtre",
+            "actWindowItems": "Liste des documents",
+            "actWindowShowAll": "Tout afficher",
+            "actHelp": "Aide",
+            "actHelpHelp": "Aide",
+            "actHelpAbout": "À propos...",
+            "strIndent": "Taille indentation",
+            "strWordWarp": "Retour ligne auto",
+            "strTrue": "Oui",
+            "strFalse": "Non"
+        }
+    },
+    {
+        "caption": "Deutsch",
+        "items": {
+            "actSystemUpdate": "Nach Updates suchen...",
+            "actFile": "Datei",
+            "actFileNew": "Neu",
+            "actFileOpen": "Öffnen",
+            "actFileOpenRecent": "Zuletzt verwendete Dateien",
+            "actFileClearRecent": "Löschen",
+            "actFileSave": "Speichern",
+            "actFileSaveAs": "Speichern unter",
+            "actFileClose": "Schließen",
+            "actEdit": "Bearbeiten",
+            "actEditMoveUp": "Nach oben verschieben",
+            "actEditMoveDown": "Nach unten verschieben",
+            "actView": "Ansicht",
+            "actViewLang": "Sprache",
+            "actViewShowLog": "Protokoll anzeigen",
+            "actViewDarkStyle": "Dunkler Modus",
+            "actViewFont": "Schriftart",
+            "actWindow": "Fenster",
+            "actWindowItems": "Dokumentenliste",
+            "actWindowShowAll": "Alle anzeigen",
+            "actHelp": "Hilfe",
+            "actHelpHelp": "Hilfe",
+            "actHelpAbout": "Über...",
+            "strIndent": "Einrückungsgröße",
+            "strWordWarp": "Auto-Zeilenumbruch",
+            "strTrue": "Ja",
+            "strFalse": "Nein"
+        }
+    },
+    {
+        "caption": "Español",
+        "items": {
+            "actSystemUpdate": "Buscando actualizaciones...",
+            "actFile": "Archivo",
+            "actFileNew": "Nuevo",
+            "actFileOpen": "Abrir",
+            "actFileOpenRecent": "Archivos recientes",
+            "actFileClearRecent": "Limpiar",
+            "actFileSave": "Guardar",
+            "actFileSaveAs": "Guardar como",
+            "actFileClose": "Cerrar",
+            "actEdit": "Editar",
+            "actEditMoveUp": "Mover arriba",
+            "actEditMoveDown": "Mover abajo",
+            "actView": "Ver",
+            "actViewLang": "Idioma",
+            "actViewShowLog": "Mostrar registro",
+            "actViewDarkStyle": "Modo oscuro",
+            "actViewFont": "Fuente",
+            "actWindow": "Ventana",
+            "actWindowItems": "Lista de documentos",
+            "actWindowShowAll": "Mostrar todo",
+            "actHelp": "Ayuda",
+            "actHelpHelp": "Ayuda",
+            "actHelpAbout": "Acerca de...",
+            "strIndent": "Tamaño sangría",
+            "strWordWarp": "Salto línea auto",
+            "strTrue": "Sí",
+            "strFalse": "No"
+        }
+    },
+    {
+        "caption": "Русский",
+        "items": {
+            "actSystemUpdate": "Проверка обновлений...",
+            "actFile": "Файл",
+            "actFileNew": "Создать",
+            "actFileOpen": "Открыть",
+            "actFileOpenRecent": "Недавние файлы",
+            "actFileClearRecent": "Очистить",
+            "actFileSave": "Сохранить",
+            "actFileSaveAs": "Сохранить как",
+            "actFileClose": "Закрыть",
+            "actEdit": "Правка",
+            "actEditMoveUp": "Переместить вверх",
+            "actEditMoveDown": "Переместить вниз",
+            "actView": "Вид",
+            "actViewLang": "Язык",
+            "actViewShowLog": "Показать журнал",
+            "actViewDarkStyle": "Темный режим",
+            "actViewFont": "Шрифт",
+            "actWindow": "Окно",
+            "actWindowItems": "Список документов",
+            "actWindowShowAll": "Показать все",
+            "actHelp": "Справка",
+            "actHelpHelp": "Справка",
+            "actHelpAbout": "О программе...",
+            "strIndent": "Размер отступа",
+            "strWordWarp": "Авто-перенос",
+            "strTrue": "Да",
+            "strFalse": "Нет"
+        }
+    },
+    {
+        "caption": "Italiano",
+        "items": {
+            "actSystemUpdate": "Controllo aggiornamenti...",
+            "actFile": "File",
+            "actFileNew": "Nuovo",
+            "actFileOpen": "Apri",
+            "actFileOpenRecent": "File recenti",
+            "actFileClearRecent": "Cancella",
+            "actFileSave": "Salva",
+            "actFileSaveAs": "Salva con nome",
+            "actFileClose": "Chiudi",
+            "actEdit": "Modifica",
+            "actEditMoveUp": "Sposta su",
+            "actEditMoveDown": "Sposta giù",
+            "actView": "Visualizza",
+            "actViewLang": "Lingua",
+            "actViewShowLog": "Mostra registro",
+            "actViewDarkStyle": "Modalità scura",
+            "actViewFont": "Carattere",
+            "actWindow": "Finestra",
+            "actWindowItems": "Elenco documenti",
+            "actWindowShowAll": "Mostra tutto",
+            "actHelp": "Aiuto",
+            "actHelpHelp": "Aiuto",
+            "actHelpAbout": "Informazioni...",
+            "strIndent": "Dimensione rientro",
+            "strWordWarp": "A capo automatico",
+            "strTrue": "Sì",
+            "strFalse": "No"
+        }
+    },
+    {
+        "caption": "Português",
+        "items": {
+            "actSystemUpdate": "Verificando atualizações...",
+            "actFile": "Arquivo",
+            "actFileNew": "Novo",
+            "actFileOpen": "Abrir",
+            "actFileOpenRecent": "Arquivos recentes",
+            "actFileClearRecent": "Limpar",
+            "actFileSave": "Salvar",
+            "actFileSaveAs": "Salvar como",
+            "actFileClose": "Fechar",
+            "actEdit": "Editar",
+            "actEditMoveUp": "Mover para cima",
+            "actEditMoveDown": "Mover para baixo",
+            "actView": "Visualizar",
+            "actViewLang": "Idioma",
+            "actViewShowLog": "Mostrar registro",
+            "actViewDarkStyle": "Modo escuro",
+            "actViewFont": "Fonte",
+            "actWindow": "Janela",
+            "actWindowItems": "Lista de documentos",
+            "actWindowShowAll": "Mostrar tudo",
+            "actHelp": "Ajuda",
+            "actHelpHelp": "Ajuda",
+            "actHelpAbout": "Sobre...",
+            "strIndent": "Tamanho indentação",
+            "strWordWarp": "Quebra linha auto",
+            "strTrue": "Sim",
+            "strFalse": "Não"
+        }
+    },
+    {
+        "caption": "Nederlands",
+        "items": {
+            "actSystemUpdate": "Controleren op updates...",
+            "actFile": "Bestand",
+            "actFileNew": "Nieuw",
+            "actFileOpen": "Openen",
+            "actFileOpenRecent": "Recente bestanden",
+            "actFileClearRecent": "Wissen",
+            "actFileSave": "Opslaan",
+            "actFileSaveAs": "Opslaan als",
+            "actFileClose": "Sluiten",
+            "actEdit": "Bewerken",
+            "actEditMoveUp": "Omhoog verplaatsen",
+            "actEditMoveDown": "Omlaag verplaatsen",
+            "actView": "Weergave",
+            "actViewLang": "Taal",
+            "actViewShowLog": "Logboek tonen",
+            "actViewDarkStyle": "Donkere modus",
+            "actViewFont": "Lettertype",
+            "actWindow": "Venster",
+            "actWindowItems": "Documentenlijst",
+            "actWindowShowAll": "Alles tonen",
+            "actHelp": "Help",
+            "actHelpHelp": "Help",
+            "actHelpAbout": "Over...",
+            "strIndent": "Inspring grootte",
+            "strWordWarp": "Auto regelafbreking",
+            "strTrue": "Ja",
+            "strFalse": "Nee"
+        }
+    }
+]

+ 528 - 0
utils/FMXTrayIcon.pas

@@ -0,0 +1,528 @@
+{
+  TrayIcon for FMX v0.5
+  by gale 2025-02-13
+  https://github.com/higale
+}
+unit FMXTrayIcon;
+
+interface
+
+uses
+{$IFDEF MSWINDOWS}
+  Vcl.Graphics, WinAPI.Messages, WinAPI.Windows, WinAPI.ShellAPI, FMX.Platform.Win,
+  System.Messaging, System.IOUtils,
+{$ELSE}
+  Macapi.ObjectiveC, Macapi.CocoaTypes, Macapi.Foundation, Macapi.AppKit, FMX.Dialogs,
+  Macapi.Helpers, Macapi.ObjcRuntime, System.TypInfo, FMX.Platform, FMX.Platform.Mac,
+  Posix.Unistd, // 添加这个单元以使用 getpid
+{$ENDIF}
+  System.hash, System.SysUtils, System.Types, System.Classes, FMX.Types, FMX.Forms,
+  FMX.Menus;
+
+const
+{$IFDEF MSWINDOWS}
+  WM_ICONTRAY = WM_USER + 1;
+  WM_RUNONLYONCE = WM_USER + 2;
+{$ELSE}
+  MACOS_TAG = 1;
+{$ENDIF}
+
+
+type
+  TNotifyEventRef = reference to procedure(sender: TObject);
+  TOnRunOnlyOnce = reference to procedure(sender: TObject; AParam: TArray<String>);
+  TBalloonIconType = (None, Info, Warning, Error, User, BigWarning, BigError);
+
+{$IFDEF MACOS}
+
+  IClickHandler = interface(NSObject)
+    ['{B3B9C05D-8909-4419-BC8C-ACE5CFE6388D}']
+    procedure click(sender: id); cdecl;
+    procedure menuItemClick(sender: id); cdecl;
+  end;
+
+  TTrayIcon = class;
+
+  TClickHandler = class(TOCLocal)
+  private
+    FOwner: TTrayIcon;
+  public
+    procedure click(sender: id); cdecl;
+    procedure menuItemClick(sender: id); cdecl;
+    function GetObjectiveCClass: PTypeInfo; override;
+  end;
+{$ENDIF}
+
+  TTrayIcon = class(TComponent)
+{$IFDEF MSWINDOWS}
+  private
+    class var FRunOnlyOnceTag: string;
+    class var FHasOtherRunning: Boolean;
+    class procedure CheckRunOnce;
+  public
+    class property HasOtherRunning: Boolean read FHasOtherRunning;
+{$ENDIF}
+  private
+{$IFDEF MSWINDOWS}
+    FTrayWnd: HWND;
+    FTrayIconData: TNotifyIconData;
+    FIcon: TIcon;
+    FShowingPopup: Boolean;
+{$ELSE}
+    FStatItem: NSStatusItem;
+    FClickHandler: TClickHandler;
+{$ENDIF}
+    FIconFile: string;
+    FPopupMenu: TPopupMenu;
+    FHint: string;
+    FVisible: Boolean;
+    FRunOnlyOnce: Boolean;
+    FOnRunOnlyOnce: TOnRunOnlyOnce;
+    FOnClick: TNotifyEventRef;
+    FOnDblClick: TNotifyEventRef;
+    function GetShowAppOnTaskbar: Boolean;
+    procedure SetShowAppOnTaskbar(AValue: Boolean);
+    procedure SetHint(Value: string);
+    procedure SetIconFile(Value: string);
+    procedure SetPopupMenu(Value: TPopupMenu);
+{$IFDEF MSWINDOWS}
+    procedure TrayWndProc(var Message: WinAPI.Messages.TMessage);
+    procedure FOnPopupForm(const sender: TObject; const M: TMessage);
+{$ELSE}
+
+{$ENDIF}
+    procedure SetVisible(Value: Boolean);
+    procedure SetRunOnlyOnce(Value: Boolean);
+  public
+    property IconFile: string read FIconFile write SetIconFile;
+    property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu;
+    property Hint: string read FHint write SetHint;
+    property Visible: Boolean read FVisible write SetVisible default False;
+    property RunOnlyOnce: Boolean read FRunOnlyOnce write SetRunOnlyOnce default False;
+    property ShowAppOnTaskbar: Boolean read GetShowAppOnTaskbar write SetShowAppOnTaskbar;
+    property OnRunOnlyOnce: TOnRunOnlyOnce read FOnRunOnlyOnce write FOnRunOnlyOnce;
+    property OnClick: TNotifyEventRef read FOnClick write FOnClick;
+    property OnDblClick: TNotifyEventRef read FOnDblClick write FOnDblClick;
+  public
+    procedure ShowBalloonHint(Title, Text: string; BalloonIcon: TBalloonIconType);
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+  end;
+
+implementation
+
+{$IFDEF MSWINDOWS}
+
+
+class procedure TTrayIcon.CheckRunOnce;
+var
+  hRunOnce: HWND;
+  strs: TStrings;
+  strParmFile: string;
+begin
+  FRunOnlyOnceTag := System.hash.THashSHA1.GetHashString(ParamStr(0).ToLower);
+  FHasOtherRunning := False;
+  hRunOnce := WinAPI.Windows.FindWindow('TPUtilWindow', PChar(TTrayIcon.FRunOnlyOnceTag));
+  if IsWindow(hRunOnce) then
+  begin
+    strParmFile := TPath.GetTempPath + TTrayIcon.FRunOnlyOnceTag + '_run_only_once.txt';
+    strs := TStringList.Create;
+    Try
+      for var i := 0 to ParamCount do
+        strs.Add(ParamStr(i));
+      strs.SaveToFile(strParmFile);
+    Finally
+      strs.Free;
+    End;
+    PostMessage(hRunOnce, WM_RUNONLYONCE, 0, 0);
+    TTrayIcon.FHasOtherRunning := true;
+    Application.Terminate;
+    Application.Terminated := true;
+  end;
+end;
+{$ENDIF}
+
+
+constructor TTrayIcon.Create(AOwner: TComponent);
+{$IFDEF MACOS}
+var
+  LStatBar: NSStatusBar;
+  LImg: NSImage;
+{$ENDIF}
+begin
+  inherited Create(AOwner);
+  FRunOnlyOnce := False;
+{$IFDEF MSWINDOWS}
+  FShowingPopup := False;
+  FIcon := nil;
+  TMessageManager.DefaultManager.SubscribeToMessage(TFormBeforeShownMessage, FOnPopupForm);
+  FTrayWnd := AllocateHWnd(TrayWndProc);
+  FTrayIconData.cbSize := System.SizeOf(FTrayIconData);
+  FTrayIconData.Wnd := FTrayWnd;
+  FTrayIconData.uID := 1;
+  FTrayIconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
+  FTrayIconData.uCallbackMessage := WM_ICONTRAY;
+  FTrayIconData.hIcon := GetClassLong(FmxHandleToHWND((AOwner as TForm).Handle), GCL_HICONSM);
+{$ELSE}
+  FClickHandler := TClickHandler.Create;
+  FClickHandler.FOwner := Self;
+  LStatBar := TNSStatusBar.Wrap(TNSStatusBar.OCClass.systemStatusBar);
+  FStatItem := LStatBar.statusItemWithLength(NSVariableStatusItemLength);
+
+  FIconFile := NSStrToStr(TNSBundle.Wrap(TNSBundle.OCClass.mainBundle).resourcePath.stringByAppendingString(StrToNSStr('/' + ExtractFileName(ParamStr(0)) + '.icns')));
+  LImg := TNSImage.Wrap(TNSImage.Alloc.initWithContentsOfFile(StrToNSStr(FIconFile)));
+  LImg.setSize(NSSize(TSizeF.Create(16, 16)));
+  FStatItem.setImage(LImg);
+  LImg.release;
+
+  FStatItem.setTarget(FClickHandler.GetObjectID);
+  FStatItem.setAction(sel_getUid(PAnsiChar('click:')));
+{$ENDIF}
+end;
+
+destructor TTrayIcon.Destroy;
+begin
+{$IFDEF MSWINDOWS}
+  TMessageManager.DefaultManager.Unsubscribe(TFormBeforeShownMessage, FOnPopupForm);
+  if FVisible then
+  begin
+    Shell_NotifyIcon(NIM_DELETE, @FTrayIconData);
+  end;
+  FIcon.Free;
+{$ELSE}
+  FClickHandler.Free;
+{$ENDIF}
+  inherited;
+end;
+
+procedure TTrayIcon.ShowBalloonHint(Title, Text: string; BalloonIcon: TBalloonIconType);
+{$IFDEF MSWINDOWS}
+begin
+  with FTrayIconData do
+  begin
+    StrLCopy(szInfo, PChar(Text), High(szInfo));
+    StrLCopy(szInfoTitle, PChar(Title), High(szInfoTitle));
+    dwInfoFlags := Ord(BalloonIcon);
+    uFlags := NIF_INFO;
+  end;
+  Shell_NotifyIcon(NIM_MODIFY, @FTrayIconData);
+end;
+{$ELSE}
+
+
+var
+  Notification: NSUserNotification;
+  Center: NSUserNotificationCenter;
+begin
+  // 使用 NSUserNotification 模拟气泡提示
+  Center := TNSUserNotificationCenter.Wrap(TNSUserNotificationCenter.OCClass.defaultUserNotificationCenter);
+  Notification := TNSUserNotification.Create;
+  Notification.setTitle(StrToNSStr(Title));
+  Notification.setInformativeText(StrToNSStr(Text));
+  // 发送通知
+  Center.deliverNotification(Notification);
+end;
+{$ENDIF}
+
+
+function TTrayIcon.GetShowAppOnTaskbar: Boolean;
+begin
+{$IFDEF MSWINDOWS}
+  Result := (GetWindowLong(ApplicationHWND, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0;
+{$ELSE}
+  Result := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication).activationPolicy = NSApplicationActivationPolicyRegular;
+{$ENDIF}
+end;
+
+procedure TTrayIcon.SetShowAppOnTaskbar(AValue: Boolean);
+begin
+{$IFDEF MSWINDOWS}
+  if AValue then
+  begin
+    SetWindowLong(ApplicationHWND, GWL_EXSTYLE, GetWindowLong(ApplicationHWND, GWL_EXSTYLE) and (not WS_EX_APPWINDOW) and not WS_EX_TOOLWINDOW);
+  end
+  else
+  begin
+    SetWindowLong(ApplicationHWND, GWL_EXSTYLE, GetWindowLong(ApplicationHWND, GWL_EXSTYLE) and (not WS_EX_APPWINDOW) or WS_EX_TOOLWINDOW);
+  end;
+{$ELSE}
+  if AValue then
+    TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication).setActivationPolicy(NSApplicationActivationPolicyRegular)
+  else
+    TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication).setActivationPolicy(NSApplicationActivationPolicyAccessory);
+{$ENDIF}
+end;
+
+procedure TTrayIcon.SetHint(Value: string);
+begin
+{$IFDEF MSWINDOWS}
+  if Value <> FHint then
+  begin
+    FHint := Value;
+    StrLCopy(FTrayIconData.szTip, PChar(FHint), High(FTrayIconData.szTip));
+  end;
+  Shell_NotifyIcon(NIM_MODIFY, @FTrayIconData);
+{$ELSE}
+  FStatItem.setToolTip(StrToNSStr(Value));
+{$ENDIF}
+end;
+
+procedure TTrayIcon.SetIconFile(Value: string);
+begin
+  if FIconFile = Value then
+    Exit;
+{$IFDEF MSWINDOWS}
+  if Value = FIconFile then
+    Exit;
+
+  FreeAndNil(FIcon);
+  if Value = '' then
+  begin
+    FTrayIconData.hIcon := GetClassLong(FmxHandleToHWND((Owner as TForm).Handle), GCL_HICONSM);
+  end
+  else
+  begin
+    FIcon := TIcon.Create;
+    FIcon.LoadFromFile(Value);
+    FTrayIconData.hIcon := FIcon.Handle;
+  end;
+  if FVisible then
+  begin
+    FTrayIconData.uFlags := NIF_ICON;
+    Shell_NotifyIcon(NIM_MODIFY, @FTrayIconData);
+  end;
+{$ELSE}
+  // 设置图标
+  FIconFile := Value;
+  var
+  LImg := TNSImage.Wrap(TNSImage.Alloc.initWithContentsOfFile(StrToNSStr(Value)));
+  LImg.setSize(NSSize(TSizeF.Create(16, 16)));
+  FStatItem.setImage(LImg);
+  LImg.release;
+{$ENDIF}
+end;
+
+procedure TTrayIcon.SetPopupMenu(Value: TPopupMenu);
+{$IFDEF MACOS}
+var
+  LNSMenu: NSMenu;
+  NSContItem: NSMenuItem;
+{$ENDIF}
+begin
+  if FPopupMenu = Value then
+    Exit;
+  FPopupMenu := Value;
+{$IFDEF MACOS}
+  FStatItem.setMenu(nil);
+  LNSMenu := TNSMenu.Create;
+  FStatItem.setMenu(LNSMenu);
+  for var i := 0 to Value.ItemsCount - 1 do
+  begin
+    if Value.Items[i].Text = '-' then // 添加分隔线
+    begin
+      FStatItem.menu.addItem(TNSMenuItem.Wrap(TNSMenuItem.OCClass.separatorItem));
+    end
+    else
+    begin
+      NSContItem := TNSMenuItem.Create;
+      NSContItem.initWithTitle(StrToNSStr(Value.Items[i].Text), sel_getUid(PAnsiChar('menuItemClick:')), StrToNSStr(''));
+      NSContItem.setTag(i);
+      NSContItem.setTarget(FClickHandler.GetObjectID);
+      FStatItem.menu.addItem(NSContItem);
+      NSContItem.release;
+    end;
+  end;
+
+{$ENDIF}
+end;
+
+procedure TTrayIcon.SetVisible(Value: Boolean);
+begin
+{$IFDEF MSWINDOWS}
+  if Value <> FVisible then
+  begin
+    if Value then
+    begin
+      FVisible := Shell_NotifyIcon(NIM_ADD, @FTrayIconData);
+    end
+    else
+    begin
+      Shell_NotifyIcon(NIM_DELETE, @FTrayIconData);
+      FVisible := False;
+    end;
+  end;
+{$ELSE}
+{$ENDIF}
+end;
+
+procedure TTrayIcon.SetRunOnlyOnce(Value: Boolean);
+{$IFDEF MACOS}
+{var
+  Workspace: NSWorkspace;
+  RunningApps: NSArray;
+  i: Integer;
+  CurrentApp: NSRunningApplication;
+  BundleID: NSString;
+  CurrentPID: Integer;}
+{$ENDIF}
+begin
+  if FRunOnlyOnce = Value then
+    Exit;
+  FRunOnlyOnce := Value;
+{$IFDEF MSWINDOWS}
+  if FRunOnlyOnce then
+  begin
+    WinAPI.Windows.SetWindowText(FTrayWnd, FRunOnlyOnceTag);
+  end
+  else
+  begin
+    WinAPI.Windows.SetWindowText(FTrayWnd, '');
+  end;
+{$ELSE}
+  {if FRunOnlyOnce then
+  begin
+    Workspace := TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace);
+    RunningApps := Workspace.runningApplications;
+    BundleID := TNSBundle.Wrap(TNSBundle.OCClass.mainBundle).bundleIdentifier;
+    CurrentPID := getpid; // 获取当前进程的 PID
+
+    for i := 0 to RunningApps.count - 1 do
+    begin
+      CurrentApp := TNSRunningApplication.Wrap(RunningApps.objectAtIndex(i));
+      if (CurrentApp.bundleIdentifier.isEqualToString(BundleID)) and
+        (CurrentApp.processIdentifier <> CurrentPID) then
+      begin
+        ShowMessage('Another instance is already running.');
+        Application.Terminate;
+        Exit;
+      end;
+    end;
+  end;}
+{$ENDIF}
+end;
+
+{$IFDEF MSWINDOWS}
+
+
+procedure TTrayIcon.TrayWndProc(var Message: WinAPI.Messages.TMessage);
+var
+  strParmFile: string;
+  strs: TStrings;
+begin
+  if Message.MSG = WM_ICONTRAY then
+  begin
+    case Message.LParam of
+      WM_LBUTTONUP:
+        begin
+          if Assigned(FOnClick) then
+          begin
+            FOnClick(Self)
+          end
+          else if Assigned(FPopupMenu) then
+          begin
+            SetForegroundWindow(ApplicationHWND);
+            FShowingPopup := true;
+            try
+              FPopupMenu.Popup(Screen.MousePos.X, Screen.MousePos.Y);
+            finally
+              FShowingPopup := False;
+            end;
+          end;
+        end;
+      WM_LBUTTONDBLCLK:
+        if Assigned(FOnDblClick) then
+          FOnDblClick(Self);
+      WM_RBUTTONDOWN:
+        begin
+          if Assigned(FPopupMenu) then
+          begin
+            SetForegroundWindow(ApplicationHWND);
+            FShowingPopup := true;
+            try
+              FPopupMenu.Popup(Screen.MousePos.X, Screen.MousePos.Y);
+            finally
+              FShowingPopup := False;
+            end;
+          end;
+        end;
+    end;
+  end
+  else if Message.MSG = WM_RUNONLYONCE then
+  begin
+    if Assigned(FOnRunOnlyOnce) then
+    begin
+      strParmFile := TPath.GetTempPath + TTrayIcon.FRunOnlyOnceTag + '_run_only_once.txt';
+      if FileExists(strParmFile) then
+      begin
+        strs := TStringList.Create;
+        try
+          strs.LoadFromFile(strParmFile);
+          try
+            DeleteFile(strParmFile);
+          except
+          end;
+          FOnRunOnlyOnce(Self, strs.ToStringArray);
+        finally
+          strs.Free;
+        end;
+      end
+      else
+      begin
+        FOnRunOnlyOnce(Self, []);
+      end;
+    end;
+  end
+  else
+  begin
+    Message.Result := DefWindowProc(FTrayWnd, Message.MSG, Message.WParam, Message.LParam);
+  end;
+end;
+
+procedure TTrayIcon.FOnPopupForm(const sender: TObject; const M: TMessage);
+var
+  MSG: TFormBeforeShownMessage absolute M;
+begin
+  if FShowingPopup and (MSG.Value is TCustomPopupForm) then
+  begin
+    SetWindowPos(FormToHWND(MSG.Value), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
+  end;
+end;
+
+{$ELSE}
+
+
+procedure TClickHandler.click(sender: id);
+  cdecl;
+begin
+  if Assigned(FOwner.FOnClick) then
+  begin
+    FOwner.FOnClick(FOwner);
+  end;
+end;
+
+procedure TClickHandler.menuItemClick(sender: id); cdecl;
+var
+  MenuItem: NSMenuItem;
+begin
+
+  MenuItem := TNSMenuItem.Wrap(sender);
+  if Assigned(FOwner.FPopupMenu.Items[MenuItem.tag].OnClick) then
+  begin
+    FOwner.FPopupMenu.Items[MenuItem.tag].OnClick(FOwner.FPopupMenu.Items[MenuItem.tag]);
+  end;
+end;
+
+function TClickHandler.GetObjectiveCClass: PTypeInfo;
+begin
+  Result := TypeInfo(IClickHandler);
+end;
+{$ENDIF}
+
+initialization
+
+{$IFDEF MSWINDOWS}
+  TTrayIcon.CheckRunOnce;
+{$ENDIF}
+
+end.

+ 199 - 0
utils/LineNumbersMemoFMX.pas

@@ -0,0 +1,199 @@
+unit LineNumbersMemoFMX;
+
+interface
+
+uses
+  FMX.TextLayout, FMX.Text.LinesLayout, FMX.Memo.Style.New, System.Math,
+  System.SysUtils, System.Types, System.UITypes, System.Classes, FMX.Memo, FMX.Layouts,
+  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.StdCtrls, FMX.Objects;
+
+type
+  TLinesMemoUtil = class(TComponent)
+  private
+    FStyleMemo: TStyledMemo;
+    FLinesLayout: TLinesLayout;
+    FRectangle: TRectangle;
+    FMemo: TMemo;
+    FFontColor: TAlphaColor;
+    FFontColorCurrentLine: TAlphaColor;
+    FFontSize: Single;
+    FLineColor: TAlphaColor;
+    FRectWidth: Single;
+    FOldOnViewportPositionChange: TPositionChangeEvent;
+    procedure SetMemo(const AValue: TMemo);
+    procedure SetFontColor(AValue: TAlphaColor);
+    procedure SetFontColorCurrentLine(AValue: TAlphaColor);
+    procedure SetLineColor(AValue: TAlphaColor);
+    procedure SetFontSize(AValue: Single);
+    procedure SetRectWidth(AValue: Single);
+    procedure ApplyStyleLookup(Sender: TObject);
+    procedure LineNumberPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
+    procedure MemoViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
+  public
+    property Memo: TMemo read FMemo write SetMemo;
+    property FontColor: TAlphaColor read FFontColor write SetFontColor;
+    property FontColorCurrentLine: TAlphaColor read FFontColorCurrentLine write SetFontColorCurrentLine;
+    property LineColor: TAlphaColor read FLineColor write SetLineColor;
+    property FontSize: Single read FFontSize write SetFontSize;
+    property RectWidth: Single read FRectWidth write SetRectWidth;
+  public
+    constructor Create(AOwner: TComponent); overload; override;
+    constructor Create(AOwner: TComponent; AMemo: TMemo); reintroduce; overload;
+    destructor Destroy; override;
+  end;
+
+implementation
+
+uses Logger;
+
+constructor TLinesMemoUtil.Create(AOwner: TComponent);
+begin
+  inherited;
+  FStyleMemo := nil;
+  FFontColorCurrentLine := $FF33CC33;
+  FFontColor := $FF808080;
+  FFontSize := 11;
+  FLineColor := $80808080;
+  FRectWidth := 40;
+  FOldOnViewportPositionChange := nil;
+end;
+
+constructor TLinesMemoUtil.Create(AOwner: TComponent; AMemo: TMemo);
+begin
+  Create(AOwner);
+  SetMemo(AMemo);
+end;
+
+destructor TLinesMemoUtil.Destroy;
+begin
+  inherited;
+end;
+
+procedure TLinesMemoUtil.SetMemo(const AValue: TMemo);
+begin
+  if FMemo = AValue then
+    Exit;
+  FMemo := AValue;
+  FMemo.OnApplyStyleLookup := ApplyStyleLookup;
+  FOldOnViewportPositionChange := FMemo.OnViewportPositionChange;
+  FMemo.OnViewportPositionChange := MemoViewportPositionChange;
+  if FStyleMemo = nil then
+  begin
+    FMemo.EnumObjects(
+      function(obj: TFmxObject): TEnumProcResult
+      begin
+        if obj is TStyledMemo then
+        begin
+          FStyleMemo := TStyledMemo(obj);
+          FLinesLayout := FStyleMemo.Editor.LinesLayout;
+          Result := TEnumProcResult.Stop;
+        end
+        else
+        begin
+          Result := TEnumProcResult.Continue;
+        end;
+      end);
+  end;
+end;
+
+procedure TLinesMemoUtil.SetFontColor(AValue: TAlphaColor);
+begin
+  if FFontColor = AValue then
+    Exit;
+  FFontColor := AValue;
+  FRectangle.Repaint;
+end;
+
+procedure TLinesMemoUtil.SetFontColorCurrentLine(AValue: TAlphaColor);
+begin
+  if FFontColorCurrentLine = AValue then
+    Exit;
+  FFontColorCurrentLine := AValue;
+  FRectangle.Repaint;
+end;
+
+procedure TLinesMemoUtil.SetLineColor(AValue: TAlphaColor);
+begin
+  if FLineColor = AValue then
+    Exit;
+  FLineColor := AValue;
+  FRectangle.Stroke.Color := FLineColor;
+end;
+
+procedure TLinesMemoUtil.SetFontSize(AValue: Single);
+begin
+  if FFontSize = AValue then
+    Exit;
+  FFontSize := AValue;
+  FRectangle.Repaint;
+end;
+
+procedure TLinesMemoUtil.SetRectWidth(AValue: Single);
+begin
+  if FRectWidth = AValue then
+    Exit;
+  FRectWidth := AValue;
+  FRectangle.Width := AValue;
+  FMemo.RecalcSize;
+end;
+
+procedure TLinesMemoUtil.ApplyStyleLookup(Sender: TObject);
+var
+  resContent: TFmxObject;
+begin
+  resContent := TFmxObject(Sender).FindStyleResource('content');
+  if resContent <> nil then
+  begin
+    FRectangle := TRectangle.Create(nil);
+    FRectangle.HitTest := False;
+    FRectangle.ClipChildren := True;
+    FRectangle.Sides := [TSide.Right];
+    FRectangle.OnPaint := LineNumberPaint;
+    FRectangle.Fill.Kind := TBrushKind.None;
+    FRectangle.Stroke.Color := FLineColor;
+    FRectangle.Width := FRectWidth;
+    FRectangle.Align := TAlignLayout.Left;
+    FRectangle.StyleName := 'lines';
+    FRectangle.Margins.Rect := RectF(0, TControl(resContent).Margins.Top, 0, TControl(resContent).Margins.Bottom);
+    resContent.Parent.AddObject(FRectangle);
+    FRectangle.BringToFront;
+  end;
+end;
+
+procedure TLinesMemoUtil.LineNumberPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
+var
+  LRect: TRectF;
+begin
+  Canvas.BeginScene;
+  try
+    Canvas.Font.Size := FFontSize;
+    for var i := Max(0, FLinesLayout.FirstVisibleLineIndex) to Min(FLinesLayout.LastVisibleLineIndex, FStyleMemo.Editor.LinesLayout.Count - 1) do
+    begin
+      LRect := RectF(ARect.Left, FLinesLayout[i].Rect.Top - FMemo.ViewportPosition.Y, ARect.Right - 2, FLinesLayout[i].Rect.Bottom - FMemo.ViewportPosition.Y);
+      if i = FMemo.CaretPosition.Line then
+      begin
+        Canvas.Fill.Color := $FF808080;
+        Canvas.FillRect(LRect, 0.2);
+        Canvas.Fill.Color := FFontColorCurrentLine;
+      end
+      else
+      begin
+        Canvas.Fill.Color := FFontColor;
+      end;
+      Canvas.FillText(LRect, IntToStr(i + 1), False, 1.0, [], TTextAlign.Center, TTextAlign.Center);
+    end;
+  finally
+    Canvas.EndScene;
+  end;
+end;
+
+procedure TLinesMemoUtil.MemoViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
+begin
+  FRectangle.Repaint;
+  if Assigned(FOldOnViewportPositionChange) then
+  begin
+    FOldOnViewportPositionChange(Sender, OldViewportPosition, NewViewportPosition, ContentSizeChanged);
+  end;
+end;
+
+end.

+ 448 - 0
utils/Logger.pas

@@ -0,0 +1,448 @@
+{
+# Delphi 日志类(Logger Class for delphi xe)
+- v1.0.3
+- 2024-12-02 by gale
+- https://github.com/higale/LoggerXE
+
+## 方法:
+- Debug:调试,通常在开发中会将其设置为最低的日志级别,用于输出详细的调试信息。
+- Info:信息,用于输出常用的信息,使用较为频繁。
+- Warn:警告,表明会出现潜在错误的情形,虽然程序不会报错,但仍需注意。
+- Error:错误,记录错误和异常信息。
+- Fatal:致命错误,一旦发生,程序基本上需要停止。
+
+## 日志文件位置
+  可以通过设置Root来改变日志文件位置,如果不设置,日志缺省存储在
+- Windows:
+*程序所在目录/log/*
+- MacOS
+*/Users/当前用户/.程序名/log/*
+
+## 注意
+g_Logger实例已经自动创建,可以直接使用
+
+## 使用方法:
+    uses
+      Logger;
+    ...
+    g_Logger.Debug('This is a %s log',['debug'])
+    g_Logger.Error('发生了一些错误!');
+
+    VCL显示日志
+    g_Logger.OnLog := procedure(Sender: TObject; ALevel: TLogLevel; ALevelTag: string; ALog: string; ATime: TDateTime)
+      begin
+        if mmoLog.Lines.Count > 1000 then
+          mmoLog.Text := 'clear...';
+        mmoLog.Lines.Add(Format('%s%s%s', [FormatDateTime('hh:mm:ss', ATime), ALevelTag, ALog]));
+      end;
+
+    FMX显示日志
+    g_Logger.OnLog := procedure(Sender: TObject; ALevel: TLogLevel; ALevelTag: string; ALog: string; ATime: TDateTime)
+      begin
+        if mmoLog.Lines.Count > 1000 then
+          mmoLog.Text := 'clear...';
+        mmoLog.Lines.Add(Format('%s%s%s', [FormatDateTime('hh:mm:ss', ATime), ALevelTag, ALog]));
+        mmoLog.GoToTextEnd;
+      end;
+}
+unit Logger;
+
+// 兼容旧版日志类,可以使用WriteLog函数输出日志
+//{$DEFINE Compatible_Old_Version}
+
+interface
+
+uses
+  System.IOUtils, System.Classes, System.SysUtils, System.SyncObjs;
+
+type
+  /// <summary>日志级别</summary>
+  TLogLevel = (llAll, llDebug, llInfo, llWarn, llError, llFatal, llOff);
+  /// <summary>日志回调事件</summary>
+  TOnLogerLog = reference to procedure(Sender: TObject; ALevel: TLogLevel; ALevelTag: string; ALog: string; ATime: TDateTime);
+
+  /// <summary>日志类</summary>
+  TLogger = class
+  private
+    FCSLock: TCriticalSection;
+    FRoot: string;
+    FSubFormat: string;
+    FFilenameFormat: string;
+    FEncoding: TEncoding;
+    FLevel: TLogLevel;
+    FTimeFormat: string;
+    FTags: array [TLogLevel] of string;
+    FOnLog: TOnLogerLog;
+    procedure SetRoot(AValue: string);
+    procedure Log(ALog: string; const ALogLevel: TLogLevel); overload;
+    procedure Log(ALog: string; const Args: array of const; const LogLevel: TLogLevel); overload;
+  public
+    /// <summary>日志目录,缺省为log,可以是相对或绝对路径</summary>
+    property Root: string read FRoot write SetRoot;
+    /// <summary>子目录格式,缺省为yyyymm(每月一个子目录),为空不使用子目录</summary>
+    property SubFormat: string read FSubFormat write FSubFormat;
+    /// <summary>日志文件名格式,缺省为yyyymmdd(每天一个文件)</summary>
+    property FilenameFormat: string read FFilenameFormat write FFilenameFormat;
+    /// <summary>日志编码格式,缺省UTF8</summary>
+    property Encoding: TEncoding read FEncoding write FEncoding;
+    /// <summary>低于此级别的日志将被忽略,缺省为llAll, llOff为全部忽略</summary>
+    property Level: TLogLevel read FLevel write FLevel;
+    /// <summary>保存日志时间格式,缺省为 'hhnnss'</summary>
+    property TimeFormat: string read FTimeFormat write FTimeFormat;
+    /// <summary>日志触发事件,线程安全</summary>
+    property OnLog: TOnLogerLog read FOnLog write FOnLog;
+    /// <summary>不同日志级别对应的名称标签,缺省为 '[D]', '[I]', '[W]', '[E]', '[F]'</summary>
+    /// <param name="ADebugTag">调试日志标签</param>
+    /// <param name="AInfoTag">信息日志标签</param>
+    /// <param name="AWarnTag">警告日志标签</param>
+    /// <param name="AErrorTag">错误日志标签</param>
+    /// <param name="AFatalTag">致命错误日志标签</param>
+    procedure SetTags(ADebugTag, AInfoTag, AWarnTag, AErrorTag, AFatalTag: string);
+  public
+    /// <summary>构造函数,如无特殊需求,可以直接使用g_Logger,它已经自动初始化,不需要手动创建</summary>
+    constructor Create;
+    /// <summary>析构函数</summary>
+    destructor Destroy; override;
+    /// <summary>输出调试日志</summary>
+    /// <param name="ALog">日志内容</param>
+    procedure Debug(ALog: string); overload;
+    /// <summary>输出调试日志</summary>
+    /// <param name="ALog">包含格式化格式信息的日志数据</param>
+    /// <param name="Args">用于格式化的参数</param>
+    procedure Debug(ALog: string; const Args: array of const); overload;
+    /// <summary>输出信息日志</summary>
+    /// <param name="ALog">日志内容</param>
+    procedure Info(ALog: string); overload;
+    /// <summary>输出信息日志</summary>
+    /// <param name="ALog">包含格式化格式信息的日志数据</param>
+    /// <param name="Args">用于格式化的参数</param>
+    procedure Info(ALog: string; const Args: array of const); overload;
+    /// <summary>输出警告日志</summary>
+    /// <param name="ALog">日志内容</param>
+    procedure Warn(ALog: string); overload;
+    /// <summary>输出警告日志</summary>
+    /// <param name="ALog">包含格式化格式信息的日志数据</param>
+    /// <param name="Args">用于格式化的参数</param>
+    procedure Warn(ALog: string; const Args: array of const); overload;
+    /// <summary>输出错误日志</summary>
+    /// <param name="ALog">日志内容</param>
+    procedure Error(ALog: string); overload;
+    /// <summary>输出错误日志</summary>
+    /// <param name="ALog">包含格式化格式信息的日志数据</param>
+    /// <param name="Args">用于格式化的参数</param>
+    procedure Error(ALog: string; const Args: array of const); overload;
+    /// <summary>输出致命错误日志</summary>
+    /// <param name="ALog">日志内容</param>
+    procedure Fatal(ALog: string); overload;
+    /// <summary>输出致命错误日志</summary>
+    /// <param name="ALog">包含格式化格式信息的日志数据</param>
+    /// <param name="Args">用于格式化的参数</param>
+    procedure Fatal(ALog: string; const Args: array of const); overload;
+{$IFDEF Compatible_Old_Version}
+    /// <summary>输出日志 【警告】不建议使用此函数! 此函数仅为兼容旧版本程序</summary>
+    /// <param name="ALog">日志内容</param>
+    /// <param name="ALogLevel">日志级别 0:信息 1,2:警告 other:错误</param>
+    procedure WriteLog(ALog: String; const ALogLevel: integer = 0); overload;
+      deprecated '函数 WriteLog 已不建议使用,请直接使用语义更清晰的 Debug、Info、Warn、Error或Fatal 函数输出日志';
+    /// <summary>输出日志 【警告】不建议使用此函数! 此函数仅为兼容旧版本程序</summary>
+    /// <param name="ALog">包含格式化格式信息的日志数据</param>
+    /// <param name="Args">用于格式化的参数</param>
+    /// <param name="ALogLevel">日志级别 0:信息 1,2:警告 other:错误</param>
+    procedure WriteLog(ALog: String; const Args: array of const; const ALogLevel: integer = 0); overload;
+      deprecated '函数 WriteLog 已不建议使用,请直接使用语义更清晰的 Debug、Info、Warn、Error或Fatal 函数输出日志';
+{$ENDIF}
+  end;
+
+var
+  g_Logger: TLogger;
+
+implementation
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Create
+  说明: 构造函数
+------------------------------------------------------------------------------ } constructor TLogger.Create;
+begin
+  inherited Create;
+  FCSLock := TCriticalSection.Create;
+{$IFDEF MACOS}
+  FRoot := ExtractFilePath(TPath.GetDocumentsPath) + '.' + ExtractFileName(ParamStr(0)) + PathDelim + 'log' + PathDelim;
+{$ELSE}
+  FRoot := ExtractFilePath(ParamStr(0)) + 'log' + PathDelim;
+{$ENDIF}
+  FSubFormat := 'yyyymm';
+  FFilenameFormat := 'yyyymmdd';
+  FEncoding := TEncoding.UTF8;
+  FLevel := llAll;
+  FTimeFormat := 'hhnnss';
+  SetTags('[D]', '[I]', '[W]', '[E]', '[F]');
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Destroy
+  说明: 析构函数
+------------------------------------------------------------------------------ }
+destructor TLogger.Destroy;
+begin
+  FCSLock.Free;
+  inherited;
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.SetRoot
+  说明: LogDir属性设置函数
+  参数: AValue
+------------------------------------------------------------------------------ }
+procedure TLogger.SetRoot(AValue: string);
+begin
+  FRoot := ExpandFileName(AValue);
+  if FRoot[FRoot.Length] <> PathDelim then
+  begin
+    FRoot := FRoot + PathDelim;
+  end;
+  if not ForceDirectories(FRoot) then
+  begin
+    raise Exception.Create('The log file directory cannot be created: ' + FRoot);
+  end;
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.SetLevelTags
+  说明: LevelTags属性设置函数
+  参数: ADebugTag 调试
+        AInfoTag 信息
+        AWarnTag 警告
+        AErrorTag 错误
+------------------------------------------------------------------------------ }
+procedure TLogger.SetTags(ADebugTag, AInfoTag, AWarnTag, AErrorTag, AFatalTag: string);
+begin
+  FTags[llDebug] := ADebugTag;
+  FTags[llInfo] := AInfoTag;
+  FTags[llWarn] := AWarnTag;
+  FTags[llError] := AErrorTag;
+  FTags[llFatal] := AFatalTag;
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Log
+  说明: Log输出函数
+  参数: ALog 包含格式化格式信息的日志数据
+        Args 用于格式化的参数
+        LogLevel 日志级别
+------------------------------------------------------------------------------ }
+procedure TLogger.Log(ALog: string; const Args: array of const; const LogLevel: TLogLevel);
+begin
+  Log(Format(ALog, Args), LogLevel);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Log
+  说明: Log输出函数
+  参数: ALog 日志数据
+        ALogLevel 日志级别
+------------------------------------------------------------------------------ }
+procedure TLogger.Log(ALog: string; const ALogLevel: TLogLevel);
+var
+  FullDir, SubDir: string;
+  logFileName: string;
+  strLogAll: string;
+  LogLevelTag: string;
+  LogTime: TDateTime;
+begin
+  if ALogLevel >= FLevel then
+  begin
+    LogTime := Now;
+    LogLevelTag := FTags[ALogLevel];
+    logFileName := FormatDateTime(FFilenameFormat, LogTime) + '.log';
+    FullDir := FRoot;
+    if FSubFormat <> '' then
+    begin
+      SubDir := FormatDateTime(FSubFormat, LogTime);
+      FullDir := FRoot + SubDir + PathDelim;
+    end;
+    strLogAll := Format('%s%s%s' + sLineBreak, [FormatDateTime(FTimeFormat, LogTime), LogLevelTag, ALog]);
+    FCSLock.Enter;
+    try
+      if not DirectoryExists(FullDir) then
+      begin
+        ForceDirectories(FullDir);
+      end;
+      try
+        TFile.AppendAllText(FullDir + logFileName, strLogAll, FEncoding);
+      except
+      end;
+    finally
+      FCSLock.Leave;
+    end;
+
+    if Assigned(FOnLog) then
+    begin
+      TThread.Synchronize(TThread.CurrentThread,
+        procedure
+        begin
+          FOnLog(self, ALogLevel, FTags[ALogLevel], ALog, LogTime);
+        end);
+    end;
+  end;
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Debug
+  说明: 调试日志
+  参数: ALog 日志数据
+------------------------------------------------------------------------------ }
+procedure TLogger.Debug(ALog: string);
+begin
+  Log(ALog, llDebug);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Debug
+  说明: 调试日志
+  参数: ALog 包含格式化格式信息的日志数据
+        Args 用于格式化的参数
+------------------------------------------------------------------------------ }
+procedure TLogger.Debug(ALog: string; const Args: array of const);
+begin
+  Log(ALog, Args, llDebug);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Info
+  说明: 信息日志
+  参数: ALog 日志数据
+------------------------------------------------------------------------------ }
+procedure TLogger.Info(ALog: string);
+begin
+  Log(ALog, llInfo);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Info
+  说明: 信息日志
+  参数: ALog 包含格式化格式信息的日志数据
+        Args 用于格式化的参数
+------------------------------------------------------------------------------ }
+procedure TLogger.Info(ALog: string; const Args: array of const);
+begin
+  Log(ALog, Args, llInfo);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Warn
+  说明: 警告日志
+  参数: ALog 日志数据
+------------------------------------------------------------------------------ }
+procedure TLogger.Warn(ALog: string);
+begin
+  Log(ALog, llWarn);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Warn
+  说明: 警告日志
+  参数: ALog 包含格式化格式信息的日志数据
+        Args 用于格式化的参数
+------------------------------------------------------------------------------ }
+procedure TLogger.Warn(ALog: string; const Args: array of const);
+begin
+  Log(ALog, Args, llWarn);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Error
+  说明: 错误日志
+  参数: ALog 日志数据
+------------------------------------------------------------------------------ }
+procedure TLogger.Error(ALog: string);
+begin
+  Log(ALog, llError);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Error
+  说明: 错误日志
+  参数: ALog 包含格式化格式信息的日志数据
+        Args 用于格式化的参数
+------------------------------------------------------------------------------ }
+procedure TLogger.Error(ALog: string; const Args: array of const);
+begin
+  Log(ALog, Args, llError);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Fatal
+  说明: 致命错误日志
+  参数: ALog 日志数据
+------------------------------------------------------------------------------ }
+procedure TLogger.Fatal(ALog: string);
+begin
+  Log(ALog, llFatal);
+end;
+
+{ ------------------------------------------------------------------------------
+  名称: TLogger.Fatal
+  说明: 致命错误日志
+  参数: ALog 包含格式化格式信息的日志数据
+        Args 用于格式化的参数
+------------------------------------------------------------------------------ }
+procedure TLogger.Fatal(ALog: string; const Args: array of const);
+begin
+  Log(ALog, Args, llFatal);
+end;
+{$IFDEF Compatible_Old_Version}
+
+
+{ -------------------------------------------------------------------------------
+  名称: TLogger.WriteLog
+  说明: 旧版本日志输出函数,为兼容保留,不建议使用
+  参数: ALog 日志数据
+        ALogLevel 日志级别
+------------------------------------------------------------------------------- }
+procedure TLogger.WriteLog(ALog: String; const ALogLevel: integer);
+var
+  ALvl: TLogLevel;
+begin
+  case ALogLevel of
+    0:
+      ALvl := llInfo;
+    1, 2:
+      ALvl := llWarn;
+  else
+    ALvl := llError;
+  end;
+  Log(ALog, ALvl);
+end;
+
+{ -------------------------------------------------------------------------------
+  名称: TLogger.WriteLog
+  说明: 旧版本日志输出函数,为兼容保留,不建议使用
+  参数: ALog 包含格式化格式信息的日志数据
+        Args 用于格式化的参数
+        ALogLevel 日志级别
+------------------------------------------------------------------------------- }
+procedure TLogger.WriteLog(ALog: String; const Args: array of const; const ALogLevel: integer);
+var
+  ALvl: TLogLevel;
+begin
+  case ALogLevel of
+    0:
+      ALvl := llInfo;
+    1, 2:
+      ALvl := llWarn;
+  else
+    ALvl := llError;
+  end;
+  Log(ALog, Args, ALvl);
+end;
+{$ENDIF}
+
+initialization
+
+g_Logger := TLogger.Create;
+
+finalization
+
+FreeAndNil(g_Logger);
+
+end.

+ 145 - 0
utils/SaveDialogsEnhanced.pas

@@ -0,0 +1,145 @@
+unit SaveDialogsEnhanced;
+
+interface
+
+uses
+{$IFDEF MACOS}
+  Macapi.AppKit, Macapi.ObjectiveC, Macapi.Foundation, Macapi.Helpers,
+  FMX.Platform.Mac, Macapi.CocoaTypes,
+{$ENDIF}
+  System.SysUtils, System.Classes, FMX.Dialogs, FMX.Types;
+
+type
+  TEnhancedSaveDialog = class(TSaveDialog)
+  private
+    FFileType: string;
+  public
+    constructor Create(AOwner: TComponent); override;
+    function Execute: Boolean; override;
+
+    property FileType: string read FFileType;
+  end;
+
+implementation
+
+{ TEnhancedSaveDialog }
+
+constructor TEnhancedSaveDialog.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+end;
+
+function TEnhancedSaveDialog.Execute: Boolean;
+{$IFDEF MACOS}
+const
+  NSControlStateValueOn = 1;
+var
+  SavePanel: NSSavePanel;
+  AccessoryView: NSView;
+  FileTypeLabel: NSTextField;
+  FileTypeCombo: NSPopUpButton;
+  Response: NSInteger;
+  FilterParts: TArray<string>;
+  i: Integer;
+{$ENDIF}
+begin
+
+{$IFDEF MACOS}
+  // 在 macOS 上使用自定义实现
+  Result := False;
+  try
+    // 创建保存面板
+    SavePanel := TNSSavePanel.Wrap(TNSSavePanel.OCClass.SavePanel);
+
+    // 设置基本属性
+    if FileName <> '' then
+      SavePanel.setNameFieldStringValue(StrToNSStr(ExtractFileName(FileName)));
+
+    if InitialDir <> '' then
+      SavePanel.setDirectoryURL(TNSUrl.Wrap(TNSUrl.OCClass.fileURLWithPath(StrToNSStr(InitialDir))));
+
+    // 创建AccessoryView
+    AccessoryView := TNSView.Create;
+    AccessoryView.initWithFrame(NSMakeRect(0, 0, 350, 50));
+
+    // 文件类型下拉框
+    FileTypeLabel := TNSTextField.Create;
+    FileTypeLabel.initWithFrame(NSMakeRect(43, 15, 80, 20));
+    FileTypeLabel.setStringValue(StrToNSStr('类型:'));
+    FileTypeLabel.setBezeled(False);
+    FileTypeLabel.setDrawsBackground(False);
+    FileTypeLabel.setEditable(False);
+    FileTypeLabel.setSelectable(False);
+    AccessoryView.addSubview(FileTypeLabel);
+    FileTypeCombo := TNSPopUpButton.Create;
+    FileTypeCombo.initWithFrame(NSMakeRect(78, 15, 245, 20), False);
+    
+    // 解析 Filter 并添加到下拉框
+    if Filter <> '' then
+    begin
+      FilterParts := Filter.Split(['|']);
+      // Filter 格式为: "描述|扩展名|描述|扩展名|..."
+      i := 0;
+      while i < Length(FilterParts) - 1 do
+      begin
+        if (i mod 2 = 0) and (i + 1 < Length(FilterParts)) then
+        begin
+          // 组合描述和扩展名
+          FileTypeCombo.addItemWithTitle(StrToNSStr(FilterParts[i] + ' (' + FilterParts[i + 1] + ')'));
+        end;
+        Inc(i, 2);
+      end;
+    end;
+    
+    // 如果没有 Filter 或解析失败,添加默认选项
+    if FileTypeCombo.numberOfItems = 0 then
+    begin
+      FileTypeCombo.addItemWithTitle(StrToNSStr('所有文件 (*.*)'));
+    end;
+    
+    // 设置默认选择,基于 FilterIndex(从1开始)
+    if (FilterIndex > 0) and (FilterIndex <= FileTypeCombo.numberOfItems) then
+    begin
+      FileTypeCombo.selectItemAtIndex(FilterIndex - 1);
+    end
+    else
+    begin
+      FileTypeCombo.selectItemAtIndex(0);
+    end;
+      
+    AccessoryView.addSubview(FileTypeCombo);
+
+    SavePanel.setAccessoryView(AccessoryView);
+
+    // 显示保存面板
+    Response := SavePanel.runModal;
+    if Response = NSModalResponseOK then
+    begin
+      Result := True;
+
+      // 获取选择的文件名
+      FileName := NSStrToStr(SavePanel.FileName);
+
+      // 保存用户的选择
+      FFileType := NSStrToStr(FileTypeCombo.titleOfSelectedItem);
+      
+      // 更新 FilterIndex(从1开始)
+      FilterIndex := FileTypeCombo.indexOfSelectedItem + 1;
+    end;
+
+  except
+    on E: Exception do
+    begin
+      // 如果自定义实现失败,回退到标准实现
+      Result := inherited Execute;
+    end;
+  end;
+{$ELSE}
+  // 在非 macOS 平台上使用标准实现
+  Result := inherited Execute;
+{$ENDIF}
+end;
+
+initialization
+
+end.

+ 333 - 0
utils/WinSizeUtil.pas

@@ -0,0 +1,333 @@
+{
+  无标题窗口size控制
+  v0.3
+  by gale 2024-11-24
+}
+unit WinSizeUtil;
+
+interface
+
+uses
+  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
+  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.Edit;
+
+type
+
+  TWinSizeHelper = class(TComponent)
+  private const
+    c_CheckWidth = 5;
+  private type
+    TSizeType = (stNone, stLeft, stLeftTop, stTop, stRightTop, stRight, stRightBottom, stBottom, stLeftBottom);
+  private
+    FForm: TForm;
+    FControl: TControl;
+    FTitleBar: TControl;
+    FSizeType: TSizeType;
+    FCanMaximized: Boolean;
+  private
+    FOldMouseDown: TMouseEvent;
+    FOldMouseUp: TMouseEvent;
+    FOldMouseLeave: TNotifyEvent;
+    FOldMouseMove: TMouseMoveEvent;
+    FOldRectF: TRectF;
+    FOldCursor: TCursor;
+    procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
+    procedure MouseLeave(Sender: TObject);
+  public
+    property CanMaximized: Boolean read FCanMaximized write FCanMaximized;
+  private
+    FIsMouseDown_TitleBar: Boolean;
+    FOldFormPos_TitleBar: TPoint;
+    FOldMousePos_TitleBar: TPointF;
+    FOldMouseDown_TitleBar: TMouseEvent;
+    FOldMouseUp_TitleBar: TMouseEvent;
+    FOldMouseMove_TitleBar: TMouseMoveEvent;
+    FOldDBClick_TitleBar: TNotifyEvent;
+    procedure TitleBarMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
+    procedure TitleBarMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure TitleBarMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+    procedure TitleBarDblClick(Sender: TObject);
+  private
+    function CalcSizeType(X, Y: Single): TSizeType;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure SetControlled(AValue: TControl);
+    procedure SetTitleBar(AValue: TControl);
+  end;
+
+implementation
+
+{ TWinSizeHelper }
+
+constructor TWinSizeHelper.Create(AOwner: TComponent);
+begin
+  inherited;
+  FForm := nil;
+  FSizeType := stNone;
+  FIsMouseDown_TitleBar := False;
+  FCanMaximized := False;
+end;
+
+destructor TWinSizeHelper.Destroy;
+begin
+  inherited;
+end;
+
+function TWinSizeHelper.CalcSizeType(X, Y: Single): TSizeType;
+var
+  Width, Height: Single;
+begin
+  Width := FControl.Width;
+  Height := FControl.Height;
+  if (X < c_CheckWidth * 3) and (Y < c_CheckWidth * 3) then
+    Result := stLeftTop
+  else if (X > Width - c_CheckWidth * 3) and (Y < c_CheckWidth * 3) then
+    Result := stRightTop
+  else if (X > Width - c_CheckWidth * 3) and (Y > Height - c_CheckWidth * 3) then
+    Result := stRightBottom
+  else if (X < c_CheckWidth * 3) and (Y > Height - c_CheckWidth * 3) then
+    Result := stLeftBottom
+  else if X < c_CheckWidth then
+    Result := stLeft
+  else if X > Width - c_CheckWidth then
+    Result := stRight
+  else if Y < c_CheckWidth then
+    Result := stTop
+  else if Y > Height - c_CheckWidth then
+    Result := stBottom
+  else
+    Result := stNone;
+end;
+
+procedure TWinSizeHelper.SetControlled(AValue: TControl);
+begin
+  if FControl = AValue then
+    Exit;
+  FControl := AValue;
+  FForm := FControl.Root as TForm;
+  FOldCursor := FControl.Cursor;
+  FControl.AutoCapture := True;
+
+  FOldMouseDown := FControl.OnMouseDown;
+  FOldMouseUp := FControl.OnMouseUp;
+  FOldMouseLeave := FControl.OnMouseLeave;
+  FOldMouseMove := FControl.OnMouseMove;
+  FControl.OnMouseDown := MouseDown;
+  FControl.OnMouseUp := MouseUp;
+  FControl.OnMouseMove := MouseMove;
+  FControl.OnMouseLeave := MouseLeave;
+end;
+
+procedure TWinSizeHelper.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  if Button = TMouseButton.mbLeft then
+  begin
+    FOldRectF := FForm.BoundsF;
+    FSizeType := CalcSizeType(X, Y);
+  end;
+  if Assigned(FOldMouseDown) then
+  begin
+    FOldMouseDown(Sender, Button, Shift, X, Y);
+  end;
+end;
+
+procedure TWinSizeHelper.MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  FSizeType := stNone;
+  if Assigned(FOldMouseUp) then
+  begin
+    FOldMouseUp(Sender, Button, Shift, X, Y);
+  end;
+end;
+
+procedure TWinSizeHelper.MouseLeave(Sender: TObject);
+begin
+  FControl.Cursor := crDefault;
+  if Assigned(FOldMouseLeave) then
+  begin
+    FOldMouseLeave(Sender);
+  end;
+end;
+
+procedure TWinSizeHelper.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
+begin
+  if FSizeType <> stNone then
+  begin
+    case FSizeType of
+      stLeft:
+        begin
+          FOldRectF.Left := Screen.MousePos.X - FControl.Position.X - c_CheckWidth / 2;
+          if FOldRectF.Width < FForm.Constraints.MinWidth then
+            FOldRectF.Left := FOldRectF.Right - FForm.Constraints.MinWidth;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+      stTop:
+        begin
+          FOldRectF.Top := Screen.MousePos.Y - FControl.Position.Y - c_CheckWidth / 2;;
+          if FOldRectF.Height < FForm.Constraints.MinHeight then
+            FOldRectF.Top := FOldRectF.Bottom - FForm.Constraints.MinHeight;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+      stRight:
+        begin
+          FOldRectF.Right := Screen.MousePos.X + (FForm.BoundsF.Width - FControl.Position.X - FControl.Width) + c_CheckWidth / 2;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+      stBottom:
+        begin
+          FOldRectF.Bottom := Screen.MousePos.Y + (FForm.BoundsF.Height - FControl.Position.Y - FControl.Height) + c_CheckWidth / 2;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+      stLeftTop:
+        begin
+          FOldRectF.Left := Screen.MousePos.X - FControl.Position.X - c_CheckWidth / 2;
+          FOldRectF.Top := Screen.MousePos.Y - FControl.Position.Y - c_CheckWidth / 2;;
+          if FOldRectF.Width < FForm.Constraints.MinWidth then
+            FOldRectF.Left := FOldRectF.Right - FForm.Constraints.MinWidth;
+          if FOldRectF.Height < FForm.Constraints.MinHeight then
+            FOldRectF.Top := FOldRectF.Bottom - FForm.Constraints.MinHeight;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+      stRightTop:
+        begin
+          FOldRectF.Right := Screen.MousePos.X + (FForm.BoundsF.Width - FControl.Position.X - FControl.Width) + c_CheckWidth / 2;
+          FOldRectF.Top := Screen.MousePos.Y - FControl.Position.Y - c_CheckWidth / 2;;
+          if FOldRectF.Height < FForm.Constraints.MinHeight then
+            FOldRectF.Top := FOldRectF.Bottom - FForm.Constraints.MinHeight;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+      stRightBottom:
+        begin
+          FOldRectF.Right := Screen.MousePos.X + (FForm.BoundsF.Width - FControl.Position.X - FControl.Width) + c_CheckWidth / 2;
+          FOldRectF.Bottom := Screen.MousePos.Y + (FForm.BoundsF.Height - FControl.Position.Y - FControl.Height) + c_CheckWidth / 2;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+      stLeftBottom:
+        begin
+          FOldRectF.Left := Screen.MousePos.X - FControl.Position.X - c_CheckWidth / 2;
+          FOldRectF.Bottom := Screen.MousePos.Y + (FForm.BoundsF.Height - FControl.Position.Y - FControl.Height) + c_CheckWidth / 2;
+          if FOldRectF.Width < FForm.Constraints.MinWidth then
+            FOldRectF.Left := FOldRectF.Right - FForm.Constraints.MinWidth;
+          FForm.SetBoundsF(FOldRectF);
+        end;
+    end;
+  end
+  else
+  begin
+    case CalcSizeType(X, Y) of
+      stLeft, stRight:
+        FControl.Cursor := crSizeWE;
+      stTop, stBottom:
+        FControl.Cursor := crSizeNS;
+      stLeftTop, stRightBottom:
+        FControl.Cursor := crSizeNWSE;
+      stRightTop, stLeftBottom:
+        FControl.Cursor := crSizeNESW;
+    else
+      FControl.Cursor := FOldCursor;
+    end;
+  end;
+
+  if Assigned(FOldMouseMove) then
+  begin
+    FOldMouseMove(Sender, Shift, X, Y);
+  end;
+end;
+
+procedure TWinSizeHelper.SetTitleBar(AValue: TControl);
+begin
+  if FTitleBar = AValue then
+    Exit;
+  FTitleBar := AValue;
+  if FForm = nil then
+    FForm := FTitleBar.Root as TForm;
+  FOldMouseDown_TitleBar := FTitleBar.OnMouseDown;
+  FTitleBar.OnMouseDown := TitleBarMouseDown;
+  FOldMouseUp_TitleBar := FTitleBar.OnMouseUp;
+  FTitleBar.OnMouseUp := TitleBarMouseUp;
+  FOldMouseMove_TitleBar := FTitleBar.OnMouseMove;
+  FTitleBar.OnMouseMove := TitleBarMouseMove;
+  FOldDBClick_TitleBar := FTitleBar.OnDblClick;
+  FTitleBar.OnDblClick := TitleBarDblClick;
+
+  FTitleBar.AutoCapture := True;
+end;
+
+procedure TWinSizeHelper.TitleBarMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  if (Button = TMouseButton.mbLeft) then
+  begin
+    FIsMouseDown_TitleBar := True;
+    FOldFormPos_TitleBar.X := FForm.Left;
+    FOldFormPos_TitleBar.Y := FForm.Top;
+    FOldMousePos_TitleBar := Screen.MousePos;
+  end;
+  if Assigned(FOldMouseDown_TitleBar) then
+  begin
+    FOldMouseDown_TitleBar(Sender, Button, Shift, X, Y);
+  end;
+end;
+
+procedure TWinSizeHelper.TitleBarMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
+begin
+  if (ssLeft in Shift) and FIsMouseDown_TitleBar then
+  begin
+    if FForm.WindowState = TWindowState.wsMaximized then
+    begin
+      if (ABS(FOldMousePos_TitleBar.X - Screen.MousePos.X) > 10) or (ABS(FOldMousePos_TitleBar.Y - Screen.MousePos.Y) > 10) then
+      begin
+        FForm.WindowState := TWindowState.wsNormal;
+        FOldFormPos_TitleBar.X := Round(Screen.MousePos.X - FForm.Width / 2);
+        FForm.Left := FOldFormPos_TitleBar.X + Round(Screen.MousePos.X - FOldMousePos_TitleBar.X);
+        FForm.Top := FOldFormPos_TitleBar.Y + Round(Screen.MousePos.Y - FOldMousePos_TitleBar.Y);
+      end;
+    end
+    else
+    begin
+      FForm.Left := FOldFormPos_TitleBar.X + Round(Screen.MousePos.X - FOldMousePos_TitleBar.X);
+      FForm.Top := FOldFormPos_TitleBar.Y + Round(Screen.MousePos.Y - FOldMousePos_TitleBar.Y);
+    end;
+  end;
+
+  if Assigned(FOldMouseMove_TitleBar) then
+  begin
+    FOldMouseMove_TitleBar(Sender, Shift, X, Y);
+  end;
+end;
+
+procedure TWinSizeHelper.TitleBarMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
+begin
+  FIsMouseDown_TitleBar := False;
+  if Assigned(FOldMouseUp_TitleBar) then
+  begin
+    FOldMouseUp_TitleBar(Sender, Button, Shift, X, Y);
+  end;
+end;
+
+procedure TWinSizeHelper.TitleBarDblClick(Sender: TObject);
+begin
+  if FCanMaximized then
+  begin
+    FIsMouseDown_TitleBar := False;
+    if FForm.WindowState = TWindowState.wsMaximized then
+    begin
+      FForm.WindowState := TWindowState.wsNormal;
+    end
+    else
+    begin
+      FForm.WindowState := TWindowState.wsMaximized;
+    end;
+  end;
+
+  if Assigned(FOldDBClick_TitleBar) then
+  begin
+    FOldDBClick_TitleBar(Sender);
+  end;
+
+end;
+
+end.

+ 468 - 0
utils/fmFontDialog.fmx

@@ -0,0 +1,468 @@
+object FontDialog: TFontDialog
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  BorderStyle = Single
+  Caption = 'Text Settings'
+  ClientHeight = 458
+  ClientWidth = 518
+  Position = ScreenCenter
+  Transparency = True
+  FormFactor.Width = 320
+  FormFactor.Height = 480
+  FormFactor.Devices = [Desktop]
+  OnCreate = FormCreate
+  DesignerMasterStyle = 0
+  object pnlSizeBorder: TPanel
+    Align = Client
+    Size.Width = 518.000000000000000000
+    Size.Height = 458.000000000000000000
+    Size.PlatformDefault = False
+    StyleLookup = 'panelstyle_radius'
+    TabOrder = 0
+    object btnCancel: TButton
+      ModalResult = 2
+      Position.X = 412.000000000000000000
+      Position.Y = 415.000000000000000000
+      TabOrder = 9
+      Text = 'Cancel'
+      TextSettings.Trimming = None
+    end
+    object Button1: TButton
+      ModalResult = 1
+      Position.X = 324.000000000000000000
+      Position.Y = 415.000000000000000000
+      TabOrder = 10
+      Text = 'OK'
+      TextSettings.Trimming = None
+    end
+    object chkWordWrap: TCheckBox
+      Position.X = 66.000000000000000000
+      Position.Y = 428.000000000000000000
+      Size.Width = 95.000000000000000000
+      Size.Height = 19.000000000000000000
+      Size.PlatformDefault = False
+      TabOrder = 47
+      Text = 'WordWrap'
+      OnChange = chkWordWrapChange
+    end
+    object cpnlFontColor: TColorPanel
+      Color = claWhite
+      Position.X = 334.000000000000000000
+      Position.Y = 164.000000000000000000
+      Size.Width = 154.000000000000000000
+      Size.Height = 111.000000000000000000
+      Size.PlatformDefault = False
+      TabOrder = 13
+      OnChange = cpnlFontColorChange
+    end
+    object edtFontColor: TEdit
+      Touch.InteractiveGestures = [LongTap, DoubleTap]
+      TabOrder = 39
+      ReadOnly = True
+      TextSettings.HorzAlign = Center
+      Position.X = 346.000000000000000000
+      Position.Y = 278.000000000000000000
+      Size.Width = 113.000000000000000000
+      Size.Height = 22.000000000000000000
+      Size.PlatformDefault = False
+      OnChange = edtFontColorChange
+    end
+    object edtFontName: TEdit
+      Touch.InteractiveGestures = [LongTap, DoubleTap]
+      TabOrder = 7
+      Position.X = 31.000000000000000000
+      Position.Y = 69.000000000000000000
+      Size.Width = 189.000000000000000000
+      Size.Height = 22.000000000000000000
+      Size.PlatformDefault = False
+      OnChange = edtFontNameChange
+    end
+    object edtFontSize: TEdit
+      Touch.InteractiveGestures = [LongTap, DoubleTap]
+      TabOrder = 3
+      Position.X = 233.000000000000000000
+      Position.Y = 69.000000000000000000
+      Size.Width = 80.000000000000000000
+      Size.Height = 22.000000000000000000
+      Size.PlatformDefault = False
+      OnChange = edtFontSizeChange
+    end
+    object GroupBox1: TGroupBox
+      Enabled = False
+      Position.X = 25.000000000000000000
+      Position.Y = 312.000000000000000000
+      Size.Width = 200.000000000000000000
+      Size.Height = 108.000000000000000000
+      Size.PlatformDefault = False
+      Text = 'Align'
+      TabOrder = 12
+      object cbbHorzAlign: TComboBox
+        Items.Strings = (
+          'Leading'
+          'Center'
+          'Trailing')
+        Position.X = 89.000000000000000000
+        Position.Y = 16.000000000000000000
+        Size.Width = 104.000000000000000000
+        Size.Height = 22.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 39
+        OnChange = cbbTextAlignChange
+      end
+      object cbbVertAlign: TComboBox
+        Items.Strings = (
+          'Leading'
+          'Center'
+          'Trailing')
+        Position.X = 88.000000000000000000
+        Position.Y = 46.000000000000000000
+        Size.Width = 104.000000000000000000
+        Size.Height = 22.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 38
+        OnChange = cbbTextAlignChange
+      end
+      object Label2: TLabel
+        Position.X = 15.000000000000000000
+        Position.Y = 19.000000000000000000
+        Size.Width = 66.000000000000000000
+        Size.Height = 17.000000000000000000
+        Size.PlatformDefault = False
+        Text = 'HorzAlign:'
+        TabOrder = 42
+      end
+      object Label3: TLabel
+        Position.X = 18.000000000000000000
+        Position.Y = 49.000000000000000000
+        Size.Width = 66.000000000000000000
+        Size.Height = 17.000000000000000000
+        Size.PlatformDefault = False
+        Text = 'VertAlign:'
+        TabOrder = 41
+      end
+      object Label4: TLabel
+        Position.X = 15.000000000000000000
+        Position.Y = 78.000000000000000000
+        Size.Width = 66.000000000000000000
+        Size.Height = 17.000000000000000000
+        Size.PlatformDefault = False
+        TextSettings.Trimming = None
+        Text = 'Trimming:'
+        TabOrder = 40
+      end
+      object cbbTrimming: TComboBox
+        Items.Strings = (
+          'None'
+          'Character'
+          'Word')
+        Position.X = 89.000000000000000000
+        Position.Y = 75.000000000000000000
+        Size.Width = 103.000000000000000000
+        Size.Height = 22.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 43
+      end
+    end
+    object grp1: TGroupBox
+      Enabled = False
+      Position.X = 328.000000000000000000
+      Position.Y = 44.000000000000000000
+      Size.Width = 154.000000000000000000
+      Size.Height = 112.000000000000000000
+      Size.PlatformDefault = False
+      Text = 'Font Style'
+      TabOrder = 5
+      object chkBold: TCheckBox
+        StyledSettings = [FontColor]
+        Hint = 'Bold'
+        Position.X = 18.000000000000000000
+        Position.Y = 21.000000000000000000
+        Size.Width = 111.000000000000000000
+        Size.Height = 19.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 41
+        Text = 'Bold'
+        TextSettings.Font.Size = 13.000000000000000000
+        TextSettings.Font.StyleExt = {00070000000000000004000000}
+        OnChange = chkFontStyleChange
+      end
+      object chkItalic: TCheckBox
+        StyledSettings = [FontColor]
+        Hint = 'Italic'
+        Position.X = 18.000000000000000000
+        Position.Y = 42.000000000000000000
+        Size.Width = 119.000000000000000000
+        Size.Height = 19.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 40
+        Text = 'Italic'
+        TextSettings.Font.Size = 13.000000000000000000
+        TextSettings.Font.StyleExt = {00040000000200000004000000}
+        OnChange = chkFontStyleChange
+      end
+      object chkUnderline: TCheckBox
+        StyledSettings = [FontColor]
+        Hint = 'Underline'
+        Position.X = 18.000000000000000000
+        Position.Y = 63.000000000000000000
+        Size.Width = 119.000000000000000000
+        Size.Height = 19.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 39
+        Text = 'UnderLine'
+        TextSettings.Font.Size = 13.000000000000000000
+        TextSettings.Font.StyleExt = {04040000000000000004000000}
+        OnChange = chkFontStyleChange
+      end
+      object chkStrikeOut: TCheckBox
+        StyledSettings = [FontColor]
+        Hint = 'StrikeOut'
+        Position.X = 18.000000000000000000
+        Position.Y = 85.000000000000000000
+        Size.Width = 119.000000000000000000
+        Size.Height = 19.000000000000000000
+        Size.PlatformDefault = False
+        TabOrder = 38
+        Text = 'StrikeOut'
+        TextSettings.Font.Size = 13.000000000000000000
+        TextSettings.Font.StyleExt = {08040000000000000004000000}
+        OnChange = chkFontStyleChange
+      end
+    end
+    object grp2: TGroupBox
+      Position.X = 226.000000000000000000
+      Position.Y = 312.000000000000000000
+      Size.Width = 276.000000000000000000
+      Size.Height = 80.000000000000000000
+      Size.PlatformDefault = False
+      Text = 'Demo'
+      TabOrder = 11
+      object txtDemo: TText
+        Anchors = [akLeft, akTop, akRight, akBottom]
+        Position.X = 8.000000000000000000
+        Position.Y = 18.000000000000000000
+        Size.Width = 261.000000000000000000
+        Size.Height = 57.000000000000000000
+        Size.PlatformDefault = False
+        Text = 'ABcd123'#20013#25991'!?'
+      end
+    end
+    object Label1: TLabel
+      Position.X = 233.000000000000000000
+      Position.Y = 44.000000000000000000
+      Size.Width = 78.000000000000000000
+      Size.Height = 17.000000000000000000
+      Size.PlatformDefault = False
+      Text = 'Font Size'
+      TabOrder = 1
+    end
+    object Label5: TLabel
+      Position.X = 31.000000000000000000
+      Position.Y = 44.000000000000000000
+      Size.Width = 78.000000000000000000
+      Size.Height = 17.000000000000000000
+      Size.PlatformDefault = False
+      Text = 'Family Name'
+      TabOrder = 0
+    end
+    object lstFontName: TListBox
+      Position.X = 31.000000000000000000
+      Position.Y = 91.000000000000000000
+      Size.Width = 189.000000000000000000
+      Size.Height = 209.000000000000000000
+      Size.PlatformDefault = False
+      TabOrder = 6
+      DisableFocusEffect = True
+      DefaultItemStyles.ItemStyle = ''
+      DefaultItemStyles.GroupHeaderStyle = ''
+      DefaultItemStyles.GroupFooterStyle = ''
+      OnChange = lstFontNameChange
+      Viewport.Width = 185.000000000000000000
+      Viewport.Height = 205.000000000000000000
+    end
+    object lstFontSize: TListBox
+      Position.X = 233.000000000000000000
+      Position.Y = 91.000000000000000000
+      Size.Width = 80.000000000000000000
+      Size.Height = 209.000000000000000000
+      Size.PlatformDefault = False
+      TabOrder = 2
+      DisableFocusEffect = True
+      Items.Strings = (
+        '5'
+        '5.5'
+        '6.5'
+        '7.5'
+        '8'
+        '9'
+        '10'
+        '11'
+        '12'
+        '14'
+        '16'
+        '18'
+        '20'
+        '22'
+        '24'
+        '26'
+        '28'
+        '36'
+        '48'
+        '72')
+      DefaultItemStyles.ItemStyle = ''
+      DefaultItemStyles.GroupHeaderStyle = ''
+      DefaultItemStyles.GroupFooterStyle = ''
+      OnChange = lstFontSizeChange
+      Viewport.Width = 60.000000000000000000
+      Viewport.Height = 205.000000000000000000
+    end
+    object rctTitleBar: TRectangle
+      Align = MostTop
+      Corners = [TopLeft, TopRight]
+      Fill.Color = x80808080
+      HitTest = False
+      Margins.Left = 1.000000000000000000
+      Margins.Top = 1.000000000000000000
+      Margins.Right = 1.000000000000000000
+      Position.X = 1.000000000000000000
+      Position.Y = 1.000000000000000000
+      Size.Width = 516.000000000000000000
+      Size.Height = 34.000000000000000000
+      Size.PlatformDefault = False
+      Stroke.Thickness = 0.000000000000000000
+      XRadius = 5.000000000000000000
+      YRadius = 5.000000000000000000
+      object rctTitleBarForMove: TRectangle
+        Align = Client
+        Corners = [TopLeft, TopRight]
+        Fill.Kind = None
+        Locked = True
+        Margins.Left = 1.000000000000000000
+        Margins.Top = 1.000000000000000000
+        Margins.Right = 1.000000000000000000
+        Size.Width = 514.000000000000000000
+        Size.Height = 33.000000000000000000
+        Size.PlatformDefault = False
+        Stroke.Kind = None
+        XRadius = 15.000000000000000000
+        YRadius = 15.000000000000000000
+        object Layout1: TLayout
+          Align = Right
+          Position.X = 377.000000000000000000
+          Size.Width = 137.000000000000000000
+          Size.Height = 33.000000000000000000
+          Size.PlatformDefault = False
+          TabOrder = 0
+          object rctBtnClose: TRectangle
+            Align = MostRight
+            Corners = [TopRight]
+            Fill.Color = x00B13B2B
+            Margins.Top = -1.000000000000000000
+            Margins.Right = -1.000000000000000000
+            Position.X = 93.000000000000000000
+            Position.Y = -1.000000000000000000
+            Size.Width = 45.000000000000000000
+            Size.Height = 34.000000000000000000
+            Size.PlatformDefault = False
+            Stroke.Kind = None
+            XRadius = 5.000000000000000000
+            YRadius = 5.000000000000000000
+            OnClick = rctBtnCloseClick
+            object aniForCloseBtn: TColorAnimation
+              Duration = 0.200000002980232200
+              PropertyName = 'Fill.Color'
+              StartValue = x00B13B2B
+              StopValue = xFFB13B2B
+              Trigger = 'IsMouseOver=true'
+              TriggerInverse = 'IsMouseOver=false'
+            end
+            object pathCloseBtn: TPath
+              Align = Center
+              Data.Path = {
+                2200000000000000B4AB0C4400000044010000002F1242440A33954302000000
+                07924544B0338E430200000006924544FCDA8243020000002F12424443B77743
+                0200000082923E44E6B769430200000028E63844E6B76943020000007B663544
+                43B777430100000000000044F0A7E6430100000009339543F2B5774302000000
+                68338E430CB7694302000000C0DA824358B76943020000009AB677439AB67743
+                02000000B4B76943EEDA82430200000000B8694396338E430200000041B77743
+                093395430100000097A8E643000000440100000041B777437B66354402000000
+                E4B7694328E6384402000000E4B7694382923E440200000041B777432F124244
+                02000000FBDA82430792454402000000B0338E43069245440200000009339543
+                2F1242440100000000000044B4AB0C44010000007B6635442F12424402000000
+                28E63844069245440200000082923E4407924544020000002F1242442F124244
+                020000000792454482923E44020000000792454428E63844020000002F124244
+                7B66354401000000B4AB0C440000004403000000B4AB0C4400000044}
+              Locked = True
+              HitTest = False
+              Size.Width = 10.000000000000000000
+              Size.Height = 12.000000000000000000
+              Size.PlatformDefault = False
+              Stroke.Kind = None
+              WrapMode = Fit
+            end
+          end
+        end
+        object lblCaption: TLabel
+          Position.X = 37.000000000000000000
+          Position.Y = 8.000000000000000000
+          Size.Width = 116.000000000000000000
+          Size.Height = 17.000000000000000000
+          Size.PlatformDefault = False
+          Text = 'Text Settings'
+          TabOrder = 1
+        end
+      end
+      object Path4: TPath
+        Data.Path = {
+          6000000000000000000066440000D0430100000000001A440000D04302000000
+          66E618440000D0430200000000001844CDCCD14302000000000018440000D443
+          01000000000018440000064402000000000018449A1907440200000066E61844
+          000008440200000000001A440000084401000000000026440000084402000000
+          9A1927440000084402000000000028449A190744020000000000284400000644
+          01000000000028440000F04301000000000037440000F0430100000000003744
+          000048440100000000802B44000048440200000066662A440000484402000000
+          0080294466E64844020000000080294400004A44010000000080294400005644
+          02000000008029449A1957440200000066662A44000058440200000000802B44
+          00005844010000000080544400005844020000009A9955440000584402000000
+          008056449A195744020000000080564400005644010000000080564400004A44
+          020000000080564466E64844020000009A995544000048440200000000805444
+          0000484401000000000049440000484401000000000049440000F04301000000
+          000058440000F04301000000000058440000064402000000000058449A190744
+          0200000066E65844000008440200000000005A44000008440100000000006644
+          00000844020000009A1967440000084402000000000068449A19074402000000
+          000068440000064401000000000068440000D4430200000000006844CDCCD143
+          020000009A1967440000D04302000000000066440000D0430300000000006644
+          0000D04300000000000024440000944301000000000024440000284302000000
+          000024449A992343020000009A19234400002043020000000000224400002043
+          010000000000D04200002043020000003333C74200002043020000000000C042
+          9A992343020000000000C04200002843010000000000C0420000944302000000
+          0000C04233339643020000003333C74200009843020000000000D04200009843
+          0100000000002043000098430200000066662443000098430200000000002843
+          3333964302000000000028430000944301000000000028430000684301000000
+          0000A84300006843010000000000A84300004644010000000000744300004644
+          020000009A996F43000046440200000000006C4366E646440200000000006C43
+          000048440100000000006C43000056440200000000006C439A19574402000000
+          9A996F4300005844020000000000744300005844010000000000FE4300005844
+          020000009A1900440000584402000000000001449A1957440200000000000144
+          00005644010000000000014400004844020000000000014466E6464402000000
+          9A19004400004644020000000000FE4300004644010000000000D04300004644
+          010000000000D043000068430100000000001244000068430100000000001244
+          000094430200000000001244333396430200000066E612440000984302000000
+          0000144400009843010000000000224400009843020000009A19234400009843
+          0200000000002444333396430200000000002444000094430300000000002444
+          00009443}
+        Fill.Color = xFF34B500
+        Locked = True
+        HitTest = False
+        Position.X = 9.000000000000000000
+        Position.Y = 9.000000000000000000
+        Size.Width = 16.000000000000000000
+        Size.Height = 16.000000000000000000
+        Size.PlatformDefault = False
+        Stroke.Kind = None
+        WrapMode = Fit
+      end
+    end
+  end
+end

+ 424 - 0
utils/fmFontDialog.pas

@@ -0,0 +1,424 @@
+// ==============================================================================
+// 文本显示格式设置对话框
+// ver 1.1 by gale 2024-12-05
+// ==============================================================================
+unit fmFontDialog;
+
+interface
+
+uses
+{$IFDEF MACOS}
+  MacApi.Appkit, MacApi.CoreFoundation, MacApi.Foundation,
+{$ENDIF}
+{$IFDEF MSWINDOWS}
+  Winapi.Messages, Winapi.Windows,
+{$ENDIF}
+  System.Rtti, System.TypInfo,
+  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
+  FMX.ListBox, FMX.Edit, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Colors,
+  FMX.Objects, System.UIConsts, FMX.Ani;
+
+type
+  TFontDialog = class(TForm)
+    grp1: TGroupBox;
+    chkBold: TCheckBox;
+    chkItalic: TCheckBox;
+    chkUnderline: TCheckBox;
+    chkStrikeOut: TCheckBox;
+    Label1: TLabel;
+    edtFontSize: TEdit;
+    lstFontSize: TListBox;
+    Button1: TButton;
+    btnCancel: TButton;
+    grp2: TGroupBox;
+    txtDemo: TText;
+    GroupBox1: TGroupBox;
+    cbbHorzAlign: TComboBox;
+    cbbVertAlign: TComboBox;
+    Label2: TLabel;
+    Label3: TLabel;
+    Label4: TLabel;
+    cbbTrimming: TComboBox;
+    edtFontColor: TEdit;
+    cpnlFontColor: TColorPanel;
+    chkWordWrap: TCheckBox;
+    edtFontName: TEdit;
+    lstFontName: TListBox;
+    Label5: TLabel;
+    rctTitleBar: TRectangle;
+    rctTitleBarForMove: TRectangle;
+    Layout1: TLayout;
+    rctBtnClose: TRectangle;
+    aniForCloseBtn: TColorAnimation;
+    pathCloseBtn: TPath;
+    lblCaption: TLabel;
+    Path4: TPath;
+    pnlSizeBorder: TPanel;
+    procedure lstFontSizeChange(Sender: TObject);
+    procedure edtFontSizeChange(Sender: TObject);
+    procedure lstFontNameChange(Sender: TObject);
+    procedure edtFontNameChange(Sender: TObject);
+    procedure cpnlFontColorChange(Sender: TObject);
+    procedure edtFontColorChange(Sender: TObject);
+    procedure chkFontStyleChange(Sender: TObject);
+    procedure cbbTextAlignChange(Sender: TObject);
+    procedure chkWordWrapChange(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure rctBtnCloseClick(Sender: TObject);
+  private
+    FTextSettings: TTextSettings;
+    FOldTextSettings: TTextSettings;
+  public
+    type
+    TPropPart = (peFamily, peSize, peColor, peBold, peItalic, peUnderLine, peStrikeOut, peHorzAlign, peVertAlign, peTrimming, peWordWarp);
+    TPropParts = set of TPropPart;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    function ShowModal(ATextSettings: TTextSettings; ADisProps: TPropParts = []): TModalResult; overload;
+  end;
+
+  TTypeStr = class
+  public
+    class function SetToStr<T>(AValue: T): string;
+    class function StrToSet<T>(AValue: string): T;
+    class function EnumToStr<T>(AValue: T): string;
+    class function StrToEnum<T>(AValue: string): T;
+  end;
+
+var
+  FontDialog: TFontDialog;
+
+implementation
+
+uses WinSizeUtil;
+
+{$IFDEF MSWINDOWS }
+
+
+function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
+  FontType: Integer; Data: Pointer): Integer;
+  stdcall;
+
+var
+  S: TStrings;
+  Temp: string;
+begin
+  S := TStrings(Data);
+  Temp := LogFont.lfFaceName;
+  if (S.Count = 0) or (AnsiCompareText(S[S.Count - 1], Temp) <> 0) then
+  begin
+    if Temp[1] <> '@' then
+    begin
+      S.Add(Temp);
+    end;
+  end;
+  Result := 1;
+end;
+{$ENDIF}
+
+
+procedure CollectFontList(FontList: TStrings);
+var
+  strs: TStringList;
+var
+{$IFDEF MACOS}
+  fManager: NsFontManager;
+  list: NSArray;
+  lItem: NSString;
+  i: Integer;
+{$ENDIF}
+{$IFDEF MSWINDOWS}
+  DC: HDC;
+  LFont: TLogFont;
+{$ENDIF}
+begin
+
+{$IFDEF MACOS}
+  fManager := TNsFontManager.Wrap(TNsFontManager.OCClass.sharedFontManager);
+  list := fManager.availableFontFamilies;
+  if (list <> nil) and (list.Count > 0) then
+  begin
+    for i := 0 to list.Count - 1 do
+    begin
+      lItem := TNSString.Wrap(list.objectAtIndex(i));
+      FontList.Add(String(lItem.UTF8String))
+    end;
+  end;
+{$ENDIF}
+{$IFDEF MSWINDOWS}
+  DC := GetDC(0);
+  FillChar(LFont, sizeof(LFont), 0);
+  LFont.lfCharset := DEFAULT_CHARSET;
+  EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, Winapi.Windows.LPARAM(FontList), 0);
+  ReleaseDC(0, DC);
+{$ENDIF}
+  strs := TStringList.Create;
+  try
+    strs.Text := FontList.Text;
+    strs.Sort;
+    FontList.Text := strs.Text;
+  finally
+    strs.Free;
+  end;
+end;
+
+{$R *.fmx}
+
+
+class function TTypeStr.SetToStr<T>(AValue: T): string;
+begin
+  Result := SetToString(PTypeInfo(TypeInfo(T)), @AValue, true);
+end;
+
+class function TTypeStr.StrToSet<T>(AValue: string): T;
+begin
+  StringToSet(PTypeInfo(TypeInfo(T)), AValue, @Result);
+end;
+
+class function TTypeStr.EnumToStr<T>(AValue: T): string;
+begin
+  Result := GetEnumName(TypeInfo(T), PByte(@AValue)^);
+end;
+
+class function TTypeStr.StrToEnum<T>(AValue: string): T;
+begin
+  if sizeof(T) = 4 then
+  begin
+    PInteger(@Result)^ := Integer(GetEnumValue(TypeInfo(T), AValue));
+    if PInteger(@Result)^ = 255 then
+    begin
+      PInteger(@Result)^ := 0;
+    end;
+  end
+  else if sizeof(T) = 2 then
+  begin
+    PWord(@Result)^ := Word(GetEnumValue(TypeInfo(T), AValue));
+    if PWord(@Result)^ = 255 then
+    begin
+      PWord(@Result)^ := 0;
+    end;
+  end
+  else
+  begin
+    PByte(@Result)^ := Byte(GetEnumValue(TypeInfo(T), AValue));
+    if PByte(@Result)^ = 255 then
+    begin
+      PByte(@Result)^ := 0;
+    end;
+  end;
+end;
+
+// ==============================================================================
+// 显示对话框
+// ==============================================================================
+function TFontDialog.ShowModal(ATextSettings: TTextSettings; ADisProps: TPropParts = []): TModalResult;
+begin
+  FTextSettings := ATextSettings;
+  FOldTextSettings.Assign(FTextSettings);
+  txtDemo.TextSettings.Assign(ATextSettings);
+  chkBold.IsChecked := TFontstyle.fsBold in txtDemo.TextSettings.Font.Style;
+  chkItalic.IsChecked := TFontstyle.fsItalic in txtDemo.TextSettings.Font.Style;
+  chkUnderline.IsChecked := TFontstyle.fsUnderline in txtDemo.TextSettings.Font.Style;
+  chkStrikeOut.IsChecked := TFontstyle.fsStrikeOut in txtDemo.TextSettings.Font.Style;
+
+  cbbHorzAlign.ItemIndex := cbbHorzAlign.Items.IndexOf(TTypeStr.EnumToStr<TTextAlign>(txtDemo.TextSettings.HorzAlign));
+  cbbVertAlign.ItemIndex := cbbVertAlign.Items.IndexOf(TTypeStr.EnumToStr<TTextAlign>(txtDemo.TextSettings.VertAlign));
+  cbbTrimming.ItemIndex := cbbTrimming.Items.IndexOf(TTypeStr.EnumToStr<TTextTrimming>(txtDemo.TextSettings.Trimming));
+
+  chkWordWrap.IsChecked := txtDemo.TextSettings.WordWrap;
+
+  edtFontName.Text := txtDemo.TextSettings.Font.Family;
+  lstFontName.ItemIndex := lstFontName.Items.IndexOf(edtFontName.Text);
+  edtFontSize.Text := txtDemo.TextSettings.Font.Size.ToString;
+  lstFontSize.ItemIndex := lstFontSize.Items.IndexOf(edtFontSize.Text);
+
+  cpnlFontColor.Color := txtDemo.TextSettings.FontColor;
+
+  Result := ShowModal;
+  if Result = mrOK then
+  begin
+    FTextSettings.Assign(txtDemo.TextSettings);
+  end
+  else
+  begin
+    FTextSettings.Assign(FOldTextSettings);
+  end;
+end;
+
+// ==============================================================================
+// 对齐数据修改
+// ==============================================================================
+procedure TFontDialog.cbbTextAlignChange(Sender: TObject);
+begin
+  if txtDemo.Locked then
+    Exit;
+
+  if Sender = cbbHorzAlign then
+  begin
+    if TComboBox(Sender).Selected <> nil then
+    begin
+      txtDemo.TextSettings.HorzAlign := TTypeStr.StrToEnum<TTextAlign>(TComboBox(Sender).Selected.Text);
+    end;
+  end
+  else if Sender = cbbVertAlign then
+  begin
+    if TComboBox(Sender).Selected <> nil then
+    begin
+      txtDemo.TextSettings.VertAlign := TTypeStr.StrToEnum<TTextAlign>(TComboBox(Sender).Selected.Text);
+    end;
+  end
+  else if Sender = cbbTrimming then
+  begin
+    if TComboBox(Sender).Selected <> nil then
+    begin
+      txtDemo.TextSettings.Trimming := TTypeStr.StrToEnum<TTextTrimming>(TComboBox(Sender).Selected.Text);
+    end;
+  end;
+end;
+
+// ==============================================================================
+// 字体风格数据修改
+// ==============================================================================
+procedure TFontDialog.chkFontStyleChange(Sender: TObject);
+begin
+  if txtDemo.Locked then
+    Exit;
+
+  txtDemo.TextSettings.Font.Style := [];
+  if chkBold.IsChecked then
+    txtDemo.TextSettings.Font.Style := txtDemo.TextSettings.Font.Style + [TFontstyle.fsBold];
+  if chkItalic.IsChecked then
+    txtDemo.TextSettings.Font.Style := txtDemo.TextSettings.Font.Style + [TFontstyle.fsItalic];
+  if chkUnderline.IsChecked then
+    txtDemo.TextSettings.Font.Style := txtDemo.TextSettings.Font.Style + [TFontstyle.fsUnderline];
+  if chkStrikeOut.IsChecked then
+    txtDemo.TextSettings.Font.Style := txtDemo.TextSettings.Font.Style + [TFontstyle.fsStrikeOut];
+end;
+
+procedure TFontDialog.chkWordWrapChange(Sender: TObject);
+begin
+  txtDemo.TextSettings.WordWrap := chkWordWrap.IsChecked;
+  FTextSettings.Assign(txtDemo.TextSettings);
+end;
+
+// ==============================================================================
+// 颜色选择修改
+// ==============================================================================
+procedure TFontDialog.cpnlFontColorChange(Sender: TObject);
+begin
+  edtFontColor.Text := AlphaColorToString(cpnlFontColor.Color);
+end;
+
+constructor TFontDialog.Create(AOwner: TComponent);
+begin
+  inherited;
+  FOldTextSettings := TTextSettings.Create(nil);
+end;
+
+destructor TFontDialog.Destroy;
+begin
+  FOldTextSettings.Free;
+  inherited;
+end;
+
+// ==============================================================================
+// 颜色输入框修改
+// ==============================================================================
+procedure TFontDialog.edtFontColorChange(Sender: TObject);
+begin
+  if txtDemo.Locked then
+    Exit;
+
+  try
+    cpnlFontColor.Color := StringToAlphaColor(edtFontColor.Text);
+    txtDemo.TextSettings.FontColor := cpnlFontColor.Color;
+    FTextSettings.Assign(txtDemo.TextSettings);
+  except
+    edtFontColor.Text := AlphaColorToString(cpnlFontColor.Color);
+    edtFontColor.SelectAll;
+  end;
+end;
+
+// ==============================================================================
+// 字体列表框修改
+// ==============================================================================
+procedure TFontDialog.lstFontNameChange(Sender: TObject);
+begin
+  if lstFontName.Selected <> nil then
+    edtFontName.Text := lstFontName.Selected.Text;
+end;
+
+// ==============================================================================
+// 文字输入框修改
+// ==============================================================================
+procedure TFontDialog.edtFontNameChange(Sender: TObject);
+begin
+  if txtDemo.Locked then
+    Exit;
+
+  txtDemo.TextSettings.Font.Family := edtFontName.Text;
+  lstFontName.ItemIndex := lstFontName.Items.IndexOf(edtFontName.Text);
+
+  FTextSettings.Assign(txtDemo.TextSettings);
+end;
+
+// ==============================================================================
+// 文字大小列表框修改
+// ==============================================================================
+procedure TFontDialog.lstFontSizeChange(Sender: TObject);
+begin
+  if lstFontSize.Selected <> nil then
+    edtFontSize.Text := lstFontSize.Selected.Text;
+end;
+
+procedure TFontDialog.rctBtnCloseClick(Sender: TObject);
+begin
+  Close;
+end;
+
+// ==============================================================================
+// 文字大小输入修改
+// ==============================================================================
+procedure TFontDialog.edtFontSizeChange(Sender: TObject);
+var
+  fTemp: Single;
+begin
+  if txtDemo.Locked then
+    Exit;
+
+  if TryStrToFloat(edtFontSize.Text, fTemp) then
+  begin
+    txtDemo.TextSettings.Font.Size := fTemp;
+    lstFontSize.ItemIndex := -1;
+    lstFontSize.ItemIndex := lstFontSize.Items.IndexOf(edtFontSize.Text);
+    FTextSettings.Assign(txtDemo.TextSettings);
+  end;
+end;
+
+// ==============================================================================
+// 窗口显示
+// ==============================================================================
+procedure TFontDialog.FormCreate(Sender: TObject);
+var
+  LFonts: TStrings;
+begin
+  var
+  FWinSizeHelper := TWinSizeHelper.Create(self);
+  FWinSizeHelper.SetTitleBar(rctTitleBarForMove);
+  LFonts := TStringList.Create;
+  try
+    CollectFontList(LFonts);
+    lstFontName.Items.AddStrings(LFonts);
+  finally
+    LFonts.Free;
+  end;
+  for var i := 0 to lstFontName.Items.Count - 1 do
+  begin
+    lstFontName.ItemByIndex(i).StyledSettings := [TStyledSetting.Size, TStyledSetting.Style, TStyledSetting.FontColor, TStyledSetting.Other];
+    lstFontName.ItemByIndex(i).TextSettings.Font.Family := lstFontName.ItemByIndex(i).Text;
+  end
+end;
+
+end.

+ 586 - 0
utils/galeNotice.pas

@@ -0,0 +1,586 @@
+unit galeNotice;
+
+interface
+
+uses
+  System.Math.Vectors, FMX.Effects, FMX.Objects, FMX.Controls, FMX.Types, System.Generics.Collections,
+  System.Types, System.Classes, FMX.Graphics, FMX.Forms, FMX.Ani, System.SysUtils, System.UITypes, System.Math;
+
+type
+  TPlaceKind = (pkNone, pkLeftTop, pkTopCenter, pkRightTop, pkLeftBottom, pkBottomCenter, pkRightBottom);
+  THanPos = (hpNone, hpTop, hpLeft, hpBottom, hpRight);
+  TIconKind = (ikNone, ikInfo, ikSuccess, ikWarn, ikError, ikMail, ikQuestion);
+
+  TNoticeInfo = record
+  private type
+    TNIText = record
+      Value: string;
+      FontColor: TAlphaColor;
+      Font: record
+        Family: string;
+        Size: single;
+        Style: TFontStyles;
+      end;
+    end;
+  public
+    Title: TNIText;
+    Text: TNIText;
+    Icon: TIconKind;
+    PlaceKind: TPlaceKind;
+    Pos: TPointF;
+    BackColor: TAlphaColor;
+    BorderColor: TAlphaColor;
+    HanPos: THanPos;
+    Shadow: single;
+    Delay: single;
+    CloseBtn: boolean;
+  public
+    procedure Init(AText: string = ''; ATitle: string = '消息'; AIcon: TIconKind = ikNone);
+  end;
+
+  TGaleNotice = class(TForm)
+  private
+    class var HindWins: TObjectList<TGaleNotice>;
+  public
+    class var DefFormPadding: single;
+    class var DefGap: single;
+    class var DefMargin: single;
+    class var DefIconWidth: single;
+    class var DefIconHeight: single;
+    class var DefCalloutLen: single;
+    class var DefHideDelay: single;
+    class var DefMaxWidth: single;
+    class var DefMinWidth: single;
+    class var DefPlaceKind: TPlaceKind;
+    class var DefShadow: single;
+    class var DefColseBtn: boolean;
+
+    class procedure RePlace;
+  public
+    class procedure ShowHint(const AInfo: TNoticeInfo);
+    class procedure Info(AText: string; ATitle: string = '信息');
+    class procedure Success(AText: string; ATitle: string = '成功');
+    class procedure Warn(AText: string; ATitle: string = '警告');
+    class procedure Error(AText: string; ATitle: string = '错误');
+  private
+    FNI: TNoticeInfo;
+    FCalloutRectangle: TCalloutRectangle;
+    ShadowEffect: TShadowEffect;
+    FloatAnimation: TFloatAnimation;
+    FTitleHeight: single;
+    FCloseRect: TRectF;
+
+    procedure SetCalloutPos(const ATPointF: TPointF);
+
+    procedure OnCalloutRectangleClick(Sender: TObject);
+    procedure OnCalloutRectangleEnter(Sender: TObject);
+    procedure OnCalloutRectangleLeave(Sender: TObject);
+    procedure OnCalloutRectanglePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
+    procedure OnFloatAnimationFinish(Sender: TObject);
+
+    procedure SetNI(const AValue: TNoticeInfo);
+  public
+    property NI: TNoticeInfo read FNI write SetNI;
+  public
+    constructor Create(AOwner: TComponent); override;
+  end;
+
+  toastr = TGaleNotice;
+
+implementation
+
+{ TNoticeInfo }
+// ==============================================================================
+// 消息显示参数
+// ==============================================================================
+procedure TNoticeInfo.Init(AText: string; ATitle: string; AIcon: TIconKind);
+begin
+  Text.Value := AText;
+  Text.FontColor := $FFFFFFFF;
+  Text.Font.Family := 'Microsoft YaHei UI';
+  Text.Font.Size := 12.0;
+  Text.Font.Style := [];
+  Title.Value := ATitle;
+  Title.FontColor := $FFFFFFFF;
+  Title.Font.Family := 'Microsoft YaHei UI';
+  Title.Font.Size := 14.0;
+  Title.Font.Style := [TFontStyle.fsBold];
+  Icon := AIcon;
+  PlaceKind := TGaleNotice.DefPlaceKind;
+  Pos := Screen.MousePos;
+  BackColor := TAlphaColorRec.White;
+  BorderColor := TAlphaColorRec.White;
+  Shadow := TGaleNotice.DefShadow;
+  Title.FontColor := TAlphaColorRec.Black;
+  Text.FontColor := TAlphaColorRec.Black;
+  HanPos := hpNone;
+  Delay := TGaleNotice.DefHideDelay;
+  CloseBtn := TGaleNotice.DefColseBtn;
+end;
+
+{ TGaleHintWindow }
+//==============================================================================
+// 显示提示
+//==============================================================================
+class procedure TGaleNotice.ShowHint(const AInfo: TNoticeInfo);
+var
+  tmpHint: TGaleNotice;
+  LActiveForm: TCommonCustomForm;
+begin
+  tmpHint := TGaleNotice.Create(nil);
+  tmpHint.NI := AInfo;
+
+  tmpHint.FCalloutRectangle.Fill.Color := AInfo.BackColor;
+  tmpHint.FCalloutRectangle.Stroke.Color := AInfo.BorderColor;
+  HindWins.Add(tmpHint);
+  LActiveForm := Screen.ActiveForm;
+  tmpHint.Show;
+  if Assigned(LActiveForm) then
+    LActiveForm.Activate;
+  tmpHint.BringToFront;
+  tmpHint.FloatAnimation.Start;
+  RePlace;
+end;
+
+//==============================================================================
+// 显示Info
+//==============================================================================
+class procedure TGaleNotice.Info(AText: string; ATitle: string);
+var
+  NI: TNoticeInfo;
+begin
+  NI.Init(AText, ATitle, ikInfo);
+  NI.BackColor := $FF59ACC3;
+  NI.BorderColor := $FF59ACC3;
+  NI.Title.FontColor := $FFFFFFFF;
+  NI.Text.FontColor := $FFFFFFFF;
+  ShowHint(NI);
+end;
+
+//==============================================================================
+// 显示Info
+//==============================================================================
+class procedure TGaleNotice.Success(AText: string; ATitle: string);
+var
+  NI: TNoticeInfo;
+begin
+  NI.Init(AText, ATitle, ikSuccess);
+  NI.BackColor := $FF74B575;
+  NI.BorderColor := $FF74B575;
+  NI.Title.FontColor := $FFFFFFFF;
+  NI.Text.FontColor := $FFFFFFFF;
+  ShowHint(NI);
+end;
+
+//==============================================================================
+// 显示警告
+//==============================================================================
+class procedure TGaleNotice.Warn(AText: string; ATitle: string);
+var
+  NI: TNoticeInfo;
+begin
+  NI.Init(AText, ATitle, ikWarn);
+  NI.BackColor := $FFF9AA39;
+  NI.BorderColor := $FFF9AA39;
+  NI.Title.FontColor := $FFFFFFFF;
+  NI.Text.FontColor := $FFFFFFFF;
+  ShowHint(NI);
+end;
+
+//==============================================================================
+// 显示错误
+//==============================================================================
+class procedure TGaleNotice.Error(AText: string; ATitle: string);
+var
+  NI: TNoticeInfo;
+begin
+  NI.Init(AText, ATitle, ikError);
+  NI.BackColor := $FFCA5E59;
+  NI.BorderColor := $FFCA5E59;
+  NI.Title.FontColor := $FFFFFFFF;
+  NI.Text.FontColor := $FFFFFFFF;
+  ShowHint(NI);
+end;
+
+//==============================================================================
+// 重新摆放队列中的消息框
+//==============================================================================
+class procedure TGaleNotice.RePlace;
+var
+  fLeftTop, fTopCenter, fRightTop, fLeftBottom, fBottomCenter, fRightBottom: single;
+begin
+  fLeftTop := Screen.WorkAreaRect.Top;
+  fTopCenter := Screen.WorkAreaRect.Top;
+  fRightTop := Screen.WorkAreaRect.Top;
+  fLeftBottom := Screen.WorkAreaRect.Bottom - DefFormPadding;
+  fBottomCenter := Screen.WorkAreaRect.Bottom - DefFormPadding;
+  fRightBottom := Screen.WorkAreaRect.Bottom - DefFormPadding;
+  for var item in HindWins do
+  begin
+    if not item.Visible then
+      Continue;
+    item.BringToFront;
+    case item.NI.PlaceKind of
+      TPlaceKind.pkLeftTop:
+        begin
+          item.Left := 0;
+          item.Top := Round(fLeftTop);
+          fLeftTop := fLeftTop + item.Height - DefFormPadding * 2 + DefGap;
+        end;
+      TPlaceKind.pkTopCenter:
+        begin
+          item.Left := Round((Screen.Width - item.Width) / 2);
+          item.Top := Round(fTopCenter);
+          fTopCenter := fTopCenter + item.Height - DefFormPadding * 2 + DefGap;
+        end;
+      TPlaceKind.pkRightTop:
+        begin
+          item.Left := Round(Screen.Width - item.Width);
+          item.Top := Round(fRightTop);
+          fRightTop := fRightTop + item.Height - DefFormPadding * 2 + DefGap;
+        end;
+      TPlaceKind.pkLeftBottom:
+        begin
+          item.Left := 0;
+          fLeftBottom := fLeftBottom - item.Height + DefFormPadding * 2 - DefGap;
+          item.Top := Round(fLeftBottom);
+        end;
+      TPlaceKind.pkBottomCenter:
+        begin
+          item.Left := Round((Screen.Width - item.Width) / 2);
+          fBottomCenter := fBottomCenter - item.Height + DefFormPadding * 2 - DefGap;
+          item.Top := Round(fBottomCenter);
+        end;
+      TPlaceKind.pkRightBottom:
+        begin
+          item.Left := Round(Screen.Width - item.Width);
+          fRightBottom := fRightBottom - item.Height + DefFormPadding * 2 - DefGap;
+          item.Top := Round(fRightBottom);
+        end;
+    end;
+  end;
+end;
+
+//==============================================================================
+// 构造
+//==============================================================================
+constructor TGaleNotice.Create(AOwner: TComponent);
+begin
+  inherited CreateNew(AOwner);
+  FormStyle := TFormStyle.StayOnTop;
+  Transparency := True;
+
+  // 气泡框
+  FCalloutRectangle := TCalloutRectangle.Create(self);
+  FCalloutRectangle.Position.X := DefFormPadding;;
+  FCalloutRectangle.Position.Y := DefFormPadding;
+  FCalloutRectangle.XRadius := 3;
+  FCalloutRectangle.YRadius := 3;
+  FCalloutRectangle.CalloutWidth := DefCalloutLen;
+  FCalloutRectangle.CalloutLength := DefCalloutLen;
+
+  FCalloutRectangle.OnMouseEnter := OnCalloutRectangleEnter;
+  FCalloutRectangle.OnMouseLeave := OnCalloutRectangleLeave;
+  FCalloutRectangle.OnClick := OnCalloutRectangleClick;
+  FCalloutRectangle.OnPaint := OnCalloutRectanglePaint;
+
+  AddObject(FCalloutRectangle);
+
+  // 阴影
+  ShadowEffect := TShadowEffect.Create(FCalloutRectangle);
+  FCalloutRectangle.AddObject(ShadowEffect);
+  ShadowEffect.Enabled := True;
+
+  // 消失动画
+  FloatAnimation := TFloatAnimation.Create(FCalloutRectangle);
+  FCalloutRectangle.AddObject(FloatAnimation);
+  FloatAnimation.PropertyName := 'Opacity';
+  FloatAnimation.Duration := 1.0;
+  FloatAnimation.StartValue := 1.0;
+  FloatAnimation.StopValue := 0;
+  FloatAnimation.OnFinish := OnFloatAnimationFinish;
+end;
+
+//==============================================================================
+// 设置气球手柄位置坐标
+//==============================================================================
+procedure TGaleNotice.SetCalloutPos(const ATPointF: TPointF);
+var
+  fTemp: single;
+begin
+  if FCalloutRectangle.CalloutPosition in [TCalloutPosition.Top, TCalloutPosition.Bottom] then
+  begin
+    if FCalloutRectangle.CalloutOffset = 0 then
+      fTemp := FCalloutRectangle.Width / 2
+    else
+      fTemp := FCalloutRectangle.CalloutOffset + FCalloutRectangle.CalloutWidth / 2;
+  end
+  else
+  begin
+    if FCalloutRectangle.CalloutOffset = 0 then
+      fTemp := FCalloutRectangle.Height / 2
+    else
+      fTemp := FCalloutRectangle.CalloutOffset + FCalloutRectangle.Height / 2;
+  end;
+
+  case FCalloutRectangle.CalloutPosition of
+    TCalloutPosition.Top:
+      begin
+        Left := Round(ATPointF.X - DefFormPadding - fTemp);
+        Top := Round(ATPointF.Y - DefFormPadding);
+      end;
+
+    TCalloutPosition.Bottom:
+      begin
+        Left := Round(ATPointF.X - DefFormPadding - fTemp);
+        Top := Round(ATPointF.Y - DefFormPadding - FCalloutRectangle.Height);
+      end;
+    TCalloutPosition.Left:
+      begin
+        Left := Round(ATPointF.X - DefFormPadding);
+        Top := Round(ATPointF.Y - DefFormPadding - fTemp);
+      end;
+    TCalloutPosition.Right:
+      begin
+        Left := Round(ATPointF.X - DefFormPadding - FCalloutRectangle.Width);
+        Top := Round(ATPointF.Y - DefFormPadding - fTemp);
+      end;
+  end;
+
+end;
+
+//==============================================================================
+// 消息窗口参数设置
+//==============================================================================
+procedure TGaleNotice.SetNI(const AValue: TNoticeInfo);
+var
+  rct: TRectF;
+  titleWidth: single;
+  textWidth: single;
+begin
+  FNI := AValue;
+
+  ShadowEffect.Opacity := FNI.Shadow;
+
+  FCalloutRectangle.Canvas.Font.Style := [TFontStyle.fsBold];
+  FCalloutRectangle.Canvas.Font.Size := FNI.Title.Font.Size;
+  rct := RectF(0, 0, DefMaxWidth, 1024);
+  FCalloutRectangle.Canvas.MeasureText(rct, FNI.Title.Value, True, [], TTextAlign.Leading, TTextAlign.Leading);
+  titleWidth := rct.Width;
+  FTitleHeight := rct.Height;
+
+  FCalloutRectangle.Canvas.Font.Style := [];
+  FCalloutRectangle.Canvas.Font.Size := FNI.Text.Font.Size;
+  rct := RectF(0, 0, DefMaxWidth, 1024);
+  FCalloutRectangle.Canvas.MeasureText(rct, FNI.Text.Value, True, [], TTextAlign.Leading, TTextAlign.Leading);
+  textWidth := rct.Width;
+
+  rct.Width := Max(textWidth, titleWidth);
+  rct.Width := Max(rct.Width, DefMinWidth);
+
+  if FNI.Icon = ikNone then
+    FCalloutRectangle.Width := DefMargin + rct.Width + DefMargin
+  else
+    FCalloutRectangle.Width := DefMargin + DefIconWidth + DefMargin + rct.Width + DefMargin;
+
+  FCalloutRectangle.Height := DefMargin + FTitleHeight + rct.Height + DefMargin;
+
+  if Ord(FNI.HanPos) > 0 then
+  begin
+    FCalloutRectangle.CalloutLength := DefCalloutLen;
+    FCalloutRectangle.CalloutPosition := TCalloutPosition(Ord(FNI.HanPos) - 1);
+    case FNI.HanPos of
+      hpLeft, hpRight:
+        FCalloutRectangle.Width := FCalloutRectangle.Width + DefCalloutLen;
+      hpTop, hpBottom:
+        FCalloutRectangle.Height := FCalloutRectangle.Height + DefCalloutLen;
+    end;
+  end
+  else
+  begin
+    FCalloutRectangle.CalloutLength := 0;
+  end;
+
+  Width := Round(FCalloutRectangle.Width + DefFormPadding * 2);
+  Height := Round(FCalloutRectangle.Height + DefFormPadding * 2);
+
+  FloatAnimation.Delay := FNI.Delay;
+  if FNI.PlaceKind = pkNone then
+    SetCalloutPos(FNI.Pos);
+
+end;
+
+procedure TGaleNotice.OnCalloutRectangleEnter(Sender: TObject);
+var
+  OldEvent: TNotifyEvent;
+begin
+  OldEvent := FloatAnimation.OnFinish;
+  FloatAnimation.OnFinish := nil;
+  FloatAnimation.Stop;
+  FloatAnimation.Delay := 1.0;
+  FloatAnimation.OnFinish := OldEvent;
+end;
+
+procedure TGaleNotice.OnCalloutRectangleLeave(Sender: TObject);
+begin
+  FloatAnimation.Start;
+end;
+
+//==============================================================================
+// 点击事件
+//==============================================================================
+procedure TGaleNotice.OnCalloutRectangleClick(Sender: TObject);
+var
+  OldEvent: TNotifyEvent;
+begin
+  // 点击在关闭按钮区域
+  if FNI.CloseBtn and FCloseRect.Contains(FCalloutRectangle.ScreenToLocal(Screen.MousePos)) then
+  begin
+    OldEvent := FloatAnimation.OnFinish;
+    FloatAnimation.OnFinish := nil;
+    FloatAnimation.Stop;
+    FloatAnimation.Delay := 0;
+    FloatAnimation.OnFinish := OldEvent;
+    FCalloutRectangle.OnMouseEnter := nil;
+    FCalloutRectangle.OnMouseLeave := nil;
+    FloatAnimation.Start;
+  end;
+end;
+
+//==============================================================================
+// 气泡重绘
+//==============================================================================
+procedure TGaleNotice.OnCalloutRectanglePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
+const
+  pdClose = 'M10 0L100 90L90 100L0 10z M90 0L100 10L10 100L0 90z';
+  pdInfo = 'M40 0 H60 V20 H40z M42 40L58 40L62 100L38 100z';
+  pdSuccess = 'M940 160L396 704 83 384 0 467l313 313 83 83L1024 243z';
+  pdWarn = 'M0 50a50 50 0 1 0 100 0a50 50 0 1 0-100 0M 40 10L 60 10L55 55L45 55zM 42 70L 58 70L58 86L42 86z';
+  pdError = 'M0 50a50 50 0 1 0 100 0a50 50 0 1 0-100 0M 20 40L 80 40L80 60L20 60z';
+  pdMail = 'M0 20 H100 V80 H0 V20 M0 27 L50 55L100 27';
+  pdQuestion = 'M14 17L32 0H70L85 16V50L57 64V77H43V56L72 43V21L64 13H35L21 27z M44 86H56V99H44z';
+var
+  WorkRect, IconRect, TitleRect, TextRect: TRectF;
+  PathData: TPathData;
+begin
+  WorkRect := ARect;
+  if FCalloutRectangle.CalloutLength > 0 then
+  begin
+    case FCalloutRectangle.CalloutPosition of
+      TCalloutPosition.Top:
+        WorkRect.Top := WorkRect.Top + FCalloutRectangle.CalloutLength;
+      TCalloutPosition.Bottom:
+        WorkRect.Bottom := WorkRect.Bottom - FCalloutRectangle.CalloutLength;
+      TCalloutPosition.Left:
+        WorkRect.Left := WorkRect.Left + FCalloutRectangle.CalloutLength;
+      TCalloutPosition.Right:
+        WorkRect.Right := WorkRect.Right - FCalloutRectangle.CalloutLength;
+    end;
+  end;
+
+  // 图标
+  if FNI.Icon <> ikNone then
+  begin
+    IconRect.Left := WorkRect.Left + DefMargin;
+    IconRect.Top := WorkRect.Top + (WorkRect.Height - DefIconHeight) / 2;
+    IconRect.Width := DefIconWidth;
+    IconRect.Height := DefIconHeight;
+    PathData := TPathData.Create;
+    try
+      case FNI.Icon of
+        ikInfo:
+          PathData.Data := pdInfo;
+        ikSuccess:
+          PathData.Data := pdSuccess;
+        ikWarn:
+          PathData.Data := pdWarn;
+        ikError:
+          PathData.Data := pdError;
+        ikMail:
+          PathData.Data := pdMail;
+        ikQuestion:
+          PathData.Data := pdQuestion;
+      else
+      end;
+      PathData.FitToRect(IconRect);
+      FCalloutRectangle.Canvas.Fill.Color := NI.Title.FontColor;
+      FCalloutRectangle.Canvas.FillPath(PathData, FCalloutRectangle.Opacity);
+    finally
+      PathData.Free
+    end;
+  end;
+
+  // 关闭按钮
+  if FNI.CloseBtn then
+  begin
+    FCloseRect.Right := WorkRect.Right - 5;
+    FCloseRect.Top := WorkRect.Top + 5;
+    FCloseRect.Left := FCloseRect.Right - 8;
+    FCloseRect.Bottom := FCloseRect.Top + 8;
+    PathData := TPathData.Create;
+    try
+      PathData.Data := pdClose;
+      PathData.FitToRect(FCloseRect);
+      FCalloutRectangle.Canvas.Stroke.Color := NI.Title.FontColor;
+      FCalloutRectangle.Canvas.FillPath(PathData, FCalloutRectangle.Opacity);
+    finally
+      PathData.Free;
+    end;
+  end;
+
+  // 标题
+  if FNI.Icon <> ikNone then
+    TitleRect.Left := WorkRect.Left + DefMargin + DefIconWidth + DefMargin
+  else
+    TitleRect.Left := WorkRect.Left + DefMargin;
+  TitleRect.Top := WorkRect.Top + DefMargin - 2;
+  TitleRect.Right := WorkRect.Right;
+  TitleRect.Bottom := WorkRect.Bottom;
+  FCalloutRectangle.Canvas.Fill.Color := FNI.Title.FontColor;
+  FCalloutRectangle.Canvas.Font.Family := FNI.Title.Font.Family;
+  FCalloutRectangle.Canvas.Font.Size := FNI.Title.Font.Size;
+  FCalloutRectangle.Canvas.Font.Style := FNI.Title.Font.Style;
+  FCalloutRectangle.Canvas.FillText(TitleRect, FNI.Title.Value, True, FCalloutRectangle.Opacity, [], TTextAlign.Leading, TTextAlign.Leading);
+
+  // 内容
+  TextRect.Left := TitleRect.Left;
+  TextRect.Top := WorkRect.Top + DefMargin + FTitleHeight;
+  TextRect.Right := WorkRect.Right - DefMargin;
+  TextRect.Bottom := WorkRect.Bottom;
+  FCalloutRectangle.Canvas.Fill.Color := FNI.Text.FontColor;
+  FCalloutRectangle.Canvas.Font.Family := FNI.Text.Font.Family;
+  FCalloutRectangle.Canvas.Font.Size := FNI.Text.Font.Size;
+  FCalloutRectangle.Canvas.Font.Style := FNI.Text.Font.Style;
+  FCalloutRectangle.Canvas.FillText(TextRect, FNI.Text.Value, True, FCalloutRectangle.Opacity, [], TTextAlign.Leading, TTextAlign.Leading);
+end;
+
+//==============================================================================
+// 显示动画结束,删除
+//==============================================================================
+procedure TGaleNotice.OnFloatAnimationFinish(Sender: TObject);
+begin
+  HindWins.Remove(self);
+  RePlace;
+end;
+
+initialization
+
+TGaleNotice.HindWins := TObjectList<TGaleNotice>.Create;
+TGaleNotice.DefFormPadding := 10.0;
+TGaleNotice.DefGap := 3.0;
+TGaleNotice.DefMargin := 10.0;
+TGaleNotice.DefIconWidth := 16.0;
+TGaleNotice.DefIconHeight := 16.0;
+TGaleNotice.DefCalloutLen := 10.0;
+TGaleNotice.DefHideDelay := 5.0;
+TGaleNotice.DefMaxWidth := 240.0;
+TGaleNotice.DefMinWidth := 100.0;
+TGaleNotice.DefPlaceKind := pkRightTop;
+TGaleNotice.DefShadow := 0.5;
+TGaleNotice.DefColseBtn := True;
+
+finalization
+
+TGaleNotice.HindWins.Free;
+
+end.

+ 293 - 0
utils/jsonhelper.pas

@@ -0,0 +1,293 @@
+unit jsonhelper;
+
+interface
+
+uses
+  System.Generics.Collections, System.JSON, System.IOUtils, System.SysUtils;
+
+type
+
+  TJSONKind = (jkNone, jkObject, jkArray, jkString, jkNumber, jkBoolean, jkNull);
+
+  TJSONPairHelper = class helper for TJSONPair
+  public
+    procedure Rename(ANewName: string);
+  end;
+
+  TJSONValueHelper = class helper for TJSONValue
+  private
+    function GetJsonKind: TJSONKind;
+    function GetItemCount: Integer;
+    function GetItem(const AIndex: Integer): TJSONAncestor;
+  public
+    property JsonKind: TJSONKind read GetJsonKind;
+    property ItemCount: Integer read GetItemCount;
+    property Items[const AIndex: Integer]: TJSONAncestor read GetItem; Default;
+  public
+    function IsObjectOrArray: boolean;
+    class function LoadFromFile(const AFileName: string; AUseBool: boolean = False; ARaiseExc: boolean = False): TJSONValue;
+  end;
+
+  TJSONObjectHelper = class helper for TJSONObject
+  public
+    function DeletePair(AIndex: Integer): TJSONPair; overload;
+    function DeletePair(const AItem: TJSONPair): TJSONPair; overload;
+    procedure InsertPair(AIndex: NativeInt; const AValue: TJSONPair);
+    procedure Move(ACurIndex, ANewIndex: NativeInt);
+  end;
+
+  TJSONArrayHelper = class helper for TJSONArray
+  public
+    function Delete(const AItem: TJSONValue): TJSONValue;
+    function IndexOf(const AItem: TJSONValue): Integer;
+    procedure SetValue(const AIndex: Integer; const AValue: TJSONValue);
+    procedure InsertElement(AIndex: NativeInt; const AValue: TJSONValue);
+    procedure Move(ACurIndex, ANewIndex: NativeInt);
+  end;
+
+function JSONFormat(AValue: TJSONValue; AIndentation: Integer; AEncodeBelow32: boolean; AEncodeAbove127: boolean): string;
+
+implementation
+
+function JSONToUniCode(const AStr: string; AEncodeBelow32: boolean = True; AEncodeAbove127: boolean = True): string;
+var
+  ch: char;
+  I: Integer;
+  UnicodeValue: Integer;
+  Buff: array [0 .. 5] of char;
+begin
+  for I := 1 to AStr.Length do
+  begin
+    ch := AStr[I];
+    case ch of
+      #0 .. #7, #$b, #$e .. #31, #$0080 .. High(char):
+        begin
+          UnicodeValue := Ord(ch);
+          if AEncodeBelow32 and (UnicodeValue < 32) or AEncodeAbove127 and (UnicodeValue > 127) then
+          begin
+            Buff[0] := '\';
+            Buff[1] := 'u';
+            Buff[2] := char(DecimalToHex((UnicodeValue and 61440) shr 12));
+            Buff[3] := char(DecimalToHex((UnicodeValue and 3840) shr 8));
+            Buff[4] := char(DecimalToHex((UnicodeValue and 240) shr 4));
+            Buff[5] := char(DecimalToHex((UnicodeValue and 15)));
+            Result := Result + Buff;
+          end
+          else
+          begin
+            Result := Result + ch;
+          end;
+        end
+    else
+      begin
+        Result := Result + ch;
+      end;
+    end;
+  end;
+end;
+
+function JsonToJsonStr(AValue: TJSONValue; AEncodeBelow32: boolean = True; AEncodeAbove127: boolean = True): string;
+var
+  Options: TJSONAncestor.TJSONOutputOptions;
+begin
+  Result := '';
+  if AValue <> nil then
+  begin
+    Options := [];
+    if AEncodeBelow32 then
+      Include(Options, TJSONAncestor.TJSONOutputOption.EncodeBelow32);
+    if AEncodeAbove127 then
+      Include(Options, TJSONAncestor.TJSONOutputOption.EncodeAbove127);
+    Result := AValue.ToJSON(Options);
+  end;
+end;
+
+function JSONFormat(AValue: TJSONValue; AIndentation: Integer; AEncodeBelow32: boolean; AEncodeAbove127: boolean): string;
+begin
+  if AIndentation >= 0 then
+  begin
+    Result := '';
+    if AValue <> nil then
+    begin
+      Result := AValue.Format(AIndentation);
+      if AEncodeBelow32 or AEncodeAbove127 then
+      begin
+        Result := JSONToUniCode(Result, AEncodeBelow32, AEncodeAbove127);
+      end;
+    end;
+  end
+  else
+  begin
+    Result := JsonToJsonStr(AValue, AEncodeBelow32, AEncodeAbove127);
+  end;
+end;
+
+procedure TJSONPairHelper.Rename(ANewName: string);
+begin
+  SetJsonString(TJSONString.Create(ANewName));
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// TJSONValue
+
+function TJSONValueHelper.GetJsonKind: TJSONKind;
+begin
+  if self = nil then
+    Exit(jkNone);
+  if ClassType = TJSONObject then
+  begin
+    Result := jkObject;
+  end
+  else if ClassType = TJSONArray then
+  begin
+    Result := jkArray;
+  end
+  else if ClassType = TJSONString then
+  begin
+    Result := jkString;
+  end
+  else if ClassType = TJSONNumber then
+  begin
+    Result := jkNumber;
+  end
+  else if ClassType = TJSONBool then
+  begin
+    Result := jkBoolean;
+  end
+  else if ClassType = TJSONNull then
+  begin
+    Result := jkNull;
+  end
+  else
+  begin
+    Result := jkNone;
+  end;
+end;
+
+function TJSONValueHelper.IsObjectOrArray: boolean;
+begin
+  Result := (self is TJSONObject) or (self is TJSONArray);
+end;
+
+class function TJSONValueHelper.LoadFromFile(const AFileName: string; AUseBool: boolean; ARaiseExc: boolean): TJSONValue;
+begin
+  Result := nil;
+  try
+    Result := TJSONValue.ParseJSONValue(TFile.ReadAllText(AFileName, TEncoding.UTF8), AUseBool, ARaiseExc);
+  except
+    on E: Exception do
+    begin
+      if ARaiseExc then
+      begin
+        raise Exception.Create(E.Message);
+      end;
+    end;
+  end;
+end;
+
+function TJSONValueHelper.GetItemCount: Integer;
+begin
+  if self is TJSONObject then
+    Result := TJSONObject(self).Count
+  else if self is TJSONArray then
+    Result := TJSONArray(self).Count
+  else
+    Result := 0;
+end;
+
+function TJSONValueHelper.GetItem(const AIndex: Integer): TJSONAncestor;
+begin
+  if self is TJSONObject then
+    Result := TJSONObject(self).Pairs[AIndex]
+  else if self is TJSONArray then
+    Result := TJSONArray(self)[AIndex]
+  else
+    Result := nil;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
+// TJSONObject
+
+function TJSONObjectHelper.DeletePair(AIndex: Integer): TJSONPair;
+begin
+  with self do
+  begin
+    if (AIndex >= 0) and (AIndex < FMembers.Count) then
+    begin
+      Result := FMembers[AIndex];
+      FMembers.Remove(Result);
+    end
+    else
+    begin
+      Result := nil;
+    end;
+  end;
+end;
+
+function TJSONObjectHelper.DeletePair(const AItem: TJSONPair): TJSONPair;
+begin
+  with self do
+  begin
+    Exit(FMembers.Extract(AItem));
+  end;
+end;
+
+procedure TJSONObjectHelper.InsertPair(AIndex: NativeInt; const AValue: TJSONPair);
+begin
+  with self do
+  begin
+    FMembers.Insert(AIndex, AValue);
+  end;
+end;
+
+procedure TJSONObjectHelper.Move(ACurIndex, ANewIndex: NativeInt);
+begin
+  with self do
+  begin
+    FMembers.Move(ACurIndex, ANewIndex);
+  end;
+end;
+
+function TJSONArrayHelper.Delete(const AItem: TJSONValue): TJSONValue;
+begin
+  with self do
+  begin
+    Result := FElements.Extract(AItem);
+  end;
+end;
+
+function TJSONArrayHelper.IndexOf(const AItem: TJSONValue): Integer;
+begin
+  with self do
+  begin
+    Result := FElements.IndexOf(AItem);
+  end;
+end;
+
+procedure TJSONArrayHelper.SetValue(const AIndex: Integer; const AValue: TJSONValue);
+begin
+  with self do
+  begin
+    if FElements[AIndex].Owned then
+      FElements[AIndex].Free;
+    FElements[AIndex] := AValue;
+  end;
+end;
+
+procedure TJSONArrayHelper.InsertElement(AIndex: NativeInt; const AValue: TJSONValue);
+begin
+  with self do
+  begin
+    FElements.Insert(AIndex, AValue);
+  end;
+end;
+
+procedure TJSONArrayHelper.Move(ACurIndex, ANewIndex: NativeInt);
+begin
+  with self do
+  begin
+    FElements.Move(ACurIndex, ANewIndex);
+  end;
+end;
+
+end.

+ 124 - 0
utils/memo_json_auto.pas

@@ -0,0 +1,124 @@
+unit memo_json_auto;
+
+interface
+
+uses
+  System.Classes, System.SysUtils, FMX.Types,
+  FMX.Memo, FMX.Memo.Types, FMX.Text;
+
+type
+  TMemoJsonAuto = class(TComponent)
+  private
+    FMemo: TMemo;
+    FOldOnKeyDown: TKeyEvent;
+    FOldOnKeyUp: TKeyEvent;
+    procedure SetMemo(const AValue: TMemo);
+    procedure OnKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
+    procedure OnKeyUp(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
+    function NextChar: string;
+  public
+    property Memo: TMemo read FMemo write SetMemo;
+  public
+    constructor Create(AOwner: TComponent); overload; override;
+    constructor Create(AOwner: TComponent; AMemo: TMemo); reintroduce; overload;
+  end;
+
+implementation
+
+constructor TMemoJsonAuto.Create(AOwner: TComponent);
+begin
+  inherited;
+  FMemo := nil;
+  FOldOnKeyDown := nil;
+  FOldOnKeyUp := nil;
+end;
+
+constructor TMemoJsonAuto.Create(AOwner: TComponent; AMemo: TMemo);
+begin
+  Create(AOwner);
+  SetMemo(AMemo);
+end;
+
+procedure TMemoJsonAuto.SetMemo(const AValue: TMemo);
+begin
+  if FMemo = AValue then
+    Exit;
+  FMemo := AValue;
+  FOldOnKeyDown := FMemo.OnKeyDown;
+  FOldOnKeyUp := FMemo.OnKeyUp;
+  FMemo.OnKeyDown := OnKeyDown;
+  FMemo.OnKeyUp := OnKeyUp;
+end;
+
+procedure TMemoJsonAuto.OnKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
+begin
+  if Key = 13 then
+  begin
+    if not FMemo.IsUpdating then
+      FMemo.BeginUpdate;
+  end;
+  if Assigned(FOldOnKeyDown) then
+    FOldOnKeyDown(Sender, Key, KeyChar, Shift);
+end;
+
+procedure TMemoJsonAuto.OnKeyUp(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
+var
+  strTmp: string;
+  sp: string;
+begin
+  if (Key = 13) and (FMemo.CaretPosition.Pos = 0) then
+  begin
+    strTmp := FMemo.Lines[FMemo.CaretPosition.line - 1];
+    if strTmp.StartsWith(' ') then
+    begin
+      for var i := 1 to strTmp.Length do
+      begin
+        if strTmp[i] <> ' ' then
+        begin
+          break;
+        end;
+        sp := sp + ' ';
+      end;
+      FMemo.InsertAfter(FMemo.CaretPosition, sp, [FMX.Text.TInsertOption.MoveCaret]);
+    end;
+    FMemo.EndUpdate;
+  end
+  else if KeyChar = '[' then
+  begin
+    if FMemo.Lines[FMemo.CaretPosition.line][FMemo.CaretPosition.Pos] = '[' then
+    begin
+      if NextChar <> ']' then
+      begin
+        FMemo.InsertAfter(FMemo.CaretPosition, ']', []);
+      end;
+    end;
+  end
+  else if KeyChar = '{' then
+  begin
+    if FMemo.Lines[FMemo.CaretPosition.line][FMemo.CaretPosition.Pos] = '{' then
+    begin
+      if NextChar <> '}' then
+      begin
+        FMemo.InsertAfter(FMemo.CaretPosition, '}', []);
+      end;
+    end;
+  end
+  else if KeyChar = '"' then
+  begin
+    if FMemo.Lines[FMemo.CaretPosition.line][FMemo.CaretPosition.Pos] = '"' then
+      FMemo.InsertAfter(FMemo.CaretPosition, '"', []);
+  end;
+  if Assigned(FOldOnKeyUp) then
+  begin
+    FOldOnKeyUp(Sender, Key, KeyChar, Shift);
+  end;
+end;
+
+function TMemoJsonAuto.NextChar: string;
+begin
+  Result := '';
+  if FMemo.Lines[FMemo.CaretPosition.line].Length > FMemo.CaretPosition.Pos then
+    Result := FMemo.Lines[FMemo.CaretPosition.line][FMemo.CaretPosition.Pos + 1];
+end;
+
+end.

+ 1201 - 0
utils/rjson.pas

@@ -0,0 +1,1201 @@
+{
+  TRJSON - JSON Simple Read and Write
+  - v0.9.14
+  - 2025-05-10 by gale
+  - https://github.com/higale/RJSON
+}
+unit rjson;
+
+interface
+
+uses
+  System.Classes, System.TypInfo, System.SysUtils, System.Json, FMX.Types,
+  System.IOUtils, System.Generics.Collections;
+
+type
+  TJObject = TJSONObject;
+  TJArray = TJSONArray;
+  TJPair = TJSONPair;
+  TJValue = TJSONValue;
+  TJString = TJSONString;
+  TJNumber = TJSONNumber;
+  TJBool = TJSONBool;
+  TJTrue = TJSONTrue;
+  TJFalse = TJSONFalse;
+  TJNull = TJSONNull;
+  TJVType = type of TJValue;
+
+  IRJRoot = interface
+    ['{486F1FA6-2CDD-4124-98C5-CE7C398B7143}']
+    function GetData: TJValue;
+    procedure SetData(const AValue: TJValue);
+    function ForceData(AType: TJVType): TJValue;
+    property Data: TJValue read GetData write SetData;
+  end;
+
+  TRJSONRoot = class(TInterfacedObject, IRJRoot)
+  private
+    FData: TJValue;
+    function GetData: TJValue;
+    procedure SetData(const AValue: TJValue);
+    function ForceData(AType: TJVType): TJValue;
+  public
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+  TRPath = record
+  private
+    FData: string;
+  public
+    class operator Implicit(const Value: string): TRPath;
+    class operator Implicit(Value: Integer): TRPath;
+    class operator Implicit(const [ref] Value: TRPath): string;
+  end;
+
+  TRJSONEnumerator = class;
+
+  TRJSON = record
+  private
+    FIRoot: IRJRoot;
+    FPath: string;
+    function GetRootRefCount: Integer;
+    function ForceRootJValue(const APath: string): TJValue;
+    function LinkPath(const ALeft, ARight: string): string;
+    function GetJValue: TJValue;
+    function GetItems(const APath: TRPath): TRJSON;
+    function GetPairs(AIndex: Integer): TRJSON;
+    procedure SetValue(const [ref] AValue: TRJSON);
+    procedure SetItems(const APath: TRPath; const [ref] AValue: TRJSON);
+    function GetS(const APath: TRPath): string; overload;
+    procedure SetS(const APath: TRPath; AValue: string); overload;
+    function GetI(const APath: TRPath): Integer; overload;
+    procedure SetI(const APath: TRPath; AValue: Integer); overload;
+    function GetI64(const APath: TRPath): Int64; overload;
+    procedure SetI64(const APath: TRPath; AValue: Int64); overload;
+    function GetF(const APath: TRPath): Extended; overload;
+    procedure SetF(const APath: TRPath; AValue: Extended); overload;
+    function GetB(const APath: TRPath): Boolean; overload;
+    procedure SetB(const APath: TRPath; AValue: Boolean); overload;
+    function GetCount: Integer;
+    function GetLastPath: string;
+    function GetIndex: Integer;
+    function GetKey: string;
+    function GetRoot: TRJSON;
+    function GetParent: TRJSON;
+  public
+    function GetEnumerator(): TRJSONEnumerator;
+    class operator Initialize(out Dest: TRJSON);
+    class operator Finalize(var Dest: TRJSON);
+    class operator Assign(var Dest: TRJSON; const [ref] Src: TRJSON);
+    class operator Implicit(const Value: string): TRJSON;
+    class operator Implicit(const [ref] Value: TRJSON): string;
+    class operator Implicit(Value: Integer): TRJSON;
+    class operator Implicit(const [ref] Value: TRJSON): Integer;
+    class operator Implicit(Value: Int64): TRJSON;
+    class operator Implicit(const [ref] Value: TRJSON): Int64;
+    class operator Implicit(Value: Extended): TRJSON;
+    class operator Implicit(const [ref] Value: TRJSON): Extended;
+    class operator Implicit(Value: Boolean): TRJSON;
+    class operator Implicit(const [ref] Value: TRJSON): Boolean;
+    class operator Implicit(const Value: TJValue): TRJSON;
+    class operator Implicit(const [ref] Value: TRJSON): TJValue;
+    function ToStr(const ADefault: string = ''): string;
+    function ToInt(ADefault: Integer = 0): Integer;
+    function ToInt64(ADefault: Int64 = 0): Int64;
+    function ToFloat(ADefault: Extended = 0.0): Extended;
+    function ToBool(ADefault: Boolean = False): Boolean;
+
+    property Items[const APath: TRPath]: TRJSON read GetItems write SetItems; default;
+    property S[const APath: TRPath]: string read GetS write SetS;
+    property I[const APath: TRPath]: Integer read GetI write SetI;
+    property I64[const APath: TRPath]: Int64 read GetI64 write SetI64;
+    property F[const APath: TRPath]: Extended read GetF write SetF;
+    property B[const APath: TRPath]: Boolean read GetB write SetB;
+    property Pairs[AIndex: Integer]: TRJSON read GetPairs;
+    property Count: Integer read GetCount;
+    property LastPath: string read GetLastPath;
+    property Index: Integer read GetIndex;
+    property Key: string read GetKey;
+    property RootRefCount: Integer read GetRootRefCount;
+    property Root: TRJSON read GetRoot;
+    property Parent: TRJSON read GetParent;
+    property Path: string read FPath;
+    property JValue: TJValue read GetJValue;
+
+    function CloneJValue: TJValue;
+    function IsRoot: Boolean; inline;
+    function RootIsObject: Boolean; inline;
+    function RootIsArray: Boolean; inline;
+    function IsObject: Boolean;
+    function IsArray: Boolean;
+    function IsString: Boolean;
+    function IsNumber: Boolean;
+    function IsInt: Boolean;
+    function IsInteger: Boolean;
+    function IsFloat: Boolean;
+    function IsBool: Boolean;
+    function IsNull: Boolean;
+    function IsNil: Boolean;
+    function IsEmpty: Boolean;
+    function ItemByValue(const [ref] AValue: TRJSON; AIgnoreCase: Boolean = True): TRJSON;
+    function FirstItem: TRJSON;
+    function LastItem: TRJSON;
+    procedure MoveTo(AIndex: Integer);
+    procedure Rename(AName: string);
+    procedure MoveUp;
+    procedure MoveDown;
+    procedure MoveToFirst;
+    procedure MoveToLast;
+
+    procedure Add(const AValue: TRJSON);
+    procedure Delete(AIndex: Integer); overload;
+    procedure Delete; overload;
+
+    procedure Reset;
+    function ToJSON(AEncodeBelow32: Boolean = True; AEncodeAbove127: Boolean = True): string;
+    function Format(AIndentation: Integer = 4; AEncodeBelow32: Boolean = False; AEncodeAbove127: Boolean = False): string;
+    procedure ParseJValue(const AData: string; AUseBool: Boolean = False; ARaiseExc: Boolean = False);
+    procedure LoadFromFile(const AFileName: string; AUseBool: Boolean = False; ARaiseExc: Boolean = False);
+    procedure SaveToFile(const AFileName: string; AIndentation: Integer = 4; AEncodeBelow32: Boolean = True; AEncodeAbove127: Boolean = False; AWriteBOM: Boolean = True);
+    procedure LoadFromObject(const AObject: TObject; ARaiseExc: Boolean = False);
+    procedure SetObjectProp(AObject: TObject; ARaiseExc: Boolean = False);
+  end;
+
+  { Iterators }
+  TRJSONEnumerator = class
+  private
+    FPData: ^TRJSON;
+    FIndex: Integer;
+    function GetCurrent: TRJSON;
+  public
+    constructor Create(const [ref] AData: TRJSON);
+    function MoveNext: Boolean;
+    property Current: TRJSON read GetCurrent;
+  end;
+
+implementation
+
+{ ============================================================================ }
+{ TRJSONRoot }
+
+constructor TRJSONRoot.Create;
+begin
+  inherited;
+  FData := nil;
+end;
+
+destructor TRJSONRoot.Destroy;
+begin
+  FData.Free;
+  inherited;
+end;
+
+function TRJSONRoot.GetData: TJValue;
+begin
+  Result := FData;
+end;
+
+procedure TRJSONRoot.SetData(const AValue: TJValue);
+begin
+  FData := AValue;
+end;
+
+function TRJSONRoot.ForceData(AType: TJVType): TJValue;
+begin
+  if not(FData is AType) then
+  begin
+    FData.Free;
+    FData := AType.Create;
+  end;
+  Result := FData;
+end;
+
+{ TRJSONRoot }
+{ ============================================================================ }
+{ TJValueHelper TJObjectHelper TJArrayHelper}
+
+type
+  TJValueHelper = class helper for TJValue
+  private
+    function ToType<T>(ADefault: T): T;
+    function GetOrCreate<T: TJValue>(AName: string): T;
+    procedure SetValue(const APath: string; const AValue: TJValue);
+    procedure TrySetValue(const APath: string; const AValue: TJValue);
+  end;
+
+  TJObjectHelper = class helper for TJObject
+  private
+    procedure _SetItem(const AName: string; const AValue: TJValue); overload;
+   // procedure _Insert(const AIndex: Integer; const AKey: string; const AValue: TJValue); overload;
+    procedure _Insert(const AIndex: Integer; const AValue: TJPair); overload;
+  end;
+
+  TJArrayHelper = class helper for TJArray
+  private
+    procedure _Fill<T: TJValue>(ACount: Integer);
+    procedure _Insert(const AIndex: Integer; const AValue: TJValue);
+    procedure _SetItem(AIndex: Integer; const AValue: TJValue); overload;
+  end;
+
+  TJSONPairHelper = class helper for TJSONPair
+  private
+    procedure Rename(ANewName: string);
+  end;
+
+procedure TJSONPairHelper.Rename(ANewName: string);
+begin
+  SetJsonString(TJSONString.Create(ANewName));
+end;
+
+procedure TJArrayHelper._Fill<T>(ACount: Integer);
+begin
+  for var j := Count to ACount do
+    AddElement(T.Create);
+end;
+
+procedure TJArrayHelper._Insert(const AIndex: Integer; const AValue: TJValue);
+begin
+  AddElement(AValue);
+  for var I := AIndex to Count - 2 do
+    AddElement(Remove(AIndex));
+end;
+
+procedure TJArrayHelper._SetItem(AIndex: Integer; const AValue: TJValue);
+begin
+  _Fill<TJNull>(AIndex - 1);
+  if AIndex <= Count - 1 then
+    Remove(AIndex).Free;
+  _Insert(AIndex, AValue);
+end;
+
+procedure TJValueHelper.SetValue(const APath: string; const AValue: TJValue);
+var
+  LParser: TJSONPathParser;
+  preName: string;
+  jv: TJValue;
+begin
+  if APath.IsEmpty then
+    raise Exception.Create('TJValueHelper.SetValue: path cannot be empty');
+  jv := self;
+  LParser := TJSONPathParser.Create(APath);
+  LParser.NextToken;
+  while True do
+  begin
+    preName := LParser.TokenName;
+    LParser.NextToken;
+    case LParser.Token of
+      TJSONPathParser.TToken.Name:
+        jv := jv.GetOrCreate<TJObject>(preName);
+      TJSONPathParser.TToken.ArrayIndex:
+        jv := jv.GetOrCreate<TJArray>(preName);
+      TJSONPathParser.TToken.Eof:
+        begin
+          if jv is TJObject then
+            TJObject(jv)._SetItem(preName, AValue)
+          else
+            TJArray(jv)._SetItem(preName.ToInteger, AValue);
+          break;
+        end;
+    else
+      raise Exception.Create('TJValueHelper.SetValue, LParser.Token Error!');
+    end;
+  end;
+end;
+
+procedure TJValueHelper.TrySetValue(const APath: string; const AValue: TJValue);
+begin
+  try
+    SetValue(APath, AValue);
+  except
+    on E: Exception do
+    begin
+      AValue.Free;
+      raise Exception.Create(E.Message);
+    end;
+  end;
+end;
+
+function TJValueHelper.ToType<T>(ADefault: T): T;
+begin
+  if self = nil then
+    Exit(ADefault);
+  try
+    Result := AsType<T>;
+  except
+    Result := ADefault;
+  end;
+end;
+
+function TJValueHelper.GetOrCreate<T>(AName: string): T;
+begin
+  if self is TJObject then
+  begin
+    Result := T(TJObject(self).GetValue(AName));
+    if not(Result is T) then
+    begin
+      Result := T.Create;
+      TJObject(self)._SetItem(AName, Result);
+    end;
+  end
+  else if self is TJArray then
+  begin
+    TJArray(self)._Fill<TJNull>(AName.ToInteger);
+    Result := T(TJArray(self).Items[AName.ToInteger]);
+    if not(Result is T) then
+    begin
+      Result := T.Create;
+      TJArray(self)._SetItem(AName.ToInteger, Result);
+    end;
+  end
+  else
+  begin
+    raise Exception.Create('GetOrCreate<T> Error, self must be TJO or TJA');
+  end;
+end;
+
+procedure TJObjectHelper._SetItem(const AName: string; const AValue: TJValue);
+var
+  pairTmp: TJSONPair;
+begin
+  pairTmp := Get(AName);
+  if pairTmp = nil then
+    AddPair(AName, AValue)
+  else
+    pairTmp.JSONValue := AValue;
+end;
+
+{procedure TJObjectHelper._Insert(const AIndex: Integer; const AKey: string; const AValue: TJValue);
+begin
+  with self do
+  begin
+    FMembers.Insert(AIndex, TJSONPair.Create(AKey, AValue));
+  end;
+end;}
+
+procedure TJObjectHelper._Insert(const AIndex: Integer; const AValue: TJPair);
+begin
+  with self do
+  begin
+    FMembers.Insert(AIndex, AValue);
+  end;
+end;
+
+{ TJValueHelper TJObjectHelper TJArrayHelper}
+{ ============================================================================ }
+{ TRPath }
+
+class operator TRPath.Implicit(const Value: string): TRPath;
+begin
+  Result.FData := Value;
+end;
+
+class operator TRPath.Implicit(Value: Integer): TRPath;
+begin
+  Result.FData := '[' + Value.ToString + ']';
+end;
+
+class operator TRPath.Implicit(const [ref] Value: TRPath): string;
+begin
+  Result := Value.FData;
+end;
+
+{ TRPath }
+{ ============================================================================ }
+{ TRJSONEnumerator }
+
+constructor TRJSONEnumerator.Create(const [ref] AData: TRJSON);
+begin
+  inherited Create;
+  FPData := @AData;
+  FIndex := -1;
+end;
+
+function TRJSONEnumerator.GetCurrent: TRJSON;
+var
+  jvTmp: TJValue;
+begin
+  Result.Reset;
+  Result.FIRoot := FPData^.FIRoot;
+  jvTmp := FPData^.GetJValue;
+  if jvTmp is TJObject then
+  begin
+    if FPData^.FPath = '' then
+      Result.FPath := TJObject(jvTmp).Pairs[FIndex].JsonString.Value
+    else
+      Result.FPath := FPData^.FPath + '.' + TJObject(jvTmp).Pairs[FIndex].JsonString.Value;
+  end
+  else if jvTmp is TJArray then
+  begin
+    Result.FPath := FPData^.FPath + '[' + FIndex.ToString + ']';
+  end;
+end;
+
+function TRJSONEnumerator.MoveNext: Boolean;
+begin
+  Inc(FIndex);
+  Exit(FIndex < FPData^.Count)
+end;
+
+{ TRJSONEnumerator }
+{ ============================================================================ }
+{ TRJSON }
+
+function TRJSON.GetEnumerator(): TRJSONEnumerator;
+begin
+  Result := TRJSONEnumerator.Create(self);
+end;
+
+class operator TRJSON.Initialize(out Dest: TRJSON);
+begin
+  Dest.FIRoot := TRJSONRoot.Create;
+  Dest.FPath := '';
+end;
+
+class operator TRJSON.Finalize(var Dest: TRJSON);
+begin
+  Dest.FIRoot := nil;
+end;
+
+function TRJSON.GetRootRefCount: Integer;
+begin
+  Result := (FIRoot as TRJSONRoot).RefCount;
+end;
+
+function TRJSON.ForceRootJValue(const APath: string): TJValue;
+begin
+  if APath.StartsWith('[') then
+    Result := FIRoot.ForceData(TJArray)
+  else
+    Result := FIRoot.ForceData(TJObject);
+end;
+
+function TRJSON.LinkPath(const ALeft, ARight: string): string;
+begin
+  if ALeft.IsEmpty then
+    Result := ARight
+  else if ARight.IsEmpty then
+    Result := ALeft
+  else if ARight.StartsWith('[') then
+    Result := ALeft + ARight
+  else
+    Result := ALeft + '.' + ARight;
+end;
+
+function TRJSON.GetJValue: TJValue;
+begin
+  Result := FIRoot.Data.FindValue(FPath);
+end;
+
+function TRJSON.CloneJValue: TJValue;
+var
+  LValue: TJValue;
+begin
+  LValue := GetJValue;
+  if LValue <> nil then
+    Exit(TJValue(LValue.Clone));
+  Result := nil;
+end;
+
+class operator TRJSON.Assign(var Dest: TRJSON; const [ref] Src: TRJSON);
+begin
+  if Dest.FPath.IsEmpty then
+  begin
+    Dest.FIRoot := Src.FIRoot;
+    Dest.FPath := Src.FPath;
+  end
+  else
+  begin
+    Dest.SetValue(Src);
+  end;
+end;
+
+class operator TRJSON.Implicit(const Value: string): TRJSON;
+begin
+  Result.FIRoot.Data := TJString.Create(Value);
+end;
+
+class operator TRJSON.Implicit(const [ref] Value: TRJSON): string;
+begin
+  Result := Value.ToStr('');
+end;
+
+class operator TRJSON.Implicit(Value: Integer): TRJSON;
+begin
+  Result.FIRoot.Data := TJNumber.Create(Value);
+end;
+
+class operator TRJSON.Implicit(const [ref] Value: TRJSON): Integer;
+begin
+  Result := Value.ToInt(0);
+end;
+
+class operator TRJSON.Implicit(Value: Int64): TRJSON;
+begin
+  Result.FIRoot.Data := TJNumber.Create(Value);
+end;
+
+class operator TRJSON.Implicit(const [ref] Value: TRJSON): Int64;
+begin
+  Result := Value.ToInt64(0);
+end;
+
+class operator TRJSON.Implicit(Value: Extended): TRJSON;
+begin
+  Result.FIRoot.Data := TJNumber.Create(Value);
+end;
+
+class operator TRJSON.Implicit(const [ref] Value: TRJSON): Extended;
+begin
+  Result := Value.ToFloat(0.0);
+end;
+
+class operator TRJSON.Implicit(Value: Boolean): TRJSON;
+begin
+  Result.FIRoot.Data := TJBool.Create(Value);
+end;
+
+class operator TRJSON.Implicit(const [ref] Value: TRJSON): Boolean;
+begin
+  Result := Value.ToBool(False);
+end;
+
+class operator TRJSON.Implicit(const Value: TJValue): TRJSON;
+begin
+  Result.FIRoot.Data := Value;
+end;
+
+class operator TRJSON.Implicit(const [ref] Value: TRJSON): TJValue;
+begin
+  Result := Value.GetJValue;
+end;
+
+function TRJSON.ToStr(const ADefault: string): string;
+begin
+  Result := FIRoot.Data.FindValue(FPath).ToType<string>(ADefault);
+end;
+
+function TRJSON.ToInt(ADefault: Integer = 0): Integer;
+begin
+  Result := FIRoot.Data.FindValue(FPath).ToType<Integer>(ADefault);
+end;
+
+function TRJSON.ToInt64(ADefault: Int64 = 0): Int64;
+begin
+  Result := FIRoot.Data.FindValue(FPath).ToType<Int64>(ADefault);
+end;
+
+function TRJSON.ToFloat(ADefault: Extended = 0.0): Extended;
+begin
+  Result := FIRoot.Data.FindValue(FPath).ToType<Extended>(ADefault);
+end;
+
+function TRJSON.ToBool(ADefault: Boolean = False): Boolean;
+begin
+  Result := FIRoot.Data.FindValue(FPath).ToType<Boolean>(ADefault);
+end;
+
+function TRJSON.GetItems(const APath: TRPath): TRJSON;
+begin
+  Result.FIRoot := FIRoot;
+  Result.FPath := LinkPath(FPath, APath);
+end;
+
+function TRJSON.GetPairs(AIndex: Integer): TRJSON;
+var
+  jvTmp: TJValue;
+begin
+  jvTmp := GetJValue;
+  if (jvTmp is TJObject) then
+    Result := GetItems(TJObject(jvTmp).Pairs[AIndex].JsonString.Value);
+end;
+
+procedure TRJSON.SetValue(const [ref] AValue: TRJSON);
+var
+  LValue: TJValue;
+begin
+  LValue := AValue.CloneJValue;
+  if LValue = nil then
+    LValue := TJNull.Create;
+  try
+    ForceRootJValue(FPath).SetValue(FPath, LValue);
+  except
+    on E: Exception do
+    begin
+      LValue.Free;
+      raise Exception.Create(E.Message);
+    end;
+  end;
+end;
+
+procedure TRJSON.SetItems(const APath: TRPath; const [ref] AValue: TRJSON);
+var
+  tmp: TRJSON;
+begin
+  tmp.FIRoot := FIRoot;
+  tmp.FPath := LinkPath(FPath, APath);
+  tmp.SetValue(AValue)
+end;
+
+function TRJSON.GetS(const APath: TRPath): string;
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  Result := ForceRootJValue(LPath).FindValue(LPath).ToType<string>('');
+end;
+
+procedure TRJSON.SetS(const APath: TRPath; AValue: string);
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  ForceRootJValue(LPath).TrySetValue(LPath, TJString.Create(AValue));
+end;
+
+function TRJSON.GetI(const APath: TRPath): Integer;
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  Result := ForceRootJValue(LPath).FindValue(LPath).ToType<Integer>(0);
+end;
+
+procedure TRJSON.SetI(const APath: TRPath; AValue: Integer);
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  ForceRootJValue(LPath).TrySetValue(LPath, TJNumber.Create(AValue));
+end;
+
+function TRJSON.GetI64(const APath: TRPath): Int64;
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  Result := ForceRootJValue(LPath).FindValue(LPath).ToType<Int64>(0);
+end;
+
+procedure TRJSON.SetI64(const APath: TRPath; AValue: Int64);
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  ForceRootJValue(LPath).TrySetValue(LPath, TJNumber.Create(AValue));
+end;
+
+function TRJSON.GetF(const APath: TRPath): Extended;
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  Result := ForceRootJValue(LPath).FindValue(LPath).ToType<Extended>(0.0);
+end;
+
+procedure TRJSON.SetF(const APath: TRPath; AValue: Extended);
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  ForceRootJValue(LPath).TrySetValue(LPath, TJNumber.Create(AValue));
+end;
+
+function TRJSON.GetB(const APath: TRPath): Boolean;
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  Result := ForceRootJValue(LPath).FindValue(LPath).ToType<Boolean>(False);
+end;
+
+procedure TRJSON.SetB(const APath: TRPath; AValue: Boolean);
+var
+  LPath: string;
+begin
+  LPath := LinkPath(FPath, APath);
+  ForceRootJValue(LPath).TrySetValue(LPath, TJBool.Create(AValue));
+end;
+
+function TRJSON.GetCount: Integer;
+var
+  jvTemp: TJValue;
+begin
+  jvTemp := GetJValue;
+  if jvTemp is TJArray then
+    Result := TJArray(jvTemp).Count
+  else if jvTemp is TJObject then
+    Result := TJObject(jvTemp).Count
+  else
+    Result := 0;
+end;
+
+function TRJSON.GetLastPath: string;
+begin
+  if FPath.IsEmpty then
+    Exit('');
+  Result := Key;
+  if Result.IsEmpty then
+  begin
+    Result := '[' + Index.ToString + ']';
+    if Result = '[-1]' then
+      Result := '';
+  end;
+end;
+
+function TRJSON.GetIndex: Integer;
+var
+  strTmp: string;
+begin
+  Result := -1;
+  strTmp := FPath.Substring(FPath.LastIndexOf('[') + 1);
+  if strTmp.EndsWith(']') then
+    Result := StrToIntDef(strTmp.TrimRight([']']), -1);
+end;
+
+function TRJSON.GetKey: string;
+begin
+  Result := FPath.Substring(FPath.LastIndexOf('.') + 1);
+  if Result.EndsWith(']') then
+    Result := '';
+end;
+
+function TRJSON.GetRoot: TRJSON;
+begin
+  Result.FIRoot := FIRoot;
+end;
+
+function TRJSON.GetParent: TRJSON;
+var
+  iPos: Integer;
+begin
+  if FPath.IsEmpty then
+    Exit;
+  iPos := FPath.LastIndexOfAny(['[', '.']);
+  if iPos < 0 then
+    Exit(Root);
+  Result.FIRoot := FIRoot;
+  Result.FPath := FPath.Substring(0, iPos);
+end;
+
+function TRJSON.IsRoot: Boolean;
+begin
+  Result := FPath.IsEmpty;
+end;
+
+function TRJSON.RootIsObject: Boolean;
+begin
+  Result := FIRoot.Data is TJObject;
+end;
+
+function TRJSON.RootIsArray: Boolean;
+begin
+  Result := FIRoot.Data is TJArray;
+end;
+
+function TRJSON.IsObject: Boolean;
+begin
+  Result := GetJValue is TJObject;
+end;
+
+function TRJSON.IsArray: Boolean;
+begin
+  Result := GetJValue is TJArray;
+end;
+
+function TRJSON.IsString: Boolean;
+begin
+  if JValue <> nil then
+    Exit(JValue.ClassName = 'TJSONString');
+  Result := False;
+end;
+
+function TRJSON.IsNumber: Boolean;
+begin
+  Result := GetJValue is TJNumber;
+end;
+
+function TRJSON.IsInt: Boolean;
+begin
+  if IsNumber then
+    Exit(ToStr.IndexOf('.') < 0);
+  Result := False;
+end;
+
+function TRJSON.IsInteger: Boolean;
+var
+  LI64: Int64;
+begin
+  if IsInt then
+  begin
+    LI64 := ToInt64;
+    Exit((LI64 >= Integer.MinValue) and (LI64 <= Integer.MaxValue));
+  end;
+  Result := False;
+end;
+
+function TRJSON.IsFloat: Boolean;
+begin
+  if IsNumber then
+    Exit(ToStr.IndexOf('.') >= 0);
+  Result := False;
+end;
+
+function TRJSON.IsBool: Boolean;
+begin
+  Result := GetJValue is TJBool;
+end;
+
+function TRJSON.IsNull: Boolean;
+begin
+  Result := GetJValue is TJNull;
+end;
+
+function TRJSON.IsNil: Boolean;
+begin
+  Result := GetJValue = nil;
+end;
+
+function TRJSON.IsEmpty: Boolean;
+begin
+  Result := FPath.IsEmpty and (FIRoot.Data = nil);
+end;
+
+function TRJSON.ItemByValue(const [ref] AValue: TRJSON; AIgnoreCase: Boolean): TRJSON;
+begin
+  for var item in self do
+  begin
+    if AValue.JValue.ClassType = item.JValue.ClassType then
+      if string.Compare(AValue.ToStr, item.ToStr, AIgnoreCase) = 0 then
+        Exit(item);
+  end;
+end;
+
+function TRJSON.FirstItem: TRJSON;
+begin
+  if IsArray then
+    Result := Items[0]
+  else if IsObject then
+    Result := Pairs[0]
+end;
+
+function TRJSON.LastItem: TRJSON;
+begin
+  if IsArray then
+    Result := Items[Count - 1]
+  else if IsObject then
+    Result := Pairs[Count - 1]
+end;
+
+procedure TRJSON.MoveTo(AIndex: Integer);
+var
+  LParent: TJValue;
+  LParentTmp: TRJSON;
+  LValue: TRJSON;
+begin
+  LParent := Parent.JValue;
+  if (AIndex >= Parent.Count) or (AIndex < 0) then
+    raise Exception.Create('Index out of bounds');
+  if LParent is TJArray then
+  begin
+    TJArray(LParent)._Insert(AIndex, TJArray(LParent).Remove(Index));
+  end
+  else if LParent is TJObject then
+  begin
+    TJObject(LParent)._Insert(AIndex, TJObject(LParent).RemovePair(Key));
+  end;
+end;
+
+procedure TRJSON.Rename(AName: string);
+begin
+  if Parent.IsObject then
+    TJObject(Parent.JValue).Get(Key).Rename(AName);
+
+  if Parent.IsRoot then
+    FPath := AName
+  else
+    FPath := FPath.Substring(0, FPath.LastIndexOf('.') + 1) + AName;
+end;
+
+procedure TRJSON.MoveUp;
+begin
+  if Index > 0 then
+    MoveTo(Index - 1);
+end;
+
+procedure TRJSON.MoveDown;
+begin
+  if Index < Parent.Count - 1 then
+    MoveTo(Index + 1);
+end;
+
+procedure TRJSON.MoveToFirst;
+begin
+  MoveTo(0);
+end;
+
+procedure TRJSON.MoveToLast;
+begin
+  MoveTo(Parent.Count - 1);
+end;
+
+procedure TRJSON.Add(const AValue: TRJSON);
+begin
+  if IsArray then
+  begin
+    Items[Count] := AValue.CloneJValue;
+  end
+  else
+  begin
+    Items[0] := AValue.CloneJValue;
+  end;
+end;
+
+procedure TRJSON.Delete(AIndex: Integer);
+begin
+  if IsArray then
+  begin
+    TJArray(GetJValue).Remove(AIndex).Free;
+  end;
+end;
+
+procedure TRJSON.Delete;
+var
+  LParentValue: TJValue;
+begin
+  if IsRoot then
+    Reset;
+  LParentValue := Parent.JValue;
+  if LParentValue is TJObject then
+  begin
+    TJObject(LParentValue).RemovePair(Key).Free;
+  end
+  else if LParentValue is TJArray then
+  begin
+    TJArray(LParentValue).Remove(Index).Free;
+  end;
+end;
+
+procedure TRJSON.Reset;
+begin
+  FIRoot := TRJSONRoot.Create;
+  FPath := '';
+end;
+
+function TRJSON.ToJSON(AEncodeBelow32: Boolean = True; AEncodeAbove127: Boolean = True): string;
+var
+  LValue: TJValue;
+  Options: TJSONAncestor.TJSONOutputOptions;
+begin
+  Result := '';
+  LValue := GetJValue;
+  if LValue <> nil then
+  begin
+    Options := [];
+    if AEncodeBelow32 then
+      Include(Options, TJSONAncestor.TJSONOutputOption.EncodeBelow32);
+    if AEncodeAbove127 then
+      Include(Options, TJSONAncestor.TJSONOutputOption.EncodeAbove127);
+    Result := LValue.ToJSON(Options);
+  end;
+end;
+
+function JSONToUniCode(const AStr: string; AEncodeBelow32: Boolean = True; AEncodeAbove127: Boolean = True): string;
+var
+  ch: char;
+  I: Integer;
+  UnicodeValue: Integer;
+  Buff: array [0 .. 5] of char;
+begin
+  for I := 1 to AStr.Length do
+  begin
+    ch := AStr[I];
+    case ch of
+      #0 .. #7, #$b, #$e .. #31, #$0080 .. High(char):
+        begin
+          UnicodeValue := Ord(ch);
+          if AEncodeBelow32 and (UnicodeValue < 32) or AEncodeAbove127 and (UnicodeValue > 127) then
+          begin
+            Buff[0] := '\';
+            Buff[1] := 'u';
+            Buff[2] := char(DecimalToHex((UnicodeValue and 61440) shr 12));
+            Buff[3] := char(DecimalToHex((UnicodeValue and 3840) shr 8));
+            Buff[4] := char(DecimalToHex((UnicodeValue and 240) shr 4));
+            Buff[5] := char(DecimalToHex((UnicodeValue and 15)));
+            Result := Result + Buff;
+          end
+          else
+          begin
+            Result := Result + ch;
+          end;
+        end
+    else
+      begin
+        Result := Result + ch;
+      end;
+    end;
+  end;
+end;
+
+function TRJSON.Format(AIndentation: Integer; AEncodeBelow32: Boolean; AEncodeAbove127: Boolean): string;
+var
+  LValue: TJValue;
+begin
+  if AIndentation >= 0 then
+  begin
+    Result := '';
+    LValue := GetJValue;
+    if LValue <> nil then
+    begin
+      Result := LValue.Format(AIndentation);
+      if AEncodeBelow32 or AEncodeAbove127 then
+      begin
+        Result := JSONToUniCode(Result, AEncodeBelow32, AEncodeAbove127);
+      end;
+    end;
+  end
+  else
+  begin
+    Result := ToJSON(AEncodeBelow32, AEncodeAbove127);
+  end;
+end;
+
+procedure TRJSON.ParseJValue(const AData: string; AUseBool: Boolean; ARaiseExc: Boolean);
+begin
+  self := TJValue.ParseJSONValue(AData, AUseBool, ARaiseExc);
+end;
+
+procedure TRJSON.LoadFromFile(const AFileName: string; AUseBool: Boolean; ARaiseExc: Boolean);
+begin
+  try
+    ParseJValue(TFile.ReadAllText(AFileName, TEncoding.UTF8), AUseBool, ARaiseExc);
+  except
+    on E: Exception do
+    begin
+      if ARaiseExc then
+        raise Exception.Create(E.Message);
+    end;
+  end;
+end;
+
+procedure TRJSON.SaveToFile(const AFileName: string; AIndentation: Integer; AEncodeBelow32: Boolean; AEncodeAbove127: Boolean; AWriteBOM: Boolean);
+var
+  strs: TStrings;
+begin
+  strs := TStringList.Create;
+  try
+    strs.WriteBOM := AWriteBOM;
+    strs.Text := Format(AIndentation, AEncodeBelow32, AEncodeAbove127);
+    strs.SaveToFile(AFileName, TEncoding.UTF8);
+  finally
+    strs.Free;
+  end;
+end;
+
+procedure TRJSON.LoadFromObject(const AObject: TObject; ARaiseExc: Boolean);
+var
+  PropName: string;
+  PropType: string;
+  PropEnumName: string;
+  propList: PPropList;
+  PropValue: Variant;
+  rjTmp: TRJSON;
+begin
+  GetPropList(AObject.ClassInfo, propList);
+  try
+    for var I := 0 to GetTypeData(AObject.ClassInfo).propCount - 1 do
+    begin
+      try
+        PropName := string(propList[I]^.Name);
+        PropType := string(propList[I]^.PropType^.Name);
+        PropEnumName := GetEnumName(TypeInfo(TTypeKind), Int64(propList[I]^.PropType^.Kind));
+        PropValue := GetPropValue(AObject, PropName, True);
+
+        // if PropType = 'TComponentName' then
+         // Continue;
+        if PropName = 'ActiveControl' then
+          Continue;
+
+        if propList[I]^.PropType^.Kind <> tkMethod then
+        begin
+          // rjTmp[PropName + '_dbg_inf'] := PropType + ' ' + PropEnumName;
+          if (propList[I]^.PropType^.Kind <> tkClass) then
+          begin
+            if PropType = 'Int64' then
+              rjTmp[PropName] := Int64(PropValue)
+            else if PropType = 'Integer' then
+              rjTmp[PropName] := Integer(PropValue)
+            else if PropType = 'Boolean' then
+              rjTmp[PropName] := Boolean(PropValue)
+            else if PropType = 'TAlphaColor' then
+              rjTmp[PropName] := '#' + {$IFDEF CPUX64}Int64{$ELSE}Integer{$ENDIF}(PropValue).ToHexString(8)
+            else
+            begin
+              case propList[I]^.PropType^.Kind of
+                tkInteger:
+                  rjTmp[PropName] := {$IFDEF CPUX64}Int64{$ELSE}Integer{$ENDIF}(PropValue);
+                tkInt64:
+                  rjTmp[PropName] := Int64(PropValue);
+                tkFloat:
+                  rjTmp[PropName] := Extended(PropValue);
+              else // tkEnumeration, tkSet, tkUString
+                rjTmp[PropName] := string(PropValue);
+              end;
+            end;
+          end
+          else if PropValue <> 0 then
+          begin
+            rjTmp[PropName].LoadFromObject(TObject(StrToInt64(PropValue)));
+          end;
+        end;
+      except
+        on E: Exception do
+          if ARaiseExc then
+            raise Exception.Create(E.Message);
+      end;
+    end;
+    self := rjTmp;
+  finally
+    FreeMem(propList);
+  end;
+end;
+
+procedure TRJSON.SetObjectProp(AObject: TObject; ARaiseExc: Boolean);
+var
+  PropName: string;
+  PropInfo: PPropInfo;
+begin
+  for var item in self do
+  begin
+    if item.Key.EndsWith('_dbg_inf') then
+      Continue;
+    try
+      PropInfo := GetPropInfo(PTypeInfo(AObject.ClassInfo), item.Key);
+      if PropInfo = nil then
+        Continue;
+      PropName := string(PropInfo^.PropType^.Name);
+      if item.IsObject then
+      begin
+        if PropInfo^.PropType^.Kind = tkClass then
+          item.SetObjectProp(TObject({$IFDEF CPUX64}Int64{$ELSE}Integer{$ENDIF}(GetPropValue(AObject, item.Key))));
+      end
+      else
+      begin
+        if PropName = 'TAlphaColor' then
+          SetPropValue(AObject, item.Key, {$IFDEF CPUX64}StrToInt64{$ELSE}StrToUInt{$ENDIF}('$' + item.ToStr.Substring(1, 8)))
+        else
+          SetPropValue(AObject, item.Key, item.ToStr);
+      end;
+    except
+      on E: Exception do
+        if ARaiseExc then
+          raise Exception.Create(E.Message);
+    end;
+  end;
+end;
+
+{ TRJSON }
+{ ============================================================================ }
+
+end.
+

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini