diff --git a/ProxyFormUnit.fmx b/ProxyFormUnit.fmx index a69fd89..d8f8703 100644 --- a/ProxyFormUnit.fmx +++ b/ProxyFormUnit.fmx @@ -2,7 +2,7 @@ object MainForm: TMainForm Left = 0 Top = 0 Caption = 'Ceton HDHomeRun Proxy' - ClientHeight = 492 + ClientHeight = 494 ClientWidth = 400 Fill.Kind = Solid Position = ScreenCenter @@ -18,11 +18,11 @@ object MainForm: TMainForm object VertScrollBox1: TVertScrollBox Align = Client Size.Width = 400.000000000000000000 - Size.Height = 492.000000000000000000 + Size.Height = 494.000000000000000000 Size.PlatformDefault = False TabOrder = 3 Viewport.Width = 400.000000000000000000 - Viewport.Height = 492.000000000000000000 + Viewport.Height = 494.000000000000000000 object OuterPanelContainer: TLayout Align = Top Size.Width = 400.000000000000000000 @@ -52,7 +52,7 @@ object MainForm: TMainForm TabOrder = 0 OnMouseDown = PanelMouseDown OnResized = PanelResizing - ContentSize = '156' + ContentSize = '200' object Label7: TLabel Position.X = 15.000000000000000000 Position.Y = 130.000000000000000000 @@ -241,36 +241,18 @@ object MainForm: TMainForm Size.Width = 394.000000000000000000 Size.Height = 354.000000000000000000 Size.PlatformDefault = False - Text = 'Statistics' + Text = 'Tuners' TabOrder = 3 OnMouseDown = PanelMouseDown OnResized = PanelResizing ContentSize = '334' - object lbStats: TListView - ItemAppearanceClassName = 'TCustomizeItemObjects' - ItemEditAppearanceClassName = 'TCustomizeItemObjects' - HeaderAppearanceClassName = 'TListHeaderObjects' - FooterAppearanceClassName = 'TListHeaderObjects' - ItemSpaces.Left = 0.000000000000000000 - ItemSpaces.Right = 0.000000000000000000 - Align = Client - HitTest = False - Margins.Left = 10.000000000000000000 - Margins.Top = 9.000000000000000000 - Margins.Right = 10.000000000000000000 - Size.Width = 374.000000000000000000 - Size.Height = 291.000000000000000000 - Size.PlatformDefault = False - TabOrder = 0 - ShowSelection = False - end object Layout2: TLayout Align = Bottom Position.Y = 300.000000000000000000 Size.Width = 394.000000000000000000 Size.Height = 34.000000000000000000 Size.PlatformDefault = False - TabOrder = 1 + TabOrder = 0 object btnShowConfigFolder: TButton Position.X = 10.000000000000000000 Position.Y = 4.000000000000000000 @@ -282,6 +264,29 @@ object MainForm: TMainForm OnClick = btnShowConfigFolderClick end end + object lbTuners: TListBox + Align = Client + EnableDragHighlight = False + Margins.Left = 10.000000000000000000 + Margins.Top = 9.000000000000000000 + Margins.Right = 10.000000000000000000 + Size.Width = 374.000000000000000000 + Size.Height = 291.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'lbTunersStyle1' + TabOrder = 1 + DisableMouseWheel = True + AlternatingRowBackground = True + CanFocus = False + DisableFocusEffect = True + DefaultItemStyles.ItemStyle = '' + DefaultItemStyles.GroupHeaderStyle = '' + DefaultItemStyles.GroupFooterStyle = '' + ShowCheckboxes = True + OnChangeCheck = lbTunersChangeCheck + Viewport.Width = 370.000000000000000000 + Viewport.Height = 287.000000000000000000 + end end object pnlChannels: TExpander Align = Top @@ -387,277 +392,1329 @@ object MainForm: TMainForm item Platform = 'Windows 10 Desktop' ResourcesBin = { - 464D585F5354594C4520322E3501060D457870616E6465727374796C6503F504 + 464D585F5354594C4520322E3501060D457870616E6465727374796C6503FE04 0621457870616E6465727374796C65457870616E646572427574746F6E537479 6C6531038A0F061B457870616E6465727374796C65436865636B426F78537479 - 6C653103DC0B005450463007544C61796F757400095374796C654E616D65060D - 457870616E6465727374796C6505416C69676E070643656E7465720A53697A65 - 2E57696474680500000000000080BC07400B53697A652E486569676874050000 - 0000000000B106401453697A652E506C6174666F726D44656661756C74080854 - 61624F726465720200000A5452656374616E676C650005416C69676E0708436F - 6E74656E74730C436C69704368696C6472656E090946696C6C2E4B696E640704 - 4E6F6E650748697454657374080A53697A652E57696474680500000000000080 + 6C653103DC0B060E6C6254756E6572735374796C653103F909061D6C6254756E + 6572735374796C65315363726F6C6C4261725374796C653103AF04061E767363 + 726F6C6C6261727363726F6C6C6261726C656674627574746F6E31038412061F + 767363726F6C6C6261727363726F6C6C6261727269676874627574746F6E3103 + 8512061D767363726F6C6C6261727363726F6C6C626172746F70627574746F6E + 310375120620767363726F6C6C6261727363726F6C6C626172626F74746F6D62 + 7574746F6E31037812061F767363726F6C6C6261727363726F6C6C6261726874 + 7261636B7374796C653103F103061268747261636B687468756D627374796C65 + 3103B70B061F767363726F6C6C6261727363726F6C6C62617276747261636B73 + 74796C653103F103061276747261636B767468756D627374796C653103B70B06 + 226C6254756E6572735374796C6531536D616C6C5363726F6C6C426172537479 + 6C6531030002062476736D616C6C7363726F6C6C6261727363726F6C6C626172 + 68747261636B7374796C653103F603062476736D616C6C7363726F6C6C626172 + 7363726F6C6C62617276747261636B7374796C653103F603005450463007544C + 61796F757400095374796C654E616D65060D457870616E6465727374796C6505 + 416C69676E070643656E7465720A53697A652E57696474680500000000000080 BC07400B53697A652E4865696768740500000000000000B106401453697A652E - 506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978 - 46464343434343430007544C61796F757400095374796C654E616D6506066865 - 6164657205416C69676E0703546F700A53697A652E5769647468050000000000 - 0080BC07400B53697A652E4865696768740500000000000000A003401453697A - 652E506C6174666F726D44656661756C74080005545465787400095374796C65 - 4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409 - 0748697454657374080C4D617267696E732E4C65667405000000000000008000 - 400D4D617267696E732E526967687405000000000000008000400A53697A652E - 57696474680500000000000080A107400B53697A652E48656967687405000000 - 00000000A003401453697A652E506C6174666F726D44656661756C7408045465 - 7874060454657874165465787453657474696E67732E466F6E74436F6C6F7207 - 07636C614E617679155465787453657474696E67732E576F7264577261700800 - 000F54457870616E646572427574746F6E00095374796C654E616D6506066275 - 74746F6E05416C69676E07084D6F73744C656674064C6F636B6564090A53697A - 652E57696474680500000000000000C803400B53697A652E4865696768740500 - 000000000000A003401453697A652E506C6174666F726D44656661756C74080B - 5374796C654C6F6F6B75700621457870616E6465727374796C65457870616E64 - 6572427574746F6E5374796C653100000954436865636B426F7800095374796C - 654E616D650608636865636B626F7805416C69676E07094D6F73745269676874 - 0843616E466F63757308064C6F636B6564090A506F736974696F6E2E58050000 - 0000000000B007400A53697A652E57696474680500000000000000C803400B53 - 697A652E4865696768740500000000000000A003401453697A652E506C617466 - 6F726D44656661756C74080B5374796C654C6F6F6B7570061B457870616E6465 - 727374796C65436865636B426F785374796C6531000005544C696E6500095374 - 796C654E616D65060A4C696E65315374796C6507416E63686F72730B06616B4C - 65667405616B546F7007616B526967687400084C696E65547970650703546F70 - 074F7061636974790500000000000000C0FE3F0A506F736974696F6E2E580500 - 0000000000008000400A506F736974696F6E2E590500000000000000A803400A - 53697A652E57696474680500000000000080BA07400B53697A652E4865696768 - 740500000000000050F002401453697A652E506C6174666F726D44656661756C - 74080C5374726F6B652E436F6C6F72070A636C6144696D67726179105374726F - 6B652E546869636B6E6573730500000000000000C0FF3F000000000054504630 - 07544C61796F757400095374796C654E616D650621457870616E646572737479 - 6C65457870616E646572427574746F6E5374796C653105416C69676E07064365 - 6E7465720A53697A652E57696474680500000000000080BC07400B53697A652E - 4865696768740500000000000000B106401453697A652E506C6174666F726D44 - 656661756C74080756697369626C6508085461624F7264657202010012544275 - 74746F6E5374796C654F626A65637400095374796C654E616D65060A6261636B - 67726F756E6405416C69676E070643656E746572074F70616369747905000000 - 000000000000000C536F757263654C6F6F6B7570061B57696E646F7773203130 - 204465736B746F707374796C652E706E670A53697A652E576964746805000000 - 00000000D002400B53697A652E4865696768740500000000000000D002401453 - 697A652E506C6174666F726D44656661756C740808577261704D6F6465070643 - 656E74657207486F744C696E6B0E010F536F75726365526563742E4C65667405 - 00000000000000FA05400E536F75726365526563742E546F7005000000000000 - 009E074010536F75726365526563742E526967687405000000000000008A0640 - 11536F75726365526563742E426F74746F6D0500000000000080A40740000105 - 5363616C650500000000000000C0FF3F0F536F75726365526563742E4C656674 - 0500000000000000BC06400E536F75726365526563742E546F70050000000000 - 0000ED074010536F75726365526563742E52696768740500000000000000D006 - 4011536F75726365526563742E426F74746F6D0500000000000000F707400001 - 055363616C6505000000000000008000400F536F75726365526563742E4C6566 - 740500000000000000FA06400E536F75726365526563742E546F700500000000 - 0000009E084010536F75726365526563742E526967687405000000000000008A - 074011536F75726365526563742E426F74746F6D0500000000000080A4084000 - 000B466F63757365644C696E6B0E010F536F75726365526563742E4C65667405 - 00000000000000DC05400E536F75726365526563742E546F7005000000000000 - 009E074010536F75726365526563742E52696768740500000000000000F60540 - 11536F75726365526563742E426F74746F6D0500000000000080A40740000105 - 5363616C650500000000000000C0FF3F0F536F75726365526563742E4C656674 - 0500000000000000A506400E536F75726365526563742E546F70050000000000 - 0000ED074010536F75726365526563742E52696768740500000000000000B906 - 4011536F75726365526563742E426F74746F6D0500000000000000F707400001 - 055363616C6505000000000000008000400F536F75726365526563742E4C6566 - 740500000000000000DC06400E536F75726365526563742E546F700500000000 - 0000009E084010536F75726365526563742E52696768740500000000000000F6 - 064011536F75726365526563742E426F74746F6D0500000000000080A4084000 - 000A4E6F726D616C4C696E6B0E010F536F75726365526563742E4C6566740500 - 000000000000DC05400E536F75726365526563742E546F700500000000000000 - 9E074010536F75726365526563742E52696768740500000000000000F6054011 - 536F75726365526563742E426F74746F6D0500000000000080A4074000010553 - 63616C650500000000000000C0FF3F0F536F75726365526563742E4C65667405 - 00000000000000A506400E536F75726365526563742E546F7005000000000000 - 00ED074010536F75726365526563742E52696768740500000000000000B90640 - 11536F75726365526563742E426F74746F6D0500000000000000F70740000105 - 5363616C6505000000000000008000400F536F75726365526563742E4C656674 - 0500000000000000DC06400E536F75726365526563742E546F70050000000000 - 00009E084010536F75726365526563742E52696768740500000000000000F606 - 4011536F75726365526563742E426F74746F6D0500000000000080A408400000 - 0B507265737365644C696E6B0E010F536F75726365526563742E4C6566740500 - 000000000000FA05400E536F75726365526563742E546F700500000000000000 - 9E074010536F75726365526563742E526967687405000000000000008A064011 - 536F75726365526563742E426F74746F6D0500000000000080A4074000010553 - 63616C650500000000000000C0FF3F0F536F75726365526563742E4C65667405 - 00000000000000BC06400E536F75726365526563742E546F7005000000000000 - 00ED074010536F75726365526563742E52696768740500000000000000D00640 - 11536F75726365526563742E426F74746F6D0500000000000000F70740000105 - 5363616C6505000000000000008000400F536F75726365526563742E4C656674 - 0500000000000000FA06400E536F75726365526563742E546F70050000000000 - 00009E084010536F75726365526563742E526967687405000000000000008A07 - 4011536F75726365526563742E426F74746F6D0500000000000080A408400000 - 13546F756368416E696D6174696F6E2E4C696E6B0E00000F54466C6F6174416E - 696D6174696F6E00084475726174696F6E05000000000017B7D1F13F0C50726F - 70657274794E616D6506074F7061636974790A537461727456616C7565050000 - 00000000000000000953746F7056616C7565050000000000000080FF3F075472 - 696767657206104973457870616E6465643D66616C73650E5472696767657249 - 6E7665727365060F4973457870616E6465643D74727565000000125442757474 - 6F6E5374796C654F626A65637400095374796C654E616D65060A6261636B6772 - 6F756E6405416C69676E070643656E7465720C536F757263654C6F6F6B757006 - 1B57696E646F7773203130204465736B746F707374796C652E706E670A53697A - 652E57696474680500000000000000D002400B53697A652E4865696768740500 - 000000000000D002401453697A652E506C6174666F726D44656661756C740808 - 577261704D6F6465070643656E74657207486F744C696E6B0E010F536F757263 - 65526563742E4C6566740500000000000000FA05400E536F7572636552656374 - 2E546F70050000000000000095074010536F75726365526563742E5269676874 - 05000000000000008A064011536F75726365526563742E426F74746F6D050000 - 00000000809B07400001055363616C650500000000000000C0FF3F0F536F7572 - 6365526563742E4C6566740500000000000000BC06400E536F75726365526563 - 742E546F700500000000000080DF074010536F75726365526563742E52696768 - 740500000000000000D0064011536F75726365526563742E426F74746F6D0500 - 000000000080E907400001055363616C6505000000000000008000400F536F75 - 726365526563742E4C6566740500000000000000FA06400E536F757263655265 - 63742E546F70050000000000000095084010536F75726365526563742E526967 - 687405000000000000008A074011536F75726365526563742E426F74746F6D05 - 000000000000809B084000000B466F63757365644C696E6B0E010F536F757263 - 65526563742E4C6566740500000000000000DC05400E536F7572636552656374 - 2E546F70050000000000000095074010536F75726365526563742E5269676874 - 0500000000000000F6054011536F75726365526563742E426F74746F6D050000 - 00000000809B07400001055363616C650500000000000000C0FF3F0F536F7572 - 6365526563742E4C6566740500000000000000A506400E536F75726365526563 - 742E546F700500000000000080DF074010536F75726365526563742E52696768 - 740500000000000000B9064011536F75726365526563742E426F74746F6D0500 - 000000000080E907400001055363616C6505000000000000008000400F536F75 - 726365526563742E4C6566740500000000000000DC06400E536F757263655265 - 63742E546F70050000000000000095084010536F75726365526563742E526967 - 68740500000000000000F6064011536F75726365526563742E426F74746F6D05 - 000000000000809B084000000A4E6F726D616C4C696E6B0E010F536F75726365 - 526563742E4C6566740500000000000000DC05400E536F75726365526563742E - 546F70050000000000000095074010536F75726365526563742E526967687405 - 00000000000000F6054011536F75726365526563742E426F74746F6D05000000 - 000000809B07400001055363616C650500000000000000C0FF3F0F536F757263 - 65526563742E4C6566740500000000000000A506400E536F7572636552656374 - 2E546F700500000000000080DF074010536F75726365526563742E5269676874 - 0500000000000000B9064011536F75726365526563742E426F74746F6D050000 - 0000000080E907400001055363616C6505000000000000008000400F536F7572 - 6365526563742E4C6566740500000000000000DC06400E536F75726365526563 - 742E546F70050000000000000095084010536F75726365526563742E52696768 - 740500000000000000F6064011536F75726365526563742E426F74746F6D0500 - 0000000000809B084000000B507265737365644C696E6B0E010F536F75726365 - 526563742E4C6566740500000000000000FA05400E536F75726365526563742E - 546F70050000000000000095074010536F75726365526563742E526967687405 - 000000000000008A064011536F75726365526563742E426F74746F6D05000000 - 000000809B07400001055363616C650500000000000000C0FF3F0F536F757263 - 65526563742E4C6566740500000000000000BC06400E536F7572636552656374 - 2E546F700500000000000080DF074010536F75726365526563742E5269676874 - 0500000000000000D0064011536F75726365526563742E426F74746F6D050000 - 0000000080E907400001055363616C6505000000000000008000400F536F7572 - 6365526563742E4C6566740500000000000000FA06400E536F75726365526563 - 742E546F70050000000000000095084010536F75726365526563742E52696768 - 7405000000000000008A074011536F75726365526563742E426F74746F6D0500 - 0000000000809B0840000013546F756368416E696D6174696F6E2E4C696E6B0E - 00000F54466C6F6174416E696D6174696F6E00084475726174696F6E05000000 - 000017B7D1F13F0C50726F70657274794E616D6506074F7061636974790A5374 - 61727456616C756505000000000000000000000953746F7056616C7565050000 - 000000000080FF3F0754726967676572060F4973457870616E6465643D747275 - 650E54726967676572496E766572736506104973457870616E6465643D66616C - 7365000000005450463007544C61796F757400095374796C654E616D65061B45 - 7870616E6465727374796C65436865636B426F785374796C653105416C69676E - 070643656E7465720A53697A652E57696474680500000000000080BC07400B53 + 506C6174666F726D44656661756C74080756697369626C6508085461624F7264 + 65720200000A5452656374616E676C650005416C69676E0708436F6E74656E74 + 730C436C69704368696C6472656E090946696C6C2E4B696E6407044E6F6E6507 + 48697454657374080A53697A652E57696474680500000000000080BC07400B53 697A652E4865696768740500000000000000B106401453697A652E506C617466 - 6F726D44656661756C74080756697369626C6508085461624F72646572020200 - 07544C61796F75740005416C69676E07044C6566740A53697A652E5769647468 - 05000000000000009003400B53697A652E4865696768740500000000000000B1 - 06401453697A652E506C6174666F726D44656661756C7408001154436865636B - 5374796C654F626A65637400095374796C654E616D65060A6261636B67726F75 - 6E6405416C69676E070643656E746572074361704D6F6465070454696C65064C - 6F636B6564090C536F757263654C6F6F6B7570061B57696E646F777320313020 - 4465736B746F707374796C652E706E670A53697A652E57696474680500000000 - 000000D002400B53697A652E4865696768740500000000000000D00240145369 - 7A652E506C6174666F726D44656661756C740808577261704D6F646507064365 - 6E7465720D416374697665547269676765720707436865636B65640A41637469 - 76654C696E6B0E010F536F75726365526563742E4C6566740500000000000000 - F803400E536F75726365526563742E546F70050000000000000092064010536F - 75726365526563742E52696768740500000000000000B0044011536F75726365 - 526563742E426F74746F6D05000000000000009F06400001055363616C650500 - 000000000000C0FF3F0F536F75726365526563742E4C65667405000000000000 - 00B804400E536F75726365526563742E546F700500000000000000DB06401053 - 6F75726365526563742E5269676874050000000000000082054011536F757263 - 65526563742E426F74746F6D0500000000000000EE06400001055363616C6505 - 000000000000008000400F536F75726365526563742E4C656674050000000000 - 0000F804400E536F75726365526563742E546F70050000000000000092074010 - 536F75726365526563742E52696768740500000000000000B0054011536F7572 - 6365526563742E426F74746F6D05000000000000009F074000000A536F757263 - 654C696E6B0E010F536F75726365526563742E4C6566740500000000000000C0 - 00400E536F75726365526563742E546F70050000000000000092064010536F75 - 726365526563742E5269676874050000000000000080034011536F7572636552 - 6563742E426F74746F6D05000000000000009F06400001055363616C65050000 - 0000000000C0FF3F0F536F75726365526563742E4C6566740500000000000000 - 8001400E536F75726365526563742E546F700500000000000000DB064010536F - 75726365526563742E52696768740500000000000000B8034011536F75726365 - 526563742E426F74746F6D0500000000000000EE06400001055363616C650500 - 0000000000008000400F536F75726365526563742E4C65667405000000000000 - 00C001400E536F75726365526563742E546F7005000000000000009207401053 - 6F75726365526563742E5269676874050000000000000080044011536F757263 - 65526563742E426F74746F6D05000000000000009F0740000007486F744C696E - 6B0E010F536F75726365526563742E4C65667405000000000000008803400E53 + 6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646434343 + 4343430007544C61796F757400095374796C654E616D65060668656164657205 + 416C69676E0703546F700A53697A652E57696474680500000000000080BC0740 + 0B53697A652E4865696768740500000000000000A003401453697A652E506C61 + 74666F726D44656661756C74080005545465787400095374796C654E616D6506 + 047465787405416C69676E0706436C69656E74064C6F636B6564090748697454 + 657374080C4D617267696E732E4C65667405000000000000008000400D4D6172 + 67696E732E526967687405000000000000008000400A53697A652E5769647468 + 0500000000000080A107400B53697A652E4865696768740500000000000000A0 + 03401453697A652E506C6174666F726D44656661756C74080454657874060454 + 657874165465787453657474696E67732E466F6E74436F6C6F720707636C614E + 617679155465787453657474696E67732E576F7264577261700800000F544578 + 70616E646572427574746F6E00095374796C654E616D650606627574746F6E05 + 416C69676E07084D6F73744C656674064C6F636B6564090A53697A652E576964 + 74680500000000000000C803400B53697A652E48656967687405000000000000 + 00A003401453697A652E506C6174666F726D44656661756C74080B5374796C65 + 4C6F6F6B75700621457870616E6465727374796C65457870616E646572427574 + 746F6E5374796C653100000954436865636B426F7800095374796C654E616D65 + 0608636865636B626F7805416C69676E07094D6F737452696768740843616E46 + 6F63757308064C6F636B6564090A506F736974696F6E2E580500000000000000 + B007400A53697A652E57696474680500000000000000C803400B53697A652E48 + 65696768740500000000000000A003401453697A652E506C6174666F726D4465 + 6661756C74080B5374796C654C6F6F6B7570061B457870616E6465727374796C + 65436865636B426F785374796C6531000005544C696E6500095374796C654E61 + 6D65060A4C696E65315374796C6507416E63686F72730B06616B4C6566740561 + 6B546F7007616B526967687400084C696E65547970650703546F70074F706163 + 6974790500000000000000C0FE3F0A506F736974696F6E2E5805000000000000 + 008000400A506F736974696F6E2E590500000000000000A803400A53697A652E + 57696474680500000000000080BA07400B53697A652E48656967687405000000 + 00000050F002401453697A652E506C6174666F726D44656661756C74080C5374 + 726F6B652E436F6C6F72070A636C6144696D67726179105374726F6B652E5468 + 69636B6E6573730500000000000000C0FF3F00000000005450463007544C6179 + 6F757400095374796C654E616D650621457870616E6465727374796C65457870 + 616E646572427574746F6E5374796C653105416C69676E070643656E7465720A + 53697A652E57696474680500000000000080BC07400B53697A652E4865696768 + 740500000000000000B106401453697A652E506C6174666F726D44656661756C + 74080756697369626C6508085461624F726465720201001254427574746F6E53 + 74796C654F626A65637400095374796C654E616D65060A6261636B67726F756E + 6405416C69676E070643656E746572074F706163697479050000000000000000 + 00000C536F757263654C6F6F6B7570061B57696E646F7773203130204465736B + 746F707374796C652E706E670A53697A652E57696474680500000000000000D0 + 02400B53697A652E4865696768740500000000000000D002401453697A652E50 + 6C6174666F726D44656661756C740808577261704D6F6465070643656E746572 + 07486F744C696E6B0E010F536F75726365526563742E4C656674050000000000 + 0000FA05400E536F75726365526563742E546F7005000000000000009E074010 + 536F75726365526563742E526967687405000000000000008A064011536F7572 + 6365526563742E426F74746F6D0500000000000080A407400001055363616C65 + 0500000000000000C0FF3F0F536F75726365526563742E4C6566740500000000 + 000000BC06400E536F75726365526563742E546F700500000000000000ED0740 + 10536F75726365526563742E52696768740500000000000000D0064011536F75 + 726365526563742E426F74746F6D0500000000000000F707400001055363616C + 6505000000000000008000400F536F75726365526563742E4C65667405000000 + 00000000FA06400E536F75726365526563742E546F7005000000000000009E08 + 4010536F75726365526563742E526967687405000000000000008A074011536F + 75726365526563742E426F74746F6D0500000000000080A4084000000B466F63 + 757365644C696E6B0E010F536F75726365526563742E4C656674050000000000 + 0000DC05400E536F75726365526563742E546F7005000000000000009E074010 + 536F75726365526563742E52696768740500000000000000F6054011536F7572 + 6365526563742E426F74746F6D0500000000000080A407400001055363616C65 + 0500000000000000C0FF3F0F536F75726365526563742E4C6566740500000000 + 000000A506400E536F75726365526563742E546F700500000000000000ED0740 + 10536F75726365526563742E52696768740500000000000000B9064011536F75 + 726365526563742E426F74746F6D0500000000000000F707400001055363616C + 6505000000000000008000400F536F75726365526563742E4C65667405000000 + 00000000DC06400E536F75726365526563742E546F7005000000000000009E08 + 4010536F75726365526563742E52696768740500000000000000F6064011536F + 75726365526563742E426F74746F6D0500000000000080A4084000000A4E6F72 + 6D616C4C696E6B0E010F536F75726365526563742E4C65667405000000000000 + 00DC05400E536F75726365526563742E546F7005000000000000009E07401053 + 6F75726365526563742E52696768740500000000000000F6054011536F757263 + 65526563742E426F74746F6D0500000000000080A407400001055363616C6505 + 00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000 + 0000A506400E536F75726365526563742E546F700500000000000000ED074010 + 536F75726365526563742E52696768740500000000000000B9064011536F7572 + 6365526563742E426F74746F6D0500000000000000F707400001055363616C65 + 05000000000000008000400F536F75726365526563742E4C6566740500000000 + 000000DC06400E536F75726365526563742E546F7005000000000000009E0840 + 10536F75726365526563742E52696768740500000000000000F6064011536F75 + 726365526563742E426F74746F6D0500000000000080A4084000000B50726573 + 7365644C696E6B0E010F536F75726365526563742E4C65667405000000000000 + 00FA05400E536F75726365526563742E546F7005000000000000009E07401053 + 6F75726365526563742E526967687405000000000000008A064011536F757263 + 65526563742E426F74746F6D0500000000000080A407400001055363616C6505 + 00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000 + 0000BC06400E536F75726365526563742E546F700500000000000000ED074010 + 536F75726365526563742E52696768740500000000000000D0064011536F7572 + 6365526563742E426F74746F6D0500000000000000F707400001055363616C65 + 05000000000000008000400F536F75726365526563742E4C6566740500000000 + 000000FA06400E536F75726365526563742E546F7005000000000000009E0840 + 10536F75726365526563742E526967687405000000000000008A074011536F75 + 726365526563742E426F74746F6D0500000000000080A40840000013546F7563 + 68416E696D6174696F6E2E4C696E6B0E00000F54466C6F6174416E696D617469 + 6F6E00084475726174696F6E05000000000017B7D1F13F0C50726F7065727479 + 4E616D6506074F7061636974790A537461727456616C75650500000000000000 + 0000000953746F7056616C7565050000000000000080FF3F0754726967676572 + 06104973457870616E6465643D66616C73650E54726967676572496E76657273 + 65060F4973457870616E6465643D747275650000001254427574746F6E537479 + 6C654F626A65637400095374796C654E616D65060A6261636B67726F756E6405 + 416C69676E070643656E7465720C536F757263654C6F6F6B7570061B57696E64 + 6F7773203130204465736B746F707374796C652E706E670A53697A652E576964 + 74680500000000000000D002400B53697A652E48656967687405000000000000 + 00D002401453697A652E506C6174666F726D44656661756C740808577261704D + 6F6465070643656E74657207486F744C696E6B0E010F536F7572636552656374 + 2E4C6566740500000000000000FA05400E536F75726365526563742E546F7005 + 0000000000000095074010536F75726365526563742E52696768740500000000 + 0000008A064011536F75726365526563742E426F74746F6D0500000000000080 + 9B07400001055363616C650500000000000000C0FF3F0F536F75726365526563 + 742E4C6566740500000000000000BC06400E536F75726365526563742E546F70 + 0500000000000080DF074010536F75726365526563742E526967687405000000 + 00000000D0064011536F75726365526563742E426F74746F6D05000000000000 + 80E907400001055363616C6505000000000000008000400F536F757263655265 + 63742E4C6566740500000000000000FA06400E536F75726365526563742E546F + 70050000000000000095084010536F75726365526563742E5269676874050000 + 00000000008A074011536F75726365526563742E426F74746F6D050000000000 + 00809B084000000B466F63757365644C696E6B0E010F536F7572636552656374 + 2E4C6566740500000000000000DC05400E536F75726365526563742E546F7005 + 0000000000000095074010536F75726365526563742E52696768740500000000 + 000000F6054011536F75726365526563742E426F74746F6D0500000000000080 + 9B07400001055363616C650500000000000000C0FF3F0F536F75726365526563 + 742E4C6566740500000000000000A506400E536F75726365526563742E546F70 + 0500000000000080DF074010536F75726365526563742E526967687405000000 + 00000000B9064011536F75726365526563742E426F74746F6D05000000000000 + 80E907400001055363616C6505000000000000008000400F536F757263655265 + 63742E4C6566740500000000000000DC06400E536F75726365526563742E546F + 70050000000000000095084010536F75726365526563742E5269676874050000 + 0000000000F6064011536F75726365526563742E426F74746F6D050000000000 + 00809B084000000A4E6F726D616C4C696E6B0E010F536F75726365526563742E + 4C6566740500000000000000DC05400E536F75726365526563742E546F700500 + 00000000000095074010536F75726365526563742E5269676874050000000000 + 0000F6054011536F75726365526563742E426F74746F6D05000000000000809B + 07400001055363616C650500000000000000C0FF3F0F536F7572636552656374 + 2E4C6566740500000000000000A506400E536F75726365526563742E546F7005 + 00000000000080DF074010536F75726365526563742E52696768740500000000 + 000000B9064011536F75726365526563742E426F74746F6D0500000000000080 + E907400001055363616C6505000000000000008000400F536F75726365526563 + 742E4C6566740500000000000000DC06400E536F75726365526563742E546F70 + 050000000000000095084010536F75726365526563742E526967687405000000 + 00000000F6064011536F75726365526563742E426F74746F6D05000000000000 + 809B084000000B507265737365644C696E6B0E010F536F75726365526563742E + 4C6566740500000000000000FA05400E536F75726365526563742E546F700500 + 00000000000095074010536F75726365526563742E5269676874050000000000 + 00008A064011536F75726365526563742E426F74746F6D05000000000000809B + 07400001055363616C650500000000000000C0FF3F0F536F7572636552656374 + 2E4C6566740500000000000000BC06400E536F75726365526563742E546F7005 + 00000000000080DF074010536F75726365526563742E52696768740500000000 + 000000D0064011536F75726365526563742E426F74746F6D0500000000000080 + E907400001055363616C6505000000000000008000400F536F75726365526563 + 742E4C6566740500000000000000FA06400E536F75726365526563742E546F70 + 050000000000000095084010536F75726365526563742E526967687405000000 + 000000008A074011536F75726365526563742E426F74746F6D05000000000000 + 809B0840000013546F756368416E696D6174696F6E2E4C696E6B0E00000F5446 + 6C6F6174416E696D6174696F6E00084475726174696F6E05000000000017B7D1 + F13F0C50726F70657274794E616D6506074F7061636974790A53746172745661 + 6C756505000000000000000000000953746F7056616C75650500000000000000 + 80FF3F0754726967676572060F4973457870616E6465643D747275650E547269 + 67676572496E766572736506104973457870616E6465643D66616C7365000000 + 005450463007544C61796F757400095374796C654E616D65061B457870616E64 + 65727374796C65436865636B426F785374796C653105416C69676E070643656E + 7465720A53697A652E57696474680500000000000080BC07400B53697A652E48 + 65696768740500000000000000B106401453697A652E506C6174666F726D4465 + 6661756C74080756697369626C6508085461624F7264657202020007544C6179 + 6F75740005416C69676E07044C6566740A53697A652E57696474680500000000 + 0000009003400B53697A652E4865696768740500000000000000B10640145369 + 7A652E506C6174666F726D44656661756C7408001154436865636B5374796C65 + 4F626A65637400095374796C654E616D65060A6261636B67726F756E6405416C + 69676E070643656E746572074361704D6F6465070454696C65064C6F636B6564 + 090C536F757263654C6F6F6B7570061B57696E646F7773203130204465736B74 + 6F707374796C652E706E670A53697A652E57696474680500000000000000D002 + 400B53697A652E4865696768740500000000000000D002401453697A652E506C + 6174666F726D44656661756C740808577261704D6F6465070643656E7465720D + 416374697665547269676765720707436865636B65640A4163746976654C696E + 6B0E010F536F75726365526563742E4C6566740500000000000000F803400E53 6F75726365526563742E546F70050000000000000092064010536F7572636552 - 6563742E52696768740500000000000000F0034011536F75726365526563742E + 6563742E52696768740500000000000000B0044011536F75726365526563742E 426F74746F6D05000000000000009F06400001055363616C6505000000000000 - 00C0FF3F0F536F75726365526563742E4C6566740500000000000000C803400E + 00C0FF3F0F536F75726365526563742E4C6566740500000000000000B804400E 536F75726365526563742E546F700500000000000000DB064010536F75726365 - 526563742E52696768740500000000000000B0044011536F7572636552656374 + 526563742E5269676874050000000000000082054011536F7572636552656374 2E426F74746F6D0500000000000000EE06400001055363616C65050000000000 - 00008000400F536F75726365526563742E4C6566740500000000000000880440 + 00008000400F536F75726365526563742E4C6566740500000000000000F80440 0E536F75726365526563742E546F70050000000000000092074010536F757263 - 65526563742E52696768740500000000000000F0044011536F75726365526563 - 742E426F74746F6D05000000000000009F074000000D416374697665486F744C - 696E6B0E010F536F75726365526563742E4C6566740500000000000000B40440 - 0E536F75726365526563742E546F70050000000000000092064010536F757263 - 65526563742E52696768740500000000000000E8044011536F75726365526563 - 742E426F74746F6D05000000000000009F06400001055363616C650500000000 - 000000C0FF3F0F536F75726365526563742E4C65667405000000000000008605 - 400E536F75726365526563742E546F700500000000000000DB064010536F7572 - 6365526563742E52696768740500000000000000AC054011536F757263655265 - 63742E426F74746F6D0500000000000000EE06400001055363616C6505000000 - 000000008000400F536F75726365526563742E4C6566740500000000000000B4 - 05400E536F75726365526563742E546F70050000000000000092074010536F75 - 726365526563742E52696768740500000000000000E8054011536F7572636552 - 6563742E426F74746F6D05000000000000009F074000000B466F63757365644C - 696E6B0E010F536F75726365526563742E4C6566740500000000000000880340 - 0E536F75726365526563742E546F70050000000000000092064010536F757263 - 65526563742E52696768740500000000000000F0034011536F75726365526563 - 742E426F74746F6D05000000000000009F06400001055363616C650500000000 - 000000C0FF3F0F536F75726365526563742E4C6566740500000000000000C803 - 400E536F75726365526563742E546F700500000000000000DB064010536F7572 - 6365526563742E52696768740500000000000000B0044011536F757263655265 - 63742E426F74746F6D0500000000000000EE06400001055363616C6505000000 - 000000008000400F536F75726365526563742E4C656674050000000000000088 - 04400E536F75726365526563742E546F70050000000000000092074010536F75 - 726365526563742E52696768740500000000000000F0044011536F7572636552 - 6563742E426F74746F6D05000000000000009F0740000011416374697665466F - 63757365644C696E6B0E010F536F75726365526563742E4C6566740500000000 - 000000B404400E536F75726365526563742E546F700500000000000000920640 - 10536F75726365526563742E52696768740500000000000000E8044011536F75 - 726365526563742E426F74746F6D05000000000000009F06400001055363616C - 650500000000000000C0FF3F0F536F75726365526563742E4C65667405000000 - 000000008605400E536F75726365526563742E546F700500000000000000DB06 - 4010536F75726365526563742E52696768740500000000000000AC054011536F - 75726365526563742E426F74746F6D0500000000000000EE0640000105536361 + 65526563742E52696768740500000000000000B0054011536F75726365526563 + 742E426F74746F6D05000000000000009F074000000A536F757263654C696E6B + 0E010F536F75726365526563742E4C6566740500000000000000C000400E536F + 75726365526563742E546F70050000000000000092064010536F757263655265 + 63742E5269676874050000000000000080034011536F75726365526563742E42 + 6F74746F6D05000000000000009F06400001055363616C650500000000000000 + C0FF3F0F536F75726365526563742E4C65667405000000000000008001400E53 + 6F75726365526563742E546F700500000000000000DB064010536F7572636552 + 6563742E52696768740500000000000000B8034011536F75726365526563742E + 426F74746F6D0500000000000000EE06400001055363616C6505000000000000 + 008000400F536F75726365526563742E4C6566740500000000000000C001400E + 536F75726365526563742E546F70050000000000000092074010536F75726365 + 526563742E5269676874050000000000000080044011536F7572636552656374 + 2E426F74746F6D05000000000000009F0740000007486F744C696E6B0E010F53 + 6F75726365526563742E4C65667405000000000000008803400E536F75726365 + 526563742E546F70050000000000000092064010536F75726365526563742E52 + 696768740500000000000000F0034011536F75726365526563742E426F74746F + 6D05000000000000009F06400001055363616C650500000000000000C0FF3F0F + 536F75726365526563742E4C6566740500000000000000C803400E536F757263 + 65526563742E546F700500000000000000DB064010536F75726365526563742E + 52696768740500000000000000B0044011536F75726365526563742E426F7474 + 6F6D0500000000000000EE06400001055363616C650500000000000000800040 + 0F536F75726365526563742E4C65667405000000000000008804400E536F7572 + 6365526563742E546F70050000000000000092074010536F7572636552656374 + 2E52696768740500000000000000F0044011536F75726365526563742E426F74 + 746F6D05000000000000009F074000000D416374697665486F744C696E6B0E01 + 0F536F75726365526563742E4C6566740500000000000000B404400E536F7572 + 6365526563742E546F70050000000000000092064010536F7572636552656374 + 2E52696768740500000000000000E8044011536F75726365526563742E426F74 + 746F6D05000000000000009F06400001055363616C650500000000000000C0FF + 3F0F536F75726365526563742E4C65667405000000000000008605400E536F75 + 726365526563742E546F700500000000000000DB064010536F75726365526563 + 742E52696768740500000000000000AC054011536F75726365526563742E426F + 74746F6D0500000000000000EE06400001055363616C65050000000000000080 + 00400F536F75726365526563742E4C6566740500000000000000B405400E536F + 75726365526563742E546F70050000000000000092074010536F757263655265 + 63742E52696768740500000000000000E8054011536F75726365526563742E42 + 6F74746F6D05000000000000009F074000000B466F63757365644C696E6B0E01 + 0F536F75726365526563742E4C65667405000000000000008803400E536F7572 + 6365526563742E546F70050000000000000092064010536F7572636552656374 + 2E52696768740500000000000000F0034011536F75726365526563742E426F74 + 746F6D05000000000000009F06400001055363616C650500000000000000C0FF + 3F0F536F75726365526563742E4C6566740500000000000000C803400E536F75 + 726365526563742E546F700500000000000000DB064010536F75726365526563 + 742E52696768740500000000000000B0044011536F75726365526563742E426F + 74746F6D0500000000000000EE06400001055363616C65050000000000000080 + 00400F536F75726365526563742E4C65667405000000000000008804400E536F + 75726365526563742E546F70050000000000000092074010536F757263655265 + 63742E52696768740500000000000000F0044011536F75726365526563742E42 + 6F74746F6D05000000000000009F0740000011416374697665466F6375736564 + 4C696E6B0E010F536F75726365526563742E4C6566740500000000000000B404 + 400E536F75726365526563742E546F70050000000000000092064010536F7572 + 6365526563742E52696768740500000000000000E8044011536F757263655265 + 63742E426F74746F6D05000000000000009F06400001055363616C6505000000 + 00000000C0FF3F0F536F75726365526563742E4C656674050000000000000086 + 05400E536F75726365526563742E546F700500000000000000DB064010536F75 + 726365526563742E52696768740500000000000000AC054011536F7572636552 + 6563742E426F74746F6D0500000000000000EE06400001055363616C65050000 + 00000000008000400F536F75726365526563742E4C6566740500000000000000 + B405400E536F75726365526563742E546F70050000000000000092074010536F + 75726365526563742E52696768740500000000000000E8054011536F75726365 + 526563742E426F74746F6D05000000000000009F074000000000001654427574 + 746F6E5374796C65546578744F626A65637400095374796C654E616D65060474 + 65787405416C69676E0706436C69656E74064C6F636B6564090C4D617267696E + 732E4C6566740500000000000000C000400A53697A652E576964746805000000 + 00000000B207400B53697A652E4865696768740500000000000000B106401453 + 697A652E506C6174666F726D44656661756C74080D536861646F775669736962 + 6C650808486F74436F6C6F720708636C61426C61636B0C466F6375736564436F + 6C6F720708636C61426C61636B0B4E6F726D616C436F6C6F720708636C61426C + 61636B0C50726573736564436F6C6F720708636C61426C61636B000000545046 + 3007544C61796F757400095374796C654E616D65060E6C6254756E6572735374 + 796C653105416C69676E070643656E7465720A53697A652E5769647468050000 + 0000000000BB07400B53697A652E486569676874050000000000008091074014 + 53697A652E506C6174666F726D44656661756C74080756697369626C65080854 + 61624F726465720203000C5442727573684F626A65637400095374796C654E61 + 6D650618416C7465726E6174696E67526F774261636B67726F756E640B427275 + 73682E436F6C6F72070978464645454545454500000C545374796C654F626A65 + 637400095374796C654E616D65060A6261636B67726F756E6405416C69676E07 + 08436F6E74656E74730C50616464696E672E4C65667405000000000000008000 + 400B50616464696E672E546F7005000000000000008000400D50616464696E67 + 2E526967687405000000000000008000400E50616464696E672E426F74746F6D + 05000000000000008000400C536F757263654C6F6F6B7570061B57696E646F77 + 73203130204465736B746F707374796C652E706E670A53697A652E5769647468 + 0500000000000000BB07400B53697A652E486569676874050000000000008091 + 07401453697A652E506C6174666F726D44656661756C74080A536F757263654C + 696E6B0E010E436170496E736574732E4C6566740500000000000000A002400D + 436170496E736574732E546F700500000000000000A002400F436170496E7365 + 74732E52696768740500000000000000A0024010436170496E736574732E426F + 74746F6D0500000000000000A002400F536F75726365526563742E4C65667405 + 00000000000080A107400E536F75726365526563742E546F7005000000000000 + 0080014010536F75726365526563742E52696768740500000000000000C50740 + 11536F75726365526563742E426F74746F6D050000000000000094054000010E + 436170496E736574732E4C6566740500000000000000F002400D436170496E73 + 6574732E546F700500000000000000F002400F436170496E736574732E526967 + 68740500000000000000F0024010436170496E736574732E426F74746F6D0500 + 000000000000F00240055363616C650500000000000000C0FF3F0F536F757263 + 65526563742E4C6566740500000000000000F207400E536F7572636552656374 + 2E546F700500000000000000C0014010536F75726365526563742E5269676874 + 050000000000008093084011536F75726365526563742E426F74746F6D050000 + 0000000000DE054000010E436170496E736574732E4C65667405000000000000 + 00A003400D436170496E736574732E546F700500000000000000A003400F4361 + 70496E736574732E52696768740500000000000000A0034010436170496E7365 + 74732E426F74746F6D0500000000000000A00340055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000080A10840 + 0E536F75726365526563742E546F70050000000000000080024010536F757263 + 65526563742E52696768740500000000000000C5084011536F75726365526563 + 742E426F74746F6D05000000000000009406400000064F706171756509000754 + 4C61796F757400095374796C654E616D650607636F6E74656E7405416C69676E + 0706436C69656E740C436C69704368696C6472656E090A53697A652E57696474 + 680500000000000000B107400B53697A652E4865696768740500000000000080 + 8707401453697A652E506C6174666F726D44656661756C740800000A54536372 + 6F6C6C42617200095374796C654E616D65060A767363726F6C6C62617205416C + 69676E070552696768740B536D616C6C4368616E676505000000000000000000 + 000B4F7269656E746174696F6E0708566572746963616C0A506F736974696F6E + 2E580500000000000000B207400A506F736974696F6E2E590500000000000000 + 8000400A53697A652E576964746805000000000000008003400B53697A652E48 + 656967687405000000000000808707401453697A652E506C6174666F726D4465 + 6661756C74080B5374796C654C6F6F6B7570061D6C6254756E6572735374796C + 65315363726F6C6C4261725374796C653100000A545363726F6C6C4261720009 + 5374796C654E616D65060A687363726F6C6C62617205416C69676E0706426F74 + 746F6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E + 746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E58050000 + 00000000008000400A506F736974696F6E2E5905000000000000808807400A53 + 697A652E57696474680500000000000000B907400B53697A652E486569676874 + 05000000000000008003401453697A652E506C6174666F726D44656661756C74 + 08000007544C61796F75740005416C69676E0706436C69656E740A53697A652E + 57696474680500000000000000B107400B53697A652E48656967687405000000 + 000000808707401453697A652E506C6174666F726D44656661756C7408000F54 + 536D616C6C5363726F6C6C42617200095374796C654E616D65060F76736D616C + 6C7363726F6C6C62617205416C69676E070552696768740B536D616C6C436861 + 6E676505000000000000000000000B4F7269656E746174696F6E070856657274 + 6963616C0C4D617267696E732E4C65667405000000000000008000400A53697A + 652E576964746805000000000000008002400B53697A652E4865696768740500 + 0000000000008002401453697A652E506C6174666F726D44656661756C74080B + 5374796C654C6F6F6B757006226C6254756E6572735374796C6531536D616C6C + 5363726F6C6C4261725374796C65310756697369626C650800000F54536D616C + 6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C736372 + 6F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C4368616E6765 + 05000000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E + 74616C0B4D617267696E732E546F7005000000000000008000400A53697A652E + 576964746805000000000000009606400B53697A652E48656967687405000000 + 000000008002401453697A652E506C6174666F726D44656661756C7408075669 + 7369626C650800000007544C61796F757400095374796C654E616D6506066865 + 6164657205416C69676E0703546F700A53697A652E5769647468050000000000 + 0000C804400B53697A652E4865696768740500000000000000C804401453697A + 652E506C6174666F726D44656661756C74080756697369626C6508000007544C + 61796F757400095374796C654E616D650606666F6F74657205416C69676E0706 + 426F74746F6D0A53697A652E57696474680500000000000000C804400B53697A + 652E4865696768740500000000000000C804401453697A652E506C6174666F72 + 6D44656661756C74080756697369626C6508000000005450463007544C61796F + 757400095374796C654E616D65061D6C6254756E6572735374796C6531536372 + 6F6C6C4261725374796C65310A53697A652E57696474680500000000000000BB + 07400B53697A652E48656967687405000000000000809107401453697A652E50 + 6C6174666F726D44656661756C74080756697369626C6508085461624F726465 + 720204000754427574746F6E00095374796C654E616D65060A6C656674627574 + 746F6E05416C69676E07044C656674064C6F636B6564090A506F736974696F6E + 2E5905000000000000008003400A53697A652E57696474680500000000000000 + 8003400B53697A652E48656967687405000000000000808107401453697A652E + 506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006137363 + 726F6C6C6261726C656674627574746F6E00000754427574746F6E0009537479 + 6C654E616D65060B7269676874627574746F6E05416C69676E07055269676874 + 064C6F636B6564090A506F736974696F6E2E580500000000000000B307400A50 + 6F736974696F6E2E5905000000000000008003400A53697A652E576964746805 + 000000000000008003400B53697A652E48656967687405000000000000808107 + 401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F + 6B757006147363726F6C6C6261727269676874627574746F6E00000754427574 + 746F6E00095374796C654E616D650609746F70627574746F6E05416C69676E07 + 03546F70064C6F636B6564090A53697A652E57696474680500000000000000BB + 07400B53697A652E48656967687405000000000000008003401453697A652E50 + 6C6174666F726D44656661756C74080B5374796C654C6F6F6B75700612736372 + 6F6C6C626172746F70627574746F6E00000754427574746F6E00095374796C65 + 4E616D65060C626F74746F6D627574746F6E05416C69676E0706426F74746F6D + 064C6F636B6564090A506F736974696F6E2E5905000000000000808907400A53 + 697A652E57696474680500000000000000BB07400B53697A652E486569676874 + 05000000000000008003401453697A652E506C6174666F726D44656661756C74 + 080B5374796C654C6F6F6B757006157363726F6C6C626172626F74746F6D6275 + 74746F6E00000654547261636B00095374796C654E616D65060668747261636B + 05416C69676E0706436C69656E74064C6F636B6564090B4F7269656E74617469 + 6F6E070A486F72697A6F6E74616C0A53697A652E576964746805000000000000 + 00AB07400B53697A652E48656967687405000000000000808107401453697A65 + 2E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570061473 + 63726F6C6C62617268747261636B7374796C6500000654547261636B00095374 + 796C654E616D65060676747261636B05416C69676E0706436C69656E74064C6F + 636B6564090B4F7269656E746174696F6E070A486F72697A6F6E74616C0A5369 + 7A652E57696474680500000000000000AB07400B53697A652E48656967687405 + 000000000000808107401453697A652E506C6174666F726D44656661756C7408 + 0B5374796C654C6F6F6B757006147363726F6C6C62617276747261636B737479 + 6C65000000545046301254427574746F6E5374796C654F626A65637400095374 + 796C654E616D65061E767363726F6C6C6261727363726F6C6C6261726C656674 + 627574746F6E310C536F757263654C6F6F6B7570061B57696E646F7773203130 + 204465736B746F707374796C652E706E670A53697A652E576964746805000000 + 00000000BB07400B53697A652E48656967687405000000000000809107401453 + 697A652E506C6174666F726D44656661756C74080756697369626C650807486F + 744C696E6B0E010E436170496E736574732E4C6566740500000000000000C000 + 400D436170496E736574732E546F700500000000000000C000400F436170496E + 736574732E52696768740500000000000000C0004010436170496E736574732E + 426F74746F6D0500000000000000C000400F536F75726365526563742E4C6566 + 740500000000000000B906400E536F75726365526563742E546F700500000000 + 000000B4064010536F75726365526563742E52696768740500000000000000C9 + 064011536F75726365526563742E426F74746F6D0500000000000000C4064000 + 010E436170496E736574732E4C65667405000000000000008001400D43617049 + 6E736574732E546F7005000000000000008001400F436170496E736574732E52 + 69676874050000000000000080014010436170496E736574732E426F74746F6D + 0500000000000000800140055363616C650500000000000000C0FF3F0F536F75 + 726365526563742E4C65667405000000000000808A07400E536F757263655265 + 63742E546F70050000000000000087074010536F75726365526563742E526967 + 6874050000000000008096074011536F75726365526563742E426F74746F6D05 + 0000000000000093074000010E436170496E736574732E4C6566740500000000 + 000000C001400D436170496E736574732E546F700500000000000000C001400F + 436170496E736574732E52696768740500000000000000C0014010436170496E + 736574732E426F74746F6D0500000000000000C00140055363616C6505000000 + 000000008000400F536F75726365526563742E4C6566740500000000000000B9 + 07400E536F75726365526563742E546F700500000000000000B4074010536F75 + 726365526563742E52696768740500000000000000C9074011536F7572636552 + 6563742E426F74746F6D0500000000000000C4074000000B466F63757365644C + 696E6B0E010E436170496E736574732E4C6566740500000000000000C000400D + 436170496E736574732E546F700500000000000000C000400F436170496E7365 + 74732E52696768740500000000000000C0004010436170496E736574732E426F + 74746F6D0500000000000000C000400F536F75726365526563742E4C65667405 + 00000000000000A706400E536F75726365526563742E546F7005000000000000 + 00B4064010536F75726365526563742E52696768740500000000000000B70640 + 11536F75726365526563742E426F74746F6D0500000000000000C4064000010E + 436170496E736574732E4C65667405000000000000008001400D436170496E73 + 6574732E546F7005000000000000008001400F436170496E736574732E526967 + 6874050000000000000080014010436170496E736574732E426F74746F6D0500 + 000000000000800140055363616C650500000000000000C0FF3F0F536F757263 + 65526563742E4C6566740500000000000000FA06400E536F7572636552656374 + 2E546F70050000000000000087074010536F75726365526563742E5269676874 + 050000000000000089074011536F75726365526563742E426F74746F6D050000 + 000000000093074000010E436170496E736574732E4C65667405000000000000 + 00C001400D436170496E736574732E546F700500000000000000C001400F4361 + 70496E736574732E52696768740500000000000000C0014010436170496E7365 + 74732E426F74746F6D0500000000000000C00140055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000000A70740 + 0E536F75726365526563742E546F700500000000000000B4074010536F757263 + 65526563742E52696768740500000000000000B7074011536F75726365526563 + 742E426F74746F6D0500000000000000C4074000000A4E6F726D616C4C696E6B + 0E010E436170496E736574732E4C6566740500000000000000C000400D436170 + 496E736574732E546F700500000000000000C000400F436170496E736574732E + 52696768740500000000000000C0004010436170496E736574732E426F74746F + 6D0500000000000000C000400F536F75726365526563742E4C65667405000000 + 00000000A706400E536F75726365526563742E546F700500000000000000B406 + 4010536F75726365526563742E52696768740500000000000000B7064011536F + 75726365526563742E426F74746F6D0500000000000000C4064000010E436170 + 496E736574732E4C65667405000000000000008001400D436170496E73657473 + 2E546F7005000000000000008001400F436170496E736574732E526967687405 + 0000000000000080014010436170496E736574732E426F74746F6D0500000000 + 000000800140055363616C650500000000000000C0FF3F0F536F757263655265 + 63742E4C6566740500000000000000FA06400E536F75726365526563742E546F + 70050000000000000087074010536F75726365526563742E5269676874050000 + 000000000089074011536F75726365526563742E426F74746F6D050000000000 + 000093074000010E436170496E736574732E4C6566740500000000000000C001 + 400D436170496E736574732E546F700500000000000000C001400F436170496E + 736574732E52696768740500000000000000C0014010436170496E736574732E + 426F74746F6D0500000000000000C00140055363616C65050000000000000080 + 00400F536F75726365526563742E4C6566740500000000000000A707400E536F + 75726365526563742E546F700500000000000000B4074010536F757263655265 + 63742E52696768740500000000000000B7074011536F75726365526563742E42 + 6F74746F6D0500000000000000C4074000000B507265737365644C696E6B0E01 + 0E436170496E736574732E4C6566740500000000000000C000400D436170496E + 736574732E546F700500000000000000C000400F436170496E736574732E5269 + 6768740500000000000000C0004010436170496E736574732E426F74746F6D05 + 00000000000000C000400F536F75726365526563742E4C656674050000000000 + 0000CB06400E536F75726365526563742E546F700500000000000000B4064010 + 536F75726365526563742E52696768740500000000000000DB064011536F7572 + 6365526563742E426F74746F6D0500000000000000C4064000010E436170496E + 736574732E4C65667405000000000000008001400D436170496E736574732E54 + 6F7005000000000000008001400F436170496E736574732E5269676874050000 + 000000000080014010436170496E736574732E426F74746F6D05000000000000 + 00800140055363616C650500000000000000C0FF3F0F536F7572636552656374 + 2E4C65667405000000000000009807400E536F75726365526563742E546F7005 + 0000000000000087074010536F75726365526563742E52696768740500000000 + 000000A4074011536F75726365526563742E426F74746F6D0500000000000000 + 93074000010E436170496E736574732E4C6566740500000000000000C001400D + 436170496E736574732E546F700500000000000000C001400F436170496E7365 + 74732E52696768740500000000000000C0014010436170496E736574732E426F + 74746F6D0500000000000000C00140055363616C650500000000000000800040 + 0F536F75726365526563742E4C6566740500000000000000CB07400E536F7572 + 6365526563742E546F700500000000000000B4074010536F7572636552656374 + 2E52696768740500000000000000DB074011536F75726365526563742E426F74 + 746F6D0500000000000000C40740000013546F756368416E696D6174696F6E2E + 4C696E6B0E00001254427574746F6E5374796C654F626A6563740005416C6967 + 6E070643656E746572074361704D6F6465070454696C650C536F757263654C6F + 6F6B7570061B57696E646F7773203130204465736B746F707374796C652E706E + 670A53697A652E576964746805000000000000009002400B53697A652E486569 + 6768740500000000000000B002401453697A652E506C6174666F726D44656661 + 756C740808577261704D6F6465070643656E74657207486F744C696E6B0E010F + 536F75726365526563742E4C6566740500000000000000C606400E536F757263 + 65526563742E546F700500000000000000F1064010536F75726365526563742E + 52696768740500000000000000CF064011536F75726365526563742E426F7474 + 6F6D0500000000000000FC06400001055363616C650500000000000000C0FF3F + 0F536F75726365526563742E4C65667405000000000000809407400E536F7572 + 6365526563742E546F700500000000000000B5074010536F7572636552656374 + 2E526967687405000000000000009B074011536F75726365526563742E426F74 + 746F6D0500000000000000BD07400001055363616C6505000000000000008000 + 400F536F75726365526563742E4C6566740500000000000080C507400E536F75 + 726365526563742E546F700500000000000000F1074010536F75726365526563 + 742E52696768740500000000000080CE074011536F75726365526563742E426F + 74746F6D0500000000000000FC074000000B466F63757365644C696E6B0E010F + 536F75726365526563742E4C6566740500000000000000C606400E536F757263 + 65526563742E546F700500000000000000F1064010536F75726365526563742E + 52696768740500000000000000CF064011536F75726365526563742E426F7474 + 6F6D0500000000000000FC06400001055363616C650500000000000000C0FF3F + 0F536F75726365526563742E4C65667405000000000000809407400E536F7572 + 6365526563742E546F700500000000000000B5074010536F7572636552656374 + 2E526967687405000000000000009B074011536F75726365526563742E426F74 + 746F6D0500000000000000BD07400001055363616C6505000000000000008000 + 400F536F75726365526563742E4C6566740500000000000080C507400E536F75 + 726365526563742E546F700500000000000000F1074010536F75726365526563 + 742E52696768740500000000000080CE074011536F75726365526563742E426F + 74746F6D0500000000000000FC074000000A4E6F726D616C4C696E6B0E010F53 + 6F75726365526563742E4C6566740500000000000000C606400E536F75726365 + 526563742E546F700500000000000000F1064010536F75726365526563742E52 + 696768740500000000000000CF064011536F75726365526563742E426F74746F + 6D0500000000000000FC06400001055363616C650500000000000000C0FF3F0F + 536F75726365526563742E4C65667405000000000000809407400E536F757263 + 65526563742E546F700500000000000000B5074010536F75726365526563742E + 526967687405000000000000009B074011536F75726365526563742E426F7474 + 6F6D0500000000000000BD07400001055363616C650500000000000000800040 + 0F536F75726365526563742E4C6566740500000000000080C507400E536F7572 + 6365526563742E546F700500000000000000F1074010536F7572636552656374 + 2E52696768740500000000000080CE074011536F75726365526563742E426F74 + 746F6D0500000000000000FC074000000B507265737365644C696E6B0E010F53 + 6F75726365526563742E4C6566740500000000000000BA06400E536F75726365 + 526563742E546F700500000000000000F1064010536F75726365526563742E52 + 696768740500000000000000C4064011536F75726365526563742E426F74746F + 6D0500000000000000FC06400001055363616C650500000000000000C0FF3F0F + 536F75726365526563742E4C65667405000000000000808B07400E536F757263 + 65526563742E546F700500000000000000B5074010536F75726365526563742E + 5269676874050000000000000092074011536F75726365526563742E426F7474 + 6F6D0500000000000000BD07400001055363616C650500000000000000800040 + 0F536F75726365526563742E4C6566740500000000000000BA07400E536F7572 + 6365526563742E546F700500000000000000F1074010536F7572636552656374 + 2E52696768740500000000000000C3074011536F75726365526563742E426F74 + 746F6D0500000000000000FC0740000013546F756368416E696D6174696F6E2E + 4C696E6B0E00000000545046301254427574746F6E5374796C654F626A656374 + 00095374796C654E616D65061F767363726F6C6C6261727363726F6C6C626172 + 7269676874627574746F6E310C536F757263654C6F6F6B7570061B57696E646F + 7773203130204465736B746F707374796C652E706E670A53697A652E57696474 + 680500000000000000BB07400B53697A652E4865696768740500000000000080 + 9107401453697A652E506C6174666F726D44656661756C74080756697369626C + 650807486F744C696E6B0E010E436170496E736574732E4C6566740500000000 + 000000C000400D436170496E736574732E546F700500000000000000C000400F + 436170496E736574732E52696768740500000000000000C0004010436170496E + 736574732E426F74746F6D0500000000000000C000400F536F75726365526563 + 742E4C6566740500000000000000B906400E536F75726365526563742E546F70 + 0500000000000000B4064010536F75726365526563742E526967687405000000 + 00000000C9064011536F75726365526563742E426F74746F6D05000000000000 + 00C4064000010E436170496E736574732E4C6566740500000000000000800140 + 0D436170496E736574732E546F7005000000000000008001400F436170496E73 + 6574732E5269676874050000000000000080014010436170496E736574732E42 + 6F74746F6D0500000000000000800140055363616C650500000000000000C0FF + 3F0F536F75726365526563742E4C65667405000000000000808A07400E536F75 + 726365526563742E546F70050000000000000087074010536F75726365526563 + 742E5269676874050000000000008096074011536F75726365526563742E426F + 74746F6D050000000000000093074000010E436170496E736574732E4C656674 + 0500000000000000C001400D436170496E736574732E546F7005000000000000 + 00C001400F436170496E736574732E52696768740500000000000000C0014010 + 436170496E736574732E426F74746F6D0500000000000000C00140055363616C + 6505000000000000008000400F536F75726365526563742E4C65667405000000 + 00000000B907400E536F75726365526563742E546F700500000000000000B407 + 4010536F75726365526563742E52696768740500000000000000C9074011536F + 75726365526563742E426F74746F6D0500000000000000C4074000000B466F63 + 757365644C696E6B0E010E436170496E736574732E4C65667405000000000000 + 00C000400D436170496E736574732E546F700500000000000000C000400F4361 + 70496E736574732E52696768740500000000000000C0004010436170496E7365 + 74732E426F74746F6D0500000000000000C000400F536F75726365526563742E + 4C6566740500000000000000A706400E536F75726365526563742E546F700500 + 000000000000B4064010536F75726365526563742E5269676874050000000000 + 0000B7064011536F75726365526563742E426F74746F6D0500000000000000C4 + 064000010E436170496E736574732E4C65667405000000000000008001400D43 + 6170496E736574732E546F7005000000000000008001400F436170496E736574 + 732E5269676874050000000000000080014010436170496E736574732E426F74 + 746F6D0500000000000000800140055363616C650500000000000000C0FF3F0F + 536F75726365526563742E4C6566740500000000000000FA06400E536F757263 + 65526563742E546F70050000000000000087074010536F75726365526563742E + 5269676874050000000000000089074011536F75726365526563742E426F7474 + 6F6D050000000000000093074000010E436170496E736574732E4C6566740500 + 000000000000C001400D436170496E736574732E546F700500000000000000C0 + 01400F436170496E736574732E52696768740500000000000000C00140104361 + 70496E736574732E426F74746F6D0500000000000000C00140055363616C6505 + 000000000000008000400F536F75726365526563742E4C656674050000000000 + 0000A707400E536F75726365526563742E546F700500000000000000B4074010 + 536F75726365526563742E52696768740500000000000000B7074011536F7572 + 6365526563742E426F74746F6D0500000000000000C4074000000A4E6F726D61 + 6C4C696E6B0E010E436170496E736574732E4C6566740500000000000000C000 + 400D436170496E736574732E546F700500000000000000C000400F436170496E + 736574732E52696768740500000000000000C0004010436170496E736574732E + 426F74746F6D0500000000000000C000400F536F75726365526563742E4C6566 + 740500000000000000A706400E536F75726365526563742E546F700500000000 + 000000B4064010536F75726365526563742E52696768740500000000000000B7 + 064011536F75726365526563742E426F74746F6D0500000000000000C4064000 + 010E436170496E736574732E4C65667405000000000000008001400D43617049 + 6E736574732E546F7005000000000000008001400F436170496E736574732E52 + 69676874050000000000000080014010436170496E736574732E426F74746F6D + 0500000000000000800140055363616C650500000000000000C0FF3F0F536F75 + 726365526563742E4C6566740500000000000000FA06400E536F757263655265 + 63742E546F70050000000000000087074010536F75726365526563742E526967 + 6874050000000000000089074011536F75726365526563742E426F74746F6D05 + 0000000000000093074000010E436170496E736574732E4C6566740500000000 + 000000C001400D436170496E736574732E546F700500000000000000C001400F + 436170496E736574732E52696768740500000000000000C0014010436170496E + 736574732E426F74746F6D0500000000000000C00140055363616C6505000000 + 000000008000400F536F75726365526563742E4C6566740500000000000000A7 + 07400E536F75726365526563742E546F700500000000000000B4074010536F75 + 726365526563742E52696768740500000000000000B7074011536F7572636552 + 6563742E426F74746F6D0500000000000000C4074000000B507265737365644C + 696E6B0E010E436170496E736574732E4C6566740500000000000000C000400D + 436170496E736574732E546F700500000000000000C000400F436170496E7365 + 74732E52696768740500000000000000C0004010436170496E736574732E426F + 74746F6D0500000000000000C000400F536F75726365526563742E4C65667405 + 00000000000000CB06400E536F75726365526563742E546F7005000000000000 + 00B4064010536F75726365526563742E52696768740500000000000000DB0640 + 11536F75726365526563742E426F74746F6D0500000000000000C4064000010E + 436170496E736574732E4C65667405000000000000008001400D436170496E73 + 6574732E546F7005000000000000008001400F436170496E736574732E526967 + 6874050000000000000080014010436170496E736574732E426F74746F6D0500 + 000000000000800140055363616C650500000000000000C0FF3F0F536F757263 + 65526563742E4C65667405000000000000009807400E536F7572636552656374 + 2E546F70050000000000000087074010536F75726365526563742E5269676874 + 0500000000000000A4074011536F75726365526563742E426F74746F6D050000 + 000000000093074000010E436170496E736574732E4C65667405000000000000 + 00C001400D436170496E736574732E546F700500000000000000C001400F4361 + 70496E736574732E52696768740500000000000000C0014010436170496E7365 + 74732E426F74746F6D0500000000000000C00140055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000000CB0740 + 0E536F75726365526563742E546F700500000000000000B4074010536F757263 + 65526563742E52696768740500000000000000DB074011536F75726365526563 + 742E426F74746F6D0500000000000000C40740000013546F756368416E696D61 + 74696F6E2E4C696E6B0E00001254427574746F6E5374796C654F626A65637400 + 05416C69676E070643656E746572074361704D6F6465070454696C650C536F75 + 7263654C6F6F6B7570061B57696E646F7773203130204465736B746F70737479 + 6C652E706E670A53697A652E576964746805000000000000009002400B53697A + 652E4865696768740500000000000000B002401453697A652E506C6174666F72 + 6D44656661756C740808577261704D6F6465070643656E74657207486F744C69 + 6E6B0E010F536F75726365526563742E4C6566740500000000000000C906400E + 536F75726365526563742E546F700500000000000000E0064010536F75726365 + 526563742E52696768740500000000000000D2064011536F7572636552656374 + 2E426F74746F6D0500000000000000EB06400001055363616C65050000000000 + 0000C0FF3F0F536F75726365526563742E4C6566740500000000000080960740 + 0E536F75726365526563742E546F700500000000000080A7074010536F757263 + 65526563742E526967687405000000000000009D074011536F75726365526563 + 742E426F74746F6D0500000000000080AF07400001055363616C650500000000 + 0000008000400F536F75726365526563742E4C6566740500000000000080C907 + 400E536F75726365526563742E546F700500000000000000E0074010536F7572 + 6365526563742E52696768740500000000000080D2074011536F757263655265 + 63742E426F74746F6D0500000000000000EB074000000B466F63757365644C69 + 6E6B0E010F536F75726365526563742E4C6566740500000000000000C906400E + 536F75726365526563742E546F700500000000000000E0064010536F75726365 + 526563742E52696768740500000000000000D2064011536F7572636552656374 + 2E426F74746F6D0500000000000000EB06400001055363616C65050000000000 + 0000C0FF3F0F536F75726365526563742E4C6566740500000000000080960740 + 0E536F75726365526563742E546F700500000000000080A7074010536F757263 + 65526563742E526967687405000000000000009D074011536F75726365526563 + 742E426F74746F6D0500000000000080AF07400001055363616C650500000000 + 0000008000400F536F75726365526563742E4C6566740500000000000080C907 + 400E536F75726365526563742E546F700500000000000000E0074010536F7572 + 6365526563742E52696768740500000000000080D2074011536F757263655265 + 63742E426F74746F6D0500000000000000EB074000000A4E6F726D616C4C696E + 6B0E010F536F75726365526563742E4C6566740500000000000000C906400E53 + 6F75726365526563742E546F700500000000000000E0064010536F7572636552 + 6563742E52696768740500000000000000D2064011536F75726365526563742E + 426F74746F6D0500000000000000EB06400001055363616C6505000000000000 + 00C0FF3F0F536F75726365526563742E4C65667405000000000000809607400E + 536F75726365526563742E546F700500000000000080A7074010536F75726365 + 526563742E526967687405000000000000009D074011536F7572636552656374 + 2E426F74746F6D0500000000000080AF07400001055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000080C90740 + 0E536F75726365526563742E546F700500000000000000E0074010536F757263 + 65526563742E52696768740500000000000080D2074011536F75726365526563 + 742E426F74746F6D0500000000000000EB074000000B507265737365644C696E + 6B0E010F536F75726365526563742E4C6566740500000000000000BC06400E53 + 6F75726365526563742E546F700500000000000000DF064010536F7572636552 + 6563742E52696768740500000000000000C5064011536F75726365526563742E + 426F74746F6D0500000000000000EA06400001055363616C6505000000000000 + 00C0FF3F0F536F75726365526563742E4C65667405000000000000808D07400E + 536F75726365526563742E546F700500000000000080A7074010536F75726365 + 526563742E5269676874050000000000000094074011536F7572636552656374 + 2E426F74746F6D0500000000000080AF07400001055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000000BC0740 + 0E536F75726365526563742E546F700500000000000000DF074010536F757263 + 65526563742E52696768740500000000000000C5074011536F75726365526563 + 742E426F74746F6D0500000000000000EA0740000013546F756368416E696D61 + 74696F6E2E4C696E6B0E00000000545046301254427574746F6E5374796C654F + 626A65637400095374796C654E616D65061D767363726F6C6C6261727363726F + 6C6C626172746F70627574746F6E310C536F757263654C6F6F6B7570061B5769 + 6E646F7773203130204465736B746F707374796C652E706E670A53697A652E57 + 696474680500000000000000BB07400B53697A652E4865696768740500000000 + 0000809107401453697A652E506C6174666F726D44656661756C740807566973 + 69626C650807486F744C696E6B0E010E436170496E736574732E4C6566740500 + 000000000000C000400D436170496E736574732E546F700500000000000000C0 + 00400F436170496E736574732E52696768740500000000000000C00040104361 + 70496E736574732E426F74746F6D0500000000000000C000400F536F75726365 + 526563742E4C6566740500000000000000B906400E536F75726365526563742E + 546F700500000000000000B4064010536F75726365526563742E526967687405 + 00000000000000C9064011536F75726365526563742E426F74746F6D05000000 + 00000000C4064000010E436170496E736574732E4C6566740500000000000000 + 8001400D436170496E736574732E546F7005000000000000008001400F436170 + 496E736574732E5269676874050000000000000080014010436170496E736574 + 732E426F74746F6D0500000000000000800140055363616C6505000000000000 + 00C0FF3F0F536F75726365526563742E4C65667405000000000000808A07400E + 536F75726365526563742E546F70050000000000000087074010536F75726365 + 526563742E5269676874050000000000008096074011536F7572636552656374 + 2E426F74746F6D050000000000000093074000010E436170496E736574732E4C + 6566740500000000000000C001400D436170496E736574732E546F7005000000 + 00000000C001400F436170496E736574732E52696768740500000000000000C0 + 014010436170496E736574732E426F74746F6D0500000000000000C001400553 + 63616C6505000000000000008000400F536F75726365526563742E4C65667405 + 00000000000000B907400E536F75726365526563742E546F7005000000000000 + 00B4074010536F75726365526563742E52696768740500000000000000C90740 + 11536F75726365526563742E426F74746F6D0500000000000000C4074000000B + 466F63757365644C696E6B0E010E436170496E736574732E4C65667405000000 + 00000000C000400D436170496E736574732E546F700500000000000000C00040 + 0F436170496E736574732E52696768740500000000000000C000401043617049 + 6E736574732E426F74746F6D0500000000000000C000400F536F757263655265 + 63742E4C6566740500000000000000A706400E536F75726365526563742E546F + 700500000000000000B4064010536F75726365526563742E5269676874050000 + 0000000000B7064011536F75726365526563742E426F74746F6D050000000000 + 0000C4064000010E436170496E736574732E4C65667405000000000000008001 + 400D436170496E736574732E546F7005000000000000008001400F436170496E + 736574732E5269676874050000000000000080014010436170496E736574732E + 426F74746F6D0500000000000000800140055363616C650500000000000000C0 + FF3F0F536F75726365526563742E4C6566740500000000000000FA06400E536F + 75726365526563742E546F70050000000000000087074010536F757263655265 + 63742E5269676874050000000000000089074011536F75726365526563742E42 + 6F74746F6D050000000000000093074000010E436170496E736574732E4C6566 + 740500000000000000C001400D436170496E736574732E546F70050000000000 + 0000C001400F436170496E736574732E52696768740500000000000000C00140 + 10436170496E736574732E426F74746F6D0500000000000000C0014005536361 6C6505000000000000008000400F536F75726365526563742E4C656674050000 - 0000000000B405400E536F75726365526563742E546F70050000000000000092 - 074010536F75726365526563742E52696768740500000000000000E805401153 - 6F75726365526563742E426F74746F6D05000000000000009F07400000000000 - 1654427574746F6E5374796C65546578744F626A65637400095374796C654E61 - 6D6506047465787405416C69676E0706436C69656E74064C6F636B6564090C4D - 617267696E732E4C6566740500000000000000C000400A53697A652E57696474 - 680500000000000000B207400B53697A652E4865696768740500000000000000 - B106401453697A652E506C6174666F726D44656661756C74080D536861646F77 - 56697369626C650808486F74436F6C6F720708636C61426C61636B0C466F6375 - 736564436F6C6F720708636C61426C61636B0B4E6F726D616C436F6C6F720708 - 636C61426C61636B0C50726573736564436F6C6F720708636C61426C61636B00 - 0000} + 0000000000A707400E536F75726365526563742E546F700500000000000000B4 + 074010536F75726365526563742E52696768740500000000000000B707401153 + 6F75726365526563742E426F74746F6D0500000000000000C4074000000A4E6F + 726D616C4C696E6B0E010E436170496E736574732E4C65667405000000000000 + 00C000400D436170496E736574732E546F700500000000000000C000400F4361 + 70496E736574732E52696768740500000000000000C0004010436170496E7365 + 74732E426F74746F6D0500000000000000C000400F536F75726365526563742E + 4C6566740500000000000000A706400E536F75726365526563742E546F700500 + 000000000000B4064010536F75726365526563742E5269676874050000000000 + 0000B7064011536F75726365526563742E426F74746F6D0500000000000000C4 + 064000010E436170496E736574732E4C65667405000000000000008001400D43 + 6170496E736574732E546F7005000000000000008001400F436170496E736574 + 732E5269676874050000000000000080014010436170496E736574732E426F74 + 746F6D0500000000000000800140055363616C650500000000000000C0FF3F0F + 536F75726365526563742E4C6566740500000000000000FA06400E536F757263 + 65526563742E546F70050000000000000087074010536F75726365526563742E + 5269676874050000000000000089074011536F75726365526563742E426F7474 + 6F6D050000000000000093074000010E436170496E736574732E4C6566740500 + 000000000000C001400D436170496E736574732E546F700500000000000000C0 + 01400F436170496E736574732E52696768740500000000000000C00140104361 + 70496E736574732E426F74746F6D0500000000000000C00140055363616C6505 + 000000000000008000400F536F75726365526563742E4C656674050000000000 + 0000A707400E536F75726365526563742E546F700500000000000000B4074010 + 536F75726365526563742E52696768740500000000000000B7074011536F7572 + 6365526563742E426F74746F6D0500000000000000C4074000000B5072657373 + 65644C696E6B0E010E436170496E736574732E4C6566740500000000000000C0 + 00400D436170496E736574732E546F700500000000000000C000400F43617049 + 6E736574732E52696768740500000000000000C0004010436170496E73657473 + 2E426F74746F6D0500000000000000C000400F536F75726365526563742E4C65 + 66740500000000000000CB06400E536F75726365526563742E546F7005000000 + 00000000B4064010536F75726365526563742E52696768740500000000000000 + DB064011536F75726365526563742E426F74746F6D0500000000000000C40640 + 00010E436170496E736574732E4C65667405000000000000008001400D436170 + 496E736574732E546F7005000000000000008001400F436170496E736574732E + 5269676874050000000000000080014010436170496E736574732E426F74746F + 6D0500000000000000800140055363616C650500000000000000C0FF3F0F536F + 75726365526563742E4C65667405000000000000009807400E536F7572636552 + 6563742E546F70050000000000000087074010536F75726365526563742E5269 + 6768740500000000000000A4074011536F75726365526563742E426F74746F6D + 050000000000000093074000010E436170496E736574732E4C65667405000000 + 00000000C001400D436170496E736574732E546F700500000000000000C00140 + 0F436170496E736574732E52696768740500000000000000C001401043617049 + 6E736574732E426F74746F6D0500000000000000C00140055363616C65050000 + 00000000008000400F536F75726365526563742E4C6566740500000000000000 + CB07400E536F75726365526563742E546F700500000000000000B4074010536F + 75726365526563742E52696768740500000000000000DB074011536F75726365 + 526563742E426F74746F6D0500000000000000C40740000013546F756368416E + 696D6174696F6E2E4C696E6B0E00001254427574746F6E5374796C654F626A65 + 63740005416C69676E070643656E7465720C536F757263654C6F6F6B7570061B + 57696E646F7773203130204465736B746F707374796C652E706E670A53697A65 + 2E57696474680500000000000000B002400B53697A652E486569676874050000 + 00000000009002401453697A652E506C6174666F726D44656661756C74080857 + 7261704D6F6465070643656E74657207486F744C696E6B0E010F536F75726365 + 526563742E4C65667405000000000000009406400E536F75726365526563742E + 546F700500000000000000E1064010536F75726365526563742E526967687405 + 000000000000009F064011536F75726365526563742E426F74746F6D05000000 + 00000000EA06400001055363616C650500000000000000C0FF3F0F536F757263 + 65526563742E4C6566740500000000000000DC06400E536F7572636552656374 + 2E546F700500000000000000A9074010536F75726365526563742E5269676874 + 0500000000000000EC064011536F75726365526563742E426F74746F6D050000 + 0000000080AF07400001055363616C6505000000000000008000400F536F7572 + 6365526563742E4C65667405000000000000009407400E536F75726365526563 + 742E546F700500000000000080E0074010536F75726365526563742E52696768 + 7405000000000000009F074011536F75726365526563742E426F74746F6D0500 + 000000000080E9074000000B466F63757365644C696E6B0E010F536F75726365 + 526563742E4C65667405000000000000009406400E536F75726365526563742E + 546F700500000000000000E1064010536F75726365526563742E526967687405 + 000000000000009F064011536F75726365526563742E426F74746F6D05000000 + 00000000EA06400001055363616C650500000000000000C0FF3F0F536F757263 + 65526563742E4C6566740500000000000000DC06400E536F7572636552656374 + 2E546F700500000000000000A9074010536F75726365526563742E5269676874 + 0500000000000000EC064011536F75726365526563742E426F74746F6D050000 + 0000000080AF07400001055363616C6505000000000000008000400F536F7572 + 6365526563742E4C65667405000000000000009407400E536F75726365526563 + 742E546F700500000000000080E0074010536F75726365526563742E52696768 + 7405000000000000009F074011536F75726365526563742E426F74746F6D0500 + 000000000080E9074000000A4E6F726D616C4C696E6B0E010F536F7572636552 + 6563742E4C65667405000000000000009406400E536F75726365526563742E54 + 6F700500000000000000E1064010536F75726365526563742E52696768740500 + 0000000000009F064011536F75726365526563742E426F74746F6D0500000000 + 000000EA06400001055363616C650500000000000000C0FF3F0F536F75726365 + 526563742E4C6566740500000000000000DC06400E536F75726365526563742E + 546F700500000000000000A9074010536F75726365526563742E526967687405 + 00000000000000EC064011536F75726365526563742E426F74746F6D05000000 + 00000080AF07400001055363616C6505000000000000008000400F536F757263 + 65526563742E4C65667405000000000000009407400E536F7572636552656374 + 2E546F700500000000000080E0074010536F75726365526563742E5269676874 + 05000000000000009F074011536F75726365526563742E426F74746F6D050000 + 0000000080E9074000000B507265737365644C696E6B0E010F536F7572636552 + 6563742E4C65667405000000000000009306400E536F75726365526563742E54 + 6F700500000000000000EE064010536F75726365526563742E52696768740500 + 0000000000009E064011536F75726365526563742E426F74746F6D0500000000 + 000000F806400001055363616C650500000000000000C0FF3F0F536F75726365 + 526563742E4C6566740500000000000000DC06400E536F75726365526563742E + 546F700500000000000000B2074010536F75726365526563742E526967687405 + 00000000000000EC064011536F75726365526563742E426F74746F6D05000000 + 00000080B807400001055363616C6505000000000000008000400F536F757263 + 65526563742E4C65667405000000000000009307400E536F7572636552656374 + 2E546F700500000000000080ED074010536F75726365526563742E5269676874 + 05000000000000009E074011536F75726365526563742E426F74746F6D050000 + 0000000080F70740000013546F756368416E696D6174696F6E2E4C696E6B0E00 + 000000545046301254427574746F6E5374796C654F626A65637400095374796C + 654E616D650620767363726F6C6C6261727363726F6C6C626172626F74746F6D + 627574746F6E310C536F757263654C6F6F6B7570061B57696E646F7773203130 + 204465736B746F707374796C652E706E670A53697A652E576964746805000000 + 00000000BB07400B53697A652E48656967687405000000000000809107401453 + 697A652E506C6174666F726D44656661756C74080756697369626C650807486F + 744C696E6B0E010E436170496E736574732E4C6566740500000000000000C000 + 400D436170496E736574732E546F700500000000000000C000400F436170496E + 736574732E52696768740500000000000000C0004010436170496E736574732E + 426F74746F6D0500000000000000C000400F536F75726365526563742E4C6566 + 740500000000000000B906400E536F75726365526563742E546F700500000000 + 000000B4064010536F75726365526563742E52696768740500000000000000C9 + 064011536F75726365526563742E426F74746F6D0500000000000000C4064000 + 010E436170496E736574732E4C65667405000000000000008001400D43617049 + 6E736574732E546F7005000000000000008001400F436170496E736574732E52 + 69676874050000000000000080014010436170496E736574732E426F74746F6D + 0500000000000000800140055363616C650500000000000000C0FF3F0F536F75 + 726365526563742E4C65667405000000000000808A07400E536F757263655265 + 63742E546F70050000000000000087074010536F75726365526563742E526967 + 6874050000000000008096074011536F75726365526563742E426F74746F6D05 + 0000000000000093074000010E436170496E736574732E4C6566740500000000 + 000000C001400D436170496E736574732E546F700500000000000000C001400F + 436170496E736574732E52696768740500000000000000C0014010436170496E + 736574732E426F74746F6D0500000000000000C00140055363616C6505000000 + 000000008000400F536F75726365526563742E4C6566740500000000000000B9 + 07400E536F75726365526563742E546F700500000000000000B4074010536F75 + 726365526563742E52696768740500000000000000C9074011536F7572636552 + 6563742E426F74746F6D0500000000000000C4074000000B466F63757365644C + 696E6B0E010E436170496E736574732E4C6566740500000000000000C000400D + 436170496E736574732E546F700500000000000000C000400F436170496E7365 + 74732E52696768740500000000000000C0004010436170496E736574732E426F + 74746F6D0500000000000000C000400F536F75726365526563742E4C65667405 + 00000000000000A706400E536F75726365526563742E546F7005000000000000 + 00B4064010536F75726365526563742E52696768740500000000000000B70640 + 11536F75726365526563742E426F74746F6D0500000000000000C4064000010E + 436170496E736574732E4C65667405000000000000008001400D436170496E73 + 6574732E546F7005000000000000008001400F436170496E736574732E526967 + 6874050000000000000080014010436170496E736574732E426F74746F6D0500 + 000000000000800140055363616C650500000000000000C0FF3F0F536F757263 + 65526563742E4C6566740500000000000000FA06400E536F7572636552656374 + 2E546F70050000000000000087074010536F75726365526563742E5269676874 + 050000000000000089074011536F75726365526563742E426F74746F6D050000 + 000000000093074000010E436170496E736574732E4C65667405000000000000 + 00C001400D436170496E736574732E546F700500000000000000C001400F4361 + 70496E736574732E52696768740500000000000000C0014010436170496E7365 + 74732E426F74746F6D0500000000000000C00140055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000000A70740 + 0E536F75726365526563742E546F700500000000000000B4074010536F757263 + 65526563742E52696768740500000000000000B7074011536F75726365526563 + 742E426F74746F6D0500000000000000C4074000000A4E6F726D616C4C696E6B + 0E010E436170496E736574732E4C6566740500000000000000C000400D436170 + 496E736574732E546F700500000000000000C000400F436170496E736574732E + 52696768740500000000000000C0004010436170496E736574732E426F74746F + 6D0500000000000000C000400F536F75726365526563742E4C65667405000000 + 00000000A706400E536F75726365526563742E546F700500000000000000B406 + 4010536F75726365526563742E52696768740500000000000000B7064011536F + 75726365526563742E426F74746F6D0500000000000000C4064000010E436170 + 496E736574732E4C65667405000000000000008001400D436170496E73657473 + 2E546F7005000000000000008001400F436170496E736574732E526967687405 + 0000000000000080014010436170496E736574732E426F74746F6D0500000000 + 000000800140055363616C650500000000000000C0FF3F0F536F757263655265 + 63742E4C6566740500000000000000FA06400E536F75726365526563742E546F + 70050000000000000087074010536F75726365526563742E5269676874050000 + 000000000089074011536F75726365526563742E426F74746F6D050000000000 + 000093074000010E436170496E736574732E4C6566740500000000000000C001 + 400D436170496E736574732E546F700500000000000000C001400F436170496E + 736574732E52696768740500000000000000C0014010436170496E736574732E + 426F74746F6D0500000000000000C00140055363616C65050000000000000080 + 00400F536F75726365526563742E4C6566740500000000000000A707400E536F + 75726365526563742E546F700500000000000000B4074010536F757263655265 + 63742E52696768740500000000000000B7074011536F75726365526563742E42 + 6F74746F6D0500000000000000C4074000000B507265737365644C696E6B0E01 + 0E436170496E736574732E4C6566740500000000000000C000400D436170496E + 736574732E546F700500000000000000C000400F436170496E736574732E5269 + 6768740500000000000000C0004010436170496E736574732E426F74746F6D05 + 00000000000000C000400F536F75726365526563742E4C656674050000000000 + 0000CB06400E536F75726365526563742E546F700500000000000000B4064010 + 536F75726365526563742E52696768740500000000000000DB064011536F7572 + 6365526563742E426F74746F6D0500000000000000C4064000010E436170496E + 736574732E4C65667405000000000000008001400D436170496E736574732E54 + 6F7005000000000000008001400F436170496E736574732E5269676874050000 + 000000000080014010436170496E736574732E426F74746F6D05000000000000 + 00800140055363616C650500000000000000C0FF3F0F536F7572636552656374 + 2E4C65667405000000000000009807400E536F75726365526563742E546F7005 + 0000000000000087074010536F75726365526563742E52696768740500000000 + 000000A4074011536F75726365526563742E426F74746F6D0500000000000000 + 93074000010E436170496E736574732E4C6566740500000000000000C001400D + 436170496E736574732E546F700500000000000000C001400F436170496E7365 + 74732E52696768740500000000000000C0014010436170496E736574732E426F + 74746F6D0500000000000000C00140055363616C650500000000000000800040 + 0F536F75726365526563742E4C6566740500000000000000CB07400E536F7572 + 6365526563742E546F700500000000000000B4074010536F7572636552656374 + 2E52696768740500000000000000DB074011536F75726365526563742E426F74 + 746F6D0500000000000000C40740000013546F756368416E696D6174696F6E2E + 4C696E6B0E00001254427574746F6E5374796C654F626A6563740005416C6967 + 6E070643656E7465720C536F757263654C6F6F6B7570061B57696E646F777320 + 3130204465736B746F707374796C652E706E670A53697A652E57696474680500 + 000000000000B002400B53697A652E4865696768740500000000000000900240 + 1453697A652E506C6174666F726D44656661756C740808577261704D6F646507 + 0643656E74657207486F744C696E6B0E010F536F75726365526563742E4C6566 + 740500000000000000A506400E536F75726365526563742E546F700500000000 + 000000E4064010536F75726365526563742E52696768740500000000000000B0 + 064011536F75726365526563742E426F74746F6D0500000000000000ED064000 + 01055363616C650500000000000000C0FF3F0F536F75726365526563742E4C65 + 66740500000000000000F706400E536F75726365526563742E546F7005000000 + 00000000AB074010536F75726365526563742E52696768740500000000000080 + 83074011536F75726365526563742E426F74746F6D0500000000000080B10740 + 0001055363616C6505000000000000008000400F536F75726365526563742E4C + 6566740500000000000000A507400E536F75726365526563742E546F70050000 + 0000000080E4074010536F75726365526563742E526967687405000000000000 + 00B0074011536F75726365526563742E426F74746F6D0500000000000080ED07 + 4000000B466F63757365644C696E6B0E010F536F75726365526563742E4C6566 + 740500000000000000A506400E536F75726365526563742E546F700500000000 + 000000E4064010536F75726365526563742E52696768740500000000000000B0 + 064011536F75726365526563742E426F74746F6D0500000000000000ED064000 + 01055363616C650500000000000000C0FF3F0F536F75726365526563742E4C65 + 66740500000000000000F706400E536F75726365526563742E546F7005000000 + 00000000AB074010536F75726365526563742E52696768740500000000000080 + 83074011536F75726365526563742E426F74746F6D0500000000000080B10740 + 0001055363616C6505000000000000008000400F536F75726365526563742E4C + 6566740500000000000000A507400E536F75726365526563742E546F70050000 + 0000000080E4074010536F75726365526563742E526967687405000000000000 + 00B0074011536F75726365526563742E426F74746F6D0500000000000080ED07 + 4000000A4E6F726D616C4C696E6B0E010F536F75726365526563742E4C656674 + 0500000000000000A506400E536F75726365526563742E546F70050000000000 + 0000E4064010536F75726365526563742E52696768740500000000000000B006 + 4011536F75726365526563742E426F74746F6D0500000000000000ED06400001 + 055363616C650500000000000000C0FF3F0F536F75726365526563742E4C6566 + 740500000000000000F706400E536F75726365526563742E546F700500000000 + 000000AB074010536F75726365526563742E5269676874050000000000008083 + 074011536F75726365526563742E426F74746F6D0500000000000080B1074000 + 01055363616C6505000000000000008000400F536F75726365526563742E4C65 + 66740500000000000000A507400E536F75726365526563742E546F7005000000 + 00000080E4074010536F75726365526563742E52696768740500000000000000 + B0074011536F75726365526563742E426F74746F6D0500000000000080ED0740 + 00000B507265737365644C696E6B0E010F536F75726365526563742E4C656674 + 0500000000000000A506400E536F75726365526563742E546F70050000000000 + 0000F0064010536F75726365526563742E52696768740500000000000000B006 + 4011536F75726365526563742E426F74746F6D0500000000000000F906400001 + 055363616C650500000000000000C0FF3F0F536F75726365526563742E4C6566 + 740500000000000000F706400E536F75726365526563742E546F700500000000 + 000000B4074010536F75726365526563742E5269676874050000000000008083 + 074011536F75726365526563742E426F74746F6D0500000000000080BA074000 + 01055363616C6505000000000000008000400F536F75726365526563742E4C65 + 66740500000000000000A507400E536F75726365526563742E546F7005000000 + 00000080F0074010536F75726365526563742E52696768740500000000000000 + B0074011536F75726365526563742E426F74746F6D0500000000000080F90740 + 000013546F756368416E696D6174696F6E2E4C696E6B0E00000000545046300C + 545374796C654F626A65637400095374796C654E616D65061F767363726F6C6C + 6261727363726F6C6C62617268747261636B7374796C65310C536F757263654C + 6F6F6B7570061B57696E646F7773203130204465736B746F707374796C652E70 + 6E670A53697A652E57696474680500000000000000BB07400B53697A652E4865 + 6967687405000000000000809107401453697A652E506C6174666F726D446566 + 61756C74080756697369626C65080A536F757263654C696E6B0E010E43617049 + 6E736574732E4C65667405000000000000008000400D436170496E736574732E + 546F7005000000000000008000400F436170496E736574732E52696768740500 + 00000000000080004010436170496E736574732E426F74746F6D050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000000920640 + 0E536F75726365526563742E546F700500000000000000B4064010536F757263 + 65526563742E52696768740500000000000000A2064011536F75726365526563 + 742E426F74746F6D0500000000000000C4064000010E436170496E736574732E + 4C6566740500000000000000C000400D436170496E736574732E546F70050000 + 0000000000C000400F436170496E736574732E52696768740500000000000000 + C0004010436170496E736574732E426F74746F6D0500000000000000C0004005 + 5363616C650500000000000000C0FF3F0F536F75726365526563742E4C656674 + 0500000000000000DB06400E536F75726365526563742E546F70050000000000 + 000087074010536F75726365526563742E52696768740500000000000000F306 + 4011536F75726365526563742E426F74746F6D05000000000000009307400001 + 0E436170496E736574732E4C65667405000000000000008001400D436170496E + 736574732E546F7005000000000000008001400F436170496E736574732E5269 + 676874050000000000000080014010436170496E736574732E426F74746F6D05 + 00000000000000800140055363616C6505000000000000008000400F536F7572 + 6365526563742E4C65667405000000000000009207400E536F75726365526563 + 742E546F700500000000000000B4074010536F75726365526563742E52696768 + 740500000000000000A2074011536F75726365526563742E426F74746F6D0500 + 000000000000C4074000000006545468756D6200095374796C654E616D650605 + 7468756D62064C6F636B6564090A53697A652E57696474680500000000000000 + C804400B53697A652E48656967687405000000000000008003401453697A652E + 506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570060B6874 + 68756D627374796C65000000545046301254427574746F6E5374796C654F626A + 65637400095374796C654E616D65061268747261636B687468756D627374796C + 65310C536F757263654C6F6F6B7570061B57696E646F7773203130204465736B + 746F707374796C652E706E670A53697A652E57696474680500000000000000BB + 07400B53697A652E48656967687405000000000000809107401453697A652E50 + 6C6174666F726D44656661756C74080756697369626C650807486F744C696E6B + 0E010E436170496E736574732E4C6566740500000000000000C000400D436170 + 496E736574732E546F700500000000000000C000400F436170496E736574732E + 52696768740500000000000000C0004010436170496E736574732E426F74746F + 6D0500000000000000C000400F536F75726365526563742E4C65667405000000 + 00000000A506400E536F75726365526563742E546F700500000000000000C706 + 4010536F75726365526563742E52696768740500000000000000B5064011536F + 75726365526563742E426F74746F6D0500000000000000D7064000010E436170 + 496E736574732E4C65667405000000000000008001400D436170496E73657473 + 2E546F7005000000000000008001400F436170496E736574732E526967687405 + 0000000000000080014010436170496E736574732E426F74746F6D0500000000 + 000000800140055363616C650500000000000000C0FF3F0F536F757263655265 + 63742E4C6566740500000000000000F706400E536F75726365526563742E546F + 70050000000000000095074010536F75726365526563742E5269676874050000 + 000000008087074011536F75726365526563742E426F74746F6D050000000000 + 0000A1074000010E436170496E736574732E4C6566740500000000000000C001 + 400D436170496E736574732E546F700500000000000000C001400F436170496E + 736574732E52696768740500000000000000C0014010436170496E736574732E + 426F74746F6D0500000000000000C00140055363616C65050000000000000080 + 00400F536F75726365526563742E4C6566740500000000000000A507400E536F + 75726365526563742E546F700500000000000000C7074010536F757263655265 + 63742E52696768740500000000000000B5074011536F75726365526563742E42 + 6F74746F6D0500000000000000D7074000000B466F63757365644C696E6B0E01 + 0E436170496E736574732E4C6566740500000000000000C000400D436170496E + 736574732E546F700500000000000000C000400F436170496E736574732E5269 + 6768740500000000000000C0004010436170496E736574732E426F74746F6D05 + 00000000000000C000400F536F75726365526563742E4C656674050000000000 + 00009306400E536F75726365526563742E546F700500000000000000C7064010 + 536F75726365526563742E52696768740500000000000000A3064011536F7572 + 6365526563742E426F74746F6D0500000000000000D7064000010E436170496E + 736574732E4C65667405000000000000008001400D436170496E736574732E54 + 6F7005000000000000008001400F436170496E736574732E5269676874050000 + 000000000080014010436170496E736574732E426F74746F6D05000000000000 + 00800140055363616C650500000000000000C0FF3F0F536F7572636552656374 + 2E4C6566740500000000000000DC06400E536F75726365526563742E546F7005 + 0000000000000095074010536F75726365526563742E52696768740500000000 + 000000F4064011536F75726365526563742E426F74746F6D0500000000000000 + A1074000010E436170496E736574732E4C6566740500000000000000C001400D + 436170496E736574732E546F700500000000000000C001400F436170496E7365 + 74732E52696768740500000000000000C0014010436170496E736574732E426F + 74746F6D0500000000000000C00140055363616C650500000000000000800040 + 0F536F75726365526563742E4C65667405000000000000009307400E536F7572 + 6365526563742E546F700500000000000000C7074010536F7572636552656374 + 2E52696768740500000000000000A3074011536F75726365526563742E426F74 + 746F6D0500000000000000D7074000000A4E6F726D616C4C696E6B0E010E4361 + 70496E736574732E4C6566740500000000000000C000400D436170496E736574 + 732E546F700500000000000000C000400F436170496E736574732E5269676874 + 0500000000000000C0004010436170496E736574732E426F74746F6D05000000 + 00000000C000400F536F75726365526563742E4C656674050000000000000093 + 06400E536F75726365526563742E546F700500000000000000C7064010536F75 + 726365526563742E52696768740500000000000000A3064011536F7572636552 + 6563742E426F74746F6D0500000000000000D7064000010E436170496E736574 + 732E4C65667405000000000000008001400D436170496E736574732E546F7005 + 000000000000008001400F436170496E736574732E5269676874050000000000 + 000080014010436170496E736574732E426F74746F6D05000000000000008001 + 40055363616C650500000000000000C0FF3F0F536F75726365526563742E4C65 + 66740500000000000000DC06400E536F75726365526563742E546F7005000000 + 0000000095074010536F75726365526563742E52696768740500000000000000 + F4064011536F75726365526563742E426F74746F6D0500000000000000A10740 + 00010E436170496E736574732E4C6566740500000000000000C001400D436170 + 496E736574732E546F700500000000000000C001400F436170496E736574732E + 52696768740500000000000000C0014010436170496E736574732E426F74746F + 6D0500000000000000C00140055363616C6505000000000000008000400F536F + 75726365526563742E4C65667405000000000000009307400E536F7572636552 + 6563742E546F700500000000000000C7074010536F75726365526563742E5269 + 6768740500000000000000A3074011536F75726365526563742E426F74746F6D + 0500000000000000D7074000000B507265737365644C696E6B0E010E43617049 + 6E736574732E4C6566740500000000000000C000400D436170496E736574732E + 546F700500000000000000C000400F436170496E736574732E52696768740500 + 000000000000C0004010436170496E736574732E426F74746F6D050000000000 + 0000C000400F536F75726365526563742E4C6566740500000000000000B70640 + 0E536F75726365526563742E546F700500000000000000C7064010536F757263 + 65526563742E52696768740500000000000000C7064011536F75726365526563 + 742E426F74746F6D0500000000000000D7064000010E436170496E736574732E + 4C65667405000000000000008001400D436170496E736574732E546F70050000 + 00000000008001400F436170496E736574732E52696768740500000000000000 + 80014010436170496E736574732E426F74746F6D050000000000000080014005 + 5363616C650500000000000000C0FF3F0F536F75726365526563742E4C656674 + 05000000000000008907400E536F75726365526563742E546F70050000000000 + 000095074010536F75726365526563742E526967687405000000000000009507 + 4011536F75726365526563742E426F74746F6D0500000000000000A107400001 + 0E436170496E736574732E4C6566740500000000000000C001400D436170496E + 736574732E546F700500000000000000C001400F436170496E736574732E5269 + 6768740500000000000000C0014010436170496E736574732E426F74746F6D05 + 00000000000000C00140055363616C6505000000000000008000400F536F7572 + 6365526563742E4C6566740500000000000000B707400E536F75726365526563 + 742E546F700500000000000000C7074010536F75726365526563742E52696768 + 740500000000000000C7074011536F75726365526563742E426F74746F6D0500 + 000000000000D70740000013546F756368416E696D6174696F6E2E4C696E6B0E + 000000545046300C545374796C654F626A65637400095374796C654E616D6506 + 1F767363726F6C6C6261727363726F6C6C62617276747261636B7374796C6531 + 0C536F757263654C6F6F6B7570061B57696E646F7773203130204465736B746F + 707374796C652E706E670A53697A652E57696474680500000000000000BB0740 + 0B53697A652E48656967687405000000000000809107401453697A652E506C61 + 74666F726D44656661756C74080756697369626C65080A536F757263654C696E + 6B0E010E436170496E736574732E4C65667405000000000000008000400D4361 + 70496E736574732E546F7005000000000000008000400F436170496E73657473 + 2E5269676874050000000000000080004010436170496E736574732E426F7474 + 6F6D05000000000000008000400F536F75726365526563742E4C656674050000 + 00000000009206400E536F75726365526563742E546F700500000000000000B4 + 064010536F75726365526563742E52696768740500000000000000A206401153 + 6F75726365526563742E426F74746F6D0500000000000000C4064000010E4361 + 70496E736574732E4C6566740500000000000000C000400D436170496E736574 + 732E546F700500000000000000C000400F436170496E736574732E5269676874 + 0500000000000000C0004010436170496E736574732E426F74746F6D05000000 + 00000000C00040055363616C650500000000000000C0FF3F0F536F7572636552 + 6563742E4C6566740500000000000000DB06400E536F75726365526563742E54 + 6F70050000000000000087074010536F75726365526563742E52696768740500 + 000000000000F3064011536F75726365526563742E426F74746F6D0500000000 + 00000093074000010E436170496E736574732E4C656674050000000000000080 + 01400D436170496E736574732E546F7005000000000000008001400F43617049 + 6E736574732E5269676874050000000000000080014010436170496E73657473 + 2E426F74746F6D0500000000000000800140055363616C650500000000000000 + 8000400F536F75726365526563742E4C65667405000000000000009207400E53 + 6F75726365526563742E546F700500000000000000B4074010536F7572636552 + 6563742E52696768740500000000000000A2074011536F75726365526563742E + 426F74746F6D0500000000000000C4074000000006545468756D620009537479 + 6C654E616D6506057468756D62064C6F636B6564090A53697A652E5769647468 + 05000000000000008003400B53697A652E4865696768740500000000000000C8 + 04401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F + 6F6B7570060B767468756D627374796C65000000545046301254427574746F6E + 5374796C654F626A65637400095374796C654E616D65061276747261636B7674 + 68756D627374796C65310C536F757263654C6F6F6B7570061B57696E646F7773 + 203130204465736B746F707374796C652E706E670A53697A652E576964746805 + 00000000000000BB07400B53697A652E48656967687405000000000000809107 + 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 + 07486F744C696E6B0E010E436170496E736574732E4C65667405000000000000 + 00C000400D436170496E736574732E546F700500000000000000C000400F4361 + 70496E736574732E52696768740500000000000000C0004010436170496E7365 + 74732E426F74746F6D0500000000000000C000400F536F75726365526563742E + 4C6566740500000000000000A506400E536F75726365526563742E546F700500 + 000000000000C7064010536F75726365526563742E5269676874050000000000 + 0000B5064011536F75726365526563742E426F74746F6D0500000000000000D7 + 064000010E436170496E736574732E4C65667405000000000000008001400D43 + 6170496E736574732E546F7005000000000000008001400F436170496E736574 + 732E5269676874050000000000000080014010436170496E736574732E426F74 + 746F6D0500000000000000800140055363616C650500000000000000C0FF3F0F + 536F75726365526563742E4C6566740500000000000000F706400E536F757263 + 65526563742E546F70050000000000000095074010536F75726365526563742E + 5269676874050000000000008087074011536F75726365526563742E426F7474 + 6F6D0500000000000000A1074000010E436170496E736574732E4C6566740500 + 000000000000C001400D436170496E736574732E546F700500000000000000C0 + 01400F436170496E736574732E52696768740500000000000000C00140104361 + 70496E736574732E426F74746F6D0500000000000000C00140055363616C6505 + 000000000000008000400F536F75726365526563742E4C656674050000000000 + 0000A507400E536F75726365526563742E546F700500000000000000C7074010 + 536F75726365526563742E52696768740500000000000000B5074011536F7572 + 6365526563742E426F74746F6D0500000000000000D7074000000B466F637573 + 65644C696E6B0E010E436170496E736574732E4C6566740500000000000000C0 + 00400D436170496E736574732E546F700500000000000000C000400F43617049 + 6E736574732E52696768740500000000000000C0004010436170496E73657473 + 2E426F74746F6D0500000000000000C000400F536F75726365526563742E4C65 + 667405000000000000009306400E536F75726365526563742E546F7005000000 + 00000000C7064010536F75726365526563742E52696768740500000000000000 + A3064011536F75726365526563742E426F74746F6D0500000000000000D70640 + 00010E436170496E736574732E4C65667405000000000000008001400D436170 + 496E736574732E546F7005000000000000008001400F436170496E736574732E + 5269676874050000000000000080014010436170496E736574732E426F74746F + 6D0500000000000000800140055363616C650500000000000000C0FF3F0F536F + 75726365526563742E4C6566740500000000000000DC06400E536F7572636552 + 6563742E546F70050000000000000095074010536F75726365526563742E5269 + 6768740500000000000000F4064011536F75726365526563742E426F74746F6D + 0500000000000000A1074000010E436170496E736574732E4C65667405000000 + 00000000C001400D436170496E736574732E546F700500000000000000C00140 + 0F436170496E736574732E52696768740500000000000000C001401043617049 + 6E736574732E426F74746F6D0500000000000000C00140055363616C65050000 + 00000000008000400F536F75726365526563742E4C6566740500000000000000 + 9307400E536F75726365526563742E546F700500000000000000C7074010536F + 75726365526563742E52696768740500000000000000A3074011536F75726365 + 526563742E426F74746F6D0500000000000000D7074000000A4E6F726D616C4C + 696E6B0E010E436170496E736574732E4C6566740500000000000000C000400D + 436170496E736574732E546F700500000000000000C000400F436170496E7365 + 74732E52696768740500000000000000C0004010436170496E736574732E426F + 74746F6D0500000000000000C000400F536F75726365526563742E4C65667405 + 000000000000009306400E536F75726365526563742E546F7005000000000000 + 00C7064010536F75726365526563742E52696768740500000000000000A30640 + 11536F75726365526563742E426F74746F6D0500000000000000D7064000010E + 436170496E736574732E4C65667405000000000000008001400D436170496E73 + 6574732E546F7005000000000000008001400F436170496E736574732E526967 + 6874050000000000000080014010436170496E736574732E426F74746F6D0500 + 000000000000800140055363616C650500000000000000C0FF3F0F536F757263 + 65526563742E4C6566740500000000000000DC06400E536F7572636552656374 + 2E546F70050000000000000095074010536F75726365526563742E5269676874 + 0500000000000000F4064011536F75726365526563742E426F74746F6D050000 + 0000000000A1074000010E436170496E736574732E4C65667405000000000000 + 00C001400D436170496E736574732E546F700500000000000000C001400F4361 + 70496E736574732E52696768740500000000000000C0014010436170496E7365 + 74732E426F74746F6D0500000000000000C00140055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000000930740 + 0E536F75726365526563742E546F700500000000000000C7074010536F757263 + 65526563742E52696768740500000000000000A3074011536F75726365526563 + 742E426F74746F6D0500000000000000D7074000000B507265737365644C696E + 6B0E010E436170496E736574732E4C6566740500000000000000C000400D4361 + 70496E736574732E546F700500000000000000C000400F436170496E73657473 + 2E52696768740500000000000000C0004010436170496E736574732E426F7474 + 6F6D0500000000000000C000400F536F75726365526563742E4C656674050000 + 0000000000B706400E536F75726365526563742E546F700500000000000000C7 + 064010536F75726365526563742E52696768740500000000000000C706401153 + 6F75726365526563742E426F74746F6D0500000000000000D7064000010E4361 + 70496E736574732E4C65667405000000000000008001400D436170496E736574 + 732E546F7005000000000000008001400F436170496E736574732E5269676874 + 050000000000000080014010436170496E736574732E426F74746F6D05000000 + 00000000800140055363616C650500000000000000C0FF3F0F536F7572636552 + 6563742E4C65667405000000000000008907400E536F75726365526563742E54 + 6F70050000000000000095074010536F75726365526563742E52696768740500 + 00000000000095074011536F75726365526563742E426F74746F6D0500000000 + 000000A1074000010E436170496E736574732E4C6566740500000000000000C0 + 01400D436170496E736574732E546F700500000000000000C001400F43617049 + 6E736574732E52696768740500000000000000C0014010436170496E73657473 + 2E426F74746F6D0500000000000000C00140055363616C650500000000000000 + 8000400F536F75726365526563742E4C6566740500000000000000B707400E53 + 6F75726365526563742E546F700500000000000000C7074010536F7572636552 + 6563742E52696768740500000000000000C7074011536F75726365526563742E + 426F74746F6D0500000000000000D70740000013546F756368416E696D617469 + 6F6E2E4C696E6B0E0000005450463007544C61796F757400095374796C654E61 + 6D6506226C6254756E6572735374796C6531536D616C6C5363726F6C6C426172 + 5374796C653105416C69676E070643656E7465720A53697A652E576964746805 + 00000000000000BB07400B53697A652E48656967687405000000000000809107 + 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 + 085461624F72646572020D000654547261636B00095374796C654E616D650606 + 68747261636B05416C69676E0706436C69656E74064C6F636B6564090B4F7269 + 656E746174696F6E070A486F72697A6F6E74616C0A53697A652E576964746805 + 00000000000000BB07400B53697A652E48656967687405000000000000809107 + 401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F + 6B757006147363726F6C6C62617268747261636B7374796C6500000654547261 + 636B00095374796C654E616D65060676747261636B05416C69676E0706436C69 + 656E74064C6F636B6564090B4F7269656E746174696F6E070A486F72697A6F6E + 74616C0A53697A652E57696474680500000000000000BB07400B53697A652E48 + 656967687405000000000000809107401453697A652E506C6174666F726D4465 + 6661756C74080B5374796C654C6F6F6B757006147363726F6C6C626172767472 + 61636B7374796C65000000545046300C545374796C654F626A65637400095374 + 796C654E616D65062476736D616C6C7363726F6C6C6261727363726F6C6C6261 + 7268747261636B7374796C65310C536F757263654C6F6F6B7570061B57696E64 + 6F7773203130204465736B746F707374796C652E706E670A53697A652E576964 + 74680500000000000000BB07400B53697A652E48656967687405000000000000 + 809107401453697A652E506C6174666F726D44656661756C7408075669736962 + 6C65080A536F757263654C696E6B0E010E436170496E736574732E4C65667405 + 000000000000008000400D436170496E736574732E546F700500000000000000 + 8000400F436170496E736574732E526967687405000000000000008000401043 + 6170496E736574732E426F74746F6D05000000000000008000400F536F757263 + 65526563742E4C65667405000000000000009206400E536F7572636552656374 + 2E546F700500000000000000B4064010536F75726365526563742E5269676874 + 0500000000000000A2064011536F75726365526563742E426F74746F6D050000 + 0000000000C4064000010E436170496E736574732E4C65667405000000000000 + 00C000400D436170496E736574732E546F700500000000000000C000400F4361 + 70496E736574732E52696768740500000000000000C0004010436170496E7365 + 74732E426F74746F6D0500000000000000C00040055363616C65050000000000 + 0000C0FF3F0F536F75726365526563742E4C6566740500000000000000DB0640 + 0E536F75726365526563742E546F70050000000000000087074010536F757263 + 65526563742E52696768740500000000000000F3064011536F75726365526563 + 742E426F74746F6D050000000000000093074000010E436170496E736574732E + 4C65667405000000000000008001400D436170496E736574732E546F70050000 + 00000000008001400F436170496E736574732E52696768740500000000000000 + 80014010436170496E736574732E426F74746F6D050000000000000080014005 + 5363616C6505000000000000008000400F536F75726365526563742E4C656674 + 05000000000000009207400E536F75726365526563742E546F70050000000000 + 0000B4074010536F75726365526563742E52696768740500000000000000A207 + 4011536F75726365526563742E426F74746F6D0500000000000000C407400000 + 0006545468756D6200095374796C654E616D6506057468756D62064C6F636B65 + 64090A53697A652E57696474680500000000000000C804400B53697A652E4865 + 6967687405000000000000008003401453697A652E506C6174666F726D446566 + 61756C74080B5374796C654C6F6F6B7570060B687468756D627374796C650000 + 00545046300C545374796C654F626A65637400095374796C654E616D65062476 + 736D616C6C7363726F6C6C6261727363726F6C6C62617276747261636B737479 + 6C65310C536F757263654C6F6F6B7570061B57696E646F777320313020446573 + 6B746F707374796C652E706E670A53697A652E57696474680500000000000000 + BB07400B53697A652E48656967687405000000000000809107401453697A652E + 506C6174666F726D44656661756C74080756697369626C65080A536F75726365 + 4C696E6B0E010E436170496E736574732E4C6566740500000000000000800040 + 0D436170496E736574732E546F7005000000000000008000400F436170496E73 + 6574732E5269676874050000000000000080004010436170496E736574732E42 + 6F74746F6D05000000000000008000400F536F75726365526563742E4C656674 + 05000000000000009206400E536F75726365526563742E546F70050000000000 + 0000B4064010536F75726365526563742E52696768740500000000000000A206 + 4011536F75726365526563742E426F74746F6D0500000000000000C406400001 + 0E436170496E736574732E4C6566740500000000000000C000400D436170496E + 736574732E546F700500000000000000C000400F436170496E736574732E5269 + 6768740500000000000000C0004010436170496E736574732E426F74746F6D05 + 00000000000000C00040055363616C650500000000000000C0FF3F0F536F7572 + 6365526563742E4C6566740500000000000000DB06400E536F75726365526563 + 742E546F70050000000000000087074010536F75726365526563742E52696768 + 740500000000000000F3064011536F75726365526563742E426F74746F6D0500 + 00000000000093074000010E436170496E736574732E4C656674050000000000 + 00008001400D436170496E736574732E546F7005000000000000008001400F43 + 6170496E736574732E5269676874050000000000000080014010436170496E73 + 6574732E426F74746F6D0500000000000000800140055363616C650500000000 + 0000008000400F536F75726365526563742E4C65667405000000000000009207 + 400E536F75726365526563742E546F700500000000000000B4074010536F7572 + 6365526563742E52696768740500000000000000A2074011536F757263655265 + 63742E426F74746F6D0500000000000000C4074000000006545468756D620009 + 5374796C654E616D6506057468756D62064C6F636B6564090A53697A652E5769 + 64746805000000000000008003400B53697A652E486569676874050000000000 + 0000C804401453697A652E506C6174666F726D44656661756C74080B5374796C + 654C6F6F6B7570060B767468756D627374796C65000000} end> Left = 24 - Top = 184 + Top = 320 end object SaveTimer: TTimer OnTimer = SaveTimerTimer - Left = 96 - Top = 184 + Left = 72 + Top = 320 end object HelpCallout: TCalloutRectangle Fill.Color = xFFE5E5E5 diff --git a/ProxyFormUnit.pas b/ProxyFormUnit.pas index 963c26f..41e0536 100644 --- a/ProxyFormUnit.pas +++ b/ProxyFormUnit.pas @@ -30,10 +30,6 @@ interface FMX.Layouts, FMX.ListBox, FMX.Utils, - FMX.ListView.Types, - FMX.ListView.Appearances, - FMX.ListView.Adapters.Base, - FMX.ListView, FMX.SpinBox, FMX.Menus, FMX.Platform, @@ -71,7 +67,6 @@ TMainForm = class(TForm, IServiceConfigEvents) SaveTimer: TTimer; Label2: TLabel; btnRefreshChannels: TButton; - lbStats: TListView; Label3: TLabel; eHDHRListenHTTPPort: TEdit; Label4: TLabel; @@ -96,6 +91,7 @@ TMainForm = class(TForm, IServiceConfigEvents) HelpCallout: TCalloutRectangle; lblHelp: TLabel; eCetonTunerAddress: TComboEdit; + lbTuners: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure lbChannelsChangeCheck(Sender: TObject); @@ -117,6 +113,7 @@ TMainForm = class(TForm, IServiceConfigEvents) Shift: TShiftState; X, Y: Single); procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); + procedure lbTunersChangeCheck(Sender: TObject); private { Private declarations } fConfigManager: IServiceConfigManager; @@ -142,7 +139,7 @@ TMainForm = class(TForm, IServiceConfigEvents) procedure UpdateInterface; procedure UpdateChannelCount; procedure FillChannels; - procedure FillTunerStatistics; + procedure FillTuners; property ConfigManager: IServiceConfigManager read fConfigManager; property Client: TCetonClient read GetClient; @@ -311,7 +308,7 @@ procedure TMainForm.lbChannelsChangeCheck(Sender: TObject); ConfigManager.UnlockConfig(lConfig); end; - updateChannelCount; + UpdateChannelCount; Save([TServiceConfigSection.Channels]); end; @@ -415,7 +412,7 @@ procedure TMainForm.SaveTimerTimer(Sender: TObject); ConfigManager.Changed(Self, lSections); end; - FillTunerStatistics; + FillTuners; end; procedure TMainForm.FormShow(Sender: TObject); @@ -485,41 +482,77 @@ procedure TMainForm.btnRefreshChannelsClick(Sender: TObject); FillChannels; end; -procedure TMainForm.FillTunerStatistics; +procedure TMainForm.FillTuners; var lStatsArray: TTunerStatsArray; i, i2: Integer; lActiveStr: String; lText: String; lCount: Integer; + lConfig: TServiceConfig; + lTunerConfigList: TTunerConfigList; begin - lStatsArray := Client.GetTunerStats; - while lbStats.Items.Count < Length(lStatsArray) do - lbStats.Items.Add; - while lbStats.Items.Count > Length(lStatsArray) do - lbStats.Items.Delete(lbStats.Items.Count-1); + BeginInterfaceUpdate; + try + lStatsArray := Client.GetTunerStats; - for i := 0 to High(lStatsArray) do - begin - if lStatsArray[i].Active then - lActiveStr := 'Active' - else - lActiveStr := 'Not active'; + lbTuners.BeginUpdate; + try + while lbTuners.Items.Count < Length(lStatsArray) do + lbTuners.Items.Add(''); + while lbTuners.Items.Count > Length(lStatsArray) do + lbTuners.Items.Delete(lbTuners.Items.Count-1); - lText := Format('%d. Channel: %d, %s (%0.2fMbps, Buffer free: %0.0f%%)', [i+1, lStatsArray[i].Channel, lActiveStr, lStatsArray[i].InMeter.GetBytesPerSecond(True)*8/1000000, lStatsArray[i].BufferFree*100]); - lCount := 1; + lTunerConfigList := TTunerConfigList.Create; + try + ConfigManager.LockConfig(lConfig); + try + lTunerConfigList.Assign(lConfig.Ceton.Tuners); + finally + ConfigManager.UnlockConfig(lConfig); + end; - for i2 := 0 to lStatsArray[i].ClientCount-1 do - begin - if lStatsArray[i].Clients[i2].Active then - begin - lText := lText + #13#10 + Format(' To client: %0.2fMbps, Lost packets: %d', [lStatsArray[i].Clients[i2].OutMeter.GetBytesPerSecond(True)*8/1000000, lStatsArray[i].Clients[i2].Lost]); - Inc(lCount); + for i := 0 to High(lStatsArray) do + begin + if lStatsArray[i].Active then + lActiveStr := 'Active' + else + lActiveStr := 'Not active'; + + lText := Format('%d. Channel: %d, %s (%0.2fMbps, Buffer free: %0.0f%%)', [i+1, lStatsArray[i].Channel, lActiveStr, lStatsArray[i].InMeter.GetBytesPerSecond(True)*8/1000000, lStatsArray[i].BufferFree*100]); + lCount := 1; + + for i2 := 0 to lStatsArray[i].ClientCount-1 do + begin + if lStatsArray[i].Clients[i2].Active then + begin + lText := lText + #13#10 + Format(' To client: %0.2fMbps, Lost packets: %d', [lStatsArray[i].Clients[i2].OutMeter.GetBytesPerSecond(True)*8/1000000, lStatsArray[i].Clients[i2].Lost]); + Inc(lCount); + end; + end; + + lbTuners.ListItems[i].Text := lText; + lbTuners.ListItems[i].Height := 22*lCount; + + if (i < lTunerConfigList.Count) then + lbTuners.ListItems[i].IsChecked := lTunerConfigList[i].Enabled + else + lbTuners.ListItems[i].IsChecked := False; + + lbTuners.ListItems[i].StyledSettings := lbTuners.ListItems[i].StyledSettings - [TStyledSetting.FontColor]; + if lbTuners.ListItems[i].IsChecked then + lbTuners.ListItems[i].FontColor := TAlphaColorRec.Black + else + lbTuners.ListItems[i].FontColor := TAlphaColorRec.Gray; + end; + finally + lTunerConfigList.Free; end; + finally + lbTuners.EndUpdate; end; - - lbStats.Items[i].Text := lText; - lbStats.Items[i].Height := 22*lCount; + finally + EndInterfaceUpdate; end; end; @@ -765,4 +798,23 @@ procedure TMainForm.FormMouseWheel(Sender: TObject; Shift: TShiftState; end; end; +procedure TMainForm.lbTunersChangeCheck(Sender: TObject); +var + lConfig: TServiceConfig; +begin + if not InterfaceUpdating then + begin + ConfigManager.LockConfig(lConfig); + try + if TListBoxItem(Sender).Index < lConfig.Ceton.Tuners.Count then + lConfig.Ceton.Tuners[TListBoxItem(Sender).Index].Enabled := TListBoxItem(Sender).IsChecked; + finally + ConfigManager.UnlockConfig(lConfig); + end; + + // TODO: Use another config section so that servers aren't restarted + Save([TServiceConfigSection.Other]); + end; +end; + end. diff --git a/ProxyServerModuleUnit.pas b/ProxyServerModuleUnit.pas index 4fd79d4..5a05a3a 100644 --- a/ProxyServerModuleUnit.pas +++ b/ProxyServerModuleUnit.pas @@ -384,7 +384,7 @@ procedure TProxyServerModule.DiscoveryUDPRead(AThread: TIdUDPListenerThread; begin if TryGetAddress(ABinding.IP, lAddress) then begin - lTunerCount := Client.TunerCount; + lTunerCount := Client.EnabledTunerCount; ConfigManager.LockConfig(lConfig); try @@ -474,7 +474,7 @@ function TProxyServerModule.TryGetAddress(const aRequestLocalIP: String; out aAd if (lAddresses.IndexOf(ARequestLocalIP) > -1) then begin - if ProxyServiceModule.Client.TunerCount = 0 then + if ProxyServiceModule.Client.EnabledTunerCount = 0 then Exit(False); lModel := ProxyServiceModule.Client.Model; diff --git a/ProxyServiceModuleUnit.pas b/ProxyServiceModuleUnit.pas index 052648f..d2a1c4d 100644 --- a/ProxyServiceModuleUnit.pas +++ b/ProxyServiceModuleUnit.pas @@ -211,6 +211,16 @@ function TServiceConfig.ToJSON: String; begin m := TJSONMarshal.Create(TJSONConverter.Create); try + m.RegisterConverter(TTunerConfigList, 'fList', + function(Data: TObject; Field: String): TListOfObjects + var + i: Integer; + begin + SetLength(Result, TTunerConfigList(Data).Count); + for i := 0 to High(Result) do + Result[i] := TTunerConfigList(Data)[i]; + end); + m.RegisterConverter(TChannelMap, 'fList', function(Data: TObject; Field: String): TListOfObjects var @@ -244,6 +254,21 @@ class function TServiceConfig.FromJSON(const aJSON: String): TServiceConfig; m := TJSONUnMarshal.Create; try + lR := TReverterEvent.Create(TTunerConfig, 'list'); + lR.ObjectsReverter := + procedure(Data: TObject; Field: string; Args: TListOfObjects) + var + i: Integer; + begin + TTunerConfigList(Data).Count := Length(Args); + for i := 0 to High(Args) do + begin + TTunerConfigList(Data)[i].Assign(TTunerConfig(Args[i])); + Args[i].Free; + end; + end; + m.RegisterReverter(TTunerConfigList, 'list', lR); + lR := TReverterEvent.Create(TChannelMapItem, 'list'); lR.ObjectsReverter := procedure(Data: TObject; Field: string; Args: TListOfObjects) @@ -742,6 +767,9 @@ procedure TServiceThread.QueryDiscoveredCetonDevices; end; procedure TServiceThread.Execute; +var + lConfig: TServiceConfig; + lCetonConfig: TCetonConfig; begin Coinitialize(nil); try @@ -759,7 +787,25 @@ procedure TServiceThread.Execute; SaveLogs; try - fServiceModule.Client.CheckTuner; + if fServiceModule.Client.CheckTuner then + begin + // If check tuner did something, it may have changed its config, so update the service module's config + lCetonConfig := TCetonConfig.Create; + try + fServiceModule.Client.GetConfig(lCetonConfig); + + fServiceModule.ConfigManager.LockConfig(lConfig); + try + lConfig.Ceton.Assign(lCetonConfig, [TCetonConfigSection.Channels]); + finally + fServiceModule.ConfigManager.UnlockConfig(lConfig); + end; + finally + lCetonConfig.Free; + end; + + fServiceModule.ConfigManager.Changed(fServiceModule.Client, [TServiceConfigSection.Other]); + end; except on e: Exception do TLogger.Log(cLogDefault, e.Message); diff --git a/ProxyWebModuleUnit.pas b/ProxyWebModuleUnit.pas index b175d40..3e5605c 100644 --- a/ProxyWebModuleUnit.pas +++ b/ProxyWebModuleUnit.pas @@ -69,7 +69,7 @@ TProxyWebModule = class(TWebModule) function GetAddress(const aRequest: TWebRequest): String; procedure GetLineup(const aLineup: TLineup); - procedure SendTuneResponse(const aTuner, aChannel: Integer; const aTest: Boolean; const aDurationSec: Integer; const aRemux: Boolean; const Response: TWebResponse); + procedure SendTuneResponse(const aTuner, aChannel: Integer; const aAllowedDisabledTuners: Boolean; const aTest: Boolean; const aDurationSec: Integer; const aRemux: Boolean; const Response: TWebResponse); function CreateDeviceXML: String; @@ -161,7 +161,7 @@ procedure TProxyWebModule.ProxyWebModuleDiscoverActionAction(Sender: TObject; lResponse := TDiscoverResponse.Create; try lAddress := GetAddress(Request); - lTunerCount := Client.TunerCount; + lTunerCount := Client.EnabledTunerCount; ConfigManager.LockConfig(lConfig); try @@ -212,7 +212,7 @@ procedure TProxyWebModule.ProxyWebModuleLineupJSONActionAction(Sender: TObject; end; end; -procedure TProxyWebModule.SendTuneResponse(const aTuner, aChannel: Integer; const aTest: Boolean; const aDurationSec: Integer; const aRemux: Boolean; const Response: TWebResponse); +procedure TProxyWebModule.SendTuneResponse(const aTuner, aChannel: Integer; const aAllowedDisabledTuners: Boolean; const aTest: Boolean; const aDurationSec: Integer; const aRemux: Boolean; const Response: TWebResponse); var lStream: TCetonVideoStream; lStatsWatch, lDurationWatch: TStopWatch; @@ -227,7 +227,7 @@ procedure TProxyWebModule.SendTuneResponse(const aTuner, aChannel: Integer; cons lDurationWatch := TStopWatch.StartNew; // If Create here - lStream := TCetonVideoStream.Create(Client, aTuner, aChannel, aRemux); + lStream := TCetonVideoStream.Create(Client, aTuner, aChannel, aAllowedDisabledTuners, aRemux); try try TIdHTTPAppChunkedResponse(Response).SendChunkedStream(lStream, @@ -286,7 +286,7 @@ procedure TProxyWebModule.ProxyWebModuleAutoActionAction(Sender: TObject; lChannel := StrToIntDef(lParts[1].Substring(1),0); if lChannel > 0 then begin - SendTuneResponse(-1, lChannel, False, 0, True, Response); + SendTuneResponse(-1, lChannel, False, False, 0, True, Response); end; end; finally @@ -420,7 +420,7 @@ procedure TProxyWebModule.ProxyWebModuleTunerActionAction(Sender: TObject; lChannel := StrToIntDef(lParts[1].Substring(1),0); if (lTuner > -1) and (lChannel > 0) then begin - SendTuneResponse(lTuner, lChannel, False, 0, True, Response); + SendTuneResponse(lTuner, lChannel, False, False, 0, True, Response); end; end; finally @@ -936,7 +936,7 @@ procedure TProxyWebModule.ProxyWebModuleVideoTestActionAction(Sender: TObject; lDuration := StrToIntDef(Request.QueryFields.Values['duration'], 45); lRemux := Boolean(StrToIntDef(Request.QueryFields.Values['remux'], 0)); - SendTuneResponse(lTunerIndex, lChannel, True, lDuration, lRemux, Response); + SendTuneResponse(lTunerIndex, lChannel, True, True, lDuration, lRemux, Response); end; end; finally diff --git a/ceton/Ceton.pas b/ceton/Ceton.pas index 3d88106..593998b 100644 --- a/ceton/Ceton.pas +++ b/ceton/Ceton.pas @@ -57,6 +57,7 @@ ECetonClosedError = class(Exception); ECetonError = class(Exception); TChannelMap = class; + TTunerConfigList = class; TCetonConfigSection = (Channels); TCetonConfigSections = set of TCetonConfigSection; @@ -64,9 +65,9 @@ TChannelMap = class; TCetonConfig = class(TPersistent) private fChannelMap: TChannelMap; + fTuners: TTunerConfigList; fTunerAddress: String; fListenIP: String; - fTunerCount: Integer; public constructor Create; destructor Destroy; override; @@ -78,6 +79,7 @@ TCetonConfig = class(TPersistent) property ListenIP: String read fListenIP write fListenIP; property TunerAddress: String read fTunerAddress write fTunerAddress; property ChannelMap: TChannelMap read fChannelMap; + property Tuners: TTunerConfigList read fTuners; end; TChannelMapItem = class(TPersistent) @@ -110,7 +112,6 @@ TChannelMap = class [JSONOwned(False)] fList: TObjectList; fRequestDateTime: TDateTime; - [JSONMarshalled(False)] function GetCount: Integer; function GetItem(const aIndex: Integer): TChannelMapItem; function ChannelMapItemComparison(const Left, @@ -230,6 +231,34 @@ TREST = class abstract class function GetModel(const aClient: TRestClient): TCetonModel; static; end; + TTunerConfig = class(TPersistent) + private + fEnabled: Boolean; + public + constructor Create; + + procedure AssignTo(Dest: TPersistent); override; + + property Enabled: Boolean read fEnabled write fEnabled; + end; + + TTunerConfigList = class + private + [JSONOwned(False)] + fList: TObjectList; + function GetCount: Integer; + procedure SetCount(const aValue: Integer); + function GetItem(const aIndex: Integer): TTunerConfig; + public + constructor Create; + destructor Destroy; override; + + procedure Assign(const aList: TTunerConfigList); + + property Count: Integer read GetCount write SetCount; + property Items[const aIndex: Integer]: TTunerConfig read GetItem; default; + end; + PTunerClientStats = ^TTunerClientStats; TTunerClientStats = record Active: Boolean; @@ -348,7 +377,7 @@ TCetonClient = class procedure NeedClient; function GetListenIP: String; - function GetTunerCount: Integer; + function GetEnabledTunerCount: Integer; function GetModel: TCetonModel; public constructor Create; @@ -359,17 +388,17 @@ TCetonClient = class function TryGetChannel(const aNumber: Integer; const aChannel: TChannelMapItem): Boolean; - procedure CheckTuner; + function CheckTuner: Boolean; procedure RequestChannelMap; - procedure StartStream(const aTuner: Integer; const aChannel: Integer; out aViewer: TCetonViewer); + procedure StartStream(const aTuner: Integer; const aChannel: Integer; const aAllowDisabledTuners: Boolean; out aViewer: TCetonViewer); procedure StopStream(var aViewer: TCetonViewer); procedure ReadStream(var aViewer: TCetonViewer; const aBuffer: TRingBuffer; const aCount: Integer; const aTimeoutMs: Integer); function GetTunerStats: TTunerStatsArray; property ListenIP: String read GetListenIP; - property TunerCount: Integer read GetTunerCount; + property EnabledTunerCount: Integer read GetEnabledTunerCount; property Model: TCetonModel read GetModel; end; @@ -393,7 +422,7 @@ TCetonVideoStream = class(TStream) function ConverterWrite(const aBuf: PByte; const aSize: Integer): Integer; procedure ConverterLog(const aMsg: String); public - constructor Create(const aClient: TCetonClient; const aTuner: Integer; const aChannel: Integer; const aRemux: Boolean = True); reintroduce; + constructor Create(const aClient: TCetonClient; const aTuner: Integer; const aChannel: Integer; const aAllowedDisabledTuners: Boolean; const aRemux: Boolean); reintroduce; destructor Destroy; override; function Read(var Buffer; Count: Longint): Longint; override; @@ -963,13 +992,6 @@ function TTunerList.Find(const aChannel: Integer): Integer; if fList[i].Channel = aChannel then Exit(i); end; - - for i := 0 to fList.Count-1 do - begin - if not fList[i].Active then - Exit(i); - end; - Result := -1; end; @@ -1007,7 +1029,7 @@ procedure TCetonClient.RequestChannelMap; end; end; -procedure TCetonClient.StartStream(const aTuner: Integer; const aChannel: Integer; out aViewer: TCetonViewer); +procedure TCetonClient.StartStream(const aTuner: Integer; const aChannel: Integer; const aAllowDisabledTuners: Boolean; out aViewer: TCetonViewer); var lTuner: TTuner; lReader: TVideoReader; @@ -1015,6 +1037,8 @@ procedure TCetonClient.StartStream(const aTuner: Integer; const aChannel: Intege lCount: Integer; lChannelIndex: Integer; lChannel: TChannelMapItem; + i: Integer; + lTunerIndex: Integer; begin aViewer := TCetonViewer.Invalid; try @@ -1025,12 +1049,46 @@ procedure TCetonClient.StartStream(const aTuner: Integer; const aChannel: Intege aViewer.TunerIndex := aTuner; if aViewer.TunerIndex < 0 then begin + // Check if a tuner is currently active with the channel to share it aViewer.TunerIndex := fTunerList.Find(aChannel); if aViewer.TunerIndex = -1 then - raise ECetonError.Create('All tuners are busy'); + begin + // Find an available enabled tuner + for i := 0 to fTunerList.Count-1 do + begin + lTuner := fTunerList[i]; + if (aAllowDisabledTuners) or ((i < fConfig.Tuners.Count) and (fConfig.Tuners[i].Enabled)) then + begin + aViewer.TunerIndex := i; + Break; + end; + end; + if aViewer.TunerIndex = -1 then + raise ECetonError.Create('All tuners are busy'); + end; + end + else + begin + // Count only enabled tuners in the tuner indexing + aViewer.TunerIndex := -1; + lTunerIndex := 0; + for i := 0 to fTunerList.Count-1 do + begin + lTuner := fTunerList[i]; + if (aAllowDisabledTuners) or ((i < fConfig.Tuners.Count) and (fConfig.Tuners[i].Enabled)) then + begin + if lTunerIndex = aTuner then + begin + aViewer.TunerIndex := i; + Break; + end; + Inc(lTunerIndex); + end; + end; + + if aViewer.TunerIndex = -1 then + raise ECetonError.CreateFmt('Invalid tuner: %d', [aTuner]); end; - if aViewer.TunerIndex >= fTunerList.Count then - raise ECetonError.CreateFmt('Invalid tuner: %d', [aViewer.TunerIndex]); lChannelIndex := fConfig.ChannelMap.IndexOf(aChannel); if lChannelIndex = -1 then @@ -1285,17 +1343,22 @@ procedure TCetonClient.NeedClient; raise ECetonError.Create('Tuner address has not been configured'); end; -function TCetonClient.GetTunerCount: Integer; +function TCetonClient.GetEnabledTunerCount: Integer; +var + i: Integer; begin Lock; try - Result := fTunerList.Count; + Result := 0; + for i := 0 to fConfig.Tuners.Count-1 do + if fConfig.Tuners[i].Enabled then + Inc(Result); finally Unlock; end; end; -procedure TCetonClient.CheckTuner; +function TCetonClient.CheckTuner: Boolean; var lClient: TRESTClient; lTCPClient: TIdTCPClient; @@ -1306,7 +1369,7 @@ procedure TCetonClient.CheckTuner; Lock; try if Assigned(fClient) then - Exit; + Exit(False); lTunerAddress := fConfig.TunerAddress; finally @@ -1322,10 +1385,11 @@ procedure TCetonClient.CheckTuner; Lock; try if Assigned(fClient) then - Exit; + Exit(False); fClient := lClient; fTunerList.Count := lTunerCount; + fConfig.Tuners.Count := Max(fConfig.Tuners.Count, lTunerCount); fModel := lModel; lClient := nil; @@ -1361,6 +1425,8 @@ procedure TCetonClient.CheckTuner; except raise ECetonError.CreateFmt('Unable to reach tuner at %s', [lTunerAddress]); end; + + Result := True; end; function TCetonClient.GetModel: TCetonModel; @@ -1640,7 +1706,7 @@ function TCetonVideoStream.ConverterWrite(const aBuf: PByte; end; constructor TCetonVideoStream.Create(const aClient: TCetonClient; - const aTuner: Integer; const aChannel: Integer; const aRemux: Boolean); + const aTuner: Integer; const aChannel: Integer; const aAllowedDisabledTuners: Boolean; const aRemux: Boolean); var lChannel: TChannelMapItem; begin @@ -1649,7 +1715,7 @@ constructor TCetonVideoStream.Create(const aClient: TCetonClient; fReadBuffer := TRingBuffer.Create; fWriteBuffer := TRingBuffer.Create; - fClient.StartStream(aTuner, aChannel, fViewer); + fClient.StartStream(aTuner, aChannel, aAllowedDisabledTuners, fViewer); fProgramFilter := -1; @@ -1759,10 +1825,12 @@ procedure TChannelMapItem.ApplyConfig(const aItem: TChannelMapItem); constructor TCetonConfig.Create; begin fChannelMap := TChannelMap.Create; + fTuners := TTunerConfigList.Create; end; destructor TCetonConfig.Destroy; begin + fTuners.Free; fChannelMap.Free; inherited; @@ -1783,9 +1851,9 @@ procedure TCetonConfig.AssignTo(Dest: TPersistent; lDest := TCetonConfig(Dest); lDest.fChannelMap.Assign(fChannelMap, TCetonConfigSection.Channels in aExcludeSections); + lDest.fTuners.Assign(fTuners); lDest.fTunerAddress := fTunerAddress; lDest.fListenIP := fListenIP; - lDest.fTunerCount := fTunerCount; end else inherited AssignTo(Dest); @@ -1987,4 +2055,62 @@ class procedure TDiscoveredCetonDevice.UpdateFromDescriptionXML( end; end; +{ TTunerConfigList } + +constructor TTunerConfigList.Create; +begin + fList := TObjectList.Create(True); +end; + +function TTunerConfigList.GetCount: Integer; +begin + Result := fList.Count; +end; + +procedure TTunerConfigList.SetCount(const aValue: Integer); +begin + while fList.Count < aValue do + fList.Add(TTunerConfig.Create); + while fList.Count > aValue do + fList.Delete(fList.Count-1); +end; + +function TTunerConfigList.GetItem(const aIndex: Integer): TTunerConfig; +begin + Result := fList[aIndex]; +end; + +destructor TTunerConfigList.Destroy; +begin + fList.Free; + + inherited; +end; + +procedure TTunerConfigList.Assign(const aList: TTunerConfigList); +var + i: Integer; +begin + Count := aList.Count; + for i := 0 to Count-1 do + Items[i].Assign(aList[i]); +end; + +{ TTunerConfig } + +constructor TTunerConfig.Create; +begin + fEnabled := True; +end; + +procedure TTunerConfig.AssignTo(Dest: TPersistent); +begin + if Dest is TTunerConfig then + begin + TTunerConfig(Dest).fEnabled := fEnabled; + end + else + inherited; +end; + end.