diff --git a/.gitignore b/.gitignore index 7b329f41..609ead4a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ examples/**/example* cmd/wails/wails .DS_Store tmp -node_modules/ \ No newline at end of file +node_modules/ +/runtime/js/runtime/dist \ No newline at end of file diff --git a/app.go b/app.go index 47dc3a50..7e08c84e 100644 --- a/app.go +++ b/app.go @@ -2,6 +2,7 @@ package wails import ( "os" + "runtime" "syscall" "github.com/syossan27/tebata" @@ -43,7 +44,7 @@ func CreateApp(optionalConfig ...*AppConfig) *App { } result := &App{ - logLevel: "info", + logLevel: "debug", renderer: renderer.NewWebView(), ipc: ipc.NewManager(), bindingManager: binding.NewManager(), @@ -102,6 +103,11 @@ func (a *App) start() error { return err } + // Set debug mode + if runtime.GOOS == "windows" && BuildMode == cmd.BuildModeDebug { + a.renderer.EnableDebug() + } + // Start signal handler t := tebata.New(os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) t.Reserve(func() { diff --git a/cmd/cmd-mewn.go b/cmd/cmd-mewn.go index d664b5a5..ddffe8f5 100644 --- a/cmd/cmd-mewn.go +++ b/cmd/cmd-mewn.go @@ -5,7 +5,7 @@ package cmd import "github.com/leaanthony/mewn" func init() { - mewn.AddAsset(".", "../runtime/assets/bridge.js", "1f8b08000000000000ffac597b73e2ba92ff1b3e85eedc3a05392498f7f3cca93586109200e19507776f6585ddd8025b3696c0c04cbefb966c032693ccccdd5a66482ca9d5ddfaa99f8ef4671cbda2e0f31a3ebc864ff1efe8bb3f2121e9f5f515bd265f2ffca7577f45fa2e1604edff48e1d3ab245624f15fec09a69382db058a7f7f7d95c4f7bf5f5f2f5f25ff9fd881507c6c0032896e700fc44f3477b1059eed2ed1dc769107b32b932c0161c761f1a47a81ee01239972c3a63b94cb64ab578e0b0c288fff29c5a53fd182198472046c032e2336ada112fa538ac7e76baa7262534428e1c90bf42d1e9324d47089a603b2670b50793ce611aad95edac3c464b360e9aba08cb9a0da9482cafb1b704dbcab21ba36cdcbe8ca9858e0d6503e9311d31e9b0cef6b28e1b19a2499b68a4dc366bc962f64b34529609d1074e16662d311c71c4e7c559bce895e43dfde7c763063b6ba041e21c0a639c3eaf2346307badd8cbbf7b5782c164bfca5910d524dccd8d72ffe99ae8eda5e85c45ffefe0da22bd5a61c28ff3d624eb8095ffe7e12cb21c07f491ad9fcfdd7ccfd2d06a68d354275e6104ac1fdf2f7bbdd44fb7cab058c613d90ce09d57d1b122801d54236919f89086aca68148096fe84f737c766445c546d4eb6a0d5b9edd4327513e6bc96a97b44e3462d9bc9fc51377c330e9e8564ddb5d754abb9fa0c273397e25fba74519fdb945fcdb145cc5d8d61caae18b8645ed708738479519b427d7f45a806db5ad5ffbc7da6d8e176be395813b8d57219678bf219675be7b0e557d8243aada94039b8a1a2b90c58f5e3795c3031271b38aa5e00ab3eb35d0ddc2b176b64cd6a59b0ea167675426bc53f105e731b6522a7bb526dd3766bff9ccfe7f599bdbd6206d66caf9675b6487c03859c6d7407b1b00eb5b56b2635cc71cd1f4a0ed5eb33cca054b8248f8dfed0cbdcb5755b9665b9379a18ad892ecbb25211e3b52277c5e0c199c96531b1ba6e741f5b13f93ffcb41af2e0a3e7c3587c9bb2d7158f62eef0fbf0898e1559ef88ef7b9a8fe805dd7faaeb7563f074a72c4a0120f9e1686c76e57bd259358d65bb2133ef76f190696f1f4abd61e1a92aedf962d8ec1a4f9362a65dd58b70f3bc994dabcfad4e753b1dababa999c3a67667178b03cf5636d389be37046356bd1db6ae27a32ef44c80a7d5429e18934c43c137f90e275e757f37aee653fb762637b8cb1a9654bcb94e2df6d3dbd27c002575f7dc4a2df4ea73d9ae7adbf5ceec74e685f126f7984fcdfa6eeb99ce2b9a3790ee069d76b3979346a942df7a541e9fefa591daa07332db4e86ab4e63f72019fd5eabe256c6a959b36b0eaa95bb91597ea918fb8533aa6cb22bde342aebe2bc723770dace9c3e3c18ab76e5166cbd972fdfacaa807bb9edd0e878326ed38dc72ad7d991b15ddd15ed598e7b2f247b2d779b05f799bd70aa48b72d329c990575e22a4f06ed2af7c36bb09e61ff3c9b15ab83bbc2933cea33ab44734fd95441698c73b716df0f4a73e6cedaebd950ea5dcfb49c5e7cc996aba9a227b55b37f88edd2c5e14e06545779f2779bec56e4f29bf6cfb8fb7bcb32848ade1beab4de77b359f359c54456d96a0ddb9d7b13b7da9aea7d99c21b34c7e336f34ab4ab69cd547c5beb52ff7d5cd56be1f7468615d190e1b8d86ca48f5e929e7d9fd2a71eef5f9de7931755dcf4f87dab03f512a77e3f2e07eb5ca3f55ef1ac5c64cbb7ed40bd55c75a9794e29b5c253da55945e435ba47abb5ef6a952290e77927c9f6f16e4c18c3d3e16a8ad90aea454f2cbddcbaa9279369bf2cb80bbd8ec93e6de1eca37a6cd9fccca2ac7179b17b3afab7a56ae2c5ab233c52925531a3734799f1b6c32de3a9bed48fb697f773b28b5bc36ec730fb959e5a13370b386e75179cae4ad271726f24b7ff73cd976a5ad53e237322db427d643bb5b1de62af6e356573220ed07b7b79d527367eca659b7bcde0f0786a33e95b7e5cd183f8df677a3760983532e2f5d7bdc32f3934a763d7ac49331d75b9dde5ca980b34d0d0ad7d591e39837ed4aa1b52c5985a1bcaa4ae3fb65bfe16e77b0d6b4a971b369779cecf3f3fc7a979fe637dcebcdccbb3669d2d46daa9adb789edcb8d18d45f986eecd51f6a6b86c14aaf274a3b5956b9d341e56a5ea6afefce0e677a9d48e98d7997eaf30acc0b0cc1c99dd3bd36ab1b7929f8a1ccfb26a61b39c5a256c025ea846d77b196b9dfbc160ecb572fdc742363bed569ff6bcb9785899d99c8a1ba4a4379dc99dd5d40a93ec734f1b6ca785fbcef3a0288dddc243b953e52feab5dbbccb0751ccbc1e2f47eb81a52817d100ec820398d7a81d3e45d78ea921c81a9fa71e3fd77ff39319237ba8e5c0fa9c384cce11f26c3affb30de785c037c726429b2bd800e52cc891613e4b17c13aa4af6010e4af5aba001662b64934c45d4c99835da0fc90ddc2b4956f95ca2d05fd1300fc1fef925f31f3471d5362611f92885228cb9049286017113a1785251cb2a44891f56342161abdfdd712767e71cb5084c73751287cf3759bdbae55736d510726f3a58c06fac5db9b5fa398b65e43c70a361902e917b13151c6023309e5571a617866c21515695f282696559b32db84b469eb49318e25fe50918f380a4bdc3f54944029147245299440bed4582c112960d03f31ce6432993a0a50437eb647e750892c8f32e157647c74c04014027574ba7a9449975db03e1494c954abbf12140a3808fcb52021e7a21e8fc5dee2b1b77afc2d1e9724246bd8e1a0a1b96b5ba2d7d810f0d015e206a64b86f60c5c1dfe11ed1d449fa08c464995311ffe0d76119860a1af48b3d5b50594a755173087960962944c30be332121440bc234032e73ee92d99a4332c1770e242e5142546a92ca984f47e62819d08aad2303800777fd6e32ad3236862d475f91ca583d1e7b436032389162c701aa290631b5e43bf5c4be9ead817f1221f42d388c01588b1ec61f7fff7e9ad0818747638ddd18eb3d6c413221c81217ffcafcbb1e8f89e733d142978b03e48a2f9e218ca8ad012214710350d3b64e30071afada05fe7ae9630c948f770e5c22a25d063d84907d89c2faf7781fdae797116173009a6801b65a9a888d440bb0104b4719078ae38440fcf01ca18f2822f889a825ba31411d2c05b4c1a1ce6f47a8e3025fbb146907a846c0195a3b3e40614c3c81c480af9db01d4d1ecf3eb3b55df4f8625c0f967c9f0ffa3101ad50ea84b3a0bb44098d6c84350601396c538566eff69e1dedc7a6391de944eb71bfd1eef89e133d095246a378ece4519fb35146a3a3f58c38760336d1fe32828a580f268f4dfe4820750662ec1c3ca1e307e28f4d37faeaf7d8f50fa9a2edff4f09dfbf43885ed36a0dee6e0426a8dc764598feb40d4dc4fd28f6b922875709e8abb84e16ce8296086f6264d81e3b47e3849e617bc3776a0630fece8182c8940e7b58217f66daea32e11bbd2ffb8668f0996c8368f0ff295b940711d1e19b1ed872702936d3846eec251c813ccc87ef7b82d5b39ccbf430dffecc52d20ca8e6d39e328d2f5ed63411f298ea1287236e1f825eda5f1d82656f8021c211992326cea621078b6281838b0843dc5d433a8216d6b491cf2b19b0bc44aecf23d051b83bfb594af2f7f89e1d633fcb480bbcc1e7c4625a098219fa1a9e47ac9c258cb3d0c67cff3a1d13f9559cc03aac3858907e7d44fa5d81fe1c25a3c789b1741032fdd813ac9c780738870686a9660a20a96a5b84eae8e4c327f76051abf33728c1dae7e6268aa784727025717fe14ba500968f6d57aca82660b7230ebcc1e647312e1a3efc1d3f352f9baaa6cd846f078a378f0efe1b5b0f05de617337187fb2f38370128d25ef113f017d0a3a3f027dd2f717583723912b308f33c07f2f5affdfa2642cf67118ac9f5ed7262f4e008cdd9db08770e5e0daa1b60836e0ee503e93b1184a6a30c76b93a30d36d77011b8be6260aa03e20661c1fca122b230a128fa263a78491d0d02bf84f25d6e62c08fa6788a6ca18f09a7fb39ac01ae21f92faf003cf404b3913ffe90319b0cef7d507f69b8b603f468b5cac9de7fb9115cd716073f1df61051623148336e3b1dcb028d600e0faeed60dd6ff192a15621c9c72b8eebb7a1cde04a8f0bbf6998b1d8a1d89b63934130f5e6ff7a1301edf2a3aaeafc4f0d07137ce761a1539ff788220189f4135a920788e8d476012d18c25413dd43d8db04e131c63cc255e3d869a635ccf1bf32ff3e720b8a2f93cc5ceceed055b8f91ffe9f2518a08497f05fa69fb25494519a99448564f622480c825fcff6c29ed45d534e2c10394f74c9a05d860b73dbf5fdc205aced900f7eb8d93f41f8d79083fff9de831de77dc24eb7fc9707e93e4d06556e2d9092b8443f78c4a7c12938fd502892082ffe13ef39a875b4bacf58f66c4ee63b91b1b0e39844f5cd2df113ab3a703e931ad2bff976140c3e1378ef1f3bbcc861007a286fe6025ed68f37c3c93cd4871def97fed6fd5efa65cb074c1b848a5efdc86e16b0f31b9860097d451fb20c3988237c09b9d4d017943aecbbf8e1c25fd33df042d2e481ea4795146c9a7ed43e2aa59e943a80ddc41cff54b3779295c3254519bc131e2685da0fdbef6d3ddd12012c9998d025b53d7a7c45236a34e4820a64035a2dfaf6e6e8a9e77551d036cd767e852fe08dd4e0e9743afe69caf377a7d369e1639873b082ea35248c4713e25bfc5d1b968c5affa1133bf4b3812d8a0690f0a3a011de80bf7ad8f971a373f0f5af47ba7af498614f183beb05cff5eb08a967cef94e639fdcb2b5b50969d83ab6cb453d2db6d5ff370000ffffca81c933361f0000") - mewn.AddAsset(".", "../runtime/js/runtime/init.js", "1f8b08000000000000ff548ccd4ec3301084cfec53cc3189680c1c90a04282231247242e488b9b6e89a96347b64b404ddf1dd96d0ff867359a99fd5443601c0f9f049f14cd988ba1a098195c715d149744cd39c8dd0f7552ac72a2f2cb3b47bbcab41a3433abfcdf992f59959b37007aed05d67cf669923cb1097a90c9872d363e6092d5c29aad408f63a4aaabf1221a4f2ef5defde2e6eafa6e310689e212358a5483afd81b9720f15b4234dedde3168d22524d4368f0ec4c32da9a2811a917bc696323c2ce253308a1741e471df480fd66e7ba64bc3ba0d3d6ae74b7a58c3adb85559da31a7bba988c5bfba99d32b4e5f67f614907a2c1af77565af9197d48110f05b2fc0b0000ffffacb36d8089010000") - mewn.AddAsset(".", "./linuxdb.yaml", "1f8b08000000000000ffec584b6fdc3618bce7577ca72d6083766bf7a45bd1b43934690218e9a19786a23e7319f121f0617b8bfef8822b5994ad7d68b55c6c0b644ffb91e20c879c91281142de54c2792bcae085d1ae7803506129a88eff00445574f5bab428913a746d67bcf49e06e99f4b004d1516f0368d88bf07b44e185d3c5fde7770c6ba3e6694a2ba2a60c119ab826aba762083a21fd758c32d55ae80453bb90ef8b9bdbf10807453e28c0d5a0196289b023eade580d0ce5329e151f8257c71a132401b4f38fabeab0c4256049d43ed05955f80ea0abc5d01e554e80d844dcd0933fa5ef0a37813cc7e4adda8a95c2c5809c4bd87a5f78d2baeaf2b2cafb4a9d09960195e31a3ae1dfad0fcf5c3cdd513fc03ebc995d42d81c062011be74a561021beba6d5395a2b4d40a1c6d5cdfb141951425f735b925153e1cb59443a0fd8b2945f988652dfc4d1cf4e3d5f739f8c788e3898432681f52fcda7a5afcb626add5f43941ed89df7d90f24504070d1b6278b13b86837dbfd8baef359522a98e5516cdbf5129e0ddef9fafdf0b1d9e7669bf186b3f91d4865a6b7c12dbd659e47e5a431d26f8b462ff36560c9e26eb328bd43f7ba4b3ea93719995d083fdec9bb2e85cef237c78863bab5894a8507b6a57496d6acb2237c1c1c7bbff465e359a81836395e7d6f4f697047676910f46544964acb288fcc388eaf83bd17127baa7b271a43fc95187f1c98b2739c4bda03ad1e1ed05c7d413d7a615f4f5e56dbb14b3a807e3f7eb1b1c7de633be0619d332d4deb8e4e3b6cee2e49f51fb8f77706e33afcf96aba0fa66ce18619797a0688d277b2f191236358f08e444f61ef161839274bbd7bf7c0c2f382e03074660bcfe3dc4d41464207d0d34a6bec7ca589a92d0d65992f06b82da93819d8fad6f39d8c237a6fabf39fc269bc56f769153cb96c9e1b1cae2ef9f2c5b66b8cfc322ce28ffb7a98632453590bb387292d3a33b675274a3f3dfe113856ed4942f4683c5dcf5bd28fa65ee72fafaf61087cfa44900633245f5576a4d3275d790c5d71f5aac1cd6bed865ede1fbc6965de3f15c3690d9d65954be4b5073e5cd0d69704273589960c1ad9c47f59d8bfb5e538e712329477be4a3681ec3a46c1e02bdf7bda2382c83a8d072ec464e8d203934821d4b1afd8ae9df000000ffff0d235ac80f190000") + mewn.AddAsset(".", "../runtime/assets/bridge.js", "1f8b08000000000000ffac597973e2ba96ff9b54e53be8f5ad2ec825c1ecebed5b630c216481b065e1cdab8cb00fb6125b3696c04077befb94bc804927e9be534337c192ce393afa496793a53f8f8fd0130a3e4fe1c353f8747cf403fdf07b24243d3d3da1a7d4d389fff4140c493fc488a0fe1f297c7a92fc2149fc175c417f4a083c11029f9e24f1fdefa7a7d327c9ff2778c45c6303904974837b20fea2b98b2df06cf705cd6d1779303b33c90b20ec38ecf828a59ea06bc048a6dcb0e906e5b3b9da99e30203ca8f8ffe948e8fa43fd1333308e508d80a5c466c5a476524868e8fe64baa7262534428e1a913f4fdf8282149a8e9124d0764cf9e41e5c747098f50cdf6321e26269b0563df7cda840baa4d29a8bcbf02d7c49b3aa24bd33c3d181a130bdc3a2a64b37ebfc726c3eb3a4a7aac2e49a6ad62d3b019af178ab95c490aa4277dc2909dd874c431879868d5a673a2d7d1f7d74022cc98adbe008f9360d39c61f525d665072a5e8c6faeeba29d48fea59115524dccd8b72ffee2ce764a9f85d45ffefe0da233d5a61c28ff3d624eb8095ffebe17c321d47f491a59fdfdd7ccfd2d01a68d354275e6104ac1fdf2f71b6ea27dcc6a0163580f66e784eafe99123801d54231b1bfc9386eca6814c296f940fa77c76644ec577d4ed6a035b8edd4b30d13e6bc9e6d7844e3463d97cd7e6d18fec10e9ec5dcba6b2fa95677f5194e654fc5bf4cf9a431b7293f9b638b989b3ac3949d3170c9bca111e68883466d0a8ded19a11aaceb35fff3fa9162d1fe7c77b02690abe7b3ce1a15b2cebac161cdcfb049745a578172704345f359b01abbf5b860624e56b053bd08566366bb1ab8672ed6c892d57360352cecea84d64b5f115e721b6563ab3b536dd376eb7fcce7f3c6cc5e9f31036bb657cf396b24be8142ce3ace412cac437de99a290d735cf79b9243f5c60c3328174fc95db33ff4b2571ddd966559ee8d26467ba2cbb2ac54457ba9c837a271ebcce48ae8589c376feeda13f91f7eda4d79f0de73d416df96ecdd8847d117fd469f785b91f5aef8bea5798f5ed0fd535dcf9b83fb2be5b91c0052188ec6e68d7c4dba8b96f1d269caccbb7cbecd76d6b7e5deb0785f93b6fc79d8ba31ee27a56ca7a697e0e261359bd61edaddda7a3a561753338f4dedca2e95069eadaca6137d6b08c1ac76396c9f4f4637d03301ee17cff2c498649b0abe287439f16adbab71ad90de76b2f9c155ceb0a4d2c579fa793bbd2ccf075056370fedf4b35e7ba8d8356fbddc98ddeebc385ee5ef0ae959df6d3fd07955f306d2d5a0db69f5f2d2285dec5b77caddc3b534529b744e66ebc970d16d6e6e25a3df6b57ddea383d6bdd98835af56a64561eabc6f6d9195557b9056f19d565695ebd1a381d674e6f6f8d45a77a09b6de2b542e1635c0bdfc7a68743d1977e8ca63d5f3dcc8582fae4af62ccfbd47923b976f5a45f7813d72aa48976d329c994575e22af706bd51ae87e7603dc0f661362bd50657c57b79d4675699e6ef73e9a2d21ce72f2dbe1d94e7cc9d7596b3a1d43b9f6979bdf498abd4d2254feab42ff015bb787e54805714dd7d9814f81abb3da5f2b8eedf5df2ee73516a0fb737da74be550b39c34957d556193add6b1dbbd3c7da729acb1b32cb1656f366aba6e42a397d54ea5bdb4a5f5dade5eb41971697d5e1b0d96caa8cd4eeeff39eddaf11e75a9f6f9d4753d7f5c274a80dfb13a57a35ae0cae178bc27dedaa596aceb4f33bbd58cbd75e34cf29a717784a6f14a5d7d49ed3bd4d2f775fad96861b49be2eb48af260c6eeee8ad456c88da4540b2f9bc74535fb60b6e4c70177b1d927adad3d942f4c9bdf9bd5459e3faf1ecdbeaeea39b9fadc969d294e2bd9f2b8a9c9dbfc6095f596b95c57da4efb9bcb41b9ed75609bbfcdcfaab7dd819b333c8fca5326af3db938911ffb9b87c9fa465a3b657e21d3626762dd766e6ac37cd5be5beb4a16a4ede0f2b25b6e6d8ccd34e75696dbe1c070d4fbcabab21ae3fbd1f66ad42963702a9517d71eb7cdc2a49a5b8eeef064ccf576b73757aae0acd383e2796de438e645a75a6cbf94ade2505ed4a4f1f54bbfe9ae37b0d4b4a971b1ea749ddcc3c3fc7c53981656dcebcdccab0e69d1f465ba965f799edcbcd08de7ca05dd9aa3dc45e9a559acc9d395d651ce75d2bc5d946b8bf9c3ad5bd8a4d31b629e67fbbde2b00ac30a736476ed4c6ba5de42be2f713ccba9c5d5cbd42a6313f0b36adc788f63ad7b3d188cbd76be7f57cce5a637b5fb2d6f3ddf2ecc5c5ec54d52d65bcee4ca6a69c549eea1a70dd6d3e275f7615092c66ef1b6d2adf147f5dc6d5d15022f669e8f5f46cb81a528277107ec820398d7a91d3ec5c776a121881a1f871e3fda7ff78319235ba8e7c1fa98380ccf31f25ca6f019c3612af0ddb189d0e60c5640390b626418cf3225b0a2f0153482f855cf14c142cc368986b88b2973b00b9447d12d0c5b8576b9d256d01f00e0ff7913fc4ad9af0d4c89857d48624aa11c4326a1805d44e85c649910454911221bbb802c347afdaf17d8f8e92e433119df45a2f0ddd76d6ebb56ddb5453a982a94b31ae827afaf419662da7a1dedf2d954886490d22644520bcc24949f6984e199096754047ea19a3faeda94d926644c5b4ff91d89e45715f9a8a330e3fdaaa2244aa350304aa3240a664e2492b12c06fd8171369bcd3650001df2433e3ac44b847a940dbf22eca30808910d34d07eff51365371c17a7fa66cb656fbd54ce10cd18cbf9ec99fe8a4217e5e8f8f12af8de3a357512b48129235ec70d0d0dcb52d5189ac0878e80c7103d31786b60c5c1dfe755055880242198d522a63c156acb08bc0040b7d439aad2e2da03ca3ba8039b44d10ad5492f18d09495f03419961c065ce5d325b724825f9c681e4294a8ac44d52190b08c91ca50262c13c320078b8f56f7a332a63635873f40da98c09d6570426831831761ca09a6210534bbdd15170f66c0dfcf5f813bf866b32006bf135f9ed1f3ff61d3af07085acb91963bd872d48250559f2e4dfd9ff0859a27130bb50e72486bfe22bc11046d4d600118ab801a8655b31cc03457d25034b3ef5f106cac71b074e11d14e83fa4228708ac2cc78bf39dac73b1393b3039d6821ce5a860856a245a888d1dd443ba25d8fd880e8f98025ae90902a1c9ba8d9044330169107eb3bdc2f5f3117f8d2a5488b413702ced0d2f1010b9d670c34067ce984256c6a8fc5ccd636713844bb118ef9be21a8de04d842bb3df282f0142535b212473570de6169eb2bf886f960913f17db9958e5da10eb11eeacebdb567c3d48198d04883ba3fb5892321ac5cfd588633710152f4ae3f80882a0777f4b3012a01d029a38043250f61d3576153bfae6d7e78df7c9e217089f53bebd8788efda6209ee660426a8dc767deffe61052b9cdfc9e7ca44d711e89bd85f16f68296dcedccc8b03df606973d9286ed0ddf281b42fa3beb0a3c59262c82850e33d3565f92a149040a5c100d3e54c0201afcbf2a20928cc3f9654d133e8aa92e7138e276e4a532c1f0102c7b050c118ec81c313181861c2ce23e07171186b8bb844c5c69ac69235f5a2a107a8a5c5f48a8b7b047f65944f19902d34bb0cf02ca335ee137d4a25f091c0ffa162eca1f3af0f5075e8885277fbf5ae4e765149b51fec08220ea23d3bf11b4c2f91dac2ac1328187f35d443014931f86e7dda663aa990255aada16a13adadbd8fee4b28393e07328c1e0274740e44449253ae7623fc30ba310a2f74f943fa49a80ddae58fa0a9beff9a3b885072c9f798b8c4d55d366c2f602e55b3b03fc1dde28758bb86f82f647acef18fc81b5ff8cfd1ef2bd677807f2bdd6bf42bd157330c1813984fe375debffd19d2512ef7bab46ec7636757280c4d8dd8803120e46b61f2a8d6005ee0615b2598ba1940673bc34395a61730927a16f500c4c7540dc202c1888921c0b138ae217d0c1e5f48197f835a86f020a03be3b9cfbd221323f61909f031c201cd1ff7237c043f7301bf9ed7725b3c9f03a40f79767d97680ee0eb212b3815f7282ebda62f1fb05ef1c4e220119c66da76b59a011cce1d6b51dacfb555d2a522ca4f960c871fddab3156cee7ee4774f6a2211656f736c3208fb5e83df57dfeb9dbe97221dbe6d881dca37b617dafc9bfa50042d11b2c2b3e501223ab55d40cf0c61aa8952212c6642279a601ee1aab1ab33331ae6f8dfd9ffece505999449662e7637e82c64ff57f06e82014a7ac9e03a7d1fdbe2b232cc242aa47227512811327bb617d6a4ee927262810896a25206ed341c98dbae6f2f2e606d83fcbd88b8fd8584af4522cbf4cd0a3b8e4f138735d3f6af10327d9a0af2d77a304ff214fd6c291ffaaf0084a1d025191d850fcc2ad26c7f163f12dab339996f4488c38e6312d53f83c9cf4e5a24fb60de88e135385a61f3a349affdd587bb3a0cd08fe69cb9805f1afb4de2641e6ac5f6db4d7f6fbb4ffde4e75dc14d4245e1be17390b45faa54a3088bea177c54642c45abe8482eae80b4a478c273f9f80a74c0fbc90361591bda798824dd3f7f17bd5d4986a11fa2dccf1e7fabd995e89b62d2ee1270dc23852ff59c2b5ad67dac2dba59213fa426d8fee6e6f44d2875c5081ac40abc72f767696fc738a159449b38d9fc40bb0632976262342d187f1321090c964841162cec10a32e390f4f8e8209ebe1ebc9bf58bafd4817dec0ab0a8a49d85155b227891bbaf45f00a7c8288fd83da26720bdf76848dc355472561e2a014fc49d7ae98fed094f7ef93c389095dd92fb05724681f44a443effc69406340b51d7d743310e9b95725d2d4b2b5a50919583bb6cb45cd20346efc6f000000ffff95a84b5cff1f0000") + mewn.AddAsset(".", "../runtime/js/runtime/init.js", "1f8b08000000000000ff548f4f4b033110c5cf06f21de6b8bbd81df5206811f4287814bc0863ba9dbab1d96449525769fbdd65d2edc1fce331bf372f09365a01c169d02c68565a1de0502a0848444015d545d109e14188b83f70568405a12ce93ad52b09ac25900865bf135d1296293d72d76bcfe0ec679f27961336d10c3c85b8854d8830f16ae1ec96c18c63d2aaea6a7861034f3ef7c1ffc2cdd5f5dd628c9cd867ad1ad40a1bf84abdf519387d734c36f87bb8054102e5df0d3c7b9bad71367182dc33bc19eb12c49dcf76607114d7e368a21960bfd9f92edbe08fd019e756a6db0a46adcea0e4556758c35eab8bc9fa7598da49925b6aff3b965a1de53d4358ef1cb7fc338698133c94a0e55f000000ffff4e896d4f9d010000") + mewn.AddAsset(".", "./linuxdb.yaml", "1f8b08000000000000ffec58cf6fdb3618bd17e8fff09d3c2001932dd949b761dd7a58bb1608bac32e2b457da659f187c01f693cec8f1f68a91213cbb66c5348062ca7f0a3f81e1ff99e498910f2fa55259cb7a20c5e18ed8ad7af002a2c05d59b7f0144557485b66d512275e8baeef8f49206e9fb3680a60a0b78930c8a7ff7689d30baf83660e8e18c759dcc28457555c082335605d5747520496318d858c32d55ae80453bc50efa5b7d78128074d3e28ca5658015caa6808f1b5520b4f3544af82afc0a3ebb5019a08d271c7ddf5506212b82cea1f682cacf407505deae81722af418655373c28c5e0a7e1ef380338154376a321b0b560271ef60e57de38aebeb0acb2b6d2a7426588657cca86b873e347ffd7073f500ffc0667a25752b20b058c0e86cc91a22c417b773b25294965a815bfbd7778c0993a2e4be26b7a4c2fbf3d633459ab0a252945fb1ac85bf89a37ebcfa3ecb0cb62147a612caa07d4812d91626277277f65a699f12b803895c06291fa532298c25f3e2403213135cec36414da548e4c76636f1bf5129e0edef9faedf091d1ef62ec2c5f622cca7b9a1d61a9fa86e0bd9747fdcc01da97c76d57f1b2bd2b367d3cea6f9cf01edb985cab8e64ae87487fb5a36c19b9d85f73de473ab46890ab5a7769dc81e8ad9740f90f0e1eee5645aa349cd1d9bf97ec7defc9200be04b5f7465489dad8cca6f60f23aa1c3f5be7de111fcac691fe6e481dc6231c67ba163e229bed3af88865f21d6e74217d7d79db2ec869ec09c00491c95dea0ccea72823c40cb5372eb1765bc866ee9f51fb0f77f012fcbdb9b7ae83eacb9c31c22e2f41d11a677cf949299b9a4708329be3b718b14149ba8decdf70d207ce8dc5b1a9d8de861e63723072d03e451a215f62652c4dc2d116b285e3d704ee402cf69f72ff47632fe336d97fd1f437f95c7fb3979e5ab64a4c1f9bd92cff9365ab2ca7012ce2bce6f84cd650a6a8067217874e337ff4eba924ddf039ce818144376ad2c7ab644df77eba8afe3979557d7d7b94e94f251a1046e814d55fa83589cfbb4a36abbf6ff1f2b8fd62afdbd397985d5bc8e3c52ed5db16b2c97d9bc09dacf3f40007273487b50916dcda7954dfb968859a728c3b4b39dab34fae1339a6e5f628f0c32f2bc591f9448596633774723cc9d1f1ec7886e14fb8fe0d0000ffff6b19f4edca190000") } diff --git a/cmd/templates/angular-template/frontend/browserslist b/cmd/templates/angular-template/frontend/browserslist index 80848532..34236087 100644 --- a/cmd/templates/angular-template/frontend/browserslist +++ b/cmd/templates/angular-template/frontend/browserslist @@ -9,4 +9,4 @@ last 2 versions Firefox ESR not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file +IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/cmd/templates/angular-template/frontend/src/wailsbridge.js b/cmd/templates/angular-template/frontend/src/wailsbridge.js deleted file mode 100644 index 62c72390..00000000 --- a/cmd/templates/angular-template/frontend/src/wailsbridge.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - Wails Bridge (c) 2019-present Lea Anthony - - This prod version is to get around having to rewrite your code - for production. When doing a release build, this file will be used - instead of the full version. -*/ - -export default { - // The main function - // Passes the main Wails object to the callback if given. - Start: function(callback) { - if (callback) { - window.wails.events.on("wails:ready", callback); - } - } -}; diff --git a/cmd/templates/create-react-app/frontend/src/wailsbridge.js b/cmd/templates/create-react-app/frontend/src/wailsbridge.js deleted file mode 100644 index 20d16b80..00000000 --- a/cmd/templates/create-react-app/frontend/src/wailsbridge.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - Wails Bridge (c) 2019-present Lea Anthony - - This prod version is to get around having to rewrite your code - for production. When doing a release build, this file will be used - instead of the full version. -*/ - -export default { - // The main function - // Passes the main Wails object to the callback if given. - Start: function (callback) { - if (callback) { - window.wails.Events.On("wails:ready", callback); - } - } -}; diff --git a/config.go b/config.go index 57f27461..b603a44e 100644 --- a/config.go +++ b/config.go @@ -94,12 +94,12 @@ func (a *AppConfig) merge(in *AppConfig) error { // Creates the default configuration func newConfig(userConfig *AppConfig) (*AppConfig, error) { result := &AppConfig{ - Width: 800, - Height: 600, - Resizable: true, - Title: "My Wails App", - Colour: "#FFF", // White by default - HTML: mewn.String("./runtime/assets/default.html"), + Width: 800, + Height: 600, + Resizable: true, + Title: "My Wails App", + Colour: "#FFF", // White by default + defaultHTML: mewn.String("./runtime/assets/default.html"), } if userConfig != nil { diff --git a/lib/interfaces/renderer.go b/lib/interfaces/renderer.go index 9d95818e..92eb27cc 100644 --- a/lib/interfaces/renderer.go +++ b/lib/interfaces/renderer.go @@ -3,10 +3,12 @@ package interfaces import ( "github.com/wailsapp/wails/lib/messages" ) + // Renderer is an interface describing a Wails target to render the app to type Renderer interface { Initialise(AppConfig, IPCManager, EventManager) error Run() error + EnableDebug() // Binding NewBinding(bindingName string) error diff --git a/lib/renderer/bridge.go b/lib/renderer/bridge.go index c4455fea..248a8e6c 100644 --- a/lib/renderer/bridge.go +++ b/lib/renderer/bridge.go @@ -48,6 +48,9 @@ type Bridge struct { // Mutex for writing to the socket lock sync.Mutex + + // debug + debug bool } // Initialise the Bridge Renderer @@ -74,6 +77,11 @@ func (h *Bridge) evalJS(js string, mtype messageType) error { return nil } +// EnableDebug enables debug! +func (h *Bridge) EnableDebug() { + h.debug = true +} + func (h *Bridge) injectCSS(css string) { // Minify css to overcome issues in the browser with carriage returns minified, err := htmlmin.Minify([]byte(css), &htmlmin.Options{ @@ -117,7 +125,6 @@ func (h *Bridge) sendMessage(conn *websocket.Conn, msg string) { func (h *Bridge) start(conn *websocket.Conn) { - // set external.invoke h.log.Infof("Connected to frontend.") wailsRuntime := mewn.String("../../runtime/assets/wails.js") diff --git a/lib/renderer/renderer-mewn.go b/lib/renderer/renderer-mewn.go index 7003f25f..5dfdb226 100644 --- a/lib/renderer/renderer-mewn.go +++ b/lib/renderer/renderer-mewn.go @@ -5,6 +5,6 @@ package renderer import "github.com/leaanthony/mewn" func init() { - mewn.AddAsset(".", "../../runtime/assets/wails.js", "1f8b08000000000000ff94577d6f1bb9d1ff2a2be27974644def49e91557ef1eef90731c9c8b8b7d8893f60f5508e8dd91c478456eb9232b82c4ef5eccbe69e597a2058278c5197286f39bf9cd70b4d8d80c8db3dc8afda3f611aa7d48bbc508b8177bb3e038f373e10137de46f41dc3b7d279ac52dae2142da9bd49bc2c92d154b6c2641f42da6eb2b429d345c15db7573a79fc06215d5ca8d1e4b816205e2b2b21ce144a8873757455a2f4620fb1a34f7138dcde7f850ce31c16c6c21fde95e07157abedc16ed6e0f57d01c968229780890f224888bd1a5e9d6d6cb33b672385bb12dc22badbadef5d311e377f637477e88d5d7ed2cbf1f8358bcf75e5fe51171b48d807976f0a6041c8d736b32f5fa06ad5ba6da349e32e9e5cbf06653ac6f1985b05dc0a21ff3ac60e219b9a05ff81a4ccd5a698eaee64c763fa171f2d1d3711965eb5ce651e3402b79ba210741cc49efbd75cf792e5b0d09b02d9d38837b7b041c837b543551d976390ad5838cfeb348a8c8dac8038e75e3ad95f17c5be4f229c87f8ded8bcf64b3a21bafcf21423ab9e67f393dbfed26b1c4f8d5bdf43f282b0cf60f20b25d34ca29048e6dc13485ac53644a577e8e892f14a57b75bdb05aba902da4067948a31091ce24a4d44e0b3931c07cacb0a228a59862c250c50b438ed43da62d2448cbd83fbcd92c9e777c842af736d17ee2595cd51e51fda5b42e805ade2a875e5bdf32fe92c8e3aef35eae2259d3c889638865c63ba3bb7f7a3d8255652b8ee75f670fd2e0159ea5de1749e60484f986b6b6ceeb6317c43f05617b1b18fee81ea22f0bfdddddec44dd699c58e7b21426f52b7b5c459e1964cee0b788422b1720d55a5979060182867644873963771b603d1a615993abc4349d14ab65d5487c2452b8426984351de8a164d0cad0804b66b62eb24bb2dc17efef8fb4bd1dd8513adf786d8e4b9dab205a192e5090c8f1d0c5d056c8a62a4603c6e3f0e070e6a22a4856df487776b5301ef4ff7d235f8e934777badec193b6767151761bb3205f072a6e70d9dfc3c11a497a90af0935983db201f38e9789d619c5deaa288d045eccc9eb108cd1af2c86d308e3ec2bf36506174fd2e89d89916544e2225036a8fcd81bf699b179064d2039564e2a487ca158f90f890a2df11f0945e4cee89548c5ddee835e55cae51274f1287ea558b9069cc56044ee66ce50a886bf028d386b9b23d618447cee2ad364515b3b3baf07bbd1d9dd46a6d39fbd5bb6d053eeed11da6c4f275dd06632b42a5da4ac8fcae4437643b8ab65584da6763f1cf6fde7aaf777cda33e8c9c67809f851dbdcadff4efc5d712b6693f94b04793199fc38bdb878f3971f7efc61727131fdd3078dabd8d77bb908758aad7ba28c2caf736bf4ac998db88d8cad50db8cda020a812befb61139fc6957429f0ed63a8c08b5484759a1ab2ad255a4a3ee402602c795a9a41512285bcfa7927ec7972d8f9cf4886ea489755916bba6ab5821cfa72345293f514a713857531182bc3f2993555726f7333b57f4dfe1309bb7dc4c4eafeb9ba62489cb4db5e27e80e52d19379cc12358ea99f6f5bc9bcde3aa3019b42e6abfdcacc162259a653e1522884076ef4e1cfc4a2628c9bb3a866df4bebb3a237d7666851c4d8e29dd688ea6e1e8e8438f347fe846035d5566690f876120bb268e6a9ae24fbd9371017689ab14cfce9a0c04d5cb66384fbb6d9e7a3f88ffaa7582f482e61e9a3981e6d2d0f76ad106a94e8063a4429bdb043fd85ced836cbbf9b535f81239de0421db4d75e1aae18fc3611fe4b3236be8afd4fe06b6bf3664923c9f4666f3387336d3c86d5c958541ce6226eacf064a09eaf464224b6cc3f8f3b41f96bc9aa4fea74e703e4dfd999a36569a719cf68dbe7227c400ffb68858e784932c32554415a5a3475d983cfaaa1f75957953626472b06816067ccc844861e6e644fe333757fb5057d7cccdebcc330ae3d2955cb456cd7fb46afe37ab66ae9ed018aac9f089d265565f29759a1ce14f7b1ab612887efb89eed87b4e580195a50c59be203d52469010b808b2e395e768a756e590b91c3e7fbcbe74ebd259b004bc87b2d019f0efff599d7dbf948c89e3d26c727ea1cf17f3fd9b40a2ffffbf310581ca18554d0ca5f6553dd834558bdde5d9b56d42495a51a9ab0a72ea9bddf894447dfc316ee71bc9e2e8433bea444cf4a929d2867b330e4d9f6f10848666bcc2b83bd5e4d2a9b24bb7b6f71bc5baa044dff556bd64dfd5987b589a0a211f8d46acb774d24ccdd0aa11212b40fb6e4870f14977173287021022f2426273c22f2e6e5a3e6f1744422b75efe71813cd8a206f1c9ac52e79d68a88b28f8c0635b9b7642b645378f552cb6dc3caa375f2c3a8591d1214f59831840e07d02df8296ce45854814542ced6eec5d115f588883a44a46ace0eae6f66dc88f1183afef0722a42dd8f2004f936cfefea927a72c3e652b9cbeaf2681f7a5705d02fce9a2a64228518e11b2a2b7bcd7b97ef8860c1e6972b53e4941d381edfd6a3d1b5a5785fdeddbdc07aafdac25d01940354886f11bdb9df207046d4cf2423fbdf6755c584c4b8d6bd5b01e02fc31f7156559f6a3f133cf1ed894dd2b97179f3543e0a57a0f3c3a1ffb9046c9dab7edd7dd2f538c81929319a7fc48985e6d606939b202fd5fe77b74cbc6ca7b2c4c91ab62ad9dfda27f15fb58fbf5bfb6153a0290b4856f26a6d30b995bf81f6780ffa14b3e3a3880694f48e101e30525d1ed716c13feaa27e10122f799aacfbd5813acd1ea1f6e06df660ddb6807c0927a8512d9391c108b6e8472f7ddc146d2c7ddb68d5b93da8772bd977c45d7410a7f9e94b7235184f6ec890e5223cf0616f959742ded273c91455424f3dc899087391fe3b0000ffff484a6fe3a9120000") - mewn.AddAsset(".", "../../runtime/assets/wails.css", "1f8b08000000000000ff7cf8c712ef3e932486eefb29fe7735379a3d4defbe890989de7bcf1d7ff4de5bbdbce29c967a292e104015322b0bb56001e0bffff36ffffce3cd63f94fbeefff54db3cfed31cc7b2ff0b04eb763ffeb36e8fe6fcfd673e8f60f62b876cef3390cee9b2c848a8406114c62b84cc7002fb95485962349457d81f4a239bde7f8e269bfafdfff76fff0efedbbf81fffedfc4d53c1dfb7fd6f35c0fe55fe67d29f3762c27d09d7ff331ff1f7b3994f9d1ced37f56d9d80eeffffe2ffbbf5008fa0f0c82fe0387a0ff2021e8bf09effbfecfbfa4ebd96e5b39fc253de679d8c1bbfcfdf1fccfba9cca2d3be6ed9f7f07ffedfffc6baab2bcfce7fffab77ffef97f567f22fdeb9ffff15fb1fec7fffa7f1dfbf10ee5bffe99e66dcc86ffb6de655b37c7bffe4121e88f6ddff27f9ddbf0ff2fb223fb57b62c439b677f1200ff6bf35c55ff2b6fb26d2f8fff7d1ed5ffa4fed72fdb4b02fb8f02a225b76658e6cf277937c31a7fa74775338cc3fc7f7cace40eaef967b2fe5dde7fc63cf5e200150ac10d12866164e18f71f8c36325b1d484890bb376f067ebf067283686611c7c9a63fb79e4000e398661d4f70fc8ff03d25ed4b3560ca27dfd531886d9a83faebf7889abcdf56d12046e72866138f86f02f61f25446df16dcd76c5e4d40cc318d81f97f007cf72823f6b3792de2902310c03f57f8cfb9f5063e81f1c30a588f8fde1e38f3f50e60f88e1fee6c74e3f7918ff64f287cf177786515e2adc0426939a21891c8611f7bffa8c3ffaf8c444b09bfceb73182642ff1eda5f5295a10ef607cfbfd8c51886fdfd11c14cf31fea758a86c8479e2b41048611b13fc560df3ffa8afa77f388f58b44ec8fbe98aeff9b4f611485c98a3389e08161d80af85b893ff9d992e5bf1e10b3578e3a0c23c97f0f81fa833ac134d2232097d5e10f5f42fe15fda794ec5cd5b65cc0681aa923c3b0fddffa32c9df03ce453a86fe46fd5b5ae6e391f6fb5b7a5ea058e1fc6b346d4c31710c69501b09662e615906ab6cb0b4601ed0da905b964ce3086cc832eecc340c3357bd50a73a40dd95afed2a6630d6d3b70a14a0de2d79b62a7d554310b613a21797bd3285917a154e8a102bedecd5107e1fe7805a7e1949176e1002d8a196045d68ba297a377847696d09582c75ea743f7f52e20dd60b29db838d9308896dc78548e213c24aaf74b123f107c62670026b519d953dff939bdc65685a90b9ea0f629e55bfaf8c554f567f8b766291a6bb8e06311e8c7199d420a710ddd170289c125bb4ef16ed3264e6f21c169a7c4ded40c1ac43ab66aa8e8670fd241d73d23350cb4062aaeba1b6706ebd885dd07bd8381b20b42d24787d3f555598ac01d1d8b62d10ad4e90b6ad924a296af2612d13cf7d5103a4b2e2b26c0e1076ecfeedaa63040a1425e674f048008c4d2b7cd836d572a65b73e00703d40159d4e1f128be35711511a2bbed0f9a26c2a6d2305980c32bfa7ad0039536733bbf2dce366648f31ea112670807689dfda4a08eed6006e8b6fe390fd6e3fa8579883986c5668ef0c2b5b227094807ba78dfe884d8992e1fadd07604a99d6dce1a66b18acc5440d4cceb7aa53b5f203a24ea6ffa8523d194c65ab8a359d6835cb82e181a45bcc568f9a0b0b43d34ba5c2512b0a7c2d38ec4d536cad28948d78a5533dec75c238b50da577bfa58ec1b0b8f9d8b9108d79efb097349095b75a0c62c40df8bcd86190704ed9299935065d53adea186cd511060d5e281b27b0ad78c20a078d4a9fed3bb4b8a9393dc52fb70bda8bb69673898836e41a2449dc3597ea139d49d1a2ec9558009a7c606701fdf4fb53e271912069bd9ca64a5ec2aeefc15e1151b304e1ec3840b1336c424ed9622b8e934b48e40e64789dd2d1f9b2c150363663d73ac8c413a3c3c330a5c8be8b5b32dc0da19a75e55c6a6d76ae50786e4e6434d6e95c64371ba1925bebdcffbc1caaeafb1ee8b95659d1046f8b9de8ce4f806a5d3ea3bd22e7734484d371ad5df1192c23fd99a488f3a21c146ba263a87d846003bcb72b0e69ffece49a3ede4e5e7e171176dea2c058baebe48eab10b0d6e8d013c3b8d547cee44940e9fcd9de3e94ff72e7048a32d92fb4bfbaa45af4ed202297292e7b6587a4edb651f338b5a00f9e05d874f72650938652cfa694fd01d51b6171a19b68bec9cf089220855dcd6da0be62ac7c6919de299a1b52477fee6077a3566bcd031f2c754bf5b4e1d3e5a183daa25a740b8a7de21ce058c5c4d3de4dc187e606ca9673a8a6d63a6309b95e2506d6363b6cad65bc4427fcf136bff3946925946ec197364193bf5859a0c89151b05484f4327881a65bc17b48bd472e731eec93e166e26ba8b0239d94dc9175a18367230c0fb3d1a15db919b80acb805e12592cd0c43cc8d67f60023498cc112354fa047f1aa5dc223ac87a86d34cfb9490295706413ab4bc6e588d6f4457b12d60761b19ed91138014c07539ccdd3d4392bf73b303a836f2b7f4ee6edf16a7f14343457218c8548ec25e485af689675e947ee0534807a4d0fe0f8c1c9943500d301a454ec65712c083282ed62b8e533e8ba8e08c407f1632deb381883bb28a620b9093bf92b73a9944b56016d5898cf7c2148d617a91b401d1338931131286fba6330657024f24cf96b614e07b8ea2180ea800919c4a2ea42da71c2921ef865a5c297d51a3d1abc4c164c36d54d16a45b928b8dbc0732a268ac5c1901564c0bd088fcf95402496a6ac7191c6e95ac7757932399d8a623b89331726890dc51a2346ac99d533ad2f161b28388283860d6bddd879635c5c1670ce6724800ef7de5e497db344d662e0d5bf43ea1f2b0fbd8e1022ff6416f3ee52f609e189a13c13652e074ec654cea688914bf059e676c2489489247ec233e331c697263624af0014550ad4f4ae9632bbef4004f638418a87f1048bbfc9dca35039089c28e2f74ea7ea7e5d2534f233cadc3e0f9cb358b3cf162ca6ab3dabf0aeacb12cd9cab97bb5a422892472f19bb1b02d5edad963b4e2634bd421241bf9429a4f05b86319446c28e8cd8ab9435deb191c7f9e5146ecec81739665316660e693f7d31d9d17e56d1cb826b44fd5f808723b1fd58a8dbc77b36c15d26271cacc12a26cd83c6a0993a4f26a5c7c2e941aea329e241e2739d268a29e914f86da77a93278e65b957195945d75b421480499ec09f1efd6c32b994ccf6a2139195a44687c5cdbeeea3affdaae510e16da44f50be3c71e01d105a57978c13a4f9ba1fa3a7b1ed81afbd1f83f64eef5af8dd259963c39f4e5346fccaaaf77ace68800aa1aaf03e2f2c087183d2ea6fdbb2f52de65320e2c2becf4f4b2fafe4f20eff7a0938061334cd71df4f484088762fa3b60a5d90a10ab315acf36632a0aab8fb123c24fe0a8a8921c7b727993fbc6f53b5f97b4fc8c31a8d014ffceb5283116c6e447cddaf6cddd47fb905e7163b58c140ddf1a8493cd8cde9a71961453f065dff9d602bf86afc6ce971f7e9b2c10a3f4c867d6e000d814995c058d61b941ce4d483241ab68b8cb5c6f68f750a85fa1e204125a08a52be9c3ecf681fab781ef155ec13275f77f48404e594e4e34d23ed4e89fd5649ff3823ed1ac9783e9e499badf60afc65d56e0bfb075eb5e485530a177a34217aa2c67ae89312dcad73c2ed8cbc7ea5c3515278aee4de32b645a41a252fb271348e9b14a24637b3f0fae1de94524bd4c6f4c6011fbc46d87be9951f49b072f75689bd3403d0b78703f659e3f26a9c3af03406b0259dae82d368fa55511b164bf03bdf9687b3dd8727dfa6822092cfdc9f3d599e959321a573b68c66407e4cd32feba02ab4ae69a0d13c23367a56c9f54410697ad3ac527fb63bc31a74c62f0ca72fda0d127ae30bbdbc31c55aa91d61378b215be47ed0cc25ae2f5684ed67ac72dcfdcadd6a28b44fe20a2dd402afd17c4dc7e3862aaa82a92e9ecab3bdb44dab226726ec1f56ed96b349b5067fc63acdfdc29dcf2922cf499a24e98f4c1c219d56c8a047099736c643fbe28087cb7d1c8824cbf418ee1599240153b9a16fd32d30603b4b1c6482f94e0bbeef6620090d9b18f2a690bd804463d7029826d4dcfd6072a27577c679ef1b2fe477d3ea28545fd9f1457ff86a16836f5b24623d5299ac7c12f05ffcd98deae9c421db55cd3ea848cb393a455aa43301a2e9aa2e251491a29b759765e6e23886153105a75753c0e632dbd06ef7f98e3ccff34d3c4ba9599a8b64b9c9787ab21b49c6870fce5a4a8c601e19c1afb5c0cf217f6db6835ac3530e48f998974b39bccbbb419deb9a86b57f2a36ad4fbe041f7d5bc660be51cc869a7c18775982b06312f14112b1432249c5136dc66d30334f48a9fe69bde10bb7a13037cb3f3566cfd5adb1098f386b7d75277891a7c2446054d409580ba96c84c6edcc46679b6cde3ed1c69eccc028bc703379c4dcd99f7e3f41d83a913226617bc9ad13a764f4de48745c67eea9d69db2be35e7718adef0e5db389c079472235d9fdada53c8c544dd095cd6eb45cb0906d60fc4ea0ee6261e25735ef475a2a91d0401de77b42544d8e4666b21cc815ad1987af6183e8c2835a428253440e5b63b9000a909bc415007bf0bc0c0860476597db0bc9af8faae30b97cc8bdd2f9e74e665977a89d6c00804e36582abc426558c96c19a97c54c5c0c4a25933a64e24714890a2c62d7dc4cab8836926109ac4155d231654cf1b1629ecf1d20945350ac2d00f613e808e9f0b17364af1ce6b76026c7cf97de81ab2ffa2ef2059289fd2a7884d34b7fd97be6498a2408567668b73209dbf5ba39d09b54b4ebb159e3693e89938a677ff70ef49aef887ef4f36c32b5d9e08c90218911c08999e283974248ed3c0336a016dbde4109cdafee0d1429a103ffee6c46395cce0487dcba3390b4ffcf0a85ede2f7d23df1c3e8c1babcef847d30bf433d1fc91f94da32cbf9981fc92b4e544a3702623742170ecce431d3cacde0880ca1a29f326e5da0d44031618833135425bffbe853804fb63988c6173465298d4614746ca99cc615746da991fc37e8c2630e5cd7e8c9c3325c3e28c3cff59538c8c3135c3f58c1630b9c3568c183085c30aac2bfcbd5fc6a144fac3c10a2664f2b7c53e665d5bc51cecf8e83cd3d9b0ce24c009dca6fc29e24eb398a8e6b6a8c0ca10c7ba0c9a6dcf58cf99ab8c77d2885043391dd6089db9b59a0259dff9e514911ad0a5f5d98212d1650740def7865eb03b848001ae1c3f83a1097f2330c43814438ec667a48d0506404c6797cb1df86365ac80febdbd2d051059872bb480a40b32ab048077457d7b72f0be4f9b0ec1957dc35ad92f0f4e9e7c26f3dc771b98f5108b94dbd0bc643995d326520fdc720847367dd72317fabdbcf1c8f8ebbb4c801c07ab6e00ccc921850a8187f3fab209c8a8b62fd83afe9dc46a2186fe917f18b28bc5bed973a218eb970832629851e9dc255f53a3686aa86acc3befca48b25e02c74abecccc385e7c2ab8ba0c10d4deb33daad75d5db305d2b3c8f1ad31884fdaa0ad1ee62fa28afb6a52d910d1eb1974ebea94e698132152c8a41d192e70397788f1a6d9eccbbb255cd4c90fe282da8a9f0e050a4ef74f4470a8810c61be13234e5e0084fede175bc9709bac1652d11fb1acaba92c5f7594df46ca0c8e951c65b20925fd3ef002bc59266cee3d4da9b658c1244c7403e72d5e5beda4c48f7855da02f770feaf2739876141906278b4cbbe18922bd60fe98bcfb5e2f4d0f2d95f2ffb9dc7e808acf6eec2ee39432804c9aa882ee3f61c41b3bde6abf5cad53362d5aca37fe31db1ba5833aea373f34a27f1c502873f09546da1df847e2341002689822001921faa7e27361a40999700b9e0f06be1e4f2c93c9d9fb3e05b9c196fac7242dcb08bba09f0da2c11a9692589247b10165292a1da37f6e38b1e9e7245b06f50b5b751f4c114c6490b8e6ded368795c08aaf43f300b57ef570803f6e223c7d91d9f1ab379b53776c1b98f067860d4751a1b00751a037fe7a7ac733d16138f79f98ad2a3dce709b735b18a7011724fe04ec0b0e7bbac29fc1632bc82fbfb2c1c97cd4c3797fc13ed5ee62f10a4ff4b7a07d845879a984562232dd4ac31932e1404461c0f984495fbd672277ae5c13b6ba77b126b48da70bcf3009ce1e38aa320fb3cafa422e5b87abe80aa1151e16dbecef5815257005f0727c9e0e04a86e60223da47ac49b94f1abf5f69a6d8b5ac82c28c5e735d2eb68a6a0f11abd2d36befdd27a5f0ece11e6c29a0355d74c7434e91606c31a1bc1c3ba891732d289c24b7ccb3e3b55c27d93290a5fdcf2867357ddd673ab364e0cd2be35685cb74e4bf4f087b56d973279486a8bbae2dfcccdda80c079cd3471d1ccd4e04572a406be136b6d468ef5539d661f93a34fdd2722e8f483b89ce7793aed5499eb6855004040f443e1e3217b5d376004007848d51fefba920d951688614078b955f03eb8e55bebfeec4f381c4e475069e278cfc56a44e08670ea05cb899bc09a94af99a4c47ca135b09ec6f101085f26178bbd602b94aacbd4ed273f0ddfe2b0f68e834c5ba4a24f9b000554fa6ddd3cbae1a9cdc1ad8ea18ea95e098d410eaf12bd6a2b50c3b4fdd7da10b1a57340ebc8a1035352a05df503715a8e0b1620279be2c9acf709944e07c91a8849f67edbaf15e466610ee98250d73a9ef6cbbccd30418aef6599b761a7d99b6c6b650d7090bc14b84880069df034678a3047f05e71732011fb1dbbce6906e1125f1136e79383c77e8c9845b4b5a4d04bf453e06095624f4e17c40b73d8d9628119f8eb518edce00ee69126e9c6294cd37a8298b17a5cabab35718dcfa42b636dc7c06c42ccf37c695aa03ef4978e3b061b24321342cc31ef61f4c11fcbd6ecdd84a83247e2e6e92d008eaa07692fb471bffe6b8babd277a04a508eecfb10c33e25412bc24b3a0d4e0e0019c21825bb9326e96072dbf9fa8e07f9a8cd5ca9f118c11388fcb83d0250816b74bd4963420f0b7ea86b3b48f8b4d09f01ce4027dd14656855fb2d53273f2d0dfaf18fa2e8f40214ac750f108b8f658fbdc4033c2ae67e713b5ef6160550305f22b1314a280a743245fd235275545fa1b0b55004b4439cdda3d74d2798b4e1afb3c56c288b5b1d247ac7e790b4ebd813c910696284d248db5e2cd261fa3c51e7566939d583feb4733f715fadabec717049442974ff74793adf05c74e3e395d748dd6219d6c0c7e3d295d4dd606b8bc94d1afeb37fbeed3f7d422c41481fdaa6e02fb0fca918f98727bf203df2f0d4946e922b223aa2f4837bfd41b03a9dd4101e9d3d7a539e44edf1ee090db23ccf7cafe9ed487225bc737c883c21d4bf3223ff7f614607912b51134b60346604a978b022c1919dba590bab3e2881cc2374f06ea4972576c6c921731630b26acb8af8c39cdab0f689118cb4946e5881c2168426f0f7bb1633df10c9cc38d6ef73d49a44ecead4ad7295e57ee7527e9f7229913087bd22d5635200b437b2bb458fe08b1bfc78b37cd61ba40c1f7d1a852d2191720898d2a5d427a0d032351e7b83195d58354cb79cbebc3cd469b227652cd67cdf59e4e45b0111783c04ef7384c302e0ef4870bdf89f4f2714d5b57133afa010d5101d7ef325e73fba104757e3f29bc3e6deef6388ef5e354647e59a425c1815fe24e5fa60330165423aa1f54376414bef4a00c8232b15ee4f514e5a10f360faa6c3f51ba8da04877caa2802ea51d2565031ed772b4a685c0cc6fbc74556e8505d07e9a9231f760a7682aabbfc65d3cf6641b106a87cc127283290529d514247a2464c2311ecdf2842c732c8eda86be2443c12dae90452e1fb63d74b7df3af7728950b8f276183aa11e76516ef7e9922f2e0c38a6b2fbb3747ddbfc534aa90f4cf8af025eeb9d8ecfd961aaa6d60a01daebca6c0be2d10b2102e4546ed005c0ab06bb2f8f891f5adc4e40a5eeda543b8954b07e050ccd51fde5813f6ed81c6746c0e46b45bea84175948b15ba1abf40ea6f7b591c37f0ab5b0cd2b3f8d79e10c82eb6bb42dfb62b64246650f43bf989eb60f6a25b2c77df3975194a15b84055669e270f21d92ec11f23b23ff361364e3d06cca06b3cb03974a041930b2734e778c73cfe0985d0846d0836fc656cbf763e5899307735db840017786e0199c691d319ba3da757f40e70207561a9144a10c2432c73914f7b4557ea39ac2b96f906d061e5dd545142719015fd2301887efb65160eab42ceff5a783f8e26467367ca0ff755ec3d48827984a345e276b59e35bfd73991e7302f7003a91ed9c6d7b524b0d7319d0e4f916e24d1ab3147ee954e3fb959b0fc63e8e40d541f4b3706407df0a75f418389dd38c73ea14f5fa64e26a7a9c898e2bcfb232132d35f4f2d9f641fefc7329ca4ad67e853ee32ed1533e0e2cc1c0bd272b0687ce96e494799687b7ad4e119a4011407ece200a203b3482a2ec6db72a9089ddd0d1482c060444857302526894233d22effe5d304f241e79e7c85d615e2bfc5c9202567bb18f2ac6f8530a1fbc9c1a19821f7834453565d81262360d93a6c3cd218384ee4ca5438c3161d9f43116487a4ba258ca3eecbd41486bbd299bf47d79749e5b4ea2ebf91e3c3899eee3bb17101a1c22c634f54119a055d05383e4d8c730a4de7d45c9f93ee3a961e0465b4950b6b98a12295cfdca91e1aebc0d5bdc03c8e9fba06f4470ac2c2eb3d5d8432d27ab33b02bb0140ec6990da25144213703f43773f51772b0e1c6ce696f1dbe2b0ec0ca057f0e04b48847a3c8be108c0ed3b8526cdcab502c0d156b8939a8606d272ecb8ae0f5db369ac5d9c6716da296445c6708479ae5dea154dc61b5621d1631e678bb8893b7bb1d1a9eca7b454a92791cb81598805b5e01c51d244ddbddbe7d3a8c1ade5e8c9b1372c4ab4c4c0e1dbf00d904e807f8297439346722984b5b1df9c77e4ceeb083b758dd74c2a327ecda95ab08d9e6ed855a0a1de569f0d75a8b56a7092ea39a364c29dba11386106178e80ee73e9eed84ffdf1fdb9d5e1f90e17c6c6df089dfb65ff034f385824de52f5f0437d10c0e569821c8ca5240274c85b0495add439dd1501a114af36e318d0595626141fc65bcfc2fe8c215224e7259ad45f67087273b76390a02716b9736ec8541981b2f94108f453f59ffd7de422ecac7b0322e1667093c37b1ea82588758eb54c0d4639b82c944ed558347eadb50657c38f6466958b9a847df8ea454f58f76ffcf1fcc40d2efbf7016f6293da9919d1515c10086d6bbb8eb2b653d41579597e44a04d4a774d4ffd19eb13bd5190b5c00a0164158d687e02965635d52f0394726644b80b27b9cd6f9053b2f10bf045798ba004b15c51561c7e74322b37c2fe5247c8b8775823a1687772e29540ea7992e04961e2d688e08b35d5330faffa09dd1a7dadf48ac74b4ca4f5b1250e4fb09a8cab7977a4086eadcb4f5ca7171abb214c87ae0e0e9717f6c15436cbfa13390b2e8d711472a3af710d2e66adf4992c31c8093b2736ad46d2c790d66f90aef6d6d73c3d78f674a5260537e97b5249992a34107eed19de9c8cf4240980f866a25da6d0dd99b7dfd78480f6ef279649e3ff02c2b9e1085195c23f5047053574e7c4abc8a28e58f2768d83343a0cd65b8b247867aff10d25e2e4a2bb1adb4c4cbee5b7792c7fe7f86e47f42bea3c9e2afee28e93cc455010a170dcc88752c7abfb4090c127f036e7ce47283c3ceaa1f3a93788cd22c7449284af23f66654ac754b3dfb7aa03efc2c4f7c67ce876e36588e022884ca1df13008cfeed1e1a3789e572abdfb1626646837ae30ab0fec73188b838e28fc066e2a2171b5a0285df8f474b39b3dc6bc966f01d2b4e64e637164e0270a5aa97f88d43c118a5e091afa4c9f472198de3baa20dd4ff4e82bb2e5be47ce51b67f0fe7c6bd7f69bd25a464005ef8b99c7085d31950859470752310520002a2028296567a69200f72015bfc6cc6d67eaf5b0713b7ca0895240e23f3759a087c236b63758fd5a1ca254710658b81e139e3d4a57e3c54d356ca6109268ce9d1766f782321e5868f567397c44b0019bc615fbc3b0c8fb3309fe836c34b306b2fdbf36487553d578a5090492ffa513a2326735303af5da9dd5a98e92e0f5fbe2250062b9a177ebbe5e1fb38fb981e849c64f0c2b70e69e17a2f419040a5e4c502bf48a014d28c17760ce6f5b8be987d891890d09b0e7f46b77d638e6e130aab16299e340ca3f645f6d018916faee0fa1321ebb25234edc8616a6d511394e354dd18062a62b1a62e595e919d04d1afa96fea87e7680e30ddfd60bb06362cc5543710b7dfebb666f3635368cafb2f14c222532e4de0d0b175dd8774f8d94744cc5afb5fddfa0f637e86580aaa91f2afdbdf59924fda61c9b182e913014a51131b846a8ba25158a79ff86e8b1d922883c0a9159b959a8a36285f511ad327003965a39b14bcfb1a8f0d9e58b656e57a53a274c2b2df43facdd174e97108eddb46e0bd32d1340020559951f07e20097f25f3a29ff342612b95cd307ae706e7af6667cc380f38a2d8ad6625cd1afd644f24e64db518dff42555db236c9a7e927e265f93a331445f1c85caf4179abf87a96c3356117250ac94ad67316e73993745d118cac12bd25fc649582e8db5b48aec77d5f7ef5625d34db6be79072f6687d93582f17c385e60566b68d3048c75b77b0eb0eb8890c4dca11e8bd9a3193be17dbc5d97f064da3e42c75f47722cd285a04e029ec8bfe58323f574a071cfd0b7d9af2007ecaa2d35e467709b1a04b4cd0733120d12ce4105c4830fe69c4740e9a8d3455469a9e52577636c4fbb49abe43d16e3cf16cf1d3c894ff02dfec9c1b68362adf9d0e2f3d8dd5b4d2fe2fb288b63b0f10921a64448a34cb8d79797cff0c00a1b2fbb88999cfd6d17c756a9910d2da737e61457efb573a31ad5af3335754c41b0886874ca4a6804c730b6c9cf69d6cd479f45da2cedbda9206276f134d690c2e29b6d8b68f565cecfd5124e8222c0d12e3af829cca6e891ea9d1222485f248d7e9284c26d32d12551843830c7dd47efd665fbf279c6234a2ef0435217dd4c597a02eb4994250863663870d59835902943fd768ada2991a5cb517b9206b5b1ba504fd925e7b56d2dce53e81d2533d6caa53bdada9ae497babe39c96ded9dc899e149fc5de1484fd074d23adeabcb6969672f97da0a1d0a590499e99c6a1cea55cff03ba87b09113d1ec4c5210fd24cafa12473bdb5809ad918abe2a086dc599c3043ba44dda455df6caad8200cffbed435819bb73844df08f90df1e88ac9373ecf01e6ca5f7797c8ef250b064c5da997480a355cfb4d5430772b6537726f8944db6f7a02f9e2137043d4c2fffc2438e0231d4009ae6a7cb7785cd08c3f11b7a7577f23dc5d5521506efc731063e0399b0fd9cdb0524fa1f6219b96681ac921ff008371c2c59e3a7d9444faeec8c078d2e90fd7b8b89ae04f428b262ca501f26c5fbcbe4faf14268a776fe22dbfd88b9f5be11bd5ab55bf4028ff80765cf2e2b16e88b486b47ab6920e09a864c8ad26a89b28d557a3b55ccb3686cc884fda31fce51adc2bbcb58a32bf686602e5c79e60a2dab9bd31f84e54df995f25d7100066dbd450ac13d46967b4dffc3efb8a1bc3cf84634ffdad3b3a3039f64c3e2cf98eac7a76ea9848e78bce0384f5a2fb2e9e239ad3639656f7866bc08a33a4212e3a59e64c2166bb5bbfa9f0af03b269f61cc9e3cccae8f78075dbfab986e881ea5a3490b08addf16a126c634340ed9ae5b96c7af8f0a3d210a0bc6cf04c8b0e482f6b64ce5efc392b9e1ee0be84f1e107034e15976ea1b617e31b88616523870782e7a97757c6a8a93f2e1631e1ac181949f919ed9973523accba8dd26d9bcbc59cece7097a20ec5f88398e6a43fb8d013f23d16a9699b958faea8895eef7e22d5670aab95617074d38515b837723ac7ef20c54641dba3a88f8a68eb3e00fed851449a85a2b263de324f98e17066d1aac7df3c117f4f3eb025b2d858835bc107b8bca98f2adb2c4fae0971c80bfa6ab8c74d3fdc5d979e756655f6438684c86911be5bebb7beb137e6cf38a0b497443e836256fe31b6eabe2ca8d7a2b144647b9b6b5336b5a577f2dd647bdda96f161d96f9dcc7698cad0979e908e836ed57ae70f1a5ffa3062641c5424cb68b0d0bd810c7c042afda377f35cc502e19d7521494f51494aabf64789715a4ab18548a0bc751d64dee0921eaf495f840783ecb444da9f0b6ed066e9bbcf260f11ff05a0215fdd81f5aa3069a3d5c933619285b82b1375b5545adef897026aa333d0e57cb4938fa6dcd5d5282edf0fc4a64260019ded1242a7919f7d320f8673feeb31349e5accf11446b6b3f99cc05ca11b8ad0f5c0663abbd188850c3f745f958c3b77fbebf22760dc3f4e3e3ba20c19a6119f4494422cdc61b65cbe95a56913de694d9645c398eb2265c7d08ea231e5d9fb5200bba7aed2552c095419fc4a8bed99229032eda98fd373a28d2f4c2f99528bcd3e1f300687cefce8c3664e3ffac1e48f5a3b64ac7e93f0ede7c67444db772261b5f80815e7820ae662d97661230431e8fcab3952dad40247447da01fc42983b822cd5520174c40070ac9e23f137aeb5934f446bb037de9bf05c89c45f0268abbec383740814438c8d5a8325660ba3ae8a248cc2906a82b6503bfa255ca3fcb4d7096c72610166c239fb22bb595f6f05c418c5f120c24f4b620b5af79a345eff8a416923472818e51532249fb6b64525b61d7ab2142ebc133b071401ca862f44232542f160ac4cd799524d906bbfd6baf2a2816584bd82e779d2a579d60607e311b1b781918acabbcf52b9eaca6df299dca2628a3b6dbd05ceb7a5f0e70b286cc40c280a5f71124d87cacdc5aa26ad79e3c16769d4a13e2dd625bc71caea54d3d748d5c5d1365542cac1f1b0d554dc38570582df4a726ce14d5e92220d1a39943cbb9bcc0225a2bee8930dd731bb1e30928de50df2afedb5eb556f58df12959d600b27ad6f8cbe87ed169db3ba00c640d7f40e345adb7a8fa0a1cd8048f1670288fe1930c516028af409b2642b0547b8ed872588e75e79c5a79b9291bb3339d77c171539d8913d88189847170de69499cea625e22f733ab17f543db14a84ee84791f26ded50587f84664eb75ffedab288f0a74e06f1215714ce009861fccb34082970743af27f59177a74fa22c760e2b5267785f6369fe539a692d7bda918c347be0275269923e6eaeb1707edf88707e4c78fc43f9ca8ba0d04dcd88edba061c9629dd09b5ac8f8d04bb407a5be737f21da4aa22a098591aa11325d19f9be6003baa91f19a2bf7139d1d79f0ad55f7eeb458dfcf2fac522ac0f0a6970f66259ca81615713d50a0392ce300d5aad1f2a6d1457e18c091da6dc0474e29f17a5f115efb757426eaabf1d5d5520ff11a20cd67b9257eba9b8dd30d4817df399954831d95f229ad45fa876a671581d7f29afc332fb009b0f81848ffe75b4e4d7d23e9dbba61fa923da3a3668c69d13349ad03f480c1533c0dc7d5078aee3de7376f3277172a0e81a9d9e3e5f6daf5e24417afe1563e70e3f13acceeb90519c00e81a0492f8d76bfaeff815255ab5083d6d1589ce3e760c56b4d1ec5bac9aaabd768fc7135dab260facc83b7005f1be06013bf679c1eaa03d51c82acb8f036ab306db62e501216f8d5079b3a4626ee1575b329b64de96b421bee983e7ae53dcad3dfd28a88c792a7955075e5091001908408dd8932e11e9b0a9f9235298768f201ff0cadf34080b5d16b8a9d9ea2270ecde79813b4a000887a2ac9b9c270c40c208cfaf3396f0f42cd8ee60f1cc4fa89f1188f4dcead180e82d848b1dc73fc1d0017e810676cc3e04514733f3b36ec4f7dd944c5bb240bc1ea22c65db9e3c7d29d4d6905e7e6967c6924453091ac47ff965dbbf2881d709aa721f2726f25a7a14c7a0a96830b54762d91d67b0da06eb2439e127f67135f1d6265f23fd6ce463e0a8bac11990f325fbcee3b63534b1fc1e9fbc69cce96a8421233cc6d705fdd5f7fccb2425491d98820609c21aff2e86fa55e6dad7acf1ad872567678483d16692dee3549dcfdd96c2ed3eb5f958c2294333dd5977396bf0f07f5fabbe1d5c34ed36f61666ad98b64987dd49aa687ad20fd885b1de6ac11412d3f30cecd413312e18fa3d280c70820c34b07c5f65728e0098cc870ebbda140481e322590358f721a76819a2400f4fd84c2129f6f3b32edef9b9fe78616857f1916a3ab642633759a39d3a053a492bea476334be0149410742cc787ab27bdf9364b5281566af89fe916d557f1757ac6acb17e2afa97b8d1a981d850c2a34e0546003dbaf909a06fd760ce911daea3c85f3bc41eeddaa74c37b0f803aa5a91f95e36807b5813d1fc8de5eb2389df2a9a379294f542cfa1d3b669133efcad7289583a839c5833ed0b40077736740ed0699f49219171ddb572d84dc9cc6cc7c1a331c4e6f86f068bc19ea306eb69713c85197c6bf34f331695cde24486fad425d74648910254f09a452326483a2f3a84b952ae585a73c04c76890d6a38447549ad85074da28990815a990098d3815aa0acb9fd379b7d78f852431d928148552e898accd3bb080956f6cca066f92b469d6269e5d9aaa20ba82308c90bd0f9a97eb82a30b953c143c803f398fcd19e2b449f236063f71109bec9d9c23f48c85684f57997f1df7e61baaefcc2609e923d65fea8738c3e2bf31864292adb20d0b2f3ef6e705bccfe0aef8d9277d422676b18bbf3c4b6cafbf673ccc967575ddf860b9b34b579851a948acef332f35e65dcae0876d52d6ed561d51f99b8067759c07592d1bac559db3d7361c3aabf1eb175132b1d675bbfc0e1014ca87ec1114287c43a128df5c48e05df799119465f5523ed89e4cb6344bac2a8b04164ef287ef4aeb24db90911d01b84b124dc08fa85e8748d5976e7d4aaff39bd694bb30044a7492597464aa7221097b072c367c461edf1b7a18b08ee1abbbc5ae13c206d5f8ee2e3e78f21fb51c07d27f1a40b2a769703b12f3c13e43eadc5431729d515a91f3a1e7893ee7d8c52c916d03c418c5a888b26277c66e003754227156195d6f341d8d743d07514e5c4e1109c5d08711763ac2246cc1a77a80882b6cc4935c5134d18486f693329362dd1958f2f54ee35663290cccecb38a248ad68fc88f632ad7d9a2c396187a3edc69c97dcd11272236de739cd3577e6bab7255378928e319dd16b6afacb4feaa1489119dd63ba406efa4e102bf4769733aaebaebe1f2be42f0e08aeb5e0e6a4b69800fc3f967de8615dfed3825e8fa9a38bafa3ac43b8c82b1159dce489e0f998c7c4c435e5d1fb1c6aa07de88b1dcc905d2371cc2df01571475f86571fb153357015dc68f0413fb299bf9135be242ac569f3d26f09e931ef6776f7e0f6a1287b4550fb1fb0e25ed32290e704e45d0ec830f858fe6fe90fd5ef3af3d0f3a066e8bd9e3ed6722916053c19c6e632df6254fd9e7c541896bd9469767e9b43f5ff28ec2a07491eb2c99f8345edaa6b79620d8d9b32dfe9c4591e81781141650ea0e0e535481ae59ca7e185d4164f1dd50119c6c9d1c67a847f65159d66aff80ed3a54ba39a6b5a743ffc16d18ddefcd0c7ebb98a428c7d03ea008f2247bb632f9f527b00d5fb9110b5b8b3a2f50e212919e4fb22f92c2687072779a5ceeedde106a0c64730e00a759a3bb3dfb7d94f3d49228b50dcc2f94624cd7cf6841155ed6719a400d0ec3e21ac92eb5862ca14c80a077f23e0a6aaf3c9aa6f38b908cb7a21f907e3ec2ff1d35d4eade683eb79cabef685e41d371b49e485311279f833033ea4bda67114d83f36e5a6bbeedd83c2c25b4a865e51b608048ec16cb390e98a16e7d63ef680fc6085596ae8b1f505a93e59976fcd534682097ec2c64955397c89f60134437b454aa06d2ee83ea70b3a4180882bcb65855dfdd7cef60f26d13d6ce6efea07c1f99f0fcfc4bd97653de3e1a103f84c82dfd74c4cb5c4705050c7afb9b5915a0ce931997dc4b429fc8df1475bde7db8bc60793b2fc46d41b305feb6c881f3ae998e75d1abb7f4452802d392eab1f61d94e14ee46552369e3b4ff16d440860b82df522b461876401bb955f3fb81381817d2042ae1703d525ce4c6961926c446dac67655f256504a4b12a7c683aaa491bf3601de0a02523f38901742c670c5dd7850526cf3cc5113e3b444b6a051e3975633fa28f709333f2e8152266db4cbad51a60e3ceaa87f441bead01039ce46f1c30fa614904de0b1e4181b39628932e2079cf871d9b02bf24f034c089c55f256e92b633a973457990ffcc86094805780970900464497db7241bb0def71b1b22e75e27db6a0ac170f2e023d4b4dd6623fc2b9839e261dadd396bc5b7be2fcb31b6debcf12f717790a012935eac26fc5be7912bcb096a61fa67841a974af74bc03618cc31ba2adec6a860d83e8c2659e18d32548b75e03beccc1b2ac50a128aa33908b53ba75cd5f50d0ca3bdc04ba07a4151ac825c1a42f46a5c8333f363ddef9e4272a5a6f2533e6b4fd5a8599d558d1e8af9ad6abfeba98961f2c43bbf0442e22cac125ce380626f5eda70c52d35e293eaf6e6feecb4188ed52b7214358b672d5763401e7766b65cdd60b8c96f088b58ffa2291a1013ed0d0028273f0594832d14addb0716b0e2405c88fb961e57e4acc72d36f744a5b11f98291231e994f48cbc6c6500a8e3aedab0c104ba684df0a880f19958be09512d60ed407e36a13634a2a2bf5e8d044ed629924b26f6a487d8d48c40f5ce92040f9dd5b5ab238454b60b5f5e8ad5ce9059951bdcb755ec55a1bffce3ab70ad9b72c4b40835a4b2cab4174ab01474efeb74980c65278059ecc381302e9ace5c51509aae669a74a5c8c25d94850b2c2285d976e4c73d136d5239cca95c01ba96cef5061bf9f7db3253e75f4db56a625bbbe63e2bba487f4454c6da4888cb0d17c9464a38ab11ad6474b5563808e22344c0cd2a1d4b3c466c8fc449814cdf13f3839ea18f9d5db6a1168e933637d9c1ce411fd521bb295580f2607481376ea31d85e19d607336d8559e77ab4167d80a4dce89065c26a9bd9af97484c37231d03f4d0d6336088c3db567ad396e81fa2daf027556397ef957cc7467d7ef54512ece219d90baea178521703a233be42a55b4bd822285de85672a89f00080651fb059c16100a5748ee31c315936ee3da55dc89bbd50d385f05268d904464ca5415e66a425632e7fc4d55017243790f1cadb9731e2ba656037786eafd6208e692f48b9d3ef487d428e1998ca86e207b8793232f0b51f58466c322d8fdc30bca11d5c98e55bba4b70b8ea86344b70c3311542707c9a22d2466cfb3fa5967e199385eba374f57d674217c0ee4c79b55158ea6323d3b7d56de4b669ebef2b16e3f884c7087bb96c0f271c80065948b32eaa98902b7ce02c69eae0211269b98a136c2ebe5b9253231f6bf36e68179948814a069ab8f3f14436694d701a5406cf0773702721c9cecb9c859c13ce97dfb51d7d1ab543bb31df747e25f25574f4f3a4bd53898e78b22beea54b844dec50794b41e879f79d01b0704287495fa3bf07c3f7e3375a4c2a95366fd7fd374d73adb724b00860f8802b712797077e87077e7e877de2ffb6f57b2eab9a7985cd1a82b60a549fefd7aea985220f8453b1a838045d8f072499665c73db59330fe69186885b5cf005465b06827409f4e113ca86c8c1067a55510b4bcde32d70f9b1ea4524ca17e83f787fb86677d47011a31296de12144fd74cca5ee7edaaa5095941b4f9ee79abef91df509ab982ce3d9a90939ec75005387358b4c45a607a0da44c6b8125dfe310f1d7d53f9fb856439bffad12a2a56a3a567ceca6ae98e7cb5b8d003ead8523413bb5146638b979752b0d4f8d243d2dca9f3970d3b5efccd9f78322bffbbd06a789fb248f5c03394074368eb8640fa83944ee901ac9a59ecdbd0a950ae3b27d612010ae32f8b6b83883ab003b613b16e042b5d92ba056aa0ed909c5b509b66558dd95bfd5a04d6e28f35fb58d078c948b7ae6d62ffcc51a4abfbfdf73bced874c5cf6d4502126b014f22795af520429f272d41fd251ce6a21625feddf60166f42e36752c819a2e4d417e61bfdbb26fc83a634416bf19fdd8b53bc2818b1573e4c6df0f2566c00dd28011da64b617299c479541b8c6fee532d45fd58f85939d1e0428d45fef93161cefe6360aa0af7b40144b644fc76b5a0090f5ba5eaa9f3cfa85a92cca75f4b3f57461649d8ddf1d4a7a27930da6eaf090cee584e0b71adc700d528622484ff32fb0d6acc94b5305b3ac50b59ca5a402d384405795a0e94971ac696df9e9a2e59e5d7af7b09f84fd693a435210e0f89c92302d93e5f1e7fbbe7213658225dae95299eebc50843246d5d5352eb86dc130d78b330fc2242da0495a3a3c1008a2449f9cf79e3c8f52a36257f6cc8671ed9aa2705a3ff54e3ed40657a459c61922199b90d1a821cf0c7a4c9db8e1752a85c7951a6cb8579a02a79a0ae71514dde764c5ca64fc05eb0551bfbe7bef16e59b1f066f1095c8a88d57901d239ae07d3e815cf4cc6cb9c1cce0f608958662ed71bcfc775cd3216bfb50ac052ce107d05da948df65f57927b45293073d402be14a13723b28c3d3ac70a7bf584f91b9ed4bbbbfb7165c4f36beed825762fe79f560f31f0bad585f3e22de4c2e61dfe7c84bedb873e8024d3415d5636dfc82b82cc810dcf8c3d80d23860b2f12312e62091ea75d657f1ac881ea1bcc20ec8550ea2a24a1ee74629a80e682193ced79036b44dd3b1038af6ec246f2b3292f83c98d9fc4c991c01c8b158f0ced628e0c228caaf6ace2f4bc34785b18abebf02a9256367d2eec7270c98b32b0c0f66b3b856ba382136f1b120351d1bf56373a8d4b8b3643c902f1a2ec042f002cb50b89f672fe2cb147fa0cc700a95cc823caa0cb034ee2b2ac8d0c2c60803c4b426f1f517a3aedd28d7278ecf3f1c880fc90f8ec49437f4cd7de02a5778740191f0e1eec446fecf19c5d2986bfb9b979be906cc517607e741a61cb0141af07c146e9908ab31a5fc198635bdf8ffc6d68f398a13de9b7b159e00d7525e34a31f4f5d3f2e4f025cc9b8e28e545e8f71400d8992448929b50209b45bb26164125597c242d9957748ae0368e3900538409ef38555a2cfa8bb82f51236c33191111bf7ecf3b255b776354cfc908ce5b67ce13b55dc150dbb3dff35c4bd30f4967c7f7fc87b54d04f2f4544f3c8550ddd7683a7691086d9885ba2035fc2268b574efa43056770781ce310100cb4f0200f71f7be0bf4842dbf32583c2062dd142b99954444e4ccc991c88667383c3f6cb26a23981bb77e89cadc00f921dc21692c17a97090146d90886c6adcd64420a72ed7ba1188778642f96808b91817ad58a7d146bdfaac548e6ca09303e343e379c441af08efd1fe6ec0bff7afde43ed296ba52a015be94e3affc8eafbea37aa6f35ce11c9466acf3b3b8b6dd8dbe5de3b17de75bee987c3ac77c0b9bcff996025739be8904958527dc7c14534eeaefd7dbd6a5c684c0013654c6621d3a8aeb2216e2b47b99164e2d1b350061a5055abdfe445bf445bfb8798393823d2f04cb0895eaa82042e0999ef2237144c2dbfa21a790c707c0bd908d049ffef722204236a6f5532959a05003d94d0836189a84585d176939ddf171d93dcf88b9c74f0cae848974dfa3d954e2f2ec80c314d68cae915f052f378d3995940ce10bf1f4a3dc3f2dd9a3f803945e8dc835d67666971d8d6d92145ce0173e15018e976473d5661247c6583f2b69b928980bf585a6af192e74f46e7037e109c758f823bfd2038fad4b362c8b60c433daaf2f2a61acf661ee2f6bedde2a30013a8291b3ea8a14403fe3a6c56ec31432ea47af5ec15f742dc2295494228cbf2ddbb613262fd76e25fd73fb83a13e5badeff96e7b580ae20df5898d033e86ecc378aead6569362fe5a211a25c3f964cec72d491009e1ad29639708f93e3aa30ddd21f8ab3bad1971c0c415e597fbc312264df7df17d0dc37428bb874f12a73c0bcd36cbcbf315a1da0337b4860fbd6f167a14de0d5a712037054befa39a165a75d87d4c59763c109d9e9ef701c475eec5f2543995879c93d005a6e1316c8e4ee4d0205d759df121487c861e98d004295f688100609a9f01e890e5a303008057838a1240094ed68b67346f1e056b9e347b3a89de95069c47527cc9ce897cdda674c51dc53b66b8f20b4120a3588ae2a91e173d0df24ec22f700fd7692d0ede170a3e8dc3aafb4cd505968fa34bd3a53535a6238f5ae0c409b7ee4228875a3d654acaa285956a10eaacd7cd35939581c6908cd8a198efbd9e002f61fcdc184cc7f4d90cf4a2a98d0a80a49e5a0f4663af867d11422ad0148fb1bed3dc7fe779ce0c729a2e12b3e0889cabdad95513fec6b5bbd58b96e09f761981ea3dc1d1f0b8f30e8079d22f3f2598368cc0c036bc4ad7026bf3e451d9eec4b085fff25a2c0941b9f75ba92715c5633cf6237f335b1d5f60a717c49dccc017008fa41f620b96a97cfbb9c7b5b2b7f9b7bd5d4c78ca2a8f25d7666f2413185315c0b8b94508088f3eaa82eea2cf47e09b26b3cc0b6473708103fef247b2997d6d8b4f9fe8c153e4e73720a0639c50a24be8dec5ba0cd25894bcbb6955daacc350895e9f9a83d0f6d0147598194fb934127debf5bce6c5e32b549aa367614896db2388a5d3d083bb7e4d9bbc0a7ed71c60c711774c539db6d0740e564ee183bb491e106188dbd09a92568570e8190db04a282ea8527fb6228d1045b6d01896fd32523a920511f30dafb4001ac5bbf29e38f05db25f146e3d8670cb5a5ed394eed8a3efb193cb08e3cb5775ece29de4537b8e58849f4340656cb7c82a99b43a24b65bc5e11e356aefb94630fc4201a9b68d628a0306b1e89a79f888c56bb2139ae84aaa5475da35c7b6081da86738a139837b2c597ff81e5b6f72d112d1450109ac3043983b56c456864a3a5750316205915d02daf7b84632278a6157632ffd515a89b465b515d27df5503ddd865a34ef562500ecf769945b421a370e2b4dbd8cb1a9a3e935b48191613bb15c1bbc773afd887dc81da827ada3ac6450765530420ee20ad8b4a977d0382da8217a3bec714a948fab92e310bdaee644faec294c6832bf064d976fafe08f4ceded23dd742f0e14ba8b5da4f2d0925032294ab058c0dde8129377667a3563ac84a392ca1510b1d463ce7a8f518238504234ace82b9518b0a468aae323e4a571201d102a334ba9de88bb8a5fa17a2a5a21ae27cb3319872da56376501661eeb5856d645b95c90c7480fc37e5d4cdf3cafab01b6fd08d6f6b6ac45d158883e6e38c7b4c1a272dcf4d649943440e830d9a4e62dcf9d87ca0de0396cc61c1dd3fceef012ec70b9e44be4ce740b30106bc0c606784acf6c833d313fc29ba6114105e5912aebd85bb9b241604fd1ba3d528de1e721af2931fe2ba1453677b71d8e485217dc0e11fccf56ca6770a2fe618b36625a68f91acce32300caeae87c7a45db5e2a96b51c62adfa02c41ba7cae180075b8e56fac3501c2b589c5a834b32da15564ab9ac0aeab18a61c0a731883041a29a2208d3050ca8f1350ca25a69ba100175d80f82477b14753dc7580d036d5c32391d3403b5fd39aaf1c14bd97fdcc883e2e36411e9683f9984f446e8b39f79341a8fd81c63a958db96b6211aba6c12bbf3a061fdb67a674af025fb51f313f9a89cd05d9da2e752ea50751c8b993f69679a0dbb4a58f47821751c4b4852bfce3a316d6d218a0b02d8094f7119b2f871b748e1c48e527f880660479a7e4704e611796a8978133d13f054ad221e051aa37a9eacd126dc32cf2d0d09437eed3a4a4e6c4b7deda960000bd272ad6c9a41aec5ec1a4d08180f4d1b1cf9292c1c1024140dd0b2d14368978a6d713239b6edd6c345042bf6123575995f5212cb2618920c78b1c6b5030974acb8a2ab856c8d46b541cbce46c3be5c5c2de00a8e771dd76d5d4e0dd265633a29dc2194d3a713e2dc335826f5035697a9904e52f665163624e8a7b133fb6e1a5b9b9b35b0e53dfb81b0e7f83b709a5cf7cbc128c36b6bd4a31dcd86671a2fc6885ef099ae8df4e80ca3bbd252b9d08818a9596ca2237a0c7d9094384af7dc7e6059b33c325901703581d55714d4c1db41eff91ad4579956dc653ee5552d9ff7438fb851e605447d4a5d88b94f446cf54626747d4b43125c18961fcf23547524245fcadd52b94ea91b48225758215eb6cd99cbf1bf33236208adcbb62d06d28964753abb62a12888082fc1718d8be7f3335845192f6b32f548a4a9bede37450a3de521d7b8194feee9f6b88e8fe262e93f40b93bff2d10a6eae5f6fa02dc90c7f8e35de2c2c6f0b99114b62a6d66ee82c320af77b0c6035dea9a6614f668655df1ac340d29fdfa26e9c0b5164d5e6098d3b04241195cf0cd9c117df04160cc768e0bf398f6a234469b4190446d1e0da384f6ccd686976c6e6c3f45875315666b1f090354aaedc917d33d004795aaa087538ae8b2a1f353f2a9b402ce7bdfbdf33b8bbb22f4ab0751db41e4bbc3826c218d9c2185eb0c3520479a8d86d13b00c57799e9b586d5589a820daf3bf2c79f118ad4e754bf610dd046334d22102e85325c061033e7f092b8befad31909fddfada014e562707e26f7407c03d88fab0b54435cd747bc2daffda9fe98239fda054e397db73cc837859c7cdf70f38e70e4a7285d0f14b1c6ec26f955962ce9a4a63fc3dd325089a211fc39cca3b4494f9e6a59b2040b3f30d6d073f2ba8b2bcf432ca8f68291cbdc03052436903f951e63663f9c8af86fc032bc42ba66d20bc7281779ea60e83183d19a0b9c2e99720bc7e8970167e08ad770a45bf5f85707a0e60b7f6286b86a0bf627765f14780d12fbfa20876f512e43e31972712fd45df80f22391d20fb084c06f731daa16a76f94e0f9968f731b45ecead64c399ca26e02dd058910f4f0796118ebb00e0fef85e2739e26f8da160a4f827f12405f2a7b55a3b14edd90797efc492ab87926ae24feed1d9e862fb61e1f6d4c9fe19a1e17e9ee362e2c601b9dec5d1a36dc4d947329082c07849170db44641a82d1610d9dbf905795ee00705c3a8f4d6abddbb8b66fe22dcaa1eaeec27791ebce1dd58eb2828631bd5d47e6d6f9c92631dab22a4bbf31265dda8b08e419ed7210fb57642e80f60382768622d8ee531f3b123f88cd89166c45eef0a84a51f2302db22cb238df431384ac30a34cd9cdd918d4ad08cedf638f066c373d618d548662a2bfe6610f765c842373753d2980f47bd46723c2faf0ee5e144fb6125379cbbc90b144867c8d0ed806ac8dd9fd5abe22dd1f1ca61e4e89763a428d096b67a2388bb6f6f40fe7a0697ca3763774f3e8dc626d67cb6d925f4039bdd737fa325d65e7f4e68c45496c4f439ecc9ac98efc91af04e88680bed0fb246f5a6cba163dbf614f49fd344f1f8e818ed253b5d5311c52a879043552b47f8d4f282988e91280eb829ddf185f97947136189075c1a6a892b9ac0953f862dd221eb0a409172df5e20891fc93953c19c4ddfe5956f84eb01b20bdc23706b752d0f731764510a7ba2c98cc0a9e90dd0137225afb3dae3b44fa19d2fd20428861c63f079710ff4d0733e37f959137d724756e405695a7cc10a4968b9831918dd94040a904f1538102c077b91918dc68a5175644cfb21ac74666cf0e6051ad7121d7135745d3e8de26e4eeda9599a0a8be5b27a6cc13f3cfee8ede5950444a0ed57c5f99ac01e8843d52f354aab41df6e66a32f895536779318d93cfcc1e649741acf1a865434dd2f0be945fc8a525aa71f5058267fa186f4c2131b4c19fcc6af13ed0c9f06aa06d1ad2e155ccfc81514436dc298017b35d5667b0f1d425d9af9d254e745af363c40a6e0c9b4c12cccf8a60b98c4831e27e61bb2388265113ce86b8fc17a75a6d22a54763f090022081824e98d3b9d81979e78a12ab9ce3ab79c2caac02e6ac2b0aa4d55311bdaeb313d4b266a9e0a487082afa2108e2ce9b88d285c9aa90505b5afcd7e296c5e2c014b9f59d93e1304f1279de0f7869aa98d363370cd083cd0184e679354439f7112f8f3e032203104941f12cc1d7b1817bc558c0ce571e6067ef570e176221631ab46040e44237555eb891e01c966e2516726a753a3932262c21bdd3223c3296c892d31078fa5f644b214f33fdd446666f58c7f7e5887d65d3846e600ea8e714f995d7a83bca04c6fe7d74617db8d42da4a29c190af2f89849d3fcc12bb70e083ec893abde1624d96bbf0b3a50df88ac4f8227cdfb9c378cc99b8bc2e5cac595997715cfca6a47f3aa895e13ca7dad6a27c9f09d5e930ee83316911a2efdbaf26c801b8266d83cfa4aeca82e44880258725ffa965a9f227a232ecbe0e045c4af991076ff17982bfe9ca40df34b0fced0455223ddad9ca51a587e38655bf29ea7ae61bc76561217fe88dc33f9b0c89506f96f0de2ec920d396d93994feceda4128da3387b7bf336e083fd1b28377033978c5d072350623ae3cef7ec70858a85827f81ba9e186619cc7d3d95987996f0d56f9a814285398192b06dbdfd3469b1bb5e82e2bbd7d1533562e397f049f7ad205a03b79028d069d471dd8c7dc8b7a2f30396ce9dedb8e824be8927af996bc000c7f41af491543a7b81cf3babf28d19a16bc5aa0119f7d1d3da91249ba78aad42ab91a0302f9364fb64e8388d9e6ffce427fd824dac1767e45166bf2b7c67fc2027cf82648f4a3beae758477d51608a39c3396d1ea067c617e530ccd78c78f43eb3dfa85292f558b644ea5b70d5c5c797f16e41b4abe7b75e5d965d484224f3004f33a3d5ff42a53ef8b983e84a016708260120d9bafc72950cead90c0cb477ef66fc35bb102a6d259807c0b7664f1292458aa212f6b5b30cf7f0097c35c917e31887b5b145b99988b4890232a88c660dd6d797532db9d6680f70f51894bdb6eebe7917b1c2c2320e203ed01fe494ac149bd84d76f2534ab19eba36fa8a21a4c055e2b8828a8e0eb72603f1408d8224c34af82cc9a8c8859c1397a8ad8afe9d817509e7c00fce80cc2b8bae85aa883931b49071389debd773454531c31ebe538a10ec7804cfc4fae4d3bfd8ec7893bd23e736692aaa5d11d31de8e5612612a5402ff5a856317ceee0ae2abfb0adf3c807f11104b876febd4de1f610972f75d03dfdf4c9aa7c2d5855ebd1a9c831ae6b646099bcaff8a8be8ce96d6e37a67e79179c4dab78f1e48b52428ad4e0491b34e875174aa04e683927d9d0be4dc7ed78c4242acae6fa31d46ed1d686f2ce2c53badf3f7419f2464c20502a0718279b8ea22c5ca2a1bd9b6d6f6fbb5b9c78b1ef37e147ca24c5da3020b09d96fe08c256e920c90c6df31a8093ae1f060e536e89c6660d4eab4208dbb0d8b1af9d8a9c110d3c2469915ce3800dd8a1b3385a42d853639a1b2132e5812f287cc1d58a30a4a301bd25c1a2aea82d2a7da8ade12156dc83e2e058ebc6b29cef951736bf07b495014c95a19a614442e54d262772a6081824a939c04b01eb4cb9562d90969df547d332eb62fdf4436e68bf71f6c2ed11a9dc8b1dc38df90b11f19ea205a527e78690cff732a361f5cb4425f56bbfd4de7be79eaa8498805737e8bae3c10d81cff19d6045e937324280473101c8881a54d93018454063a5cd01bb51142213e9b12a8c444465d4e6935c6041d29c980a7fea6a139a27a48f7bc9499991225c5b9d15ef492cccc7ac9006fa66d17190644a0f57d015c66f53fb9a9683dedcd6c16bcfb39f17a00f176379c5e99c11dc0b96710fc9427cae249122b278ce3861df40cedc0aa65b675b206b7dd794303b234dd70e26e8688092df9bacc996142988049686903a7e1d044d0908189cf495aa517b7a6054348ee7d99689f7e27e0a17e35272a05abfd8a4f538a737f6caa86564afd0a99049a3051a6fefd421d8c9bf7fa007f9a416a8aa9c4a13203bf60a603f07c3f077fe163363afb1f77c09c1327a0b1cf7f68a7e95c9c4b525ef5865028d4f38855da5625248908bf3f694b48a120436c8340b534615df21a844b433b48c9ac5644bcd1cf11251edaeca4357c5f272c554cc1972d518befbf38296b5feb50fa4ae1e96b183d3fe607853536fac47de3ad2f3c8a57b8bb474596cd82cf400f8f9fe1ec09b12a77924026f604c9eb8969bc66293bbf6288e1286f9a356b2b4651a11da00fc20750bcf1e1fa7028af8a6b59890e047bddb1550eaf467dcfb23515de47c01bc2f3e3fa00fc3b9b2001ea76d0538a42640e738e40a595620511ee47a316b6a3ccb0d4057f5660151603345515a779749d1531284553735fcd49bda57d97ec8f5b8a65165c3eb5399520c83eb93df9c177b92191f68b2bddae390ce9961a29aa8cd508a7f5d79fda5580fff6014a8af17b552cbeb744e6e538f9b72ad0196d33c3500a12a3a67dd7a72a8641f6528aa8e15ff8c807a28ac0a406bb24864aacc4837af68b67e2129910fd621a81bf728cd1c12804d57e67d29e67f2dcebe50765e0b6e5367a225fa664fc8533311f51945f8aeea77e26b8aef1d4d04928fbfa7e5383c03913b2cb830009acfd218d88d1f371ef9ce45836c5da8a89d14d80e708b08e9ade18662393fa131739a418cb13f6cdc9241e1d0ba2361289ebc852cd45ae467b3fe521047b7f2ed6d623e93e8697d27cc1257f784758f53ea54da9b4a93500bda743da8b47bcb88961994ec03bb73e8a988e0862fbc58285fe3da67a2c62004020e8ff474d0a4b2ca35efb2447a18888940307dc4b689b6b16e9c197252087d8e057a6e9608d159f15d9acd68b0955023d1a0c171a15a75fb215ad6fb540f88ca86982e6dc4fe112de7a52b53faad8032599720cfc35598ec7803d2a39be23ba25f65f240b7ecf22292361c85d486567d8faf98f63bf4f3e9eda1505a0f704b09488804c0d4451ad4ab4ab35b1ad29e143f204bc0f906bb04042d98de9294dc7cebe47d451b84a7b7cf8d4f4edbfd35b3a12ad38d9f09fb2b1ff59b80f7bfd04cd73bb71b5d00c8d91d13fb45c6313615dd6808fb932b581895c4a05266f71b6dd8b9cb689edf2f7e088dd3c724b3188ef8dc5ff48ef60dc5b8e350d84c0058179564aa4331e97ebef9892a90288826c8fdcb00346574a9402bc42290e83db3e80103e08604668b86d1971120489b3cbe23245000ad696e018f56151a4ab2549448ead1041ec074005569228372aa157568568a0b80bb0eb81a8100c99ac1303810294afd80ac1c5064ad8a71b8a8e35be1160478ef4418741d69e13be1f089e80f4cd6f97ba95403119d751d019812a1ae84cca8085aeb26f0e9697a1008414bc79a261ca98fc01e735826421fe74af6c1e8a3397eeed3c1d7b6b0461e5a3359c748b03921ae82a4431ca2ee4b0f8472e6f989a5f7a225c44d47bdc5d5f93c202d921f7980338fc86f738239a27083120c2e88e9ad20ac037f36ea16cdd59af9198d76f66eaeb293332deffedd5b8dcaa1bc09bfe4e7d263a0d8e2d06c44b42f7e976c5dbb09fd949943035011320fa711df2b39a4e76116aad75790572ffd47b48f4c6e893054b048f0085dc3f24e9036b8259f91bf0dbcb9161aaee6a7dac82c0bd216c586a1230484237bb183d2fa2be835f0ae665b2ab6487dfe60391a4e2320a93695ef675c81dbc5f31ac5dc0436350defdd9a6248491f56c64633f108c441e7bae7162358054a29f53c8d3aad0c2dcee2f6a809d1df7a9d241b352726eb891c46758cf5fb7e6764ab2e2ced277818a3e1ebeaabbb01e2498e846c2c9a25aba71d680d3d4acc7efe2455efdd5d4ae9c30aa01b1e9101ef4f3bd166a3570868c16896081327146dd78c063acb96035901835cfb36e01bb32b3eb384755b988d7946c8fb28fe79689741f824e15520a0ef060edd3de8664906109acd1899304764a09b5e6d13b05d9e99766bc560f71e426ebb5b33db253a6156b6f15666515243c629f4455f74980b195e4da3c11d185379fc1f64d2464eb4a625d5c74059a7c753455be2f68e2218933d71a0c303002a36ba5c294c50a97659c1f2651b2ca51fe0a4fb9ee925110615bf935082d2d04d14d7efb8a8d23ed04ffd4a032e0ea41cf134a5a9d7cf3dbe839f589aeaebb0b40ecd56da8a5e3407f5b0f3367c360f0d65512b94461ee4828e785289fb1dc6102ba0535517cae97441ca64684a1e484e0da27fd175ac4f8f68cf4d15c648a2ed2a7aec0073ed985ab287bcf010d2f5949db18a90566f0ead74325e202a87c17e418c4ccbdb08b5df8edf011c0498ca00c6391ce870a89c7841bc2c3fbb1b57471e127819b306a3993e31b49513170f1f1d1fe2814fcd478c0e44646939b24194e95289fb96d268a3dcd9dc83ccf242bd338a40093d1f1fdb9cd82602e3a2d5fb3c8a1befab9faa91bc1f37ad713efe983414acfa37c8c79023deb01396005ab52e64790a8eb2f12ac1aa7d39cc613e688ba60406605baf5511e530a4a7a60d370f83bfea4b8a3f1cf495278d9a77aac7e44e073f5ae80f2c67b8658fa59285f41c91cc98af6495924387ad1fe959023f666dc3cf0960303d27673ee3c9aa1b1bba7c2000a333f8f33286313d9574b9cbec767eb0f6d11d0702c347ebb6faf6feee06db67b12ed0721b0431afa44d5e77f3420cac40e73a10cc2757613bf0951d7abd6cf4be315492c65e8d303fe4786532a8990fd72281d197138e59eda4a3f3d4445823e0e91f1af81d08a99bc502f217659d916b40051216f9540a3d7e5215bc2250e37776be06c894d59e1e6a025c3de0b7558593cd7cad003c9dc0f6e3016dcf495c921210cb158d52588888b99204ce0307f71f68db78a60c2a1fa7072d8b868e1226f86d1dfc8625959e989a10b19442d74bf63ca740d07a6437b6f59276dd75d20ca9ef41505452fee7090144bd7dda99ec59446a8ae85fb75e7ab4eccb36332f93377ad2ed03818bbab0b22a5dcfe24aa38b53e24677a27dd00d1835eb6c69a42a9aede349990a4a1fbd13a687b4360375a90610fa9830f788d76d89ee0a98c2b84632d92390b89e0476386131934966291d46f3965de57bd1300e9d0df5034437af462d7a506f8f98cfb5ce32de2cf4b39ede5d5eac395a02b5122040b50d9e6f7a539c8020e2a2887e39bdcd5cb25fa860e170a638816b99d3f622a03637cad35c90d33fd05ee6bfaf6952cff0e28d3d5f2770214a4a5ffb9ca5b62feb3181f1c13f15a46cd7a6a5d7624ef47e0ec39fea64426634b60868460b077662fd9ab39e6d20f02b089b56b18eaca086f42afb142699ddfe5a4ba91fcb47f406b10b3daf05dcec6d501be1cb7a9e7e8877a3c19977ab7111d362680321ad87ba8f198e8de37e3d8b7d7fceda43c6da8cd6bb1b036be4aa729a248e626a90e6fb18bb3e3e72cf2e0c1d106b37d2e712c9623e7a3d03167eb19041bfa2b460b0235378dc58651641fb8779460dc3119f270d88771c5a63dbc36e6c778afba67029ff9d5de6f3c69dc08edfe409a93afb03268209a4129c90a8f8332141a7888ca95ce6fe0249dc1fd4b984914df68020c7430da52080723a4d11e733fa576c73417c4bb90143f4255a6fb1f8814b8f5390a9d9a5cdc1797d4af79bc30d6440ca58b33e727866c6b4be561a361b888d4f844edcf9432861cb98242ac7301941c491fb5494326aa395c64d822a317f8481ffa8f5df41c8817d64ae92bd176f22c6ae986b7a153270f62fd7ee2c0b00281e913eddca47d7608cdb76ef133a4c2c3c2b54b9e9d51d2228bdf84922eea07f51589a2aba116f69cc50e699c8ceda118757f3e67ef7c3fca2651e12ec32a16edbe160e5ddb67870bd2075634fba2d2012beb357882bbd38e08396905131b7160fdffb86beda39322b2139f9602147cc665c01c3cf57c982ce88317459606fb723463305538df827db48308c208053535d7682560a239ca198b3a792ea8a6a2c36a40fc4fb276bd8caae2a63fab88f25a2fe0de96c227b449f4ee323df702bcf4a952dd7c0c7f739a269983a04e6becde41c18bd28dae27ef8b76be8ae7d1b72d1f9c808ce89f27bbcec68c3cb56774dd834c3262ac968fefde6d0a1b1818f95ee581af8fa7cacb0dda3cc2ccd56ac041221acecb7f60b0192920568eb81c674d85592a09ab977370cae4ec4c09ac3fcebb7af4856535dcc07f86c06786014d30441251cc3d61835f2a960d2626f87567458720f87bbc861794b751243943885c76c874da90ee76b1373740c4eb9b319516b178b75b32589dfeef97ad9bd23f58c633b1c89ecf8165ce253d5b421b27ab9ca37a30f9b046506ebac01a4fe8166606047a937ea2891db3da27229ae1a689b2c2feff420990d05eb152a4b29030f28f580764bb2cb99d6bad32988c8ab7ed79ea048403a9afe0c414e28738cd1a2893be878a0ac82dc51052e9b7c605abf10cb2b80c3ba70339b22023d438d50be06a0693dd9bcc4686b00d41142c9266a37262a5a68f010a336b32ed884c4dec71e0bbacae3737ab365624b5e1025af7deb22a61f93ddb949e9d76ce8911c8e202d3e4a9c8a193dbe1aa16068329bbfd4d572f467836298a19548a110cfcf60d2f4c59e987e7c0c61b9af44da499237500cfd5dac73a017cbfd4a1b1a172b9eadf5ad8f3b625df68401fd301265621bc3295fe83e9e43de351a52dd8def6cbda7787774fd95ee436442d896ae4d9ee25fd8c814a06137f287460ff8bdcf246820ddde0aa741ad122970ef9623893634e27f5e43a7fa888a7d5302b2742f44c5fc72ef9ba1fe18d02af752c0de48afcc00f53000d0d042e3620514bb937988f28fb497348c3dc2fdda41e1d37ae7a7c1b6bd839bd0cce76f62bf45668af74766708c69b251ea191dc38b612995b5f055ec57d3c308418e5f854d7c40cea5f56747a945e87be3a9df757f76a2cabb44d2d232ed914ead7856dac7b07b473e6f4d79ded597336946632b4493a6d8d727ce956b953b13279b483440538b7e4e3e6998e07304fcfb92bbe717fd01446092341456d52ffa92d8dc85649e5beb5c98ad06614fb5871b7e5b745d89c8196a01f56660947458d14b5673e05b80a2df3161055cb7ce076018d84d4b05829679849f12495f279282914e0883b12841b5d425ae474808f6824d3f61e41890f0612dfe04ed26159382b52bfc50879d9e93ac0f93ca4476b971094e5b2565a67a4e68b86dc614b14584bdc9c280fd2a82bb5376f1759d8ab99d4ea1626178c0ea6d11f3c5e518903d46cb1ed00c775afb4a6e19841a39d3d33c26d26d06c658f33fa91d83599b26b67b02e0c79a7d8f88316df24baff79e547a35b7b6bcf0b6799b8da97d125326f6438fb65be8bd4edd640df3bdb32369bf6e5ece77a772a4e80e3005d8015ee0eb2ec22cba0490a2e1b19a696c00388efc9e3d99d367acd16fc31180478137f43a9e7c7abcbfe291c42524aa3c1487a6832ea84aa9b161b16369fbf52219e4111d584a58ec70d3f1f030ee395eea8f68a07c39c004eeb3acc42f0b24ea85fd99a116b364c10ae4af18992b50128985edb62dbc1058738f43a5e79916fc7b10d1edf49093cc890c7a286ed0d0a0a93b0efc6d4ec81d2013788a2e4cad69849cb7dbdbfd48cc5b1d2e7c2f79f16cf7320af99128179b78acfb3c3e6c1e396992a13a4ca653c5c548986ac6a95e52ea7eed18037c9c9f27eef52bd379e9552979442a4072dbcc31b2fb22a97c049c66721fe4c6ac108dbac9d907d47ff4b6df615bbbe2cb8d42303eb090ec9a143d325977ac387a127874b543ec2d11207b283fb67990a6939175457c56226b15a2e0635a116247393f80579e58ff89e9891849b50add939951813c0950fe4a12c9af872d92d14840d3a564e4db374a7a9d8d59f0c08301395e0df233dd4122e548320e07c1ad332e948ecebb6d6b50a523bf1358242a0fc00af32df2306f34613bf564a1086cdc09da2c6177b633bf201f225cff6742a9cf1af91d72454f655e5cebec8f3f72373923638fc9510c652352e0ef730ea86c5af63bc241fdbc08af021388fc080004ea8cb1ac2d97d9431f6b2610a0339c21e7cdcfe39785e85779d41b7334a6487a21afc7f7b9269b6652b237056192b06ebb82c3a3ca1bfaf784f0a483873c98e597464cf4402c5d5b5ad692a7c65953ebacd00e5e472135c5477c831b43a6234958eff77d44d6bc3aba2d8bad5308f825b40d7c2ed6e332ff4059f0bd353c1075307516706b40c8915d2d544a26bb9d94f0c28126ec9d52f7ccf95fcc8b46e54f42a6ef2149faf2082aa237c5bb41a1d5c61cc24cbf753fc00f441472d34f1b7cb461e4029c75f5089a6a5577ddafe539f03a7adeb8556e74cfb694b18f9ca9f99c9220f8109894b1545b81cbf2956fa6c8778c24e08260aef84c0ad6e0bae6b548eff55eff08f26cac8dd7fee0ebe645c4f36c4cac691bd5f18f0b3d751965632726bb49b8da4b2152f8b451f312e0d9535c342748043efb68b375a70c913fb03e7757539aeb01b033a240b509570fadc15b38630712cfb5535a8afdbae07b934f7a75a2772d5a34f981889919a2d82b68ca68ab38cacda291a924053c376f32a6e5f62c1c29ddcde0b1083a4cec6098ba1799681f0b0465e2c5e31792798cfeb840509ee329e363e7db2bed77737724ae98628a29e278b9635f41e0f32e440b1ef9d8cea93e37ba87941aa93238bd7e7abb3467d4db61c804ed05ea3a0a0adff6a126f0297a61ef765fc6ad5cb9b41d838ee81c330b407328dc05f401744de948dcde0b47295681aa3cac5ed6b0ecd5df77ce015d33a734629c0091636af64b7e0f4333e7df2a7470fc242e2137c13443cd61573c797a31a16771c34cbf9b40ad0cf7923bc0b00317c2099e15132120feb221b01618f8a3c9da7b9f6c2793b1ca2df1f397e2ea38b4382b527acf25b3df1d2471ee6b26802f1929cc3b4b5f8510e0cf4f272c2f592c77a492783c9be48c7fb917d9a01a1a47ff23aeed273c6e1849cee4d427290b73c3683d2261d8c765ec9861949658d77d9a8f09bc64e6d9a17b48e217ce2f1535b0c6616b8723111710bbf21d4814f4cf936947a8ef0ec58b7aa7e03e5418b48031114ac8474cd780629c0bfee1e0934148b2cef6f66cd33cf967b389245c44f42912d0b1043a77e0b97cf4be5c5e10d618eea02d1870b1a961852d4c8775e80f8b0d00f10d6895b574fcd97b1f5114d80451f9092dbb61a56585de5105008c038a0baf7f31e828946fad00a0fa6f046fc4e40aa20e594ad77995f643b66152dfb6e284d9e7023352a7e24260b34a5017003ce0ee6196ffbf47d5c7225bc7232bffc21e1475faa2f0809d669d653912f4b55a9a41d002b84ad676bae44ce7ad0dfbd51986f133484f6b164346a34e44be562d821c6691bd2a0dec2c7a434c3fa93979c6589f19475b04a62ecd12c57005c791f4c8baaa0a441b6f96eb66f7bf847542e676c25a5bb0defd0cb936b8cd88c57bcc9d47f1c167865595931bc781b8d7f8b92829abea2f65b340ae6d10385aac55d940e484d5490ec42b4b5aafb3e78ec1ef024ba0046812073f98b934c601a1df30b8f403c145cb11784318af7045a1242e3d1308f0af4788df03138c8079cfb4e2756fade2a4c176f9d83950230829b2e4577a7aa008eade00f942e772eff7f6aeadba4bccdae9a8ec59ac10776650b88a7e29e31d9f28d4f25eae50937931bdf22b1638a7495fd92252cb3557d23aeee96469f25976ae9498b174bf532a9da0c8362dc094967e222ebd5f7a95e26a34bd1f1582962c989e6a149e2af85d68fd323db0da45e7e2456770fbb455df9775e79214569f14e56bf5791cccc56155372cec96276a9880fdf745a997a47dc362afb9ef7ea232175e0163ed5cedcb63ee2ac13e434e7c79b5e741d9c45cd2e4007543d9aa47905486731ed35e004f0374d2843543960a7136ad6ae54858fb6f3f6ced317dfe5b6aa230862650aeed14d1536eb3219542ea788dbc7dd93613b3d1c1c6d2712505462f47ada1189f5081680ab1943001a72f430b6ed8a63e582bb7c390bd3de3ddd4013d958a20c162821843bc065f182e87ea09a2d70cfc41e1e629d8802a717775980591862628cf8eb6020eca3f03feaa8062cae4a188d0e3a4c0707a6a335347b9091b26be08bd409ce472be796be12df37f7f17167958143e387ee5aa5f592de6f2249c0215fa0f5387ae021f4f0a0d71c23a50031b314b8d308fe14413854146f0690e60c1f72564e5388470589378b79e70cd1da0d9aef4a495340296ee77db2e8b9cee8107fc7130292605c7d2a41cf2d2cfe76b9e842784b699ff3c394896784d8e878e8775bf7fc95142e2176f233da01b2894941818ba3037dea6f48df58637e6dc59a329116b8a4dbafb10d7793889f5f3f06b819c596e719288bc24bbf514d2e745d9284fe91adcb5eec92c5ec134cba4b123eaba5238300f141fea173d5f694c580c76d7cb33b2c8743da7dd76c02afaafbded8833304e623d48e6ec61e1ac5e991a25fc11987db54eab18f240fd3adfd31cad90c145e97ec06e8f6f65ca34d65ef549d9949b3bf2a608b842f5fdd96b77ffb8c9201f7e7bf8dd5a93b6f73312b9c225a547fb4e7cd94c69f36978e54b36a8f6823e60b2eeac897c5578ec4110749f7f6b5cd5fd650b3862a6de3a53ed7cc91e06885bb5cee71076b340421631ed8635a59d00568b3917bb3ead3ef730841de2df2149cd603ec2eef0cbcc230f19c01073a0303572c8a28c66b1ec0562013d9cfe5990f034b2c8d8b1c6b3be2e3c4d2226d0bb75fca397fe03ba7298f08936e901f5f6a1d2c48fd04261f8deb8a69d7ba9beee2625890bd7d77e88b79b1978ac1e5d8808e4d792ccb657671f21326887122f171fdf513919b18c44e5f3737f12bbe749b7ed39f975409e29b73a29291e795a68ef32983c5a6d719e8b37da94ef5ef056918ae00f237f55e7eefff95f0c63ee8c5333c2ff917eee9fd35e3321c3302cc308c5bfd7ffd1f51ebb1ff34a96d87e9ee2ee7a06f2403975c3809573d64f69a79c7396e17737fedf1dcfce5a50e429d6a962908aa21694bbb40844d5af555694d1025398168a9d182396e8a97f9025c48fe1eaad64295c2b1106f7333e4db1bd5a962fa436621e60545b11f4e631313628cfc83ed7b3a9f9b57a571a056910c4845ba1c053e370db614ecd21c35de0cddb5fa8949bf6f982d9d82f432afd6e8951b11fdae6f646693ec2da23ecc70c41238bcd40a0b868b1078487a67306d9397213214a1ad11a7feb1b496c14fb8e346b89e8275d07da0382995ea24d083e4a7b8072614f2e577afbad1bd6364d73e53386795cdbb68c636d9c64890fc5341572420322ba16140761d208bf60d32ad62a34f158c501d0230e2dad681e2515694cae96b006beb06060fae759ca1944a41143d953b71381c8c02f08356b469158f6ef3b1916daf6cb869e72c93bfbf39efc7074ac1c2e75d1edb7f14ad3bdb63f23db217001f7dd09bead9f13e4f5f79f37aee7c3e1ac07b7e0a822fd8f0e8375cd670c073a4fcd69558645ed5762cd1b231361050be82b5c88558613f9712cfd240587b0b2ff9e425f6ca028e2223e437ae2e3230f31b099905cd97b72e51b72a1d302f787ce585ef7e508e4f0549a477c903d8d03ef5cec6887866c5dae7bd13225bf6ca4d75f5416c948b7ef6a5ecb9baa674f5ce6943b87ee45005c0d1158e747a5b2dfdf542bcde580f862ffa182f380f2a5c64461e928ea9ce08d6e56e16ca56fcbdb35fd180f7985fece4526656477855825e3f894999b927514c9b19db19d3976f43029667e13b899cf0b55680fe090d5aaf3f6d170605b20502b9e9288ade22afa2f681fe10719c5a8a90a8e0942dfb7a3eb7a9e67153cafabcab2e7f9de77d3ad685aaaf072390809b939438843cb9dd3c42fb880838baab19b25beb9b1558b857e5ee6ef6f9d59d76c670973d63d3f011387a436e2afee24a39fddce92f6f8e96cd68a5fce190d2c5c7cc9200cbc537529fe1a7232e20f0f843d70cd4d5325e09b14fc4a3e07b372f5e9e2f14792f4c4d89ba89afade372b9ae3b31d5b79ad5697e4a3cfd7880c803d481fee2a43cf0145cf7346da969374e8c4fd3edc7da1b3a430e52bed898d0ef26e8f0a731a907aba6ca5744b790adfbf39210d7f8acf24b3ba2feea05bf9a7c18dca11477c23eb992f4d086f9a4547df60d139f67ee349e1092ab4c723b494dab78ddab7f7d2b7cbd2b758d2b743325939379013277bf8db66c78ea56e9fe366d6b7164eaa0ef52639a7254ebb9225b0e4e384608a59f5a8af2dae14eae518e8838cbb840cadbf3da50d85f7167849454853616d20d5384c953da8c80cbf896d2511225b41b8c42c763cd7351928ccd8df5b3f4c4f726ee8e8f273271f137a2c4021bca6e0daa2ba852b58858c61580ce923eb0a49ce6079264fa8c2a91be7ba14d6139a8608b545e8cceda654af88d7e16b5f48434eb2e03e3b3f87df9d5fb7a83df7f066087e80158edb2066a726c55988a4df3f35e7dd813d2a11daf3b185a50df531a3be203ad89b9ff4c3b50b319c24ad1a518d94281acc6e67521c2c9a199436ef03e99c826d41d761abf98de41318cff85aa8ee9ec66e6119fc74342496343025194c774ec1552066df824c23715bf1fcc3fad00a5b0197e4cad4f7efd1e98d1d9fbede1a75b6bc0b87741811e6598450402c092df11ca833e089cedcc96fd17ffd3574764b9be2fb5dc67766d9c7b626cd22009169d4df63cd06b47a4735c3fc8f7f55f336a6c77fff8f7baeaafff81ffff5dffe9ffff67f55f374fccf2acdcb7ffddfffed5ffffa5fa5b11ddefffcd77fb873361ff37ffcd7ff27d88f7728fff35fd31fcbf0bfd1bb6cebe6f8cf7f6110f487ed5bfe9fff3ab7e1bf17e991fe67ba2c439ba7473b4fe0bf6bcf55f55f79936e7b79fc9fe751fd4feabfb2742f09ecff28205a72ebbfd0c7308c94ee0c6bfc933d71e7dfe1f2fff762257770cdbfccfa4ff1fe4bf3c48b72e75708ee2ffe8ba3c21fa8fff1f00acf32f2eec2acfdfbab5afd81cdc8304cb81da876ff44f907071cc3305af4a7e4fec995b34fd950ea695fff1486618e7f8c047f2289abc7f58362046ef2bf384ed57fa0fde709515b7c5bb35d31397fa0f917db191efb4b01e1150c4c4aee0481188641fe9c64f73fbe31f00f0e981244fcfef878e81f53caff5a23300ccb4e993cfcf96b070cc3f87dce300ac99492c8924833c4a1c33022f2a7ca187faa7c6c99f83ea45233c40ec344ff5e58fcf9c3a80ca0b2253e67918b310c5bfc3361a63f91b56ec56303c873c588c030123bff597efff88a8691248dc94211fb331277ceffe65318456152fa8c43786018b6fdf38fc9fee426a21b84784eec95a30ec348ce5f7bd87fbaea0493500f815c56873fbea4fa33c2fd734e2a40e03974356812aa23c3b0e3f28febf13f33a4a0dc08fac7ea3f43cb7c3cd27eff74152f50ac70fe039a36a609e6fffa9c666b8c315bdd899d5852eb3864fb95d1dbb465fb646d9a92497a1b29303689d9d7371846c400d6fee366316441e2126503d88da40bb5fc1173fabf9beb283dd22a9cb8309c53b3aa7be790e23733f3c82ca2892b02cb3aa4fb1dac27dde44b42cd3abba8edc8b0373ce4b92876b494db900d1c64a473cdb7105a523faa8a3f2e6b530e5558a1c8d94af864dd0a96923819d96775d2d746a2a8e5e4562dd754cbe5ee557a27eeed0f784a93b7800c2c01917dcd18de210f5957dbeef8eec7182e20378f7bc9360d721289d00c668bb247e79d1f5ab512184e8df1408173cd995a8f756e8cc4578d9067c28d01596f805869f86e6d4c4a0cbe68cadab75c2c82adec5a22197ab42b7da0295a8e72f9309ffec144f3c22102f69d839d2fbc15425bd1b115a7836c5ce6c9f2dc4d425c5f3dd8d324c7c4f43b8130c3f1eb385444cf706d42828fa7fbc0bba3e3e09cbdb8a99694f6fc9e86ab43d36db6604fe262adcb5b6eb17b4bccf405ae37b9bad160273bfeea73e2e9ba98b7bb4aac4710495613899bd0d71ca74d7423cc1010033a8f323dc06d50ef065fcf111655087ad11bc6cc016e9cdd16a71ef0e18cb457483cbf4b5d6ed3a2a2bc3b801a365c0ede5aff546b5d543eed0725506da9afbbd4d34d9ce3334b70acfeb5fa26840ae52d63ba954904c2084ec84ff78bf207950e7c7eaee1407220f870eb4934f549d5968abcae5dde7e779a7098f1765a43804543faab9a349934e3aa6abe18a5027083ef4ce27462e47aff609f78f8758f7bc34b5dc3470caee0db31cc5eb6742e5f189bf9808d2c8d4e3458c62b76630aa7e3fc09367b5fd310e41e500c48a005a42cd065a813157cbb079ef462e708c9559ea3a0045a62807f97706c256e47e9f0ef660f65c369d489f4bedd2b8f2626e5b7a4fb3bdab79fbc9d1e4e0a3f9cacb0bd3ad27b2ac982954601fd4e93cfa12848df7eb9d7a8547eeb49b4c5ce3ac6cd72de290af5df18b7f435cbcef970ca992c180beb544103fcaafd941bd62c71d57253024e65dc96f928157cc3c22a6e16346edceaf6c84f09024f4c0faf0e8e42b6ddcd69b9189aef483e553cb562ec9315c337e02bfabdf7dbc716fe4bcad684bcc885cb2722871f4c810844b7bc68c74d0d06c32e39127078fa95bab12192e713b5b4481adaa536019687bbd082b858cfbb28cef3bef15a3d8c62b4bf2b2da9e19ae41e87c441f98edf6e8adc1907a6d8cefb28a2dcfb613af02254728a3077e77f98e291a128d5272cf64a48b410144a2d04495e83c47aa26650be4f7c7c37829e2c159cef2f87c4213d8a68e291a7c8d73b7e0e346954272a9256557e3279e2f9cabdf90198832787d799a483ffc9a1b6a725c65064cf652313a86af46aa09a5d9a421e4329b46f6c17888e94163df268e59184c8d4a7280e496248a522a2d6586a23f293ac06ee75e5ae7b1ddfbf171ab3a653425be76b4a2354dc3c408e42faf2da93ef8d8412fa6cc1a7a20b97cd49cb8196b5b6f5d797d1b94dbf37fd9dfa5eedf97c9f0fe0be3c4792a4aed9fa5942ad24d0a9c7998bd243c207da43a7956a1841e4a713f933d107f4d14f1a82a7ed440348b6d040e7c07cea40b411e530345880e9f8e623718f5f3a104334a25ac54b9962331fa638ccc7c93add1350e8d0ea19ca5b952d12c55e9c6d790903d8f53ce30f1fa915e980fc7c22e0eca54071ad7885787a9bf3758b4f5a651c487db319de7d00af97ed7eb62129d05a4a6483e417c504f073376c6675073b9a60dee600daa0f9f162c9429400913ee80fc0362272dcb582b06a221a28a4ee62e9175081be797cb98322fb330c809f1040defb6c8f9875f1426d49fff6e4d203c81b24f56811ee4f6803951f47404d3e3ee4c65fbe125da8a02a032e6022eafd5ee1d7db3c784464faa0b4617897273937ddbebaca0abcf4664bccd6547bda77fae04d6f7c23f62b5f74913dc046d211b8675be56ae5433b6e090aa7194b105fdd19ded9efa27e87fd765303ebf388f3798ab71fd9d2caf975bf71b92d008685b443f03aa9dd899db419b9864dff6c4ab5eeed4624263eb8058189f71b81146626602a1ce46a80be573e2aba30be6b7831bbeb0a70285a183bd0ccfaa36a40c5d4fdce04f56762343bbf8442eec2e71a15b4cf08c26cd98847f9709aec8f7f5066813b3a977e75eade1958f9008965fe229b54a7f3134c951bf84cbb9af0a78157a58c4b034c0127aa9a3cf8eb9403b84fa60581f3254af06a35dbfa445a9b8a8fca3bebfc70eb7c860b67746844285f84e127e8a47df58da98d3293f261a520aeea92e1aa345622346c9dd896d89715aa949fe06744025d664b3f85267247461411a8ecc5bb0e502cf994c418f8d46344163951bce92275856e442161c50fd02de6f39ccfc618373d164cb5b2b9c22d761c771305de9e5a89ca9bafd6b23178ba65df88f53139040fa00a4033a26f9bb000abd8f0937c4016e7103f180fe0cbf225eb107275c2d601378d20577f4e04624cd01051bbfa5243dc132f6cb76326b2361be6980bebb4aa93a49b648c9694bc0ddb24840ed5f5d9d3363367b7b79c6e997e9ec3a8518a45c83451c4be618f11008def823c12236c02d0a9cc561cd0a66a0b740fdcdfc145c773f3df041daad3b97c661660f8ac42f985efd324a938932e246be6404425adda90d7c7909dfa13e17a4a46664e5e98ec8b183815f84938c4709004b6d9ed07d165e47852430f7636015c42300e143ca5b5065ca35136170f64ce0efb6259c4af0ac992412c6d6bd5c9eff9fc20f73f5843d88a43a6651d90316dca09198356f4a082a68d1163c4b43eb7f9f7405f209415b1b40a9fb90f30fdbe55dd88c0dfc1aa8fbe15539e756419d17d6cf0a7ed48d8466bb18998c759bb4c74b300c01430463f9fb620530d9e9b076a078cdb41f8822330023fe8821cfe05be15e0be1af8699b76ebb6fc1ea45b2d05faae042a8f3b26165f3eb5e0a7083b9d6a2af1e39320347adc08c82f71d14355485829de3ec6cf3642f08950abecf157cf427f3de03eb201902e09e12272142dbd69c5b9f4c050dd557e54185effb39dd4c5925bc716db86867e778a2c3e39343582b09e99323790b05d5e0d8f94b0aaa4d07794a4d74e3837a70c5677322ac64fc159b94d3feeb67e29ae755c6c39a5c80843553d544d9479ccb61e0fca089b08cddc331a2fc0b5cdc1b52d608d64d44273df6f1f26969fdf7b2c9a9a262c4602cbca0b3d46421b5c1f06f8923512cf0775c1f11c1bc4e6dc2bbd91ab5a50c708db41024b7018cfd6bbc4be9ccdc4ed21294abc37752a69f1b329727a38a226dfdc164b1ec6f069d497823ad89850b85425282713c6b7718d0ceecb0268ca42b372e7a2dc5b6bf8ea5d1bf66a155c748d0c7905bc10ddbcc8107cfb09acc78cb7c57c2ee5b24d3f87f163540c83877bec3593765bc2f1b6bca428782132cc2fe013e8dffd1dbbc9f231b7b13177b7ea70d2b27520944e675689d074f1c8d68c2428a5c133b40f304e2694afe8085481d260012532dbc6d566dd4675f354376a63ac0412db4d35e0c69b58a30cd78b6c1b33febd1b90c3fcefdf25b1943231dbff8db653327a6fc43aae33f754eb4e59df9af338456ff8f26d1cce034ab991ac4f6ded09e462a2eefc5cd6eb45cbf90dacff13abfb3737d12899f3a2af134ded2008f0bea32d01c2c6375b0b410ed48ac6d4b3c7f04148a901452981012ab7dd8104484de00d823af85d00063624b0cbea83e5d5c4d77785c9e543ee95ce3f773ccbba43ed64030074bcc152e1152ac34a66cb48e5a32a062616cd9a32752c89438c14356ee92356461d4c333fa1895dd1352241f5bc6191821e2f9d4054c35f10f801ccffa02373e1c24629de79cd4e808d2fbf0f5d43f62cfc0e9285f229798ac84473db7fe94b86290a547866b63807d2f9bb35da9950bbf8b45be16953899e89637af70ff79ef88a327c7fd2195ee9f2444816c088f840c8e444c9a123719c069e51fbd1d64b0ebf53db1f3c5c4813e2c76c8e3d56490d8ed4b73c9cd3e0c40f8feae5fdd237f2cde1c3b8b1ea8c329a5ea0cc44f347e6378db2fc6606f24bd296130d83990cd185c0b13b0f74f0b07ae30754d648993729d7ee4f34608131185323b4f59fed0087603386991c8e67148a196eae61b41fb3dffc8f311866adb993d17be66678893177a663388fd17766acb9809173a6aab99bd10ca6a9b989111c5170fe799f14bfecb04248705007b2194c16108ec191c6fbc684974a4210b9dc0fba50ed2d2c1a38a947f345d27347a81c4514f862bda4946b16a1cdd856883cf9e1ec56f00ce454e6ce212dd2fcbea5ff3c6a75d7a95a528af6f1d773ee03923e3fa3fdbe85f79b4717ebdabaf885eabb48332983de2922c17a97465afa59c8cce03e7c690e95f8fec9869b3781874c717346822cf8594f0b99a60dc1fcac129e20e0cbf178987d493942bc3748d447d4c41d732f6a3b622d062e830e1c9f3fa5fb791f89ec5e8af109d5a49a02eba708248c17f9538ae8cb5d57ef8d73dcfd341e751d50599b6df2010a020bfeec2ebd03e4dd81a6aedfcdac9d2abee104e759cce2dff8076d79ffb6b7295449bb528e222446ce75d3801a13b0083ceeb1ba740983660196743899d4171533f389bd83143542f0913d2807887d7e472528fd7602305a09696a37ee8e568b19d5155429a84649da015a67b2fe775db6a37a0c5e49768543ca6191b1cbbfd111fd2c238895722233d4d6f5763bc2332774672aae755c67a89d4c0026ad6bcff9a9c1f41b12bb3bb96c00c4b5ba9a295dc3a094c104079dd1f202daa35c9595bc237b532688049eb0fef76621c3c82078337669ae74e514b568462165de0b8296dffefd6824bc3525e199ac57e345e90be98905d771849fe3f56be4e897b3796eba9af1288efbcba8c3cad677153b3244b93fefb167a2b12b1f13f7dd04bf0df946085288eb044910ac0c6ada55e3cb7f00b9e0f06be12fd95b3211c36aee5b9c196d8d76cee3f5d3ac849261c5840ee9fcc592ec415840e9a97010a6e4207807bf1d0b2002aeb0b9881b9c58e978e899c95c400ded7f303d57b5c562606f2e283efcde40344801c91afdd45a17a396df5d288e5999b914c8bbe82c68c84b72200ce7ad51e94879c93b78dbf61361c1be971399851a172e5ac831d8fb147dffa544c13de7a6faaf953f22eb9137a4de3f309cbf059603f7a8f2f04e101dcf0efcb22c882630db456913fd5c36af4c99cb5f75c4a3e5e302aff12c21de27b1df7ff7ddcc43bd8ab282a9478be9bab0abc78ca9f41d4ddaca0e4660905a9aa083772ccab741bca4373acc210c5ae18b289eeed578a8e7ca40b2a4408f96262d94e6afa9f9507f5f9b3fc37abcd90d063a9dc322fec759ace40771161939d68f2334d0d19d4f8935fbc09e8f2adfe565350dd1cc53bfbeaf702db7b2114ba97e4d6529d6b3180b0ae14d69c7a841d9383b6e60de8998cda13cfba954c661d3d20946a073fd44bc4ad37754657ac8448e7dddd5b4c44a12826f2c5558e9ee470211516ad9c15b2be33c31b9a227bdccf7bd28d00a187f5dd4b6c9d7cc0004b4d253f0177bddd646404f8277f57d96fb5eb57b363d6957c05bfdd13774522f58922c09d66875cd28a5811e91015c82c4c3b45845296016d8c366762a1705720064da2a77b7f80fca7e8955f5f812a2800a7ac663ced88a692763dfa29bdd1a709bd00ad4d6cd5670c56d6dee527d9aba937446917018f04bd0f4895cfab700e70e7af6b15d559241c82f314464047b32fade14d25f2f390c193b603e33602cf58faa16694cb239b98a46876833b1938748c84ea95e7ee26fe1d7b38558e6105d695b42d448026112c4e669e8c0382dd478ccc3429c3b47579cdb5d3acc9fdbe496020cc5588d2c070bbcdcb90d788699e47ca02d3e8a739166a10417266d74f06b0a1fd99929c5450e09a033dfdb63157ca3ebe3662d0c8baeccda1f3d7d170cf2e428c562c257b033fc5e4533482251b5d2712545b710ab6c1446e0debb268e6d96a83895a2d8d6404736b0b2712b8e311fd3bdac2cffda48824aca28b4b36bea541a4391cfa3ca6143a705700ba8a1ce8f0baad2bcae11a0ec5e363ff0b9ceaa9b41cc27df0748cfa5b8dfdc9eb2aef946f43a071a082b22c55ef77cd4e95ad4c9ab76d24a220d8fc4f334c852c27ef5213e67ab8cace8bb79160f11fb3bc47219327609df6120f5d8511d85bc80b886e42bd7d6123713df173098ff8860ffd183bffdba8a5b46dfdc45c8521fc67243c3db2345ccc9611fcfa9e8c5db4f072b707f811ae97af7dbc48f0bf4dd0c8a1e1376c788b9b8a0acdced3836fe05b0f92b3c2b7862263541c957ae06b62ff8a8f6f91222a13bf637074b2f6491628f680ea4df88ce86e6b9611ea05df9e1d8f16bdc16c90e21a52a6230418f2455257bc2fd9ab68926a231faccf54d8a24386834a5496d6b6a003c3a31934d70a30583d41704cfca8bf390e4443e9d248e53a24f98a633ae816f93ac738f26f35ba5dc629101ee6a98e3a3c861b6fad5ca04b7ad6349f5b6b0630a3668cbc6a39ebb162bd5f1b798d5f7e15bcf90e197f37032010ffca2655777127dd5923b4e154459c3931a3f095ee192c6cd386230340d4b82c86a05e7d74117bcfc7226baa385d2f24448c3ee528d0f911f31737b92710ad7aeb59d29805e28b4453bef07988d816f945dd35c656d13a9a6af6e0330abc22ae53c9152c52a08d90a18ceb0ecc1ee5e84092c29b7aaabd105acb6a3a24b08e98b51c7817673e87d8cbaeb724ba919e0870c99b7c0dcf723615d47a7b571910f20008a1e9703985f3321d37232f96ddee98d44e15937c7d05e7e9529774be1a2449181f5d309391a9f687b0ba73f0684f55ba028b97d37d5de492ada131f14171dcbde24d01e0f4ae3c700726a1c4d5899f0b1bdda0d7556327c39e43ebfd24b6507515cd6398664ec9111acd9d4f6c9cac85ae8c290c406e9907ff60e1ef7adbbec3cfc541cac3790c8334e8fa2ef1936315daa428c4e0824f3ebaaf30ca914bafc0e37e329e2f0a797ca8313363f00ec9999807a555da337d9bd7b7fc4152c6eb0a82ae45237969ad0cbf6750b754b6ab0174e072b5fe3703b4e0a7c4422f742d0b44ac962f1074afa76b06f9c01744c073b5f4524dc314c8355be1bc4f09057a9e3c053175ce151f87770a1d4bc1c807741e2613b76aa4034baefdb1fe243e264b01499bc64d85c04183580592493f0fc39f6b5888b76553ec2942c27ad6433c46b88b5a4f9c2b062a6f5bb3de65b7b9a30bb30afe56eec54b3cf7baf56dfba19686ac6730dcdf9dcd26ad28a601668b857fdb54f7fd5213bac0bd2ccdc5cd76054f379c302defaae33b14327b16308983859b28051320fa57b347b9e936ebbe03c264984a6fca03b307ed274ba3d1bb411b3723f7673c6860e6c96c594137f9207a779bda39efcb4a206b97168a6a815bb4ccc2229bd1820f65e0dcfb94d40f885fb8f1f1d43d18c0f4e87c75e29b774327b04e1f47a518f92c233c949ce4c04cdcd61d57b9387096115e3f8423425f359e7ad54c5180996c47e701c436cde9a9c1d2965ea240b2c1a4fe3334495661d86c1d8dfbd2c9c76d41b98fa862c3ff557092644a1074fe3ad397f02c45aa1c05a88217384a18a5bd5b448c2397bdd08e680b0ccc7db8d36accce9f784a97a473cbb6ffd04fe9063b8ac9253f4deb55cf8bf203f201ade2699df0100b0b8bcb04cf9457290e480cc12c3df5e8ebbfcc1202d7d6d591c3f3b4d41d0a3c78ef4d870b16499aa5f5a7da20ab4e4d780c29ad46da623a2c9bae5689a1b5dd31f3c0c7253bd988931667d29823a901db8b63dc5f61817bb197f13da5f2dd594d75a557df7dc5088428c48024952eb22bc60015cebf2521e4fd92fbb5b11cfe86725518398392d2e79acfc0c399d5b824be942c977fd3d793acb43dd6dc1bf241a35867e961e642c5e2c1ac73cb921538c2131d82bf181daedb84ee23dfe4aa7d8f1486deda5515badb73766c0b88571f3145529f3c2533c1bedd6064c5913f3e9f3523bcadeb2abae7b5d6e24d14441f004679b74c1b44b8f897ad013a51b14d475b87d1a20eb86cfe96a9578c131997457195eb0559ded5e43a60ae6f0fbb14e24f3f610cb68c4631f2275e15c3fcee0c77de6f4f0900ba3c3da9c042bcae1463fe6ea7ad7d85be9ed8ae6e42516fecd6167bfdc7ccedae6714dcafc6acb8b86ec55b04959901c329b900d24837d95c1671bcd41e705aaf1a62a7f5bb55e5d6f6fc109e4966c04613eeae9685ee0761eb07d4dbcfff15a6ec214e1b06fbc87bcff81d344a5136995866eca60b50750514aae7b04c4975f00503d185bad183b563107ea1e370093e9e698b2c5cb177ce6a58bac644490c19b79c0164b6f6b64ec18ebdd369a326aed62b03d678cc97a268b932aa6c32896f3130611937ead080a3a67340d7df376ddb0ed060811c93fef0c515807a0688f1c32e763880b17cb879b5b002a02e22925bc2b557ae3cb7bb2416e7287da10772f17ca2cff6ed348a941bb1187fc7e2c35198bf788a473eb0711f3872dc5040d7728f082bfb8c7b6e26dadb21f60e44711a29cd3cbb7e57819f6cf228ff9b94b1a26821c94e668b28beef27afa7a585231594ceb7a6439feb05cc31b5618439591fe3938ace6da53bf4b44bbc414ad140fa0e9dc9ea430312e626b5b13a48f4bcb8a571eaf0abcf43e4341f52aec0ba6f1421d52384d631b7c217395e4e2d23e0cde28c358cdd061bf63755fb9259842661f5fbcef33147ed2a821115ba6091fb30e87d4b3bcb2bc1a3b40bd248c04a50e7b0a133c94a10ef73914dc7036cc06e1bacfa63a56d7e2cacaf18eef8c22f5042a5d1b49beefd04ce7e2db6114f34d63c5131e0c52c089b35b269f7b3ef9c3775369c18db64e1e6ae82488971e224a81767f91f45dc94702aa40010add899767ba202003433c0ca9a0e808076f31a414bfecfc1ba986d524d59964b93d61ab69f66517de24e21a50982240bc06538f50595c0fdcb3e823896fa5e4df456110dbf1cfb48e8c440b0c3dd0780779e6998f78b65eeebe44e7a75319e58e73cd6ebada46b5a7bab158d785ed9998db6bb600f714fd404627b88209abbb92001c3675e0fdc71ef1d107bf969f88df891880bb13d0769e9563c8bf2117e3ba94dfc66f5c347ea8dc46fcbdcd50188500aca8bedd4069d28609b2b252438c81f21c2b642f7a9d6c6e7aa05e9026424bce521bb9d0a6210f390340878a4355477164927d1a4c85e14794bbfabbe44fa5c1cc14f3b5b7a4c9ef3b50c01b1d704f980b97a860f1d961b13b310707266fc5724551d6ebc20b0b66fd9442b1d6c761d6be01f70c3fe57b990626f375210d98a0abb5102dea18aff622523cd1e783949742818a6d38be9b6686f1922664f50bc4924c6f5cbbc0503f7679faaae994c8a1bfd353c7ef1b70160df3d00185483f3adc14687bba30460fb8840da28bc246208c3a42b281c1aaa48b08201b8d7f3e872b6db1a584a9fc46a51d52e487df126186f4c0b3692a3c6c1b9a8dbb522947dfa775f46ba36587ee90a51fca4478799104e9e36313235068b7472e1c4021b947feca2ea196f8bd0a2e37042878e1c155f8ba9835b4c5cf9f0adfc64e9f9be019f070f8cde40e88f672c6840eb0dea979534e24db3c36d547354862817e06a1a421ec8530746ddb96acf5c7c9b4fdefeab337e2561973c007bbaefd35c6b05af608557232ecb988134a8196ce4b4dc4d4d9632995fb24beb48133bdf2906fb54a31b7ec3c4abdf2d6f3934b7976241b7d22bb01c8efe635dad152ff0aba88c29f245002d9c05422bf53be6b402929dddd77c9246524497516c85d390712118f6ea7dc02717765ca71b6192a35671bad9b7a059e2f12fe3bdd28a6bf561fce3298d75212acd51a6f6bd1b6b121e6a1604a34225f2bbf0d6fbd15bd8a50503d43c85c6e76d3eca2463fc8abae0cd6c5bc444038218810501688ba9bfa00b22519751f84589d9e5e9333f8d675219740493dbab7ad6f59dc03d3b457207755e448da3ae7397dc74c2bad3adf3144b5dfe9dad3139d1075dfe262962d101d1ff909893f4902cce24f93aeb4b830f1106852d83ab0f6dd5bc07f0027a6ab725d8c08b355a8dcc2e0776105e4fa7c07ef9ce25bb1bcfecf64886185ed255ae9f1fc51eb5845f79c26190c90e7de36d40703cef5b2332319d7bdffde9d5c1002c23bd5f387715d1be17469a8ceeefea5c0ec098a3bd3b41f1f11cd9b30e1cd0d25dc2be6e48aae2e6bde3408a43b364d23d43a6e31aee7112c632905304be250a0f92a28d4bd4ba8399ffac0d4549ff21ee5dad539cf54ff93503ba65bf67a2a0d3c24754230a87f497eccc8dc2a4a6226f4f2a3215e4591d38b5cf8fb1c95d668507ddafb39b720d5af75a485cc4e8745f3eaaf3a4871fb8109e42ea4039bd57d74e345140fec7bc64cd2e4370991669cc6f4d92831a2a94bd3998d7c450ac028fa7d8b2984a21c2a28891114dd267c9250e48c901f00a6d4851ef561694c5fa8f069d9993b021cf3011e3ab16f0cdec619e63d374986a8a579215aa917095aaaa9617ce78e2bcc8e1cccdb8f935c1e6aeffeaeabf9e49984f831b542ce9cf36555f66e55757d1c1057c4861b55a596c14ffe5473a482893aceb9bac1ea89a65f009a4f593c0eddc4309f3a271cd0b82247b47dcdab4d62eb84aaf4d8443b8c73de333d84867e9ad3435de8ee77b216e3e28b970b86c3cf2b6ccab33a0ded4f37d7c537167f4ba0fc18256a7525323fd57d6276c7810bb18b1b200b9244ba2a26083f9b7e25fc6d09f643f582805cfdf0a029093e9aaa82b1a667919e08b8b2945f0cd3189a1eea8cd886ef8434c0c93b3a9227ebfa4560527cbd1cc2793cf4aede13cb787b9b2ef63ded88317ead5c9f86c0a837942a5313753465cce1cc5f3fbc76c3c137a16f8d1cb6446520e6a79b4f68dee6c87ede5896b7924f78a87168d0aa977d109def6345e3aae2108228a7fd0aa6947229c88f4e3f22e5590f747c613390d80618d9684b07f11200b20631cbe98ddade2875d0cc3970a8cc778aa21d79f4987e75ad8a3cd36c4f734ef92d631c08a0a5f468833c15bc85b0353ef28cd483393408a257cdc50337a5c8b344691f6432358186a10a20fd3a6a4cdd1d7608caaad882cc591f94977bde41084c10ac4cbce454089df0e7130a8ac65f1f8e650947d20ff5e4988c839278740e130df7ef34cbfa59ea6bf32fe7938731a24f01af6404347cacb231df2bc6fa08f62a833f3be143e0b8f532051262bf72e42a8c1e8acab4d17cb23c6292768b34249f7bfc98099d7f953400b68e5a7b07d11389cf9c2d2bbf92f36c89921e414df39dc3f65c921a720145d620cc0f07cc664eafb6fc15f0ec57edfeba4c021873daca676f94b992cf286ccac1fe484219fa69c169638233b20c38fce3dff5923f9dfbcedcde3116c702cbce867404ab953cc153e676254c4d130951c426ac99535da486d24befc10271e14955fa2fd5167c5ca88e7da8d6673f0180fa7c23be6fb661075a5a88a0ac85fb686abf92f2b6fe0c5e596abf17ef9ff668bcebf257bec99032b0deec52429f68bdf0f96a5b77f7a16c5669930594e938f3834d6d022e2ec33023961740ce1e73c938ce713ac3102cbe63a33aadfa49553fbcea104d068b7da5f8a86a26206bc613ceb1eff72ba49296458316450b3fdcb88708934d0805ec1442f3f8e34cbd2a64a06bd69325a8504a72ada82791894749c8807ba42aa4f54cf58136465ec5b001105e4f5330e230385792084b52662d5d0fffc34fd631d4d1305bb3553d1ca5dc0a2f412a21ef875bbae5b6a9c3ded047b0e97e2b13959a0ce4120acd933ee152b0cab915f0178befce718990323db6a1197de93724da950940e64d063ff3aafc0909ef4634c329c96adf0cc6857ed59657188149a7744bfc1123350e7b248ad0456f851b96bbd751825cd9773e27d248c65fd1cb82d17c71723b982ea85ec31492d0457d8130ba394d044dfe3be891acc7ab9381a45dc1311bf522b8d3df9005871899fe10d41aa514eb32e3524fbbacd83f6ea3c4e639e98ad1c02e131b95bdbde8543bd18528a57d2ef6a91dcb97df0810195cde1b255c4a68718aed3763a8e77571876683f94efad45e2f318ec4fbf2c8a717ac47bf9e367891ecb1a0952decfa497a39aedbaab02a60d12fd6c1a38b0ae7e42df476bd9d9d56b84795eb0a9321d865d300c96c4416ad5da81b51a2a907826099f1c8411c08d4f5186da779a28432f413b02304008c3a3fe0582243308321d55cc68445decc880083b87bf265ba9c43c1d29e741ce7323896320617723df2c57a451d2a0db75314e16187da4328b707fbce3f0e1a80b2d2978e1f45ed3f3753df09ac2e8bdf00eda22a1a2b6dc2281c6d8f4127691187a9e489954958a389fd13ae4e73d05b241c95da19a6a208f7d163c209e73a45997c57bea128368fd4790d839637c57e5b1ca63d660a9ba4cc96f580772ff57927350183e19feaaaef7245e62253fee0dd958a86944e922f6460934e165b79dd14b5e8307ad3a70f023057a9a467af36a61abe4de97d40d9fd883a2690cd9d95b9999485adfb58cf226a01e24a03f11bb4a98918f294c35fdcfa6697e9097bbca3c72bab5f84162ab596264d3ff3125087ac584f7fd87ed6dfadf43ff0e13f6a99fa662ae1aa5890dfa6f60810c34823aa40f9dd176335003767151252cd45234fe6e1de3d65270a3330f64e4616b911efc5836cb3f826e435c7af3e65925557a5cafb0bda13b9c7713013cbaf95c51e50ff6e4c9702ce9f01f55266b00acd1d9a3fb0d658d2a3e53c4b5ca5f15a12418f28e69f5ad603a70294304d5706dcad600616cb8b75044990bb44870f8da796b91a9756ccc5aa6e70b174f1a5fe48a31ca30c9bf67a200918c7afaec820a03ca28d18d973e2179078d80e261fbb8c791661cd755fae78218586ff510f7ff34c628da786f98ca7709bbb6ab1c075c73a9b69c478e6e82758fe1c35d9ee165cb4b4bed550e65f507d96dd27de827550f61705372ca28107a495fe1b1996d8fb378f5735f7ed714c3fa34e23b5e4aa825ceb3c356a4eaf9f5c6aa75adc5008b53279a261fde04df9fee835c235904b28581cc1982a6e092b6da99e4af8076165d4f30edd649da9623e24c95d292d8089059fc5584182359ff16c39e2542abbe90b58b5d16e657e80edebca7f5ce11809d8a19cc33cbb082547d18c1f79b598c4c8462d3616b31a9bcd9cdfba8e30939101ba1760d8035da93e7e5efc488ca37ed7469c08a854e229165e226b72bcc4dbb7d2ea1b88db4a93783257d5aa82d95c916915ae5c4965c479122838f936deeac924ac49c37ac15ab4f5075ca02d8ea704895b2076a6c4b716052718d47e356d48327ee647dbe50e0d1ea5cfbc7e98c86367b9a417d37276cf52c98d9f43a04951246fc470afac0cf140370749a590155e456d5b9e32baac7e05e0679183e5806ea7a7b88c00017d620e7831245d9528272c5d30c1dfbd8226befeaa5c8b66e6d59ef9c6415fee2ea7737018593fec80d790d1a09b3911fe9d3fbc0f1faaa5b5619dbb4ef0e901747c4eef9d17a626e66e990f8cb4bd07afc30fd3f1c262f023a9aac2a9a9c12f85bf6499e2d1459048bae109c820766b75d406bb83b7936ed8fb941432dc0ef66f76cc76c7bb8b62718d39302c424d18137c948bec9e4e7e30f42e6b40904a1bfbad7da517157cfa66db319d49ac61b849c3f0933c4f99e65c097081617b86439b53408db86a0a2ab59fc88adecd42741ea359bf288676bc7231e31d9041d7b7fdb9beea68c66caa703f1f04f52bd31d3310fef60c5c6ab4aa11d936c4145c587c1e1d839edaf72b45a8b82028dc0a7bd3d62b734c060e87dcb295ce528434ee1864ec8ed77ee26fa142ae106d998f705722279bcdd098339058672448b6649b52fcac5bc46cb5de7b9ee9747e0c5ac370e5838acd836193efd61f54c7c7f62b867ed4ab9186f664e251bcbb1d1b4d2bd516037f6206744922489522b42713fb026f0f7c64b043eb05083e3da9e8d0e64d2e142c1a335e610b937966f3c55102d65626aedd13777da6aa75014fc11509246293a5d8ba3bf2461dbf4ae2e84fec607e79b45edc73cc6e3a9c5643b35fe362ce3223d539f67ac20b9bf4468acf34295cd6f1f7e737965c91b4b969c035831682660cc85c23f69c749eabe2c59e4adaae2b50f9481fce4371b7eb1966786b160b5f4b714ecbaf1f073746444d3f0a18571e7fd2e5e7867670f74c83859be99bbf7e9bd442551c771ee96a183a9aca740e5fb4fe9cb77a1bbb37ed9528434f4dfc8836db2fb4b259447f3488d4eb2fccd075a44b88038b5c928fb0504e0426819a480cebf552384351d012f0a14b507c00c9e42d7c3025e934d1bb57b07e7a36d5f003e7ec942b266ced6d921b737fa34eb73baa6b88937affcc2b8fc38bd905a3adf2da638c4918255744a16b241838a0cebd653174f3affe1cf38cf6b0ef4cccaf3ab506d1c5e1068d8b28a83485c04d4a563a362f10b7ebf804cf852333262c40e294a305b3eae1aac0921669b0e0370f94ca0661ce36bc6964c7912a77b8020d06cb608ae2305eb7e3b9ec47783788a10ed47e729cc677a33f43f72a9ba329837bc042428c637f3b6c28f601892862d2e2d7058e9db82db461418feeb60f505888377b8761112e49d320dc46695a00c5011800a5508039da475845bc5dff7a942f6ea2539d7aab2bf6bc28f11430dede00b38567070613a165fc6e4666023367e534702df28e789e5716cf37b6df7206ef853ac92defca9a1e72896669e5f43762ba761b1e845b2ad4aff77ac133f4da13a5ddb903659234f92d9e54122c6168874e4753d21b4c3deeb64de7180d1b20fbb217284f4d50d453407407fbc0611f9744357647de76fa504a0a52626ee1432857fea4b06c820bbb03d946828a3aa1cd59bff63747c0b6b35ce9461a2a760cd75dbd0e1a43e49df846368bd28c17eac658112bb5e94a2f17c7ba37d933819affbf1cddb5b9a5000044e18208700b71bdb867b8bb53fd7efbba3833c9af336b4251a5d965a5c8ed61c46f97c56165b182dd384fd1997c5e659df2764a1337c5b208b4557a891bfd4217045c605da8b5f0dcba4c4279c9255bcf31cc1d5f9b4e812218d8d23d84dbea8a818fafbe69dbec49fdcaa5936d64f750b56e78282ae47d097f1b173c38ac289c21c85c2d26dbe602bc745ac2fd1911defd423f1a267e0726afa0178cd6d920306894a08b12be0f437fba0fedb74fb34c3da4fc3d05eec55260ea078f985dd5599e4c9c8832460e2b00f6d952f8fb31da7cab8deb14f96cbc7efe1b205ffdf97af2a3864680cdc0e729256dea35297f83dc991d97e0aab8b1c6b43a37c8d5460c8fdaf062538eefa766688c3fcb8fa0b5f95ce26ab3a2497fad61227a2d12272087963095c5348e50174c5add71513f67c257acf441d02dd070c34f023b4e1039c30bc3ba7a093f6fa1a5ea02bf7747f16e489ff857299c504d138009d97b13d6357f903a5fb88730f95bc092f7f94cf2a6a42e0dc9a4c0463253dd6feddc676dba40ffed3ffe3796da5071404832c6e8bb33f9cec5b900500fccaa6b4928ef5e12e7a91471c24425ace009934f4d006b2798a648fddcd33629e6bcf1cba1ac92fe51f721b990e5db8b262ed4b8fa9f7998bbdfcb435a20fbbd04690e7944118d94ea8adb8fb2c5f528248b240ff8228e0d8699a21d68f38282ee1d93127ea9d1a0442cc301f3c4a5469dcd15fe895b779da9c3820824329a4ad4731395f0cb10af641ebf918b4a4dfc72a323afc2a94799e86105312ad316247524e25fee47130e178845d221402c5912c170e01671c855874aff44181b486f00c6ab145e43cfb6da3f7bb3096ee558197d4bfa4c48278ef0551b2b8c010415f0b34975a8dd3d99564766c7bc84ed7c879fcc66705015101ac178f86b66a519c722862e45a74d788c9f29a3ccebf2e1f9475a100d8824cd7401c6f6a0b46a91866c46c44d844e679c9c512ab7910e3022f581c8bbd3e5dae42ee2b0545cdce8ad26e44fefe31ef3e1b2e1594eb3a5c2a32ccda7f9586fe2db57dfc50f74c0f857b5c953ff3cfacc1cd6187e747c34f365cb97caa18522dc349587c89400d470df2f5c40045825044c9e4721624da1b63041ae1b8b1c0f2645604dd6834762ad0c58d0248f28656c82cc30182e948518716513cb2414d1b3a84a7e0488d75e378894861494d9e6f3920ffc4531fb2e183b5bd4163bf0b289a4321ddc58b07ee25501e745ab376ce0a0f2e168255aab7d83dd2f9d9926992f7f3c0dbd6125c8d34b85817c38e076b44f0a1a2ee254264a2d13d215334706a8719d32a4348cb5bb6675b1248d332dec661e1bb778e1bf59aaf21ed889fee5950d6be5fd40bb5eaafe08fbedccecd1f64bf0825eda414d229137dd2da607362ed4a16e5e74a8612f8153f7dbed54a51da4f7f3bef30b4a1090bf0b9ce4c8f26012cc163c24c088ed0f596d51b71bdb09370088262ab902cc2a42e539a3687057f5365f1824b41a27028b43cb6a08dbd6a4eacafacf3ea1c4cfcf1e150c0968b6072640689598ca8e37e79cd6cf82888aee4fde391442d32b9fa4c1737be80e1930f218f1ca065002f1418400c1786260aa5920d286e64a96917564f3a98f4970bb8e5a2ae9949a4a44c5840928c2bbea8e688cdb5870d27af15b7454844c96bda16863115a1b3a0b27a9e62450c48549c766952113e81dc92c2f2a3c5eaa85ffcef2e7119aac5497ed1d334fde93ea265dcaa6de9ca5a80c90f894c3ed6f4a471a5703a8ed1fc9aff451b93fc34dba0fa14b5334635d5b66bf2a7facddf2e91a8a1854e5164492c03e6e1d00c6601015355995c6859bd8848ee748af09793fdd70e3b9ec55ee4b80db79c105582657750e6250e57005b8dc4beed56ef5550d5ea735a8cd8fa6f0da016bdaf632056123d1319345518a785dae50f8a9e5dc38b67da4d1af275a816ea345390486c2cf6464a9021bd939ffadc7368f1e0a9d2d99197855022cb380d667c23402651e791b58cd9ea8df5fad4d5100ba55da1eeeec95f06ecc7e36a64d5933710d0899ec3407f7b2078c671ac56b374b1733b993d948e3fbc547f429abd79a5fabc1aa78a854d3ef24e19748215b05987c1bf67e5e547c3285b6163d0048f054c65ad502435909be4966df6c1fb3c87edb3c303c64a6e453cc3719d79e0c7d385bcb658f82fe3c64ee92632fda214f419b21fd0d144db3bf499642befcc626c27a0fa9d4ea4475360e8b58ae85856840936715d211f224007a51d2516f29539cb7a1f4687db265d19c98008e12a81e723a3074208eb085c607e60f9f8ba809ae8f7c50f35d92bfe4b1cf36d19378249483929bda4a4c83cb9b5b6cefdc8a2cbb0f4312a409ac5f38100e373240fae943b98d5136de3e2e09cc557c81294f6b2e783c12f7fe516cad1578a644541ede438b2c8df6f6c34cfa464382208c5529dbe904a50d5ea5f2680a9676534912c015fde2c5ee74829edee47e2963a9813d9bbd21de5ce02af5bdca3018151c946fa946c9ead48c9e115ecd46982ffd20e96388c44bfb81f5182f8e857e7bdbdecdd361e6414062c4b552bbe5a0d19aafd38836cfcb84674ad36dddfd696e2de8d55369de592cd67d2141a904070d8929305ba6d6b2469a0949fd12fb6bc7e0b0ec4b0756c68379da6958d4624d9c335a9ff45199ee973bcd8594b3ffd0ac81c86931f3a012224e8984df316ff6b5fb81217e4273095cd8d997d8f48aa365c2a17cb9bb6f1835dc5223783efa39697bc45a35088eb2296baf15ae55ec1e960fcae50c909157e30f27fc782d519221897ab1b6666841f6dc838dc73f94a268a0b41ea2cc1519f96ea342e5ce0b007a45c13215ac6d6d8a02acbde884646c146905f36e291a0f5c8735e093b189e1819796dd139e6ee89aca5b04e9d8a014d8bad5a214ca5f5c71f8ad729e6f7fe226a01f153bac76689e7597fc476d2b8ba56a280f6ddece77598fea7327380b586f619b4724a279f72dfa1a993a5aee7ac98caff1d3b7ea77927999b17197289675b438067af823eb10019c5716b57a2262b712b9147d41950c92c3cd9c55f3d646b2a80336d31c53565376bafec16c4122bdca7828aee054a24f08da33247a812050215697dfce619820e75064cbb24a238db7f7b89743408b0dc823566dbed7d269a583f7600e569cf6c48b1599a76479ca748d91b57147419fdbd6968f5782082a7d0df9e082313dfe91aa37ce2135fc146b4a3537e56fab067fda2f067f0d1fe4c578cfb341b081abd772d90266968e44e4738e90ca4d17ae61c10e3f7581064a0a345371514946ed8b89d63e0f10b24a9bb262a511acaeeb5a2c43fc80daeba0479cb69faaae4913da98e848a091a66267fa8ee4e9ea63786cc2c6e9d8b44fd4b4aeb8d2cf3aa3c9653a72294d9e7205bd3ec426e2ddd4c9f95eba57b99221d1ff541165bdec13428575454c7f677f9df108730916701c1f6b62f5ebf8b58557603674767b09536d34e826798d3ab614c66b88d2ab9e7d998506898bae0707b3c7e8ebaa901e8de9c96c5d718e5aae7382a9c4931d89ca6f435b090fdf362cdee4772732638ef6709e3552bde18d24f9d5d8c4ca1aab419831288438d7dc663016a70813b39661dd951a64f8215dce276d5019a75cc7a4bdbb4021d6d576441deaa8aadd33667014f46388f7a4a3f3c7842633b44d38d85f9c5824dc25a579451f38b2c2f769ae4c2feb6282946a5628398430772923987e90138160c3a0517fe89177e419ecd0b919ea6069c9e64d3826c443650ef873aa5898304c4996759a6e105bb9c96cfc79395ccb6317764c110a99987dc9ed6fa9a70f266210dd814939e2ea71aa34e307a93febedfc717c294f07a4d3cad163c913d36a92bcec3aa47d9404ec3ec30b4c796b56fe2dd35af676dae5c51dc1d5355d8f00c050a6115250f002a42de4e375fd669358f9d75d4aab04682742400c8e52001647c40f1b1da0fc40bde901ca75f95c53c48b0d0a54e433a3998566f9558f9d4850246592dd0a94c7d839f857bd7047027006586e691fd39774b2874fc49db84b4324a6e939385497bf0e3419780738dd329e82b47eb9ab99326a697c8dcf19436c5e2378bb2759038d3139d577f3360855a8cb71c46f017f1e1cb6a5b2df44272e8497601787ccb3582c5a1833f63e409dbd7dddc6f62b6a152f87b3e7e89807bfefd09c457564e444fb1f993280cd92b14423cdfbcb1653597ece8539805ee01d80f3dea116ea862c96177a689c2fbc1ac05a92694ef00cf60a210c4076274b76d77aababe70f23b301015c44618d5cafc1e74a06ca602b5eeb3e7e4e32311f155143f172e83077640f349f9df3231479bf89b9f97556aa5527941813d4550ce64bc94343570829c3038ff49378c173872443b945705375cceb87308948fdae95be2191c8530a09220f3b66baf4fd626e20a2e875ed95c83a0ff783097c3ce68e4bfd75e49514e520865490a3b4bdbd37ef10da60fcc21dc19ddf37d411085552f2b89ef8f6663b790e333cae6fe683516406422d0f469cda01601a5e0e0fbfed21a084fa0163be9999143594c52515e94812a27650f9f9643041ed3ae965aa5e90ebb6890f811395020c60d527c40b24206728e4824a96358ffa06c8656e94c06a7c349080672b842fb8e62851b9584e95a6a957a53cc2474e3a54ac4e2e7942c09122919539152cd3d066e50725952c7482f305fac56cfd864b6adbf847ba5df8131274d01dfb77681ea54b0f29162ddf25218ae89f58d6c5c6d030c1ac021b989ad0547c18bfb2f52b00b736ef4b3736f853428a914d49e64713182b5bcce58132c453830915c348a80462cdcb84b53be23d6b17e9c4e15548d682a8a181f235f79c0a666bb2b06733073b6c020d1bb7030cc3e526df15aa940257dbd849d86315c054ed4dd50b8d999721fd50986a569ba2f8f3a71f49517df57e16a90b1db314e643a6b4cc0eeb26c62b3f2dc34d1d293e388c75441daa55996deabe0a3108a839629945460dd44c0b0eb6c53475ee5a245f33ea9942253de8cb806201b2b23cb9e4629c93562375475283bed0d52d10b96b713f47adccd82185cd9c1921f032655f9c2c760b17c1f5c7e35a164574599a1b5b21e8765b850ed2610975384db48d4def38e467f2e09ae0b644f9daa8706c92d951135ba372040192896c34280f525ec0492783b4efd53eb3d0cfb92db46fdad93b323c99f2d85eb1b7e738b206225387edda8b90c6c6e6b0de4ab006e3de9a5ab15f4c9c3d5b01d2e4d97596533b33b8e2900e10504c69276a7d01253bdff3960a72be29939630fdbedffe2b7ff54be6d40fd9522728ae6acc00520f138f9e7fc177df799e751075110906d0649f3470d2a843f4239b10413fb87e1d7a477175e5b0e61cbbec1dbc22e117a6d21a53ced3518a7dc600fa04ed7639177979a31f9475f7a1f3389dc246bdab77fae98f2e3147881d09a7f0e103b7d47abeb86acc1f395002899ace4b9a5f649c7dc15b112810955244892fb011598806938acac37b68040c8146f640e29ebcd339eb0dbdc502d24f979fce4984f5a8e0c5f39572361a808fcf39b86ada5dc515eb4a9b5063b3cb8e18ff258a107838922703a422b47d8384943d0198db7d13c8f83d4af7f4e0a40bd649252f6dabd1aeea072b7d5584410a15f7c6a2ed20b175db6dd2edf9e9d68fbc6c7c4fd465e72879997490337dafd2c80b62e2a5a0cb1af1b79cfd6ad7b9f013d6ecdd952f878db9443237298df48221d2b66c457b2f4b39ea7214aca169002e9fb5973c2c3ab89f14ba7a04e963759ada9845b9ec094f291d0b739a1a3a4500448ac7a2d9bc278655ac234193360734eccaa97403952184000e5a621ab042e1f351874dfb8124ccad2046d3c591bbf8865fcd72624a649ff580ccd159b50e66e663b8dea996837dc63309539d822c7feefbf711ad1c255dfab34f2540a8541a961c6a3d740fd3d0eb91e76efa8d249f0ea814d259dfb49a0678a109da84439d8ecabd443d614a8f3073b600c05565a0cee56b6ece3aa50b6b817be9dc5b062340140c7ebe229f12ca63a1f09e20a68387170bcf8cd4236535b61b3c67f66449d178eea025fa71e0a5ae3b8ca5273c628304e8d3464979c581805fe14b6ad3753abfa6563ab741c355b639fa1d0697bd4ceb4e8bb661a2dce10582ea6c5bbff124244cded093bbd57f51e42381419aa9e64a034b0bc78aab9e83e4c0d15ef7c1f80f947e767aefcfe6c0f8e56be1a3974eb11a64b1a19430c913c046288a46f2abed553532feeb3c809f176700d973857ad300b2dbe2ada7245f7a9800cd682cd3ca7aae38bb73a8b6b6b8f666225addec2203e530646aabf3aba4ed5373856ecb7ecc0b44a73cbdc8a80213de7862c2873b7388b0796e1dd746ab0c73decff2bc6320ea157995cbe240a05b85a2978b1eb9ac0f14585a1ebe02e469541a5919a3e506bff400e014adf30a2d51fe44c84638aec9dbf0ee9c59290d747279009962a8a07aed8f8861d61a55eb92c3f46ee6e46b93f3ca3fb200db8670e3a1a6eb89f8fbac58f2a7e13fced422b631662a70cab54e3fb14f17399e26ef07341696d09bd39e311fbcdef66a709da249b00fb939d7bb34160ff6008fc00fd4a484f3481d4b965757b5a1e5898c4c71462866386bd4e50f5d1d50a658209a36fa18a561b0574ec558e7a0a62fb7d1559da6b786fa57238c9ec5754d58202ccdd3b1f03d9b48cad2d1db3ad9de7b472be67e2a6a020ad355d015e8578d69820b44e6c46c65b41e9778f629d4d0639e6e76fac6068a440765711623be4ec366224b8675245baca92af3e0ba9fa4bfbd516c128f4810aa51f31aefcaf154b32e828836296f02549062c292a872e7daa7df6ebd25bd9dfde077bbb1c722378288283aa3902a938f11728ca3080be9dca2c14c8af4554af3961718ecac4701705d37c5951ca4473a16e493bc2969f857e4e5f010611ac7545222c13a1b23ea6e624a533d4f1eb01e17d3ad0559ddc0f8c581377dbe1e78ce904aecdd3873e1a2ae5870e779c97db5be4f06091af9a4992c9d43faa2423493060bbdb30902cc0ece26082cf9943db9bc923aaf72419ba32ac3a8db2dc1cbb66325ac966c361ee6cd2ae4545398f2b75c85787a8563db4d5ece7fea86f466ef58d77c955e205d8a1da6aa518487d73f1526abf2f6a2b27bd3da47b1b78e03fe7b5a472cc77cbbe53ca226b442013ea003ba9e404633d2bd262e72834a2fd3dafb23282b11050e539f5c57b8ae82b9cd7568ac56cc66969219be4ae05614e629edfeb442317d0d99e0ae19bd281d4ca32b1fc4f2ba4bdfde7ef6820f00a83c5803e3bc3a42a51969a01181e6a29bf898f01b6d2e0842d9cd05c9f7778c4866db7a322ad3ce801cbde6bf085349e707ca736d2661cc992f0338953ef9640e8b9a896acb474d5b14d66e977205efbe61a4fd7c5ee7d7a8ada83a31c3b56bd84d48bfd5f02caab66edb81b1c1ae6238e6827d0b5dd5af0eb9fbb537d5736443fcf26072313f3d65de27f657594e965350e849613ba0052e14e6d2a935746dcc3053040259b992637f31d791902c8b91719cee7667166938f96f0e83c5913269f54ee1979bba7e7f9de7943d932c839291b6be62911108d32fddc54a3502752081d36bb883b060bfa16d1bd4705a6367d32fcfe7fb7d947c2cc61488b1b0ca9ab3c31bf781fc36b659b1a0b7d737a13b09a1a736c42dcc53e842cb4ca435d40def30685ab2e54be77bc0392aef4421494c11c74a35b6b3a0afa8c481bad05e4585e841e9bc25974db151b79bbdae7b1789254a57a185cb25dd10c2e83578cd2bcc3bdd7e623905f6888accf85a27af0dd7ecc849dd0f0b227d585fd4e77428840914e2a44ddc9869f819b7b6c36946ec8c79b44fc7618ef1b3c17ed947e6261bdd151aa8cd186170a901c0d2c8bdc241214abd0c2ef482767384414b9ee8071a03cf569061208abdc4563c2bca0aa04b2c0fbb04bbb39d1f0f9af261b2da902d284ae0999f08d60050fa0dc9ede8022f230e8c1f6b6a5ebaad1935c0a8a23abe3141edec012eb2377c150a0d31722d91374aee092b188454c3f9d1f0909638b00c5559a0b6383fa523b72fc984b4d4ba1224b256c9844da91668ca15df8cd3f4740dea5512e9505ff622c0eb2ef700b0336d4bdf8edae510178163b56718b0875d4fb141c22f33841d0eb523648ee6d30c2ad30132d90df25fb3a4fb85e26f55f264bc6b5b98665a5e35a4aa76baf86b1003ff3859996905c047c16432d5916bf487c3d622b746880e00032ebe3c2a3932242a65cc17a713e77809f56af2aef6bd3f10484e0ef8c1cd8944ef2df1d35d4ad4beb7d0ea9551d1c0ee30a0e953503f4895744b8473914cd12ed93a22242f28931dd71402297b25e85b81fd93ce9c217ef31dba52901ea71a70871c3985da0484ce12ae5153873439de29f9a9ed8796f20b2fc967060ed354d70cd33e8c5ed572989ea087b61bcc3a9208f7eb0b5e620c9fb0ac36ac4bbc11679fbc981e27c29b16d590f9acfec3e1db82269935f93dde437d53ca98bd4dc77f581269650f41eeaf91f97ad29e0e1526e5ad99086d6f88e490070a0de0d8e3fdbdf0d5e5713d4a275554283889a325e7e35fb75a8ecabc6c4c6234efa38139f1598d83b166ca2e41cd923907a461ec5798688171127265218f1fd1db06cff391444564c952b53be09544c60d2533b4456a6dd69264744a2a8d3f63b1bfba48ceb75bd4d2ada3a83d81ae960a3e6c97d14c37d6dbe967cfb036cdec0914743c83e2e2d33a9dea42c55adf982c9745291432695c8c3194da49b60a606dceab4dc67eeacd7a0810a2c44a2cc00bbb62448700f5ba2083c315887283b11b52c2ac4820e50d01a1c6895269a71c89a658adca1e26490f835808b8ca9db7e80cd3705796b4d3281c59230442d8af746a4038cc777d7cc1077c32810b63efe937317399c33a3d6f42b85fec569f508dc977b935ba46fa86588111a2b21e4d0585e9d3c3e1cc2dbad15f1cdfa83eb790a2caae370df8b3a023a7c8cc47052b6203899b84af614233f19d9bc814c7c951fd833153077abb0ca885a86ba3248921ca867e6894ef13f80c4bbad512e4e4738ab5d417a4c2752fbc4a0b4e2b67702d3be4397674d68095059fb297db0aa9c84a1834faaab23e7c7de2006dee8dcdf6084557aa7f714a14cb7b1a0378f15bde0c4363e4088764b44016043ec04bf7437ef4d27ededc8e3b90af7ee8f515db177e835fe34afb9036a2de2d07f6958cbbcf0be2bc591cb08e7555f4eda352421ea15fc8d320de1977c45242b4b394cf4c588934a79a181c36ca298c9d0beb9aa1d2486c3c240c73db39307df596a944a2ad1e8878c5e9bdd3ad171b6d96b0551df8c8a82b9908f14cb1b2b6d72b4ffb9fdcf79418063d833e7cb40b54b10e25852cea27d630449348228b5b6072c6c740813079b2a9b815949deb354fb68a01b7713753aef2b6a231a875003a94ebbd44735531e78fc6b052a56981d546cb3c563ae9d4d7c01ef1e858c645370b33d08a9ed206b1bb48c7f33201a0bbd24b710f1d8f1d27b2007a4d3b33d645b88462571b35b64d0f5b368e0d3dc3e6eed74a4c84eb463d97496741b921bccaded99d2807ee4101491762155dd4b9c488df6f462c2e8c7a4ba13ec4318ac19b3585e3c834dc37be3618b83d085df2db9a4f097087bb0b97a41b071ccf442ad0d802d0828dfd96b123599888cb656cb2193da46004005caebcdf1fdace3905aec0eefb2d73ee7bf044ec789b27eee670eaa24c7030aaedc6720dda91637dbb0f004b9335b168ea3bb365ac5433f8dcaf8054d399b0923fcbe7991dcd9ae1442147371e3d0937ddf2d9d3fc36de8a99ccab24f3a9493e37f3034e49af3e330ded4ea1bb4c0d7f5cab17cb2542a6cf2e66d8ba1d0c950d8a2dc1ca1a6352621ebb0241022be8dcafb604f167d1c3283afaba78c29251a7a7722210fce9c0343cb68c3ede6bd6c1573f05581f3b8c891fcdb326e8d78caaba6acc202b71d88ddb898a5eebb7f50af3e59bbd5d1cec12c09d12452cb7262d830d23ef14789bffb3b6a09be819661c849d902888994547cfb79e312dbd1b3ffef6f1ea7a0f606a3545bd056c1414d9c277ba302d1d96f3077494ef6029e69da789aac811a7636fafbdb242928d8d7ead40bfe3a7d961ed3357beae432ef6e60004c6c94cfc472b2d294568d2ed73322b43ad4e2eb501cae8242b300377de07df51419120ab608ec2e6c99e788105d6a389f581b2e78fe89118e68d948bd1fe2053729efadfa4278e04a184073b08311d8d40d3af117846120010ee2e38bb1c2c60e20fe1e784ed4d38a8b23046da04c6f15cf88d98812f2f94446139cddaf8a5bb6daeefc45fb3f2c1b130347bf6799abe0fd26838244706892092ea5c1b96845559c9a961a7ea61e687ad99f7bf0b9e9bec48c64d1724ed3e8be9a216b56921aa807c7b10b153088e172c4d95962d1ea373aae15d9826802005f2abf1ea5f55306fccbbddf541e56e57b45959ba219b9fe2ffa2ee986130ea21198cdaef27dd56dc02e0d2665d6e04d6a516cfb931b6f5fdca0286d7e9d401d8bb44e80a7e143139249df32852a0ada62e59a1dc153b4e797a9418166af4055a20162d36aa677b6c009cb06581e84ff839b0c6a6f5dec68d1bed05c341a6e3a4c5309003c68cd94a9649b7874f7e26c30319e87b91cdc88d8cc4d1ab27608cdb8db1801d7470e8b1f668360284975a193fd09829efd229dc6f8631f566197227a56628a73a26873777de1b62da93f6dd5eff2115732ae848000f7ccaa4258fc8b3dc1e7829b503dad60a9f883f9c0b86da18276405b7c7233576d72f9058782cd180391926878c24fa3e1ede88f68eaafe9bfd0427b9032305f3b14c906f7077fc5c4941583000b2bf3ee0a49296d26402da07d2073995ec6930a7c9039794ed4899b7bf9901362e93d315b71bc90703a102dff931619404edaae5cbe64b8e712d68d59dd2e735cab304828d8ca23797839e484ff56874b672010860381931c3ab9d91697798f511972fe893c85f3207b35cb81fbb024a481b43c59069d25fcda0cc13422f6d29a98275b62ebabf8209551d9d293cad216ef561efde3752ac4bc1315e3add96ceb2efcb69fb50f7db5fe489ea233006badde9fcc213301fc853834eaf1f52693725183c550ce656af1be40b13f85a3ca15fe0706ac846453e11a69340033ae6871e00bd1a3d0e12847ecf5af46d471d674945a73241860471c8fa43dd9e8f5e5345ebae09771005769596d013ae4b4ba58b117f9c46b8a00528e2c006e8e3b582236e518efa232bccf477180dae1ce507cc8aaf1ad7092d0c7781caa56c62ef65f6e2a9e44422cf18fb025e2abbc3de072020bbbd929fad0ff19e8d5b6239edf394a435f2c6af6661c026010a1a79c80a7c69f4c1a305b54c6e9875e7385fa714155ad7aaa34a1743fec0c60a81605bab0e98511c07576844f0ae7d28de29abbb38c3c2a30203d1af07724d46a67b94aba4d56b57052904120cdd862388de70bae8a56a99ca7b3ed4c70299356e5eb83b0891f5ee197cf04c6db351835a6d61c27305c489a5474fd60ac39df45f480767977c98d305e220fb00ed11309ef786c7220fd897e518176f9c5465318e5629ac7f7da9b7bd1c072ea35e172e6a56b03aed51b46b4159dccfe1d35639e225cd1334c5f07509a1788f91c90dd9fe7cf2fa0af6c9d67d55d2cdfe122ead3911d791254b6cebf3c108fa1208e7c2f81ede7e49856d8f9b42315856b4562d59d2c11221da76e16c3b0c8e180716b00b61a7cd048914a4ba5d0e287f416afc58c3a59bd8d9a617ef672b77862168c28f764498f14a49d79dc7d2e2bc4017e853aca631f396cd8b63620673d10b8e578c0466c04329fae78a07d0acc47a0171f026263078fe0a5f647ed73d04e017bd042b4daa10ba50ae7e7d18c33b146bfde1c48bba4f38c16ab267d8d2f15b7eb1bd1582212ed8d0306a482b154776e0834243b570e267f65d3705b99712fe98932bac2516efc788842894b650db38a2a2d16bf321221ad58a99f81643e8db2db7cff32be471d18bb80be76826f897fae6960e94faaa960dbeaf63b320a0aae03ae5602919f67d026ac7efca1251027aebd1371bd708aacfc5b230432956075c5c1f84c8b3134bd9f37732119f7643ec7a7d13d6e552fe0c852f43cad71e2f5976a8c47b975bcf42e513ba05249a37d8021fdc1d68d9fbe3f08470216aaf93a79b9063f2f5180ad6a3c370999653289e57da8bfa78f18171d3979a7dbb605b6b54251aaba180c92dacd7581f57094c33bf46cc851d4fc5172a27c250677314763f92885f4316d429b3ecbaea7f778483fe4871588d330cf0165155c9ea8256c52fd41d7201514f64392bc132aac250cacb241c4ecf51fc9c9cfa3d64e552d4475797198a6777cad13637b4e9d32dd8199599e6ab63847d4d6e13b093f9b91430d946a4fe9de77a916998a76a5b5f112ea019aaefcd709651440eb74114d7595d4aeb5cf0a54d6302533b9a36d6510e72952b2370bb1aad7fd158588528a741eebc74f64400ed0044cddf0537e9251e2293e572701fd77d55696f0bedda2a840e31eea290fb32015df16954b0f6e4b6c436ae3b19b5e3c31f2615e5fbfcdae78bcfb4127a195bb88c0d552a136022182f9c8908fb0ef7df78d3edcaf4e537fa70f7de0aaa24a211ff6a547d3930c5f101e2fa33247ba7ae8d92c3b7dc5ab10371a714b53e9897818f0aa8f2812c4db59e4eadbb6c1a80bc7c5f1d585844cd88b00b938d1d6ce3e6abf1233c45c4f1fa1468777a5f5638a31e8a47cd9d210cb740b5ea92868d41c17aa8675fe6ac3dc3cce82d84e8d38e67bdb4155f07ffe571315246c0c9fcf0cb5aa61016a20970d985647d26f881203818f2c751a9a915a89493e1055af9cec84f51490b8b114a9b54e86b384a15c16acbdbcbfca6825811cddeac08718ebb682594b3a788df7cd6a9d8aaaa2d178bdb230aa69b82d61d87f8cb643b5ee15010249f6f8778b5c40492378539cd9a732898f43f3cd70d6199f1d5247b7649db94cd9c0842cdf95dc7e77cc39fc55df836d66cd3f49ddb5d7593650751d48da5c4b518f48919b101746256a9998b3a9b8d86f4bf439951d451e79ee233349b1be8b748a732274c256e4274514f3ee64a9742e84b8a2390fbaebf9850249f93a44488fc1d04e162c5e9405ab253376a6e9878c2e07623c9075878e378f23c0c780f254f1029947f6d8f4cd5e95b566519d3809198666f755a12aa190bae3689b563a042930abb89626cc4af4d61c3691d2ad9316f7bdadbb1a69c745820571298600a18e93fe07af2a1ec3df363259f8ce1d33789c820c7318fb63054a5ad02f5edc094d44a163428ad8a2605c2f257dfc4d4750095f5164e1db23e6c7f0ec65a82382dbaccd50d9b21cfc596fc887d3bc850a646725b384074356b218812de30e4a19d97aa008342f6318b373539268197df0c550194ce56e33aeacdcd4753fc122b2152959e6c2c31f9e11994143c7f4eeccf503792dc21bc65bab0c40cc588efff083a031e92ff30e0ccad56c1abe04367803a4d537cc1acbcb49207aa9fe5ad78b1ef3cf4800d731f5775d54f3e36f88d7dcff6e2e52ff2c65ac132f385a9dca80532aa0e7a1632acdf2b50facc79422a9224869cacf4684f3075271ec6a14dbc5f71b62ce344319ab97f6e389e3f8664b72b505e5a85f22c35fd79b1c6b84bc7f5d60303269ed12beae494c60ef0dfe7be79dc4cdcb13fef9d56f9ca764d6967f796d821e89c6f59138386b8c456bd9d2d6a223dafc65604cac9ffbff2ee0292c465522f1d7b497f21414c2015e0c1b9bcfb3db94c2f5d87182bf163dfae4ba6faeac31e7149040f7ea317666bf1f3c97018b69df876b300adbcd8e54af8203d751e852b603d18ef60250f6f83551280578f62ab72b1bad09dceb3b0d80ba801a9a1811f058cf3b357b662a7fee7db860a43d38013c1dd045b6517613cc143cf94d411f476c32724d315a00e2da1ce48a1f90b7ecc56c66c3c7c4831f956d7b72d1242e24d51acacc15df9849eff4ebf3a9cea63b5d14c05f244ad589a3979667fae0b0284d9a57847287965bd39030d586f5431d9a4ec43cde987154ae29927e0f7900416ba4164fabf475df6fc9bf20fd1d1fd5d5a247c404c97ccd00d6a7616b48fbb365790cd19b678b7d50ea682e43a6ec21fcf6d8303bf94373950a84d0f777aa1209075290e174456f4f1f29ae32033625f5c6cb00d3549ea4f52fd85a88b19fa9817e237fcd1687c4592ddae3fdf0957096691a1aa75e6da09d9c3097bd08d285e4638cdf16df28dd19fa3038e7d11f4e9e6535c1be27ff2dd1711f53dfc67c28a0dd6f6d94ab770d08882a2e505da7d2e5a1f9afcd05ba5b12f8ed697d7be6b7ac8df76fb87f0c5d9318c497a0ab0c5f7ebc41dbb339fb978fa3f0ce0d447e881f71e16331aa016e44da08da294b020048caa0bbe3257c154826619092ae36cd31ec95aa03698577275e0b263871ad9097fc25bb45f7c2a6eb1c77151c55cc6b92cb76e95cf8b35a3a90bb5f4053e7536d265a8a21197cc62055e75fe154e0c446e5a3d59a1f5524e386a45c8912a5ac242c43b1f12344504fd6d789d0b10049ea9cb0d03057d4cae8990b315a2b14906bcab83e7f092f1b996044c290758b56e5749621694d40ea71b4af0064fe054fa864b35fabfebbd4057bf010c30529cc01ef2f74c930c09d40eaa65d66cdf37d1af7c9a849fcf3c139a72180c83b4e77a977b1a90978de27226eac750effd223eae5ace2996339741a0d86e241ba4b9daa9b3fe301a064f3ef9257c9cc1b2bdd021916e10f6532f332a64a8ee71b4ae69fce92e7f214f174374331ab5b0ebe819a97f5ccc006d7ec789bf8a78b54823bc2e87adeba504c56eef0d28c1a06bb95351aae18b66c7bc2c45240a817e949b47669f2cbb27bf22388c060142796c98d213584fb9f7b9889e97239b956a1f4978618efd7581a58eb0c7d4901f03b4d911c99138d3defe6c46e65210b29741352b6eb3650629933211c3dbc3b65f326b205087612184a5dcad9b7ccf5305f4c8fb767e9b3065a278b3fe81ed63d688548f01e1066ec0c5ee076f52e3186b82c142bf50e73b5ee7a064ba9acd14ea91cb7eab1edb3bae5668ea9a0beb767fa234e30ace22aa7f22b03932febe40b6d5e7d02d46f08c934b19dcb6698e8022269b0fc9a2ece43f188a3069c697937b4745d7b9cf6f2e82e5728718c31dd5d34b63f82ec4e7915921fa7829c9fe06fd034bcc63cd5cc5c23195364bc1c420b9d760c20f1df875b5e71aa123e9e341a7bd44ec70f7ea820a40cb7d7dafb614b2af7fbd97a2933c9a84994cbd103fe60b69a8900e6df1f0daefc983dbded29c559df033bb3bb637467b338500031bdb54929949659fc326e5e7d882a807f2ea27477ef07018b3593e81cf23e4cf60073c10509d59bede311c8a16834f730f1f6b86115cb317b3d9f32d5ca7a562521c57cb2bf63352df5d09d2167b404f3c42609defcc9a367f27c01b94c79e68fa7603b3f9c8bd32701dc3acdcc246ef994c2f7495ef343f53a177cc0bbb34bc38596f03d2f62c1b6789f3c75594535fe027ad912d2bc54e639d8da41e7134ce2e5d89f66798d0a55ae63131c42f4f39b67bd38e216b1ac231b0f5c2c28cdb55c013a39419025523585938ee82d5c8b6237cd331c5ba55b977d7432e17c663aa214b553f2f085e750098b2143822d2dd03753ee121d3d2ecd7a140c3028decac2e09bcca03946c2aee711dfa56ab02a3b30421c2228949b352920c337127ab439e58f4570a91813d204d342bc5bec8ea191752c51433a5055a5ce807aed73074cd0d15ceb751c0f5ca20daa03054ca0012981114750de99e37caa5dfb4a98f3aea6be217a17c5b846eb1c6650a2b77df3215373ae8e6f278bd134becbbc5eb1ea7c4f20fb184803dbc03063c0d054de57a466261ad7148cc03f7c55733336ada1b631fabb68f6d85484e5e25aa2df6bb4b08f51e02af652679016b8e31e8e81407385edb6861f3b1cfa455944c16b3bd0f10eae6ec82f8f2ade4f13da5a98ee4e197baacc8bacde708d7ef430971e996eddbf8616dcb61d11d445853187f1700a695c7c3b1e4fed294cb2d80473fd4d41f3be2eee836413ad9a1366d869ad2a74fd73107b4b75606e2c81d5190a06f5a9faa1094df0751d5df2f9bd2d0147347c02f5338ab399462c2d95fa16119af2b360614b20be3c408ed065be0afd2aa5e635aaaf242efd2d24e9ee0ccc83736e0882c15ad5cdbbbf3a768ead9120029e2e4f2375a0bd44c7c7452d2f76efed5ea53ee5d20f0592677e7cae1ffae0a0481a4cacd1829f31abd031354494db95f183bdec91b7786d8621b1b71d75af23cbeb5f7daead881f7c77f65c68b83cbdc678ecb4f72e5b0d1e839059a7e18bb126d8703fcee1b516c2ef622f3e6c0695d0a35a56faf596a208474d976ee49116f160877a3360cc3d8aa6c3720b1e2da528622baa16036c55c57cf854e1b1fc6e00986bde0e04564e5d7f7302b7bbc70507d3231d0f1e136d352b51f2ec8facda5fac9d39522dfe2d4509849275a4a270fafd3cd879f0692b6f3db4132eaadd9662d0cc7c222f6e265ce63278225a61283c1f15ca4d9b24e859e526fc16f3c7f17b65dd065cd68c90751ea56557b7530dfe710c27f8daf2c0b6d4dcb9c987d32b9b869e3fc33ee1791256ed6885bf01ed00f14d0740251a3a372e37bc58e6259c2c41cb0a1cc85aa6f437638e8ebc3a2c6352ea3658314a2d5f87a211e9e071c542d2ee3023da5837440bed7645aa9e0caceed1efc92ea6765e33310bdd83a9b14f355220b52a5e2e7f171c5947c37460c3c5f655aa9461029346b18ab8692911bb3b6515b327cc0d67311a00da3c5717f993ac010914d605f5d348f4cd887589b13a6b517a772a4d482045f2689147814643689e570b2a86486464a318dc74c6eb0dac5e92dfec033ebc8c81ac13f2dff7175da058bf2b534fa5de1ef3a7715f6f933a1ace3315aafb841d45337e80453b1ce81c49828e29770d4f52bb98c84eeaa22a080a62e4475f4766e0d24e4508eb8c4ef7272cda65037a1d2444fc5fb6bf51b32d51e6fdf1a29eff1795e8d75db6bed59422803b7dc27af15bf31518ddba97f6c929a66d211b693235ffcebf8cb63cfc067cb19e3fa488274772b678eafbc31de658823ba00210af331da778edcd83c4f3fdb3c83b4cdeb97205dfbaa160687295fb840b2096f7ffc8ace0fcbfb771292e6a4cd03d5fb0c1bde868b4df08faff7d6812558b2c4fcf98ae7cd2e8a8bd2ea0d066069adbba4575a6b5d04ff9db8f7cd0ebd6da3912a4e9f8c043232a28db38e1b2c930b4270b59cc81f43fcf238bad43a2661fec37505d3d21b7a1d5fc60e7c452620d78d4ecd78cb02ad4be6c6e614c7dcf46db48fd078476278e7b16cbf4773df6808ad5d043b1d1a2c083dc6416bfcf0139b1bdb5ea74e27f6df34e02f45613c5aa4a23b1354e3622454b4513264f3e9361c43f12d06e06d82bfbc3cb2e786db2ce62c0db35bb50c5d75e21aa81c79da349716707118c310978a0a6d8eea9ada1e51e041a5b570910f204217166af883d3eed176a9c8aa42bca535282e05096188c0b11a47a2bc04be933c8bb4354c3abb41bfa39e1a98adaeb384d884869837e8d70ff53427865fa9f4b5eee550c775353e473c270c8372df59c44a12c9164da01a98d7b434579ff7ee4718a0e99334b3f3cfe8a198b4f8dee70b26a9148536c79d65027c2c0faf9fef0b3f15e54bd9165d7986da30fb470aabeb7d114e9cbabb527d902a41598ba522168c36caecc20d9d9a760b856147fb8423bc6f59bb235edf761a8e76fde61cbfe1d062328df940e472581615e757a9eb86bd25d85bc2b4de3db8b881c6e5816de4a6edfde476667e8f0fbd7c35d7956d2980fa38c7cc6a87c2d24040f1845ddd165c33be2e90b54a428c66d16adc465d47ca1e3718c2b8009db3c408f6c88ce72d5c7869fad7d9200b8ab714d5ffbffe9dc4b6b1cce9a876271f027e832f95f52d08fa053ab992b920585102e2d8094e29b8ac3130afdc0cc3bc0f7390ffa5afd6c7163383db19d6b1486315458364f9369fc1b801cf683737664e2997e672f410ad04a2e03f1b8d92e470099cb6dc4a6d709fe6edd2fdcc3c3722228ffce8db27466725b466a0f74af137dd118d5385adf192588f332502d214c5f9981616b7d0e5a4ad99fbc0f38bb985469d4017e76d191aa8ecb2cc2970406dfb81d902bb732065cbc47f4aed3ce72504e2254d7d0e0662560362ff5def6f481bde4ceb3ba3854978dfa80f55389ee94709b4cbddaea2b57230ea79dcf318cc3581be15a91ec897d70f0fd08d3b98e9db873f965f3b8c8fd43ea4281f7938f1e972c97ba894a6b4e503e3315adf5e7b0aab83cc69436fab329fb347633379037cc5d7a9bbbe899007a5f60e6698a10485b49b61af486ca81c04cc9de3ee2576d4aa4164698c0769e3b727423a8396b3667b43b4dfc7a637d8605c8f690c34fb9de7a78d8485d21e72b3b36bc9fd24b3c1538347341e11b9cb4172794d56ac48d4caeccfc09212032a7056909afe2f948a2d3315b04fdd4a9989f4f9ac04ae41c887cb58409a37d9697a7cdc0fddd09bf29180aa31151e7301770d0dd1ec0aadc38a6fb5b901a4285d1e3419c12b59313ba19dca34666bd09aebe5f42ce0ec757183a26cf42c705feeb2291f4343a2f95e7e22c9f3a051e528ccbbe3617ccafaab59f7d3b6604ca884865bfc7c5a9988a15d953a625f99e4b2b943450447f7284d5164856b5ad568baece23beee87671e9b73b3ad070a6e91ae51e26770dae126fcc8c74267428d4723129a1bd977acaded7c25e911c458583457afb68930a429cf243b8b283a4935f192b884cdaaabbb79ae5651d4c98b30dab02d90abac7f2bc8d426c51df7fbc4d3de28d4adcb920f9194bf16aeef4a5e6a349dc06f789d40220870b167b5d7575eda8024f6590d27a9ed2e2710e5a02e4c2ffeac5c726c7deef2bb9f143ff78d500f0861fb5330e3eb98a2db1a14263899349d8e76b10d69d4b6f7e63bbf8381a0d29808725a5688fbea6b5a4e4412d1d7bda894d730d6fb4534a1f0415e4bca4dfec2cbe7bb55913fb5d0c85c151cb97d681fd50f6a19ce8e94a9d7c6850b4a904ec282ea8d5a71e5ece9c15bcde0ca1bba75228951fd488af40cd4ed946bbb23d0ca0d2ca64d4a9ef46ae698ae2dc80026c78f9a3a6eae52aa8905035d88b9c1b6adac39b2a9ff7cceb229e4e78fbc26b7dd14f456fa6de56cb9cfd5353a33e7a3174b344acd4261fcc1e2d5df455c15f4554f5fc71761c546d4b68c2f3abb4d09f0baf2b7c2b71cd41b7fc84682ba1149d3460067f82fb65d5c3194dcd2db888695a8bef47997a325b638ba409e9f507bf42c5dad23e9b39fc210138670d39664c2e4018d976d1c2062d67af134235ebb40ec62a5b1b465537a19462bfb23347c3c4e07c0ca177fb98cfe0976e1b0de01674394e26d9ee77dbfb365d6ef773fd80553de20896d9dd1c6f089191e797f1556214fd8064c84d935c8523fcb81b93fba092897dfea4b98f735393f1e6fef2ac939026d98f498be96b362bcc896d92009c60d8a616f644b0f1bb8bc4238fd0013f13e4fe209611a5abcf668661048661f88d117c86fdab99c8304ccdb00ca33062cd308cc3b0c95fcd3a164326d87b2192735887d6d3ba51eaa38bd8a63b3be59c15961550a15332ccc36acdc8e6479dcbb0f175e7b0bbf40459067469a1ca2d3bfd40de281856efd429ff9689b4647b446b357ed8a2852c4565d41212a443a11ab795bd21d7dcb70321b9b1c4ecd96cc680a6c62dd50ce0b168da95e26a5c53499b5dfb1053d5de367ff405596c86d33b37c25cd73a5299dbe02e841f177020ac821dc28546444471d9bf5c167c36aeb509c9b047f2e618aa384c5662182b7b39d94e4ace817e241dfd6a4ace4d917913b74db0930656ec5df2a9210f7eeb0e200b93300c9089fd396e16ca8c35ef0994d782049b7882eb36fec134da12d0183811d1d8159ac9a5333b1345d1347b8c4234efa12125ee8a59e5a79fe38681236c5ee6cbf569eaf228629408a989f653134964f75e9e568e0ece1d2de6714af3dddb91c9c7f60ef2a9722a4dbabde498101f38e60d694f641389138ae678bbcee97ae101919760ea400d5447ae5f6013194494d37d8ee11e533fd8ee4ccdc03ff7bcf6666b64901d70e28738fa17c644c21798b936f8af65952dc5443aaa040a1f4292b83c3768c55eeb1c963455da52ce38c9ca6e834aea3bc19a5394d9c2ffbc0f20bed87d54701e50bed498282c1d459d13bcd1cd2a9cadfcd9f2764d3ee321afd0dfb9c8a48cecae10ab641c9f327353b28e2239b633b633c78e1e26c58c3f819bf9bc5085f6000e59ad3a6f1f0d07b60502b5e22989d82aaea2fb41fb083e6414a3a62a3826087ddf8eaeeb799e55f0bcae2acb9ee77bdf4db7a269a9c2cbe52024e4e60c210e2d774e137e700107175563374b7c7363ab160bfdbccc1fc54b465db39d25cc59f7f802260e496dc45fdd49463fbb9d25edf1d3d9ac15bf9c331a58b8fc248330f04ed5a5f86bc8c9883f3c10f6c035374d95806f52f02bf91ccccad5a78b479f24e989b1375135f5bd6f5634c7673bb6f25aad2ee9873e5f233200f6207db8ab0c3d07143dcf19695b4ed2a113e77fb8fb42674961ca57da131b1de4dd1e15e63420f574d94ae996f214bfdfcd0969e82b3f2699d57d7107ddca3f0d6e548e38e21b59cf7c694278d32c3afa068bceb1f71b4f0a4f50a13d1ea1a5d4be6dd4bebd97be5d96bec592be1d92c9cab9819c38d9c3df363b762c75fb1c37b3beb5705275a837c9392d71da952c81251f270453ccaa477fdae24aa15e8e813ec8b84bc8d0eaef296d28bcb7c04b2a429a0a6b03a9c661aaec414566f84d6c2b8910d90ac22566b1e3b9aec94061c6fedefa617a92734347979f3bf998d063010ae13505d716d52d5cc12a647fefb70e357767e30c969130f1e9203a4bcd5e9107482b1860db335d85045f9c6fabb8e13c70f34aa0b79e6cc9c90e7cc4420090043199662a48c1f63beb8a626723e9991a699d3409e1f138b56602765611d57b334fcf606d563b2c628203386668898fa91bde925733b19f51e626c95867fce09db98df8dee4fc0b62467d4d265387a4b5b5c60f7a14209372e867880b2926ef4dd3c63df50da10d40196b560186ed17486094b884c23041e51594c130cc7ffee7fffc47356f637afc8f7fbfe7aafaf7fff91ffff6fffedbff5dcdd3f1bfaa342ffff1fffcdb3ffef15fbdb11dde7ffee3dfdd399b8ff9dfffe37f4fecc73b94fffcc7f40765f8efd1bb6cebe6f8e73f7008fa33b66ff93fff716ec3ff28d223fd67ba2c439ba7473b4fe0bf56cf55f51f79936e7b79fce77954ff8bfa8f2cdd4b02fbbf0a8896dcbf6188611829a518d6f8db3ccefb4f48fa3f7c58c91d5cf34f63fddbfd93c53079e24579201482ebc70cc3c87f621e33fcc1b1e2486a82d88559dbffb374f8f3552a0cc3b88a44083f40957d38e0188651f13f46bf3f3cb417f5b41513e89ffefd59baff0165823f781257832bc4c508dce40cc370e8df0dd87f9810b5c5b735db1593f327a09a7fe90a7f9aac22f477188dc99d2010c330f01f5076ff833706bf8303a60411bf3f78fcf5773f7f9dc1ff89d1ac3965f230320c63ff21f99b048651d07c38289c459a210e1d861161eaafd11f533eb6d4e5e852a919628761a2ecbf02fe9f0d3234c656c19c452ec6306cf1870933ed7f9cb49e0b2bffc6e78a118161a4bf87c17e7ff815f59af49f928522f6875fdcdcff8da7308ac2a4f01987f0c0306cfbc7094cf1c7d436ac94f08d88bd72d46118c9f983c4527fac4e3009f510c86575f88397d47fa6b83fa0ac0e60be8bd36812aa23c3b0e3f197fa5fd74b055d44d0df5ffd7bb4ccc723edf7970a2f50ac70fe1d346d4c13130c69501bf1672e665906ab6cb0b4601ed0da805b9654e3086c4853ee4c350c3357bd50a7da47dd95afed2a6230d6d3b70a14a0de2d79b62a7faa86206c27842f2e7b650223f52a9c142156dad9ab01fc3ece01b5fc32922edc2004b0432d09bad07453f46ef08ed2da12b058ead4e9bffc4988d75f2fa46c0f368a4324b21d1722894f082abdd2c58ec41f189bc009ac457556f6fcfe97ec399a145b2e46819857204e63943e4da52dcf432d3c99a2b0e222380f2b989be8b7cc711892d2ff1c63f86d0e970e876987638c57ace041c4ca1e7b9e7a620b41fa77060c3b884c8d14c8aa8a21b42b8dd06a66ec6daef6543b3893169e5304e7fbc00a4f5f045439987c5b05a6250ec3b8306890b3d11133a0df0050ae648636d902fe600147450047b20467b99041b6fcb8ca734747cf8539a5cadc2e99dd2eebee9eb68144d128220eeefaa2df640e3f3b42b712f0e600a24b0f37ce4eabb96bf0fa78fb657dba60632a9e07ec004f29653bfa9c049d8d3f66c487f886774d79cbb5d167bf71d9a53f13affaa837a8a91a03bddb3c0f222ba46f5cd9154e1be68272ad70db64fb990a5481e4cf107fdf707d746013817544c85a4585f03bca21a7a30d452d322001f2e1d17eba9c96417b969a79edb6419ebbcd8c3920d69ef91897d53ab938130b37a60118f4adf6d87c1b7e229608764649dc2eb27d44c26f4356980339bab5b4141748dd96ecc9d6a2491a1b9c341114db9115590bea0e2b885b1b7aef80f48ceebc4e02f91de88f5c1002ad903e3013ac5c3ca26eaab8d97e483a477cd550b3d403af3e8ed817736a4401af2f1e353ec4acb733ad5fa7613d996368903a776ebe671b2fc6874c87304ec92417cb9f09c664b752d530520f483d74d3eaf0f0cc2848cd95375b520200314f99c4288df1c1cde8de0db7b2e30d3b094c29f3ab99aa38b8c025d96dfce9506a528f9a8bc1826d7b6725716044e1ec2eb7c4fd3caa8d0f1966c9c15c3b98c587edfd3159d617b14aa0811406e5deae98355b609ead74bcd1fd85387c67a11a769451b00eb258fe3c1f4acdb29c5f9ff552db2693a2a9526394f0074f119095bae7f825316a804cfcc11fff39617242de44aeb40dda995776033dd6c876db762d2212010c79b58cfe691b26663fe84f7dfaab28b53ed3d1a85b428c822d345ccba0648185659006fae470eb3259be9de116aeeecb465b6233d667fa8d5536c6871585f0192a753873662b22fe529ce26a2c9cf7fefd42374ab631e9e97e89a216e2301ac10ae1b4cd5574c9639673646ecab65c75f6f0f964661fa416c02e74490168afc0dd14baaddcdf36d3edc770b0ee7043cc1acb2eff96138221045910395cc8ed7f9f5ffbc3c95b246efef3f8e09ce96ff2b99588dad3bddb47724d28f8b53884e44dad179bb8432d6c3a8fd5afeab4504e1acd97d85470514145122eb2b46fa16c0d641b8699c94a59a1748fea1c65ffda0455104e0f6e2ae59913d267469a4845ba440c2d6207be422e7aaaaa01af90275be9731a93c1e875e252363df7d93dc2c4cf16d4a35711e4b99051d291f942ea956c89eb94b74be666104567c8d1905f0f59127521a898c5387d4787e62729d8ed3909c66b863a7c8181894e74048551ed0ae1946356e9cedb255720f6b5d44962c2a33981880db1205abf0d325b10dd4be0a4756b7e186906bea7b2bc64555624de5f2e49f378790d880dd32a47ec9017b41445b20b1ef2d62b14f494d5249c6d064764697610fcb189c8d7894546721d095a1a291beb449b47b7c06b0b99c0dd676fc89f541b223ede372722753f3688f3542063060ed78b1e5dcc46622a46ca4aa2e9d927c83042f37a2ce90b782ef4c0ca2b95aaa31f25fc176503e11910099ffd2720c61413addd6028d5b54786a1bc1e6d3aca42e50740a05ca99d08036cfb2194256591c48fea4f026b1e78393d557113443ecbc35dc5a4ebab43eaa9a4d875d74d50243219eeaee802d3fad8a422ffc66a6281864ccdcd0e220c89119803e55136482a28d1987b2da8736b99d4abe8b2d2b377db379aaaab730f19d1aa100f75eef5ce1cc8140c0784ae80e393b80d12dfb7212fce76b69074b31033a1a0c07da2f8ca62ff2cc0109908008e1e0460e7297f9748f046146aed1fd4b5c94e7fb86c8064486652f700d1a71b05c80a106f7a94fce6ebf9520c4a7251c68353f5511368ddcc444a24e88c14b600e6d500184d0f8fa42c25bc10186a8ebcf2f14ea10f5f5d622c9a2f25a55b6d66389d893742f4c33c5538e34f2c086e5195a3e3025092d26cf668c26f15d412c6ce53c1d190aa07a8d466d15595d9e6f267795e97b82f5b4066a3b4db5bb7ecfeb0c6e4647d3f867efea6392eec9f6fbdaf0f8ec0d7db7d7f217ebad87d44edea06a206ce2896df26db6178aa52ec8bfaee6badabd847c34d9e3a03f1f5808bf79b7d455cc22599207f0fd518fde5f5c7aa6710d4b6532f796f10967836a4082d1d6c3d6c0d9a36ce8b781e9879afb592bdd3e1de676f47cbe2d6dcf5bde1e7d83181f9bd92e0d3d872dc4ebfddfd322e6ee4faedfd6b33dc8d79da4f002e5c88af8ff89408b2b85f8f3c5f773aa7db1c305fb6f303f30afef25a8cb18351d4c868dde59ed7c068dd8564dd1e6f0ca1fe29ed8fdd936c0e85e3ddb860d512ad3e71b6d7fdfc95152be976f1e976d178103626708e527eaf248b5463c7a5204bfbd26d01f4c0b3f3356b8294f9065552b088055cdb030d774a11e1d3597d561fb43f364fcaf302f678053b7cb60aacd35b6a5741b3958cefbed64e4ef6f41e3386725be14927c38c11daacd7121f1494bfb31735b10407338bceb8dbb5eca2bac67d4763ee38481e25d50b417ea88dbe1df05067b124d41b0c5edda026b0e97a409df9760633e288d7d5631b78c3fa0a0a6969ae709fd31a3308fe33011d84389e9eab5abd7381abeca1e02a87725d9db3dc4fb38f620bb552df2f6253bf5cd0c1224f73c48274ae023a12e072ec149d545d8c087b66243e7dd3748286e5e6f26beb7b224bb6b6850a5cd50091f1eeafc54fc442a06c3afcbcf48df91117252e93356a106d4a92e7ddd1ee3e7d7e371548032356315fe7e37600d3dd34e86a473af2cd9fbadfafc1047cf45db5c7c82b4bcefe498ddf59ac68aa5779a065346b72acd33d69d69e419aaa6f68a11f364a9b8d27f421e39f14c73196bbbf78d9fd52ac99642a77a5c3d5459ea6ae81b3950e2302957bfbc041064f8e691c6d2b6cf114256347a7ce0c7a293942258a1e4d252203179cf14df949e8494016828d974dd434add9ab0a17165756119b75ba3c5e81667820cede594e04d0b9e79f561143b5d001ef3becdf327e32883d68e8ccbbf39c355fc1a848acefe29c01d3bd27996d2c314cec34d86df0b08db1ecee924ac0fc1eb44269d4ed73496d809d641e90b15f2b5e93baf163c92a795c6cf790cf19cdf125b566d1cd81f93fa9cebffef663eb64666bc94924b66131e6749efaea779e2b9983257866e14516711ea3625e9897a9e47ec64d62886772e5da3f58571035c7c759cf174d270059af15cb3846dafe5c2bf4fd4010334d661da258ec188971838f60ea99e31a853183ec1ea2ef6efc8fea18c00637f0ad401ea42ed002c90e902fe2ce27b97980dce259b02e48f97ca8dd96d9b6ce0ffefd4e9924e1f6f21358857a468811854948a1afbf3a40a465e6d83a0e832e41f81e3bb3062fed08621d4f6c844078726750b5b04fc2df80b3be3f246e1098916ffe3cf8900308ac6e935710e3e77fe6c741fb963e4766a1bbecbec524c2395adcb4ad2354157d1f551b5c8da9bcb3db9cf26add3c9a2d06283f499d33a45b914afbec41175bbab8c64f5cbb70830932db65b25b5a343b46b23a43fb9a269494e2e50791fa1978d8fac9433aeda8632567d3284233dffa7e1e4fda2c2139c2faeb942f755e97fa85d0c737005e5c2832b93b5a7c426eeddb8d5b5287bf54bc8e649184dd9195d33675ece35f004438cf0fa788ec46f9bd6445c7ff7c87b919689bd7e56f39849fc59de10dc6519883e108c65098e7e63dc69a99d1e169c68d1994e13bc68218eae669c68959e1e66346f3198ce11e46bf998ee12d465598c7e16146a7988de14e46704421ead22890c8df70b0820999fc6db18f59d75631fb3b3e3acf7436ac3309700cb7097f8ab8d32c26aab92d2ab032c4b12e83a6db33d673ea2ae31d3722d4504e873542676eada640d6777e3945240674697dbaa04478d93e90f7bda117ec0e21a08f2b47663034f1db080c310ec590c3f1196963810110d3d9e57207fe5819cba7b3b7b7251f22eb608516907441669500f0aea86f8f0ffef7a34d87e0cabe61ad34cbfd93279fc93cf7dd06663dc042e536342f5e4ee5b489c403b71cc2914ddff5d085b297371e197f7f2ee323c7c1aa1b00737240a182efe1bcbe6c0232aaed0bb6ceef8e23b51083df917f18b28bc5bed973ac18eb170b32629861e9dc255f53a3686aa86acc3befca48bc5e02c74a3f999971bcf854707519c0afbd677b54afbbba66f3a567f9933c32c88fb4415b3dcc2ca48afb6a12d910d1eb1974ebea94e698632154c8b81d19ce77397788f0a6d9eccbbb255cd4c90fe2fcda8a9e0e050a4eff9d88e0500319c07c27869cbc0008fdbd2fb692c136592da4a219b1acaba92c5f7594df46ca0c8e951c65b23125651f7801de2c1336f79ea6545bac601226ba81f316adad7652e247bc2a6d817b30ffab84e730dcdf12d205820c4363c806d32cc2f87091dda83a25d158e8668726ba30320c7b203ed4f635ad6d1cb779ac36b44b540e0a51d7715f569ad26adf7887dcbbb633a7d8dc47b2c035ecab283d027b3a72857fe4822619b3bdd709922008e2f74e9e6a674f937c9d4459e4dd5910f973836fc4a82aca8cdb6c72a7cc4fa3d0ef162bba9d92d816950b728be16eced97cd53c9fe41870545a4275535a1d0ef7caf8a4814e2b812a68b9f8f71b4e13501fd71eb17a3665df82f5c87dbf0920e4914c9dc9996242ef3b29628653bb377b67ec3955f429e43c80b43d2e998869734bdff0b6888dc0ed7c312b64bf30538f064dadbee12f412fbfaf9daed04c04891bbaa60edaa1c8f7bcb33608385f044da36e40fdb042b351b18663810d920a049a6198848ba756ec5701162e758dc1d60b917f4a30389f6bb906b60f7b2771aa74c4499fb7f7017c2d103e820fe2186fb359d1aa5cf018e0e5381ded679a2768003a0fa90a28f1064676e013963439138b02f0021b152263dd5eca97df62ea25e289ac46dcfda31414873ead85c2ce60b94efef8988c8c1cefc7e11dccdfed4f89b542ac8f852f6c6638530ee9e670ee29584354773bca93d47b8b85d4d23e1b3d026ebfcf24cfc7e41b7ccfeba5c78e3c41fc0eacd5c37ed9ae2a7dc7c5a8aedfc7058f00ee870f37bc2ac52f8600b12b9c2a29e79d3d0924e82b6adf68b83299368cd3804445b8473ce4399164f80de5ab4ea7d4913f9c096a42a72590cdcb10b155c330c571bba471ccfeaa73c93246828a9681ede556288ae9206ed5366681a24f80de892578024cc847dbdd84595f880323386265c1155f7e29567272fef89b122b8309590581df3966f588fbe2c5c944eb342e08723221807afb43a23f9782cd9b01ecb22b15834c44d9f6f9a323b008b3ba9ba58a479f1db3ce2a40698b3c606d6db09e27a68e2a0b968e918318dd5707490627b95eb684710aa14b6ca60ba3978746b5e7d8b8369f445ff01178cfe2d6dfdc43820ef563105d43cfce5b53dc3c33eb51c0a2af7dec92e1b8689e5fbebae998efa0daf6823ee979db9c0a89441b74c740b715230c13683c6b3027787e70b164ea4a0303bc8cd94d0c45c7eb99857dab0e41106f2a07805ffc33fb7663604b28528dae53470967fd85d2d5ab2f02e2b496da74adddf419c473ac060231f6b54ec6ab71e9f41bc51ec0b70739fff3c409bf6c69c8a282c5232e10bbfaf9e86247bfa70169e7e3b264f1a99cfc78120706fdbd131382e717c0e94d6b9f8cbe6c202301d332d09bda915f03df6bb3c458618551847f574901306d0277b0c400334e17eaee66764be777fe3822d200693d0dc470fb2d0e9afd577b8b76ae101235e2aa7d8b36302b36481fe46f7a206c7d4aa360fe662c7a3641951f979a6ca5c70260ba47d5810ab38036fed76c10f35aeac75c3162787bb48b794b96ac59accdc12fbe278652ed8b69d0b7b82ab73eb9dcebc23c9eea1eeadb1a54acb5edba68bfd5d957ade6dd526839910fc069415f7d502f0cd037d842cb33045108c32ca270212c354646beeeac7dcc2031dcdf4a573bb28a004dfd3a875c10f22b318f2e586c63000dcdcec83c5020b4ec6ddbeebebf083a3b6e5cab01ba9a5a3e426dd45ea00b8eb20301e71cb42dd93b888e5cb05be17477fe661e747ea72a323635dcb5718ddc365a283b9fc38c79cabdab2343e5492f704d0f336bdd7a6da77addb09fce80bde7b80c315c2ff92085695fce90fa3bb23dd47146c6a5388a94d6761ca35dd745cfbc5f18822a9369dc2fb37f81e78e31ab06096035cc3643b3e5913b3e7fd001abcb237cacc352dacc8c5fa7ac5e6b5b33c2c6baf85c4f38085cf0483f08a8f502630e6d55e5c8961f7543ab810569fcc93c55d56cfdc2e3dc27a9a4da282210501ffd3d1fe67c309c3d384424f94817706250804275e98a66d6b8c9c3dc566529c90521ef123d441d05e00e81e3c64f6de8caa4030f4b7f673876402974434d1a2bfb24667853686cf34db4b433aa510cb43cbfd8f9213e837baa5df1a1929ff92f567449b6716a816dbb8d271f40c73341161144f8d6ca51b3ecf6da53d34f0cd3034358c04f125dab5521fa49b87d8b6eafe67b0866da5a18f62fb974e14ac3ad1a50850791d0163a82d61fb83916dbfee19e9d2aa13e6c450f3a1d0f70744859744349b49d326c6bdde64b29cf538eab9be3e1243c24f633565bd4f0f1067eefe61a7d5f50c1a8ae57192d27029a1a8c22efa77c61c547e915e261e9811ee732d0de6604a94785e8dbab6d5772f526d62017b063553de5dbc298b2d324beb0fbce09ec8dfaf4c6cdf49a8eeb322cc81a732537a7222e86cb50ed2cc88674fb9db0f202eb6bcc9d5eaf9f6a5730068b626d4f1fa581d6cafc4818cf97d20a99a55672e46b8753186e45eb441b2a38ac64f86b97f372477aef8f26acb0f0cb736d097e812486d23238ef4f12121798d850504ef9eeeb7ae62cb841a2c5c05b4b7b02686b71297ee2ad0afdef4ee1588f8619f7b0a98d85c391971fb35e8cbc24bc3fbe1fde7b8f17809f4283ab816a93050877e134ce3890768053754cd695432a619e3193ecc6d0b4a9bfd51d1ad797354d4887d3891c3e7206c54dacdfa86b9b47d55323bc2460ff66d82d69dafe41f353b560b5dde28409e093ed6fad0b9e278de175377bd38496ca00756d5fdbd340920dd325535c56c430209ac14801aa37f6eb36f1cef4317337f7a3ebbd460edef067c20ac1a35b746f8348d75f431301030004c0e842093ed9208d5fd75a306c90dcf381104d37c65ac7fc71741e2b9264f3383363557fea6f85e85f8ad8a07fa5d36158e0d9850cf73e8c44b1f0d3dc58a1ab03a429af9e0c6659288217ef6264f82be2cdd0f07bbc24f4536c2ed0b315623022818467b337f276536b43fc8548a7aa2e146701498e509202ca3c13f717f86dcd7917dfc6cab860a7fd08975b4674174c9cd7aa119e87b31000d8cfb69874a60360f9a02cce330c95de8c7be3c16b38b666a9589b301a4faa75eb6d411dbc4a2431cd5dbb7d2dd4c89df12fbf7c8cd6d94c8cbed3b5b00d4650ddc294aa54ee74a33004c190588232f789f7ee9efd56248d38d71d81f86965340974c1b8f987e7e2ea57b1428fe7a9cbe0b59352aa4ec25629d761655d26236b8ad972725cdbdaab61abe543dce71f81170cd1bd64a6abb0e20b0dd1dd7a754577940ee018089622414724e0572b82db1df412991dc9d697ab97868196556deda78257b094e0395b51d2517762ad2ff2e43c2898f555dd4cf51ca7f2e49b7b75eeca72bae07a770009a6c22d2560bc999b0b7a68b0e3fe04535dad10866ac852c6dfc89cc258efef5cc5bce9e2e9590679c0aae729a7f2103c31fe681cf050fe1276bad6c770aceabd22294a31ff726e73b86b0969b9eb5138b967ad9507c8f3b4d9c9fa3bebee3695b8a0b7d76c59703087b7e0401020db068300c8bc9f0a543336bb23e0d2d2a827dc0a1500960b17030ca8cc139025b7ba143e28ecab9209a8c86913087f60509de95148d1c4d72705b81975d4b24789f65672a67efa80d3fa68698623de63374bd8da10ffde265e31ea93137917e01b10da90fc49331b27db2a240b436a96cfe8de593f41a4baaa52b42ccbee1f2474acb7f3c23a1a13198e0542128f8682821f96542bdf7305cf60bae9b85e02e0f400799399949c068c695861f7255e14a9ed899b2d9e4b183098278126db503bd58b29fae87f4ea35812b440b37c96f94b91533645f70aaf03544cbafa4d90fcb00286272505fc2691b050a7367d227a883d391c2737180660f17cc62f8ea757c2833ee41ef6d60986fa7c12d10a7f52ead1758b15d84ed70ac9b5ac67cb58c5dec707dda0e526d61992cf59edd4a60d58a174f54f2753203d4712c5c9019c60c7f6a3f0b781c01cf91b791fa2074e363a18d51a642060291f5db8d1c9121f5315da4d5a7947ed7cf56623967458cc5f7aa21126421af4bc133ce0ba83fdbeb219ab80eb2535e968fb9d0e8e71219e8aa46ff9b080f8d43b3b3ba085c3872631a84646062ade8e58a77ddea810dfbe86a78459dc85d9c7259d812a36f8a43198df1b0867f665030f305ec5580391aeee4021f9a54c22b1ce858f898536ffe27e054eb501fa02514dc1fd52e0cff832fda199c47194621338f81014634155b974f6c6b79d5f28f9267b77c7c08b093fabbd738ad16392dfa5446d5b21db47d275547364e62de3789bb920ddf9088ef144f4de929cf3e6c3701eeb140885b33037e836178bb3eed7f80951503322309cdad8d3b9381a133db29e8536f5ad7455b6e4ba852089940d7875268d13f7cc69ec1c9da5f72de35c1b896ace6e2146b7261cc307cd79082e795b731f2102bee9b9b6049559a015dd2149e70640484db8d1cd032c09308715b9ddcb5546ec589d633499d37aa9cd3190caea93c9f9e18065d0069afa4347a1294d4511887fcfa68a304cd079ed5713ef4edfea3e1c92771976e325bc410c8b528e926f6752176bc9dc2979b3e278e52322cae8c5a4b5338b03b32c3b8b7aa8302319632c4e17589cc95a0ca1cb991ccb549f22226b178a78b3d8fd41d9eaac56007057baeb2144bee737f09c1538aad7e8d330cd83eba146665959d5fa94b5d1c46ce0b30300b947c6c7096e119e180499ef87a5d14faeb308098061045b762166536a965a762f973d95bffcf7e0c526bb9753d118c59f37578d9078d92f6331f4d4e1f48ca6129988709aaf7af5f325503fea76cd1ca73aa2b25eab6c945efc829b1f7e1bb11665f5b5160dbed576ac87573dba591c177e2e29a3c63ce00053508894eda9fd3c624a791bd32464b734a9219265e93f035b39dfeb82c95fc8cac98abd1c7746e5a09cca4d1f21948cc6dadb696e03b8d59dc3b13bf05f9441301e9b72a7faaae6ee3d43a69ee912d4118e50ba7411b1f2ac44b5ef5dd6cc67ee9f514d866d0dfa9661b671975435ec73a1ea622d06f64adc53cf0b01c07331b2506aba7c2674b5391c1cdf87ca8ceda5f75f69df6f352d6dfbf100940020002c5351419b2cc3084e5a2017e53c49049f126296f85ecc91cf92765f6644f9176c26371bf2d0bbc7731fec03fdd0bb457288a89edbb166ca540bd0971b77ff9c6695fbca25d6ca868e3359fba065e68805339805b74c648daea8ec7a99e8ba7bda8a8396c572e1f923355c14b40b17006000035cbdea16a84c7486e20f4d692528e6348d94883cd9f82b8d38981d3049d3a8eb828f7346c74dd127f22de06d41db4192fed99fd5ee1a53243e55d90ba0b4a99ccc959bf87495717c561031f499e690f462b22df56834fcb27417ec40d8ea253a622e67758d7946aee100110df951de77913c83ca4a94999aaa1036401dff2ca78aba413f313c25c941fb201fd5477bc5468338f4007648551e4431609e4c00c44323b9a96af75fe509deaeb9bfb64d3e961485d5937c67da61060fbc2e9254a2953ecf3be6467695a763b3f64184c983b4ef518699ad1f1b5db1581195917acbdea5448aaf5231c803a9ed477ad413f5d941eccb69235f8c36180f14400ab48c086b0346807c4fb53a2f24137ea9ad5ddc3ee95fa111edb55eb5bdf6492756f5a5964825ec34a29fdbfdfd021fed1e524781df6c134f5b4924e9d95d4a970e8fb512f94389365a23a014379a26219e05c917ef92f6d2e0e3a3dc6c43c157d4c772e3c73aebba6725b7632c6231850f14b4f8fb42f16a47e4fc293d81bedb9d796bda8140477a5387b7104c520a577e65ed63b56e74ac8f95e3ee28cfc57000b21692c5eb0ee9fe3136d7cbacf43854658a51a5cb044c7f02f6ebafbe4441636fa706d77438802979a24462f999b37a22be4b9dfcef77b876ec0bb605c37c1252f32f2d39cec400d16542d383c86d3f42fe793d7c7c8ead8edc641530ab58839b7f7bead305206dd105cf7b8e3b50ad74bfb8ce45e556ba646e29a5d6e6ae8df5e12442682c22ca03cf75c911dcfb81c859f5d48baf24f19bd06bfbfa4da449aa814400ccb9bea1b741c3ae12b87ece240d955465c669eb2b95b5958a9927c8c848e26068dffb94e8813566a07e56a4315348cf8d140883e2e341b0ea37de83f9f2f5328b06e2aa2e73f1962c483a973992a1318d0f9acadb7d4c38dc35ac48f5af6427aaa35797b7e4897c558f0fc17ed5a172a78ae323568a3f51349bc40007c66b0257ad8a6c041ce094c6463806b605a5014c4daa1401092aa5039a2ed7e4c186c57f478c5d2916396a061caaf584d093c4b86a161746e17fd95a3662e555bf2829d8807dcb4953baa7e09f64919c560168675ecad275e9048d8e0e249e410648c7d29c08f7ec88c3d0ef5a098caaacc12749c35db4ba7a10c75e76f09853046055d8265dc583cd8f410cbcd9d6aa341c6726731c594204628f67d9f533e1530cfb727c4b3e24613de7ebdd372e7198ba5fa50ad29b58d15f84b714787892fda2c5f04938be98073b8d8df8a4d465c32c3ea7a0ce7cb9c2b795488194f3013ad3348f8aee6161b23489b151dd892804a57da1d7637c8496cc791304ad4f9f4b289d0e6b9741d164fcc8e0673f1126ab7d2b1744a274e2658dfe66639cd3e1587a4ac53dbccf6adbf580d90384a6add12a822313bf9db9f07d719d9d8716c954658c489def4de7eefc0de01104b69d624af6b6173f54150eefb69f01ba9d1e407ed3207e23bd4d4ecff0022a51e53f1844e6691b7ddc7af48b2f06604abcef6c264fab36b8477e3c178fd28f4315b15e58c76fce70c55cb05788e671729fd5df9e27ca517e591dce1489e32e2204ec4ece142e2ff1bd2ce57dbd7efb3399e62d81dfa36037cf0e76c4c50c5f4633476231d5947971d05eb3202680d8e0d9517c446dced11411bb8fa1d52ac0248fd678a0c6f3ec5e5e88ef95fbbe3aaab047e437542abf9be173a4a52f1ffd969bba608cce816fbba896df91f49adacb87ef4306af46c23f5153beebd4fab9cb715572e5b8a71fa7f29397e0534c81d7796d7a65e08245e9d596d1ce4bc55ecf0394edda74e2a227ca5f655bd55765148fb8c2c31cdc826c03c55bf83e7dee9b75d96859594d635607c6127736701917c6ae9325e53cc5792be1a38bb75454c34539bde22f5c99149734dfd22cd3784aa2459549308ecd4d6a739b831469d4d1b8ad1ad2e1e5308d547b0d5f6849449be372be1395bc8be8f696438d404541fc8c80a572bed17213919c31144009306e04d41704f227cc7db55d93b56a0cc899ed0b5166647c9a9f226de9f6a490c27373cae8e66daa4acbe1eabe1eca9215f1fc4b78929342c0c02621921b6c2a6bcc0e3c68b2c7dfdb970e192739a2d327624885e9906f18ae896700af6a972b6b0001cad591e07884e958b784181214c88162d89feb834c472b9e390a03d92fb6086b92ef653f5c3f9501ba5bb485fb1d5d5b7710c153bb80a6446c322291dd2f4b1c9ce4e6a10611800967427142673ba23fc962914f1944daa9cd72f936edfa0c40ba2ecc6ea3edf86eca5d7dbc855de779eb44f72a7bb62afb0e53749281a52b7c60e8753aada7c07c9523b50bbc4152e65190e6bebd577e244704a425ea702f015841cf9ad610a1ab79c397def4bb07c538fc7a4e22bb7109ed0c1087023e997cfb5e1ee7fb55966f4dc1477a2d3e8e6994155aaadd1667fb82015b0caee1b61343368178d8ca8f0996c826c9c5d2e8402613184d9e4805f770d68cc956bb3c8b65bf569a57be43c3a7df4861478031509df84366f0d28624d1c8fa71824094cbd065cab403f4f803ace59590914703ee55b0b57ad679720679b27b8caa1091eaf57ceb2ee5a0a6e7aba5b716f75fc1f73ba2c8d96298429d16a253c83729bd2d3d0fb597205c25c89e67793918093b22a8446a03eb44ac556f0b49565e912603d9c281b69e2d47a50bf6f3500fe590950d9b300597cf61d0500342df6fadab4f407bec84e74bb1aec20cbd689a965d747a065cb2ebded1b8443ce94c97fc7c09b8270e6d89f51dabfc58bfbfa670919343d889a2f4612bce149daf9e98e6a4a983d4c442ef302e4a784d9f00d202ff93840a0a58eea13ea455d8add2fbbb001302b77404b3326c8fe4525bbd9257d2073338faff38384b64cb0100081e28224c32796166726166cee9b7feeaa9716dda3478c93a75209dd1f197e4e168198362461d55746556df2ce7d83d3b81116b560c1ffa31e5874269c28d7be7d32734ce7b2222726aafd0ee188cd263a8943342cbb6bab1c69adb35e38287112f4a27d76089bb6a0816a91020a3380d58bf24b384cddd2dc1d6cd08b3f0731b546d7d66b874976c9eb61fcbdbabb26fc6c7b403b9d8890ca0a6ba24501f3325e0f47cd489f54e360005207d90a1c49d00131c830a4c690db0b763098d09252d34cd5d7080a8dd078599895562ba2d7329f194911dcbc876708f59abf238a7bc753c20beecac0cf32212699fcf78c96d81e4f2169518dbcb40bd56f199aebf0957aa46f0eb5d886f73caeb02cf39e19f9c096c2797d2137b8ea843e3e1d8632f43e990563e74fa234a2e766be0765d4e9f497b1b3b4e9ca61c288e47de75bf3d8a9f44cac59b9825e74e29b32ea05887b193f8724281ec09dab086d0eec71cfbc6719739c76563d2eae52eb2149f282faffc96b0041471ba78009c12d8c3176be5caed3629a3eea2c91bcd8cbf5eb36bf587762a63662cda714bc29deda27acf95801b627ce68a9969281c6317f6af42038f5722618fe88578622a02f5afd30968d782b92a80c1ce02aedc51d0659afb5f57438f5661a8a153cad351ecfd1193e3cd60f83462e4e9e9f26c6a837bbf07d9d0dfe8f4fb8f14e3560c6d1954ca7359cffabdab6fafd6a52d41acd06e7093096c3a57945bb6d3284764de19dd1f17586d635f4e6d556307cc706500775d9989cbba7a3b30a5e4096fc3bcbe7c67afaea6a1c81daa3ce2770582751c980ab0f6378ad01dfe7adfbe4a57d543827b3349b9831cf19dc7e582782525b73f78da847e4bafc8edb544bdb65755e0d050e595e8a093ff6bd83b760a6fb698ce7ae6312606b484fe3e101030832206f03ed10c7632b5b88f5f70ef0ccb313246b1b3be8ce65d958648e6c2291ef6b42b556176bf9f34404aad6362fc25334af29cfb04a108550798eedc4d9a3908d5f382eef3e8196b6bee4c8205fba2bcbec54be935f81ef681ad05b5901c028b5fa5e87df4e57d40908a230b028b6338ad4e3dd87e4d7dbfa9f2bf684d4008e6a97b387580ab7089f9c965304eab718e7941b2a133bf492f5cebcf7ac88fee71c3ee56513f59fa823aae8e35794750ee3e281c31ba17611e725622a5350e8fff86c2184db296ed49444404de469c247d4b659c693861059e43eb84343e2f9dc73cf295f77772fcfc64222c7e268045556b8dcf25f853937e42a0bae9d6fb4c132efff52d58738f1f18b8ad064ac6c178ee519759c45451591a7c7e1d159120eca69619211fb9ed217cc11894a052b1809716a45083c1a0413bc303e755a591db05e101bc026be2f8072e50604e55862408307c97bfef339e92cd6488b9822717ba42d86173fe592a337672fd3503d6a7d2745f6e3e25d7683e6ed4939b5675ee77186e8140e1b09d9f2433bf9630a599c5e6c6be8f6d26446d8f7ce59313dbce2465850acbbec3d189222f5e6910c883ad24aa8cf9a0f21279e7423a331818afadf2707580adfaa60d0e8d2dc18d537c7050ef811026c57ca818721306043a2af416157c55c1cbb50da106796a9ccbcf2f2a33e9e53c1fba9999d8db2f3967828e6ff680096764b56a4a7559ddeb03f8d4902478b219dcc0dcf84289e19b9a7c922e6112839ec83e87a2bc0e5b1e6e27691704385a8c00d71828ca44b29287a8e025cf9123c995c8c7be35f89c42ee1f647c4a1271d1fe3417434142c3958c704babf4d41934fbe9c5110c0c311c0cb77e3c09aefc005fc3617c78ffd2f7c9f4c4e6062d7d7c05e3d8141eea634650ce7c3f46d992279fe2220d7990cbfa13842d6f05499823bf318340f8871455590a5749e43b765f168ffe28b0451672da8285935fbfac22682aafab17dabd126a393752139cf2e387d086169fd0d08defe365de67105dc4807dfded82e3634ad3164725329d23093d1774181fe4f7af2eb66151f7b1893c2deb2f41e62543d5b84d2a636b28d8fe8cae6fd02a104e09552363113789f82041c9214630d020c229a81b8db860917dfa9580cc44d705988925dab605a44b59d1a9df7516e2175b02d11dfd0a726237814693ecb4963921134c8928e418b3b11fcb289bf3a95a150d735533bdebbcde38e743d23da7b73fe44ab5fa2ff5dccfc16b25f56d8fef450bea1cf9661cfe73f9fd2d2a008aad879c1063cbcf0ab83ccf1c85a01235aa16cbeb0c13ea9208766796d90cee422d567668865c453047b82fdbfc1d779d88351f33bce6711ea29d3c1537bfb7061246e8470c2b298503ed5282633557200159e2e5be842eb03b578b99a73f8d97f1f3224efa000f5c8625c4fb1a37d5b20d521017b3888421fd909519278ea31fcc9a96a3077d8b046280f6050326d1d7fa6008274b00b89421b24e42b21aa932426a8ee0c5820d9da2a91274add6d7d12d7881c3a077e814adcca57639a14e543f7a00bd6d2802596962bffa5976569fb151831e93ddfa2eb1db0ce6c250b35f26f36e4d249439fcef1c071060b599f81374bdc49903f67bc3304f2527511f2fae334411a5ed8f04a7b3e35118a7d8b3a5c458c450498de0d940b091f5f17b8ef3d8263ebb1e527edda29a4ee2d413671bd18499c137b7e3672f9616276598a7940115dc90a890a4202cb153b04070815600f449300be2aa4c60b5b64c7288a55e89ee883ba3a7466bd54c660ffcddaf84df48252975c6ecd26a2a894ff3c6d607cd4dc57afaf633284acd466a1d7a8ac7a715f1c8286a6314325cd3a126b5eccc8882129902309755c646309ec7a14067c1dc655fff95e0e6f4a0a0731d3da5a302f0452674743bc051a2b0fcda37ae28630ecef67901337ead85c817f54a156474196e5df0d1e724f4a3310f7b925225811232774b0660b8eb5a7e67eaa80b1a53109b80e2ae480470eaa838f29923c56f65341de0dc303221f54f37e257c41cb766b5cc2bf9bc1d1cd4f844a3ea779e65c6dea1a35fd1a858f753b0720807e127ae5b6fc8f4be2e6ad18fda238b83a2acca041d8c8629e988d8a67160f798416d6b69d97c9aa3087f546a9e45fc1506859681a7e1e4a8a0a1782527d11a51b4d12f005641c40f1175b553a70167f69ab675752f0a366501de62e45c6ff530367a17f4770d3b87fe14076cf30564e9f9b340c9ab2ca40724f1dccff35ccd2bd4606c2667cccf09d010a3f69d960082828261b00811bae2885a35c0abe6e0e349bd07a15d35c994c5cad9edc2339098566ad5973b4dfeb075bba25c03d65009e80b9c1dd9d8b41b50b28e9847a288801df558909c66e005b1ba40d303e8e103f62d98803a09454bea3041dc0153fa116fafc89e78dd79c4bb4cddd776b4fff545b0ec1af1fdda6a7224c1208615f4fbf54794be7dec7c7718c074eddf2f6e88685d2717b9b3c5e87bcea57b5d8408c9da3ab3284140dbaa8c4facacd2c389f42eee205753372498fe74b41e17189e60d5fc78a4c26fe82811ebbad139d0afdbca2dfd771055dea3526a4d232cf3e5ce2e12df8136a97516416b3b48070ad1555bded3d9e96cde26c8eb5475092932dddd1b85756d005092d77b67d7d66d285e1de817924e5114e6b90fd1ebb8c77c4e9148b486533994026612bdc8d5f07c0d6e22084d49167be76240b0f279639c3c5c47980a32657ecedaf781b1c970d2a70d87bc5225ba0075a9ef6f801c3488af88e272e2faf2dd452a1b67a89f68de9ea5e672ecc69de8325f9d607e1ab7aeef5b6c521b5bc9b8e0da84722a5303447cbc6bc0a1a8f4295549ddd4b9ede107c9b8378de2cd7f7f197216ad5a85475061496cc4a9e3997edcf591916ef45366a2324cf36a7110a79221aa082233276d0e424321b7b8516e60afa43c3c43af1f252ca2cda680afcd95caa342a5ca72428b2800d43f8a7366531d211d1214f5c8aaac4402eb84e348065726f969c304fae457bb5d712ce67c998f7c6ce72685ae9801d748e156ba1cdf9a943ff15a32098fc3728dccb8c7c466adfa763fe4f6bc0c2a7e77aac687ae785f1a258d14c14d8525a6a2ae9a9f57b66b59aaceb65491c0fca6692394fb9b031810cc3de9644587a81d1135bbf67c9415f65e1c1f363ef6b61d42cf75e330c3c5831fd240add30c6e1e767e695d0bc46c479a13750c1526b7ee69c6ebcd2e25be88e1e1834b7bfc3d8189ea3a9da3f9e946625a12c3172a2afb50b75db108c827bd01ca09b91fa41bfa0a8227c00e3099813c716d5ebdf06baccb8299e3b7a8908e6126bf712f7294811e01cd5ffc50865bee8f2e944fb649beb20a719ecca1961c7b102d3aad665161324d9be23d0f0511922dac696040f3ea0af8ae04a2b74d108e7e1f48dff8140108648b8feb5b84e51798216368af01d641b84e12c25de93a7d397f8f44ce59a9f80565c1d94303375bbdd515007a3b3d36207bf96c102a5474ac6df231c8e8021d441937d93d593432ef69f05467c11e697be74350f87b43431a04d749edd1fef4504f4ec517e29ab1eb56452df6b7107cb63f5247f9af3adf6f59aa265862f1fc84aec09c310792fccb029b3539a914f59ca457cd6d9a26c59582d2ea70ed38436b631ca07ef637fd1e4b6a5c5199d10f65c1dee28e3753a53640b3d32bbb12848a56f8a1bf615335fe9635b5aa5fb996006d097d68343f64476c7fa59b56ae0459a0e5802023d6ffdc014f7e50ad8e812f9021e104cd01bfc44bd61a3800ab3576ed52b41149e5604b7c57616d9c06251555440e844388f7f3ba0e25d80fa555cbefcfd91373a6c5e0a348b14d78ad78ff9de5b84ae5a16234ec589bae8b889873a4d9cbe75de56c6cd3f2fb7d0ffdc3e9ec985396deb0eba5926ed1a4169578b566c0004e6039ba9f24c415b9c2e60bfb913c7327f9d4ea1420e767ffed41516dc544bb4e80d2077c391849810d7a6646441096347128e600800a0b182ea9253cf640d42e901ca7523e28e4f51bb5d11803088a4799a34a5f83e037f628d6aa34db1ffa6cc36e21541b6586999637b4b429dfce7e643d91efb354fbe84ec34369e1e72d13aff1dd752b13afd87130412570780652b8fc943aad2a04e7eb2283c84f1f2e01727b12887b3e4582074dda4c31c3736086befcadf04ccc612911c8239e36d5d4d452cdfce02e486df79350bc0f084f4c5337bc7030c5780cc4106a32d73b9cfdf503afb05d5e2dbe0c3ca8a20b218c13752800a02fbb23721954ef5c5fcd1b8a7526912f650a34c47ade24e5fc20b7a6fc508092c73ec2698e30c7b2968d1a1e7f2525e17778c0b35fed7771cab23c3ed22ba44aa427fa7a186bd8c87e10203d9ad6e0457206c1fc51e95e475e5ed7b1cdfcb2e24462c374df534e3a686732b65beeb63ab426b9e9b30a480ae99c89e68a739f3c20a94c3dc2ce2bf3368c14a5b247111f670b8a8a26a4014b6b22a092fc5dd7d82dd0175c098ad2956dc971345a6c03373dc2d0ef2f7436f6240d8f91b63ab4c4c48004cff6623d47cdde7ebb197290fad57ccfaaa85d79a4230123af835fa608c9df678e834cf118bbea7b35d53c4c95b86b5a4d15af44153ff08262ac614b697e63476826bcc4e84620764fe807803f08d2dd11f52d566a58abd0bab5d826a1a30f785a01d2d688ee49a0ef8ba0d030ed161546e4409460793c2a123889af6f5515f8e5a7d8a3de87e2cdf6117d6f4a9a519ad5827745dc499c6ff111d9ef5b17a283ee9b42448786baf522720df3c6b64fcaae223d3b7d0ec79213dfac7a9f7a905c2db14bba91dbf5db6b60e5da8168220b12b54af4adb934d16f95c662034a57dbba985114d1f642e5b8eac9767ac67e4032c219019b44fe796efac8fc96ce163cb5c15b082ea397508a5f50538d8dbd4917f448565ea71402604a970728865f659d961a86704e013acd850895e63b5a7a60654ed6e426e8317dc34082c82e4924dad133847e07415129267124fc82586aac787c86397f8d568590dc7081a883d1e7c79d667a7fa60cf4c2b0a0bf379c69a1a32211c54d3b87b9e2433e4e11ab0a27eca206ae664fadc5f6e802e78ca4cc0b9618f18e6bf36bd50df1d72fadc7d6666e4db504770871ddc424ed206a60db74c31b113ab1e2701f3040fcfb32d11d9133317c9d9f85ae7eae7089faebd928945ee34f7cbbb41a182f4db6241c111e1d95d7f94c41ce900aaa2c21ad0c6be312fec5e55d8736e6fdc423a0e8d6edfb23337d91d43d74e4dd4b42e7a5508377f573afa1cdaf409e441ab39988edaeb16889b039de8a81e7b52113111f6dc63e512ed40b0357099f191e5ecdfdba843c44dec1e946c3252426fe68fbdb9eb73c1f2e4afce9bf982906670991dbbc13cad08daad5ab1f81e6a12a15a8aba5d0a4fcc8fcdcccd7980e2b92b758f0cd9043c933950f04c6136aee6b7fa6eda0cb6bbb40ee62293c3346f6f8e7941eeb105638e095041dd8a97649595d1268800cb24553f390785b58d1ec915f09f2d2553c53af65f8200d1b4d008eb9c18955818400807bc59bc84ea05a373621cf6d1861a7406a889f321762048dd331595381273ad23f370de65147ec93c439d89b961744071f8d22a93715240af40e531a9d92933569495ddaf41f401a051c611b20f4267f2740dc6ff5fa099abcad7513263f879253ae4ba55b14f58a51182eb4a7c6a1ed7d1474dcdcbc1aefe7e4e9798d8efbf7323398fc8041e0ae4c846942ec13a9bcdc0a260fc4b92206223e6e256540d4c80818eced349db868a78389e27a3018c8ff082ea22ad90c0e9ed58037e3ce10bb58a8958def6d813e02ca57c3a68f9abb960f57c04d3b2822b0e2857287bc649756517e937cf13db08d978197f379d7f4252a2c91f66934d99b8df1712c053a308e7f3526c4f132c0a0455284911f5cf2647ec7617053830fdb25fd6028d7f497c5c04c0652945adc884ae11f9baa685fec1cd2e1864f64b8931aa5cc58b27e6860e3543e0ee3b413a1c86347281f0f904213e441d460161d36584dbf812c4e048d4021294a3d8c5642dfcf0ba497a2a035902fa5d70cae4b15ce80a0c383a4f15e78cc643dac7501af52f97a926ecc7cc131c70ccf0ad8e6192dcd0bed8cc918bea04648ea24a48e546380490167ff0137f49e42947b2ecba6480db6b287e8789abcb6579ffe4f59f79cc684c66ce1b9cdf198cc10f6c844cdea81c0319e0ed6b751ce07213d4cda487e29047259d079dd3a4601430b7c0bcd0a44689fb879e9e6024ce8e95a6db5cdc82a02552fbfa00e2d5270bd983ac6ebdd58922e3a844e4e841ee3194a0d31c77dd0ca3aa84dc18de973a580a9d7d2662434d7aa3c24512847eeb71b24275004750891181e7292b3a8b03946f8eb2ef642857bd2cadc6182cb95f6848d3d82a2a8a22a6a8d045337281798b8827e8812962e0f57ef0b2c70bb9e6350642dc8c1396049bea1fc37117773474543276ba7fd3ccdb50f219a0b9ccda9d9c63aec02ce0f7af683cf89fc88f239b2aefe9065d47e07923d3096f805c9acdb196b2a389c7924aac24646d44d813a7d86688ee99ad9eaff846d381416ef2732345f5d1045c2feb286d33766bca7491504d928ea3ab12141ef9a7ad5d65f7cd0297b61edc67fafe17e3a2050ea96f29f4ed4cfec813a02f4b13213f8f0c679516733168663327f2e28cc95754e99df633836e1a03febf074e5a09d1f5688fca80a1233abb9b473021bbc01cc4dd8c96b88b4f32828b6a00c8e89cecdc365f3149ca2b0c5ce9a28beebd49050f1ca733b763ff2518379fbde4c61056b934b802344a5436bd20a0f11c6d09237122991301eff02d5905bbae738f27b330eb9de65d05448e6398f23c6c9d6e11d88cb465c57f0ce9185944ad9dd6360cdb5c1dc26fdcf1e7c9285ea62f4341025d7633aaf3318021ac322f70189223b509c9080fe3d42a0a236950d7ea98e618dadd08907a02f841e47b31e5166523008d3e4e26d090a5cc07805c60a1f84e2d95af70a7ed50fd2fad56080634103cac7d55bd34a7495ef848e80f54a5dee0a8c9f6017637174eb251eac7a2872f262d530f113922c8bacc81935fe3e79c999a7f0a26b569afbf4c635ee6eee524d19010e7a8063f4d5eafbc71d8280f308b125caa29ad6a702ca624500b202d780a046a3ad0ee5bbfc20297cfa498b11cdacfd6946cf8111b0f4f8c733a7e0d89e89ad145989a8eca2cd9b25bc3d0b7f837cdeeefd231d79c8148e642288d98051686bf7c6efa53491c0e837e0359e7be25ec283014c88448a6ea63011e336d906657c68955656638920e6688a3251f3990cf5371a82bd46ab77b3716b0ddad56b7c69867a1d60f438b1c65088ce3363bfe325b6ad69917955b634a6e88ec62984cc82e25dd12dc27fa1b0f8d13121eaa4798dc0e279d8b5f33579789f6528b7d06fa03180b73d3f838eb67baac12d1e19597760009aaacb9728bb5662b867400b1a8bec8d1538f9a411c3304a8ddb276ed2549875115e7863d13487b77e74411e82dcb759908e1fb43b63e9a5dac7a47a5e2bc2e1c61c926285dbc554e42e8b4525855e9d0477a244bc914b0dfe44cb681d3fcb16ec2a7582b226455c8a25205edd730e8db8fbf970f634dd46c85768891d4366713898e284e2e926546cb2e08c102a11a0d0640101913301b031ede22a5804030ba37f0d4a5f8e8dae1fbe6ad52be06a714f2cc69db53834866634bf0e2dc379f14042730f8803bb105c779133c9327e597095b61b33670db84aa9a460bfc4193476c23c124b4ac013f66c1a9e954a4d7dbf0c8bc93a3ccc33ffb9ce6d98cc3407a2aab19fbffec214771ffb130385b33ea1384305a03ebafcbc84820e2118b36587131121336b7668ab7a384b04e63812f870027a0b5b10205c0fa22c565a0c58c959c69841c0976a61f4ac84e7ab8ccd03d98030a871bfa4468a6b0380f60292b59a6494a759c400aa3477b78b4cd8b194455aa30e05a50d6c5b8ff94e6f96d3316ef7d98d46ed7c6397f2019a84abc92b44db50c2133816a3c6188b75a935465a826790b832e0233090e2429500f072d7ec5f51e913ff1d49c61ce4211c2db45efc2f00f8d1bf62ead7cad6b4e208bd6dc02567a58314b11045c98fba393f3af31dfb362ea7182f67c8cbd647ce82f81b6fd688f57ce08bed7b19ce7442f3bbbe39779d4f737443b65ce1616ef34c1e048c0878fb83bc1fbe8d919f052ba9bf38db7185339448109f8c0481d88474e90568d04ec4bc017119365a16ef30ba913d8cdde3e9dad461d77f4e3c121018b0c4de2969a6ed3aac89b2a7539bf22995d845077b559562f9e41367e99ea0448d7d02d20bc68a0568761c30acd7e81ff6625bc3961fcd7e2e8233da21f5c416e1f463768a68c1712c3468951dd957e49fc57e21110bcdb6abe28f574755e2e45a7ed4e45213f389de3453e56e2f5ec350650cfc316830d30da9059b398c8671c51e24a5c690ea447b7749df8723dad3bf5ae423a26846d348fa23885f2571f5634ddc6628f97417e0c3d6637a35acd384e667cffca99339da60aa2da8497c7fb2689cdbdfc50fef2e43eb2e1c8e65095ba817b0236fa5a60e629d6185bcfd5e15c543b82929d5b16eb3e7f1c043c54cf068635d1b1384a1a0c9f89ed62a550605979e024531d247d0c01361e2395a8365171a82c9fc807aed81052fdb9c96d609518d520cd77531f15d0aa1ae54214b1b4b0e0adf288cd71d92078e80157f3f238c2af50cecea8ce3c3f77ec28405030effa4362d53dd6be1235a57170ba4b482955638c7842e6928acf7864ecb560b5e4675d35ebda307bbab96b339beceb585be61278da9041b5d223d85c90732b147539c2d8fd513bd256dd9aa0bdb2f4660559e15911bce2fc794fde02f36db982e4960f9890ad7709448f766187d5c6467a5bef10dab04c878fb0520365fe4570d54bb5f27ea1052057e2b42836ebe91dbd9790914550e591a44747440aa1a3691582387239fea6a4354558250cc72d0ad086d00e6a00bc9ad6dd0315233459690204dbfcd02aa5c719fb52f8a82b021adddc85ade15f8ada06199d6e167c16ad19530d225f092956b8a37618e9080faf121601b26da8fd0610c8703589b52ea30e07e04c2e380ca8f61660dce5a12f7f95db5f953fde022268bb5dc08f03571f9e54ad1963b229f68958f9525a8ae91da64eb93008a463478c5613bcd6e23e53f9b81b3b85ee31b37e73bb67cad35dcd453ab8a33636f3df8fa1b5a19ff7e918c17614e300d190a258ba5744ebd7e1e3a4adbe81949815c2cb752e215b2b6c066930ca08e23d4a0bb32d975fdc6b31cb1b24a8f780e340901f8d6dbba351f5175ed3af6c3e84743f55bd3b128f633bbd74ca3c79ef692e8081b74176ec10bf232464b24a8b99c21d499423c3108f6a07e2d885478eae353560aefdcad137a58d2deac1956d4f9ca66217664079c79ec9e89ada1ead2b8ed118d01efc473d87e0ec9eb3745abd38821dbed42cf6e67132b1029641fa434094c761bc015e1d0e80f027dd82f734afbd3c6531bdd521bb9bdf2c6388c10806571b918de4fccf9b8d488a8eccebdc0c31b43e81e7d429a5d58edeb3575140bf0bca37bf20582914a5536c8f470f38ee7b329c634cf2596d44a31515777be74b3357e84e298060ccb76e47b0066f898024a2cefe44bd425f761775164af22b2bba96882375b2aaabfc9df49dadc042aac408ceb3cd5582f7c17094bf380c425d6907f88987071e3c421e411a6e50e48c54415a99f6ef67ba08179e7b218f53eb89428de9582cf7de2fd3dcd61b41b06278a017d4d043a49ae0ac2eb23e33c24f343323ae639590a220c58ffa0216d0690c5e359e20f68a1c8d2bad6016cfd15b5fa28e9ab2561ab1e29806549f3f8a7fb0ad8bb600d6f52a192e9073f59d6c19bb022515db6540a412cbf0958d43dc5ba1e3e787479e03b7697b703e719c3987347156ad1581ece498dd9803bb9bf7704cf53b860e8d8c936a8c98962e090d270933ea40542104c29900d9d8bd017009c494ac125a34f9ae5188da0158e09a1abca2e2d067d1dd7570a729197015ffd42b4cf596c4a9432fec1c4a903dd450a36c5dc22f6b111bbd617a18101d757d56abe482acbfa272b5baab0703764cfb8b9720d626ef54fea9e03b1ba8ec231bdf35253ab3b1d197bb55ff1c2a7b67723f0587c25057a726d01cb99f39c588d6e02054caa794c241682200fc62782819dfb6ee4fcb4613069e4db64dea9e1332986184a792982cdf1b0e7b03bb9cfd8c331ccfc4620a09ff7f1ba7b7a7bbabc1cb6df15cb44940c30ece787287b416e6626a37d1f8a0daff40ad9c78ff515962f98b34f155741dc2be5d0174e476f63cce8a1f1a29a24ce0a4ca2784e3792d2140d643efabd9cebeb973a4b8f9d65c10411a9d8add56441132ae92c25f789250a07b2d48847872cd490643a4ece52203faea5afb826ae59a570a7e7543af34d98cb776a1d2f5ac31bacfc344a7e83ddc8308e0343df0dab7a27a80108f988955269a7ca3034ef90faf198f653b4f956e66696c09ce390d34fb47b117b3e899db5c45223cdf1f9ce0bcd157bc32d5aed0296bac8ae14dc207a7a89f440885e50fb1e3200d7024805642692b6d184e7aa6edcb6c8db24df4e6e05e26916c34c7a703853d2c6f83e26cfd9db4c46e447f97c0a74271b3667c50aafae7fe4b318e1591428d71c9270db2a987bd35aefdcbb2178258ec436665651771110c76913e2de4bea406b93003b524c9ba3ca2dd8b0a5d4bce5099b0f34e90d6b182b4dd9c8a3b41c214aa2ff1821498fee641c474470ce961975127febe1d72b16ae572ba207954e8f2031d296e0347ea34659d397b96fbf2856dfd16444c44a8b3bd598bc7f922d3af9204ef59181c053443ef74305996c9323ceda464b05ea41cc2c0ee08f2942e4d9bfcef7c7e25109e43345cc96a281dd1c8e22d1538322093b41bcd51132a7be38698990a82a10e4d158ef2dac200ddaa622b6c498e097c4b959bea1705575be6bc5f9ab6264cd7e12d89904f16813f9fc6e22d166906bb19e5ee487d00b4c90f821e4859f1e765b8c4b0eb41fa488e8dc91f2cc368c63c7d77937081bdb21cde0ea2591ca640cb7c683f24db42f2f2d97d64ef713528a7a89282511ff8e40747069100dabcecf1022fd2bc705caf8f983e42efc3c38f25576d3afecaeb21a11a4352230625e1049cddbb20a175360d24f759beb3ca5defc136f9c35c8277b3d32a5be87eae48580927534abbb6f7fd9a5e87935092540c8ca3531f4427b0babec6baa3ae6d80ab132a07726e0ddeffb20aff377d79e15d9e2574fc47edd62ffa6fea69b9800b3695e98916c0e4749276dc4ada95333b9ffec26fb7e05c42a47ba34edaa01906e9f47663051c35ebce418802094ac951bb8967a6ebdf0788ff9babca001835f0a9b7a5f72f90ce81774173c46b9a86548bb34cdd230f964ae8d4249928bd00e52b7c03600566b759255cd76686be7eb4413e9fb1b24c224002eb9c68a7831589ad0add9e7b4a60d323222ee25c7bbc08c6f4da1d7af94eeb8a5c74fd27b25d38df58dbf30d0f5925d23fa530861397e83cf298c2a708cc6b1dc3ba4960869541e942782fa5db79736a78912dc3fe5598960dc03b84c3b2b2632dd0d94c764a02648e2515f2824515ee78a9e421481cccfabeb1f04926ed5a1703f0602f573f88b0a65de47258c433a1332f04fb51ad00cc3ae944afc5abd9df23ce3ca35350bd3e529b71bf06219ca1c470a0b640eab1b1674ec28e43b3b61310322cae4d07483bf7ae020f5a7fbc6d582bf9a2c08ac8ca06cc8eac3169d3b4563aa264697dc0e56cb451f71143dcc66459586b940b6fc579e891d4bdffe5bd5616f87966e449d25fd245c34df8ce1fdec938d7f44e1e74dab9a30ed2db7d33dcaa4dc9ef06dfbbc2c9f32bbdaab3e7e638efab95ab0ae8f0e499a36a08f6f4f3af0affe793c2a1a79388c4f57fc883d128be9d156034d0eb595930fdd6e969e1f3846c860412135d972b535c63dd4bb727fd0719df2841cbff29c3b41cf101e49b382b49f96a42653d3b494ffd8e98b333c850040475830b433354b4f93ed664cd1dd283713487bbbbee61d0856327e3e886fba638f8b162ba09d7298f91505987caf8ca3a281e67a560e0ca6eae9a83c837fb0cb6d128942148f564356291f588146af4aa35788433701d8036c0d840698252e37720fc6311b11bf13066bae7bb01050b8831a2966edfa636d58290c3baf85d2733fc0663846b730e7a6b43596c6866be044d5033aec0df9fc7d395919b698bfda821c77a695d9895b1060ce6f4977d7aab90255265308bee6615624f27be83e4aba50feb27da64bc91a247faf50b7adc728023d7fff051127c1a620e705008cc21420d7a5e1529eedce48e766696a38367f3412fb5d89faf9156606c45f95c439fbbdd093d44be572a18333e3695a22b890f605de4713d13117e45d3a9edd77ef1d763f703b1ad62ce1a363ecbb057064cc3b737db6eca489d322ececc4e79f0c1ceaf9b12cd19ef7310889a869c3cf44825dc544eac354168426e729dcb4df01e85ce5d4e0e0c778681dc8a268de8faeb42319b99bc678128e38c21ad219eb63c81f028ba16a6115f43307e0215174ea494aa587fd1a2e00641b8c36e4cbc72cbb459b1f9fcde2d938798b13c32f5b78db219c5f4f87b54e87dbf1584007a98c411c7ad64f1f744988254ba933d5bf8cad77a5751637a5f5db165fc1033ab0e947e7c5ac77df87256293326f60942746db8dc3d54d3d3b152b8c1197e041b30ef5c7c927821b2216b5f7b3f3f6eb7a2cf5ea578c69eabcce5b40eb93af6c7c06fb7993fa65e839ac3df705116b2e6f22a52f5bfd840e7a3aa755d28c1cd29658dc528c1308ac6fce7d31c8f7a13b73b9d4dc7f2f8916bdd094f0edb5fe70e1b72998a43be98a6a22eff0fdce0da8e919cde4a6820922a22f7d582af3b8d942c4af2f40ce4d16972d17ba0eba4fec01896c12667f58cfd6ad859992341b5360785a5125c5a0f45242fa5755aab555f9cf371ebfaa477188893ad2f67ab4040a6430cebdd996dfee85557a922788c3da2b2a12b91ffeeb135a03aca768844ffe628170c75e874b80c903c5871de2171cd759c131c4752929ee815d3a3b1f552702aa0edf61513db86403fdf22a4b0989ccd6bee5e7879ad24bf3eb60f4d2f1e2ad161b273890f244372de5295ef60bed3e4385fe20bd6412c8ba0b64222426e7b4e3798ddc85fd65b931e0c98ce715b8facde19abc6f00cef5b54727058bfb10fe50e8589795409726044a33b7f52e2e90a014849d5f63b4ac674e2689980f79babff5e0aa305e11a6257f5fa13ff52438127646cbe3e2525bdccfbad81922bb9bb67862164b6216f4071330301aa37be7e0219b4065b81ed053b9f2b2d884db89d90ab7d9fc12f0dc87abdba4e1ab06f860dcd4227e64bcd80a208444a05bc3d1c2821acae7438b60d1ada0a4bc51a206af9f29be19304e2b35ef4f41522846eddd995252380b88c77ff5795fc085fb00a8622e545525a73dc8065c5144de6042b9a0fba01b3c933374822d86e713dc55185daf40c9297a52841b3280b1395355bde3ba65aead7f280b015b74d3d378a696688f5a1bfc192bd657f041bc47b6d425519de05343f646900fce68ee4cde1856e334380b04e9e00ab24c999f68aea75d837a05ec57565f2b47cd6908e265222e8068cfdc587546852f62a71df2b131df6703e0e0c1e6e0fa64bc69045df0144dfeb7b4d3cf0d7b8cea0636c8b4e12121695c80eb52b41e79bd89fa0839d4bdbec70faf839c04b55583ea77ad5f62aba8b320b44ff25b70c5a674ddff90d2f53df1771f1c53440a29346bd14325bf84414bb583a57dc16434443ea771d6238618364453a3b98ab344bf3be1715234adfb8f000631d50b5ce22c1e0f983167091105fee22cdd6dffe0625d4973a38e5b1cad86a0eb2cd99ee9efebe6801d81ef727623ff64d5c39fdbb669d26bdb049a98ae1ef43d882b17d07de260d49c6a06b36462233c588a9e00d1f7504975f0f7660a24e700cdc673528ffb4a5412417508cffd66d8b7a949388b6a4d0e24272e0a255e3f877c64797463877d579480e66e06202e418612cd94c7abc4516c032a9add2ed5a03163d45010db1020d4dec6617ab626d7a3a792842cad334c9cd3a6c73c5611b1eca1a21f2bce5554ffd269320145c8bcc5e703ab91571cd93249fd4c44bfa089c2989468f6b84bb4f56c83f60bc5b5dc06511dd4b1298f34be78c0fb41d3d36a2ca048ca24bc394635c4fd8ea9f55e618ecabde2e6139c609fec95b6727a2ba756be8ce42bf1abe369db0dd6b42132c20f9f88f7c5ccba45b2260c2136000f0295b28a873752ebc493d32cfa1b9844c06bdd7e06bc6f392d02aff4870e150998f29c48e209a6ba49827ed324d298e71f125a0674e3ee761e8b5aa207cf4bcf1c847a12b8814a6ba06d923a2b6a2cbfc26f324d302b2cb2c53adbe826b23c5b2c4904df59585d59d5f727270e6146369fd36ec46cacb3482b0ce1e72f0da2f4f1c998c9c78c2ad22790bb41256a2cb2bfa4ee8d3ded70d4e7b30bb0e4028be67c4cef0bc9a9aaa8c8f35dd2407bdf160ac1570b9ee96514ab45095ea1e6d10e12492c49e18a2ab1e0db3f4c55ad2f865f13590cd0b51ac3f391c1ea5e2877f7c3250368019c68077d75b82534765f260abce682eb443957c4167107704ec70ae1fa0ebb0f469ee2192ea4e7c5d0574147ff623fa3d1462d31d34c3b949fa11ab174b90de5dbb6f48dcca01e2be777cd00f48fb13453e8f1347f1899e4b1c3bb3e9ba8ff465c514635e5527bd9432a4af5c5b0298882c3f45321e74288f0228c2f33ebdc7c69f9e04fe8e3156640b244591f099a734e27ca5f315c75c3d67ecc11e6e1d3a32b891c6eb1442ef587c65c0bdc1ff738132894ca1dfe344ffe5527bd2cdfa7f5ce75cb01d2ea38f98b83aa7bd15ca8b51eed7af2e7515e9c3db87871a5298b0e9c20da1ce47e7fe3b4c464358d1779493a965ac3df2796c93778a399c7d0ae6b9c178a9c84fd28d35844a19829b1da28534728cc83b1413a50f5c8b988d8b91d66945de69ad2c9d3ac623108d60a92195a65a0aa71364ae6819a60899bc5bbef6f0ab10e2f261e221f7496015c5ff543beebbe937e60eab6efd5bb138ffad997125203ebaab03eca868db30a499c758cb4fa05bdef92457f3ceaef3702505f7c4df9aa84ba7286c8924f8ffd805b604123427cdf5df0c9e6aef110490e1a627c349a4f8053b8b176fcaea569d6ad37e9ce8d126ebe4c2d47e80f5f51fb36ed6c7c5361d824be31d3c8b4ceb8dc5817cc7678dfa99c585b1fb2f3766e8a5ed04a7c2e3d9638ef22eb8283380d8d690f9e3e2dd9a2d7faa7b925ee94e4acc35f630aa3582ec2f5f3a6b98fbca670e63e8be5f1d15a438d7145ac2359d1a13cd59660fd5c0b74cb820cf20903fb1f8c9da44ddc3e4799c18ff870aef9906a19f8f564e42f8cd768e18d9255adb83a093810351d7f3fb12706d7e933ccc7885b4378f4513544eef1ab5ab60d7c049204ae6bd8e95c64e1a002017bcf33b626a838e6c419b504ed9435d8c24e5c4dbe8d83960807a47e8e58fa272378721836732c933f09c836486d53f89bf3ba457308ddbb77031060abf9690fbeb86f5ead7a08e7652b000aba41567da895b2a1fddbd13e6d00ce4a87f88cf7138a2f138678dccd150ffc950560f50770123daedc70f1c126b4b63fba08292a902959cbd00d96503bef3f12ed2617e9b10bdb007b58b43700862aa62fb4d721e480ac462c44bf9ed4ccc766bbf5034f93e0f191fd704b3fdcd1016a083d60a5e4de6fcbad9d89e26e05ab5d76ec1ca1e0a9b15b109bf998afd60fe0499aea23f8a4a13156776057c28bafc05f7269969fd4164c4e5010b113fd860a1b04d357a7b3f35ed7835ef9b2c3b2d8744727fdf68cd984f374b307455e0f69698b73390d8c3b2cb78a5d5f2c7fd715bcc5d3f040ab89a76fa83656f770575266f2c585d0520d27ad084bf9f95e182d338634fc4a13e9c5b5e6dcec9cfaf038a5defaf0516640f3b8a4327ef53dbcd7e7477be1cc21de3d7e05914092ddf234c45f4b2aead79871a1fffb60efdd07c8707ac203fcf7dd2635f3c4e1071316befc923287fcf4437697fbf4ad2e8b33d84b6d485623872635d25edf8fb0d74dd07101b9d355bd45e3286212ca4c531f83f2ccdeb344efeb2481045282a8942d4251586daef6406f93bbf8cf4a3c2c5649628fb6144c0bc251c0f64051cb3e99c91d68e3b9c387da76a5f1451af7247868c286b23f540f9cd5c8bdcb692ae9fd6ce61f5fefad433b906409fafd15e5f50cb8036a558d01965a6b4d8f975a6bb9d87f5fbc57ddbdde5ce3227932f3c4c900898848272ebbf51fadd4e27d8477d01e09db15841b9fbe949d4f44e8eece28065cfcc1aefe8c9fe8514434fff2c7f28b4a30b47bb1218800086bb17dd836142fb5141aa016ab1cb2687a0aa3cbeb8f78e319596ea063bef4fba5f6f7c58c66b2989e26a810f37d22a06c4a5877741acc987e3e8ad8b7c86047a71c276edb1ee3554c4e07adfd288b26edcb5ad3db23ec03deaca92a61d3b12701d970a7f7fc029b545bd001e18f2280a782debcdcedb9fa1e1360160ff4fce7678b4bf8cb000bab3b709fdd86ee542027f4dd20ba0fc4675b18a66aab0665ecaae4c716fe4cb7978844cae0f1d8f966f0c52126ab5c79f4ebe680192c31d8c6664917aa284e781cb7102a9f5633836945769213d44c09e5078da299f9b8ea4d0baef6c5630d4ad5a1766b0ff6387a61d7edfa593a174e52561c369a4e133c0adf99f236a386454d59a4ab71093ba498e46b5f8c4243f22a1d0e3048a1b33cca18386330964360537be21a3f1881cb83dc4d47958b8102a954c51393a4dc5cd75a5d14fceac5f0253b7e9ef93bc11023dac9030fbf2b71b23a50f49a362c855f3cf190605de1b826ca37f475ff0dd63ddc6d267f250fc54621280ce0adab1df6575b8d0dddaa9ca933d424e341a84ea4ea07632ecb222a9af85d74033f4c63848e6db5bbc8a2e663a4b98d0a935d178f7b886c47f115c8edc9f7ce4d02e6fa112713df76e7b7d9d859303aad6269d1759adc1bd0371fb9546725137b9bdd7936dcf57d519863ec02eaf4e5b3622887c053aedb0c00fb9cbb44066ce7a7022ac9d1b2dbbe431e1e3290cc98e0bf311f6ce5a1814ebeb1e0cc14d39717f173d1f647af586d4ddf25d7528f2e804953c59783017df785e25fcc0e8ff5e7183dd9fc2c03b517dd70ad4bf8f8ecb200f02c78c582519c9af1c5389efe496a48cfc617d01005b6799463be2846f6dbc83fbd3694f67a60edb7f99eeb37ed9de94987135452117e3ae3258c1a68db297d79320dcc93486e3d777cf012a6773bd77d65188179f318df85cb565903c93b1256cc41d1c83f82ac9b085c9840a0903fc95e8d4a512ddc213668d7aae2353738ae4d52f782d7f530cf7e4baf995eb2a88c4a334a10714d183dd2ce06a1ef19f4b61ccc7d0f1c38455cd97d9e9abd266fb43082a54ce371bb6dfd99dc35f11fe5b5051fea00361e629784d6ab1a139fd3b0d81db49c05666328c5a065b3ebe9c927b1ad99ab8e371d7e0f4bbc1318de6a32c7f1e04ad667b877018d95554d99403312b0fe22886285bbe0f44d4af4cdc6cd703dedb9adc30f4471d4352f2ffe926f8aca358ed4a2a9b1016ffbcc8b95afc6c23a8d061aab055645a54d185516f5953d349653606842df6a545da45734959e2a48e772a6d0a4423f0980b9dfbcd10334f5e72b37f0227d956fbc04247e5b3a5cf17cd364305e7efca914941664aeb9f6445155d6e13b08521bb7c7e6b5c8ea871653c567e8829407a02f0019f09708a779dc15fac3e584e171fea0da595d350a396d122b09a7956ae277ac46243df76f02c86cdd63bd28367c1d3db5eaa48f4aa50b744f5a91e9eacbd06e46ddc85179df5d2f898f9d8cdd09fc6115c2a15660062d751bb17754baf374c57b223e89c665bc95b3adb976e75228a41f59617f7ac1e2ab9b64c607d6994a57f930e6de4a6af091f49f6e81991f0eb5c0e3c89e816dfe4f66815a907a196dbb4406ba7d4d47cf6a93bbd93b5aae815c7c59e81ca06e620946b81dff75a2794547a57c5bc1ecd310e81bd370b4d5dad4a4cf148860edad45ec61aeb4f9c12d09317753ea3b7ca8adbbe9341cf31eff23f017923335cbae4fc5293884ec886a844945567404f3e2ca618cd427ddbff4d5057e65514aa97b62fbeb6c248170ea03b00451963c4b5a4ad50b1fd0665a74472e2d7f3d7a63462ab4bef5b999f91834141b98eab42faf26db5ad0ae46e1c3f9c9bcee541fdc6a12d1485935266af1d83beb66f01d49360c995b5acd3f7da12cbe659023c88fe5ca0866527c91ec382715ee658456c5e5ebcef337914247d0fd95b4ad0d457e12dba618d2975b76c851b39eb5141d0db82db619a8feec2032fa73485fbc0e907bda5d7bef6425eaf244d5b98431ad80b04a2df0dbc98d3bcf844241f3a69637ee32e5855106eec8a80ee68ea2365c7849efaa056b17c74d3d2bbc5c216b7791c091cf0847d1ef52cae2141027aa9bbe9e6a9e21e471ec9509f75f5a0f536678bf655595426d363c901e4856007e1766a54771cf629a4aee6c45ed124acf36df0b1670101eb0c851c7c29260dbae06e907b9a37f4f00f24e03e2fa448ead62db2654f77e79989f0ccc71c6f46131a79145314bf73ba5a90c4c6016f12d22a40eab5a070346ce64dd83bfb76e12c5a42340bb0e3efc2a5c9865aa489236bc4b9a784810530fd816f77dad637f49cacf867d4ad4bb29ec9d47bd89c33db857095744bedc2015302dba60a0386a75482684050731bfd32818b9d8b6064535edcc0366cb08d1c6a7df70ccc84d0ff61309fe9333f45930ceb01a6462bf541074af8a3c42fa082962371413431e132a42696b3ba03ecc36eb2da91c34f34861ad41027601decb35be96dde9b307185f1e183d0a4b0c313c1448ace10e93431803f41888f5529590dfe92f32b4f648286b91232f3a5655cc10a2d788f5dc1ebbf23b549dc1a935dbfbf60a6d19f5536e9fa0190a8d93962048315c9ac9c7519e0557481f5d92ce5b55de5db5da21424e30b9059a119c91ea60e8a44aa82767763bc6beea7df4bfa74e5d4bb466887392010ebe72ec747a783b7f6a11aedba197d1d621673a575582c66f46d1a0508ad12b9a5beb7ff55f4e10b64f24b64e4636092d2c9476faa2f0909d6683653912849896872a3a0661b3e391b2624ef7ad4de735188671124ac7ffab3f9cc4d79a4d90c32cb1557e817045c7fb9c7f8c103a37b7334b1ec855dc65bfd42c3c367445258e49ddb63badb7d5461bc6a016b2fe9dc574569a105b069b89cdd2ca66291b9da6f7bc53b161fc8ca43c659c3a647b21ab7568b6b90aa29a404d5cc6035ac90360e57468972fe9fe5e4454ae131cc2530a48ede832e712bc1d0fef18ba09acd9234d2595e23e2978c26475422c5542f7564148bf4c8aed5615794f622d80f9d05101ed3c5dde3d340727f380316d9cb60edb39ec9c057414d75186db01d54cae222370d119f1512574fddeba8079c9b53b880b7f680bdfc9ab4097ac98c134ded72a7f3f89b7c706259f2a3642ba45c7b9ae8d94e8f49d815f850f39b01b4e01cce5e2c52374d9dd24528c5453857951c53937051d6618148d5b052fcfb670b9631e11943a4ff7313769409016e802994c50f0ca49cd1a687c93fc79a13cabad01dd643a8bcacf2cb2916e7aacecc30d3d8b7d5eead84d59df3520f7b608629be8b68371de50173de056557c915a43022f1105d459caeebe788051e4b2aba3c2591f90d549f43440bcee65a0736b94f9818bb304e9e3be48d71e9783a1dbf5798806e2f28c056a3ecb71cf0d13c48815a696c422bfb5f341c9cc8ed08b1297b4a4f400d801f72da31c446a340723f5812685dee2a6e8fe999ef22030bfa129083c4a3a8b2368a828bb38acc95fc282165173d9e57d1ca56b490fc211ee1e058a564ca5185fdc649ef3d5818caf63690f3106195763e554b76687ac275f3bdda5a806fb7d49efa9d04048c08b29d6b86581c8a2936c1082ce5226cc7b0bc890a8af3b640228d3b5ef3b35d2aa1bd94d580791e2a88ed6cf3260628653998f4b05b6c5390c064cf53487fb9909cc808f87a251b4c8da1775f701c75f9f1de81c20dff27b58fbf7ead2b729d29754b780263916fde7f75b438acccb4a3274326c18fd438e8c95bc781b1b265df711a726e3d04639fbb667e0aeb7b889d67e9add89f05382d0cd8770eeddca7c90235f03e4ca728f9320e52ed910279f3d1e2ac7b945b7e0feeb6ed23655fcb3251a33e3ae2bc503d341f9a1b8f8d64b79c204b0b9de1fa39e4c1f70e9edc3ac0209e3edc89c85713f568554c3e9542eecd55f2344028539575bb64aa83494c007aeeef285022e6c279cbb23bdbaa59ad864d70d15515ee66aa46ae3aad43756ffdd8deab1830a079319546bb739aec0a62a8a5b6aaff74df65a3fd5c85bfcf551e7c3edaba78111bcc326ec35e4f152d18602f86d17edd72f7ec810f3e56a51d0e39e3c5a548785261e4e6b7705bce9bdb09a2d57c8d9c1077458a63dde611a3b447ebd9a39e16247d20a6f48f3655e31cb05f740cb395050823a5516c68b5fc831e480ee04a46003f0b262846c4319fb7d835218a4d4d35606d1bfa66fd2e9924ec58ee677fcf24d428b6d1e50ed7d46d1f2fb36cedbb5f53923fd4826d250f774185f24fa25fa65fabb7ad607b4957745ca0e36f2739e77eeddc952d5d4dc9e1f5f5fe6bfaf038c507df649d57273190ae3977ee8645985e9c89d09a4d5a7e3f93b20e5596958b80d556e1c5fc938acb5aa79f5afa67602c330fcc60806c33aff42989a61194661c4fa6fcf3b36adff7668c49009f1be00f303b795d06770821532d519d243d27c9388cd42a1153a07691ec65135c7411fcd01191c7564a0319808643c9437eff6b8492750e25a42ef5c83bf6ff8a2e16c71cbcbcb1c44afb2a2c13ef5821f052b0885a840ef5b94554e93adef1ac0e9cdfbc72522168e34acc53c4f7a7586e5d5dd0ccb778e8509d0b73f0dd703c8b236cd327f56f0dd1d0fa0f4d6a5519648fa13eacfd4463e5551d5cb69fd6eff433f171dcab57c277e00364ca63f40cd4ba0a0be4ab001b0068e95a0fcaa48993d2183705d980df623a1bd1cf5c0007ac6da3f857f001bcdaa68c34de648b5c4494439a8739ec67e47df9fb2d942021918b9634f7e6b7462eeaa1904681f18081a42f1f9c8af74841f4e51be1b3445e485ba6cfe24b842d27e81a914c7f60cd9be9e74b7ddd230b5991fba23acedf367945fcd135eeaed824e0426a78c4966dafb8ab44dd4e9f25ddca6c50d1b87853cd2fbb204f37d65d5d4118ae8eed35f295dffd1ea2eea3678b6ea10bdfb110e613715733c8366a0610ea89c903ff6f8ac0e2d0ad4537864e2494eca61e5a4baf5344a7112e9a8ae5d81e2a00f0302cb4ee3b44a9ded26f1bed4330cc1185a21fd756b0627e70ea8fcfe11853f0e4318c8e575128d7b7552ce1ca021c398e5c97ff30fd43191c7cf5d5ea64a6ae81608bbaa822341bedc71983b70832a4fa07058fda7783e7b07eccc14d2e608cdae9833d78a98c8d429437399562b52aad769cd7a15b0a3b2ee82a54f4e0ea18ced65a361409120c1344ad3474a23d4871be982eb3b0f92cc7d37d58ee7795a2a8aaaaae09061ec7d3b3ecffb7a56c5d4f332d7464104ee741e5cf89bbc89fdd0c58d4002520b20b3eac492f9765e6acf6bc7cebe8de4e518c9c0bce6b445c7afa370649ecee28ce4f51ac9c0b2a7930c4ac03b45e592afc90623f9e66f34fa3ded2cf9cc9fce1e02ef0905649ffb1f69e5dd484f265fe3f724996dea5f179233c01ef4d0f97ad2567c634dd7f8cb0c0095da956c09014f7672e66677cf234dfc216d73ed14ce8e7699abbe3dc8ba87935fdd9918908b257a711a0c369c0c7e92796ef78e75226cda8ce22ea9d318ec588fef20053bfe195b24f4fa0a777cb6e2ef28fea27d26e1ca0a48f8eb742b23bf61ca3d0d153cfd1e3d4d183d9d1b3d6d1c3dbd193d2d1c73fcd6e233570a7dd2d413f99a4572bf1e3e3d859cf681ffd4e1569681d3b683248637ab7e750d037e61ac83902607910667500df25c798bf76cd05d9bda140d73eccc53b0c6fbd0a473fb84e0714dfc7a6ed76f393730246b4cca887519e3af7e3f9d3921584979de43cc97f82e01f50512eb164d84341506198f8e6677ff9b5fdb39b2f0bbca488c5fff66f0704aeae41ccd53b6f6f5784f830fc7111605c1dce8ce98db9bcee06abbaade23961ba6f8ebd206df73c0444c787ecd13b523cbde5600ff696550d488ca501a3c3e5cbcd049bd129fd277e7fb02cbd2051f5edf7692dc816549942802accc3af47ddc33807150c0ec3cc8df2fe308d0c71d61d3f0bf7cd43594a8f7a4a645c3b8e56e47124d1d2f9317de21adf151a320ee53cb8c69bf71ec4d2793931e674bee0abd8361c4189aaa886198fffd3fff51cddb981dffe3dfefb9aafefd7ffec7bffdbffff67f57f374fcaf2acbcb7ffc3ffff68f7ffce7d3d80eef3ffff1efeefc9b8ff9dfffe3bf26f6e31dca7ffe63fac332fc377a976ddd1cfffc0709417fb07dcbfff98f731bfe47911dd93fb36519da3c3bda7902ffb57aaeaaffc89b6cdbcbe37f9f47f5bfa8fff8657b4960ff5701d192fb3774310c239537c31a7f87e7ebfc0963ff871f2bb9836bfe19ac7f1fef3fff79eac5792814821b247f6aaa3f7192d1fff0f00acf32f2eec2ac1dfc595afd015b8a6198a89da18fcd693980438e61186dffb3c9fd33af9c7dc646524ffbfaa7300c73fde50bff6ae59a67fd8e04819bfc0f3dfb27de4af61f25446df16dcd76c5e4fc01cdbffa843f43561140212690f44e11886118f48f1276ff636a0cfd8303a61411bfbf7cc4dfc3ff7506ff27aeb3e6f49387916118fb8f3eff481846c1144c9ddc3b6a862472184624fe8864ccbf9b124bc08f25939a21711826deee7f25090cc3a80cddb3253dff62176318b644ff80d31f7bd6fa080a088ecf952002c348e21f90fdfeec2a6a47e635ef1789d81f7dc9cbfc379fc2280a933d6712c103c3b0dd5fe5d91f95e6ae9dadf093d92b471d8691fc3f204bfdd9758269a447402eabc31fbef4fc2b5afe339f896b6c37079a46eac830ecf4d77f4cf2d7eb055dc450fd5f2910c37c3cd27e7f8fc60b142bfc65614c1bd3c4f43f4b61b6c618b3d59dc44924b54e22b65f19bdcd5ab64fd7a62999b4b7910263d3847d7d8361440c606de15fa9d3822425ca868f8bca15509538ab78af658f4c29c0d0ab5de12249cd2d68597b668c8c4889dc2d86e86f9c602ce4cfef7c2307b5d953607fcba0ae1dd4326806fee9a34bc91ec7c9267389b8c3d54ac30f1876e3c21fbf76323d00f450399b9eaac23783393c91df40d2d754a00051daaea6789ab60f0bada0328aea3034267442eff1c8fb360ae07d15bdf86d6628400525e15ba6a618aedeea642b9e3447f83e98a9c6b4c9f44805be02b99ddfb781d34725c5bf851ee4a112a8945d7abf551e054f1de8bdefc046f0725650f781c31a507cf6a543f806f7faa5bfa4371e10af2555e71dbd01bc637db0f834d647f95399c6869b5fe117b3570638a0feaea1375d2501f96f161c8bcd2971c9a5aade4a9ec66cdbf9c60635790eb2ad462e3a0bb248072bf8059286973697339f7ee91c625d8a102812df68a77f2c0e2b5e76641903f78397f88bdacb9c714894d2c7e3b8deef56bca66981fa55a67e141c862250be88eb22de5a65b1d78657a294a729f75bdc1d444106b0e44d4bbd243573b8368d0e0f9d35c32c8d95458762151af4e21bc64def2f918e80f97e33e32381919608935f378a610c932ff373af33abad33bbac33fb5b67162f670ceb287e861cce84e5c418a705e92e0f75b8cbcf6533be65d0db5a5e04cfcb30129cd66da04cbd4faf1ec963b354782d065385b1cc0821e0ad8054ddcd64a7cef90565bc517de12b1990d91f572ab45cc77ddf85e9b90fb1677a9e38b2bc18b7c12409d330426ff4ab40a56f57a5b02558a26fd2dc6931082af537888ff406f97286726956a0370cd8681b07cd9eb091168f7722a7314f33b96e655776e77a102676e229d2dbf4bb2aacb68aca80ac517a4955638b371321c4d2b44166f7e04f844da42ffd5a89c6ac689a0e497ee32feacae64c8fcc24247c84283940cee7e78c539a05d0a27ad1a06a1eb4a93b364583b1f2e9e613482f9d2f2170da2a686b3ff80c193a2c183b8b85e0238e8d4139f7a3a7fa69ba505e490a34f2d37475341f0af1819fc6006961a3c13558a05a68293f1cf2386c9210fd16e908daef47d9fa41cd1fe52cf8306dd07ce1494135fb92c659e4fd86c0d3c2e08da4253dc9c05bd0c0238c3cc1310422aa4f632d01a5595c1a8543e2721c0ba7462e050d59225da75cbfba936314eedfded6478b3e29aee7dffdc66b1295468b43b43e25e35934291ea9d3289ca54b92b230535c0729b6059b05a93df0eedb499a20f254f467f4bd48d9b8e4cf3666eac76c8d71941d0a953a7aedf4d7d549986703aad9dc4c6bddbbdad94c651dbcdad64c133c7971a7fb3da58974776e9d2d47cab6f56844a4c67e9a471d9cd9d06f95cea38361233a370f47a63858a8af3b850058d4b75b1c58ab542354939e7a5da2fc2c0a11a78a21011edd8d293bba8fd35d92253e35c1376e604b2b3223170ad83cde07636cd64a3de2302cfaeedbb3f36843188bcf7b257179eacbf77b34dbbb35b2d5e31c2ede0e5aff1c64eddeccb6de1393f508233f994da8be6c906ef94442244cd98867772682276acacef5c54cc8ec51d2633112c0a33a558f0ce52e280f1787e52ba9f261401bd50cf79e3bcb9a0d3716e821e3c2a6c6fc644a9d7fd563733f493e35348773aafb5e3b4d31c444eda724047d4ae34217c845b90a3d4435db9b29ad4356db7a2c02d6ff7f3b71b188dfe58bfb89228a19bfb939cbfd66ecbe7920762678a022a2f32a466933463b32e1b3876717be6fcbe8e393e8d7133ca29d3b8d81c903a7b499d3edeb572554b1e6f3d24813be7fa8bf2ea173f0d785ec85b40c7c15c50767727311725ec66458a8f5b64cad42feb0d901df94a7071c0d29e907c8343475a85ffe2e7c2cc6661ddb98987292cc1bfba09951d24a55fb09cb79eda67db9e0c44f456c17a23a2e0f5bfe44ea5628a249338cbca7b61c2125793f2b734bd5e43ee133ad3c0f8c81dcacb74c02206d16e097283a3c5f539fed54919b3b424be3950f31b184ccf89d0348858739e7eb7d1522b9800a906615be79b42b1389bd02b50d0faac34e0022fff015fd94d8e27f68d948d5c84793608d2441f3fe50593a99d84578243fff332fe2a28891bce45f8076490924bc5f13d687063441540e8d6e27f2b9bbc10b943e6e9aa494f330fd10b7233f8b3f9351fabc9817afd1a8ee46b372cb5ef0aacaafb3a86292b96b501263e920f8c645cbc90162005d4f8c083a80f42bbf32d06892fbe7683e66ded6c97a08baddf60000c9354bf05f9978d7a14c205559b41fe3360a8efb2b0dc0d680c481e3bf18be3139c1f704ab6801063d02a24dcd0de0bb700885070b9d7d88a2e4a769e8becbcdb7981fdbe1d21b9fd8ca72665237c7e22340286d7e329d6e4de03a02d67f92abc4d5f4faaa94080b9baa1a12268a48bba16ebfd04bc1c021e6bd237be3ea01310510d03226c8572d32e88782aec50fd66ba55037ee5d21238ae5efb664b8c462248ad736aaf5d4ac8d88f66f5dc336e9c1044297f41cbe4b311fe877ff26d26f260b894f49359658552a6cfcbbaededffd1295c3b907dcff7655ca5ba0f06fb87c5283943990cb9bb0cd7443f7f018db8387648caea571d43ce37935a1cea634817cd8df7be8b9f15a39750d9f941362a11deb273d9386c4940d3b748df9d7ef9755c637595f87a7d5cbac302138d71692829382487c9ad872224d28a5495b021e5325a064741d1dfef99ea33bc0419ac8c64fd8cf601eda49dea58f4e97b28d6f5b7abf61af272c9438ea40187779bcd4f96064fd891a1a45c147447d06640830fa8ada122b2054fd2b0ea2f9102327e458bfdfd375efd9dcb566f0dc7e98a7dd3a6a0ab1aca7d5664bd79c33265ec85ef4e7ad9be1794a73bcd0b33940caee3da4e0eebbf6d3fc55d228a21b94028363d9e1d306a9b6c158d7cc1d3cb2b5efa8255a8ecb967a6efff0c167c617f9919c3e4c782cb5221c952dc525937027d4feb00684bacf643ea7d9a62eea3a66e3ba8c7d3666ebb88cb3156ea168066fc087fc3a1a8998152e04c0182ab350d477b9d2f84a5853d9f26090dc4491e1fda28c24e62b8595f8013c8474af00f43692458930ce58fa743764312860102e94662ffb8e33f88ca0bd8e8b9f7a45200302d62364a5b97489e4d689c5b691a1df9d228b4f0e4d8d20ace74f991b48d82eaf86474a585552e83b4ad26b279a9b5306ab3b1d15235070566eb38fbbad20c3b58e4b2ca7141961a8aa87aa89324fd8d6e341196153a1997b46e305b8b639b8b605ac918c5a68eefbeda3d4f2f37b4f4453d384c548615979a1c7486983eba3105f7e8dc4f3615d703cc7868939f74a6fe4aa16d609c27690c0121cc6b3f52eb12f6733497b488a92ec4d9d495af26c8a9c1d8ea8c937b7259287317c16f7a5a00e3626142e5509cac944c96d5c2383fbb2009ab2d0acdcb928f7d61abe7ad786bd5a05175f23435e212fc4372f3204df7e02eb31e36d319f4bb96cd3cf51f21815c3e0d19e78cda4dd9670bc2d2f290a5e880c13847c0afdcbdf3f372936fe3636e6ee561d4e5bb60e85d2e9cc2a159a2e19d99a9104a5347886f601c6f909e52b3a0255a0345840a9c8b649b559b751dd3cd58dda9828a1c476530db8c926d628c38db5ceb03dc37ce8bfecb1753ab3b5e4a412dbb018733a4f7df53bcf95ccc1123cb3f0228b387fb4bf302f53e9fd8c9bc410cfe4ca7570b0ae206a4e80b35e209a4e08b25e2b964982b4fdb956e8fb8120669acc3ac489d83112e3861fc1d433c7350a6386bf7b88bfbb093eaa63001bdcc0b7027990ba400b243b40be883b9fe4e601728b67c1ba20e5f3a1765b66db3a3ff8f73b659284db2b486115ea19214114262585befeea1091969963eb240abb14e17becfc357869c710eb78622384c2933b83aa457d1af903ce06c190ba6168c681e97bf021871058dd26af20861f7ce6c741fb963dc7cf4277d97d8b498473b4b8695b47a82afe3eaa36b81a537967b739e5d5ba79345b0c507c499d7f48b72295f6d9832eb674718d9fb876d10613e46f97c96e69d1df3192d519d9d734a1a4942c3e44ea67e861eb270fd9b4a38e959e4da308cd7cebfb793c59b344e408ebaf53bed4795dea17411fdf007871a1c8e4ee68f109b9b56f376e491dfe52c93a92451a75c7af9cb6a9639fe00220c2797c9c227e37caef252b3ac11738cccd40dbbc2e7faf7bf859dc19fe63bc9d791cde644c87411dbe61ac9d216f1e63dc9d591da161028ce56f2166dc9b551c61677c86356f51601c87d96f5e65548a69188e61c49c8118de63044714e22e8b4389f48783154cc8e46f8b7dccbab68a39d8f1d179a6b3619d498013b84df953c49d663151cd6d518195218e751934db9eb19e335719efa411a186723aac113a736b3505b2bef3cb292235a04bebb30525a2cb0e80bcef0dbd60770801035c397e064313fe4660887128861c8dcf481b0b0c8098ce2e973bf0c7ca5801fd7b7b5b0a20b20e576801491764560900ef8afaf6e4e07d9f361d822bfb86b5b25f1e9c3cf94ce6b9ef3630eb211629b7a179c9722aa74da41eb8e5108e6cfaae472ef47b79e391f1d7779900390e56dd009893430a15020fe7f5651390516d5fb075fc3b89d5420cfd23ff3064178b7db3e74431d62f1164c430a3d2b94bbea646d1d450d59877de959164bd048e957c999971bcf85470751920a8bd677b54afbbba660ba46791e35b63109fb4415b3dcc5f4415f7d5a4b221a2d733e8d6d529cd312742a490493b325ce072ee10e34db3d997774bb8a8931fc405b5153f1d0a149cee9f88e0500319c27c27469cbc0008fdbd2fb692e136592da4a23f6259575359beea28bf8d94191c2b39ca64134afa7de00578b34cd8dc7b9a526db1824998e806ce5bbcb6da49891ff1aab405eee1fcaf2b4ae7cf8b5533cc05820c4363c816d12cfa04619530a0856d107dfec60537acbaef0dc1f09a8118bc12a03da65882c171342ae0568d99c5d599c3e9b98cbd5d574acd02f181c347feb50d6226b308174efc520bfc91e8e97b4e8b5d208856e53e5248325e72659d6559563b39941a863ea0f02da294dfea88734b780f29daa59d0c3e58b3f617195a1e79e7c6b83013b66379f1ecc454c7568edd39d0e5437d72fbd5a0d35b867d774265aacc144641e141b598f9cbd7fd57b5c2e539cb84c14f1ebff889ff9a3774f90d9bb2527b4bed8495e6791cd2e6a2839fa8c025fc28f5b4283fa2345e0b82d35f22d5e8558c94c7df027d1f8ae739566445f04a4e20814171dff9618e582f51075c7145bf187821520ffef00b7e5e08efdc2b5eade14fe4a6eda97872004bcac412c87e131fdb3f8555f4c64ce1d449c8f730c09cd99c9d5ac9dc2fde044ac9d2afb89a9cd2ea3158887b67808316ecd0df57fc38612aef9cdab5c5987eada1a4b1b9feed319ae9e6a2830905b02e7d5bc018dee798c7a271f355c971893cc31286a48c15118f0530c49d0ac64e5ad4b094df5e1f7c90861f5cc484838c6993898ad3e84b882993fa94607f325b4fc763a3014a3f944bca3efac21b37f4c1ab6030062457b7201ef8af2a990f5ecaecee05bd0c5403dcb7fc0dda7aa29be364ab5108b7d3d56f85c75416320edf584362fea6731800304df4c13c4b02f9d1b45b5201af5047fc4a88533190498d2083d8db2f1a238069096d84d912022ef13c0c80636c9077d04fa7c9bcaa003e6f80aeba375a9f2f4c25d366435f5f3f7b0c0603fce8402938ab16876890e19293707bdf4d117fc4c51c0516d4b76f3e5ab86bd7302e5f5d5b98028105b9e9c382c786c5d899545b298caa00970bac80069c416a4c5fabc8aedba6f95db6012c6fabd7fe4daf9b0254c323834f215941839983b4c827cb609d0f8bd3a1862785a36666ee1537db5904d4bc0a84ae2009f78e69a0ea24d47a7d3460dd3ae25bb7891c798ddaed9d46f7acbce620061dcdce0df89bdbc228616775a62d501c28574b068277b03c76bdb73c1e7b14849bb2a67bdaae476f9394cdd09192fe14dea386c6785377b3c2725e792608c8a70cab9f9c7017765f786d8a6a01ff706e93962a0e8d902f3dc7d11b3a0f24402b795b88247b640c3174c35ea9fb6bf40b049e3d5b863f8fccedaca1fdf8c8a953fa440a34dbeaa0c02db73d5c8e68da29f0a42c915ec9ad897729a4a06de8f94848bef619f4a92b268717ba585d85b0c2acc0914ba88a766140af6a1212ec76e9bc7c9088383ea33c66b2f826e3d19a5834bf84173587238ec347289a9cff4dab7004629a695fac2192470f968e84b11c8aede02ca86e49ed081d4f19ba55beee8b3803190780d92e17872dcd02bac44e812cb2a22a762348479c7f06e3ae73efff6e753d6b9e4f9c5e1b09bd603683c8a454ee4c775f82c01b5d3f640dd1acb01a97577d76dca72fb845eb70981694aa462bff18d1bcb280cadd513b46ee0fd04adbbf225a224599c613f935e8a1d811bb427bfcb850b97ce22a8eafe7878a498cc6640c630909c2e58397303981b586f1560dce2860e6fdaf83a0cdfad1359c80207f7e151ad9d5a720cbc6122f78a03a0d9a38b75789782e85b2c56c1a3f7a3cc093fc08c22c8bacb84e2b74fefa980b8b96712dc471a519c9851271df41ea3a6d80df71f4b600937dda8b6ee390657ea1b4a654994bf1562e88c69b4395288186c58a78fbe58e4fd11cfc42552b92211b1fdd92db68b3f5e6889a3e0367ea68a078d4e18a76ac077f518ed0accc300c120a17398c3d1b275242786dcda9a7b0623d3bfda543e4ddf292e1713205037aa08ac1ba6814dbab2caefd0b043211e94ee792ba62eaaf544cccafdf138338dcc9d9cb83d94779ec515b46f9aba5aa0a2cf61238720baa5e84f4ab235b5d8a26891d7d86afecc36fbd16a732647639f4aeea18914f521a163eacb5db75d360d623102dd3587d904458321f39d4b4dc5c8befc8f4df2d84c0eb862753a2192c9e363acee96b9c55d75adac0ea013bc5df2ec31efcbd0cacb8c6c57e5fd9eb53e20e690516d6219764be23c7d6dc10b859c9b79258c3e3ea19977435cb7184ee6808ae031ccbcf25c2aa789c1aed017209c1faa5bb6f07f42b5890711c0271e3212b27794e4099a772c6be2f8f323ab9103289f386dafcb6152b4951a3aeea8036a8763cd0e4cff3cff6ab5ae84bab2cb5e03a251b543de8146174e2be439425637de0dcd5d99eaff35ca1c93407e7ed9f97f4d7fe580bf5035b158f8a43b12f72aac7bd347923b64133f2bce2025606b02014cf1ce74405e6541ba3fd24d49bc676a7ef62c43038d1c75598f3229983363604d851a71dffc95c52c6aece73c18384ed8924775f042bfc4ead2a6170f2aba21cbdd32fd9e263c634a299a68a6c70997a8c19c45ef1394630e96228e9f78120bdeedc3e4f460dbed60e0eedad134321231527491bf6c33332e4ed42c6415c2aeac7810f23c40852dc5dd3267fc4c747b0891a524b9cc97c2f43188481f2d4afe66668f850be4b21818c6e0a20e8e2767de052b083dcd506c75e94b8751ad8556330bd134ea8d4a8da88868b4c0705950cf0c29ef3c3768cda58643d87cd677c1fad7586bb5f2a53e9a20ea05798ba58a1d8f803e6bb44b30a5d4521cfaa06bd31941a48166056ac9acb5dee755e1ea131b0ec11e281153ca95f80cf20baea10b30fdecea453cd88533662d78fb284727c45514845839b03bf51249febaf90d4707fa719083b1a84a6c6d9329ed2cd1ca1ffd0d2e6400aafafb70c34d8c160c32470dceb501cfea6e6d3c6ea5ba43cabecc92f936bfc8e6ddc195b6548af9bfc881fcf2ad3e9954466d90baab6ed40f865cd1eb40959a63b1daee1b2d1990087eefa2c15ef6d91521973a906d644dbb6ede670615b1825570271668da15688491083704e466cc0016745a111b43fbe4172a905ec675a2a263c29fbd48a8f22478cfb2454c26b19f354e5f7747dcfee9fc6ca5eed748be7e9c2e7e32bc4b7ac1ac3e3657b38664969c8691cd4f8072ccdc2944958022d4eb843c0dae9bfe20d772e877a9969e23ec36a306bcad3f233924c292aaf5abe5880ea1c71ded6d943987c157a2a65791280a0377b7ae0bb2cd0ec776d716b815f7cde24e98ac49373a0093764a630d53ba2f5bcc70a78b7f70018b3c2d15ca614412573298d19a071ff0e359948fdd7f2222716edbeffbc2b69a82a60765eeb02a56465329f121824925fb1aa09ab1cc358f3980de99c9a8b821300f77b3131fda15e3e57a8eeb921bd44ada0256a4063c683b105db4df984857197be208817e4c1019539f94dbb57bf74edc1b8ea0f2384018468b7632457fb7041053fc54f6f40904a735dc5dec25e6510ba90cfbed05f2754bf43cc4ed0bc501567ed0ce18ee56c109063ce5f2f588e9d5a88754758edfdac6ccb7e5c63afa278594e16d91ae6722a87351961b27920be9d98a40227b6ef202c47467598cb566c59530c73ddc3c7fbaf24f21fb057e10f648dd69d3afcf5a66e41758520c3d85b1372baa91acd31f9b41d298a25cc10295a833a68f3e21c5d7e8733dc5db21f0f432adcd01d9be5583784f04f4d12cbe2885da8500504ed59b175aed3f70b134e6fb0f393a068f5cfe5d0bb7578126daefb841ab6aaa3d443b57dc080c23ec1f5f959648a4389f6f38e8a106f7a53c1497cf0ca3ccc98c6157299ef1cb0e11501d66fee9e18073dfe286664ca7f36bcc3204233cfd333c0c32faa472a62ccf9e7afaee69c62082e109048bbbcaffb40566348c33b62a8c5eddaed0fa10c7aa132d99da16b8171f33a9d733a50dd956ffb30d25b6fc3788edb5522c1d23cb6748ebd120771c4d99d1490cdfb1cfb42ce37562ee4ed11f9d1f96667f915881f5dd179340af48caa32b890c210ebea01bc856a5ce3cfea101f482acda7d4f575ae6b00b4c48771f99c68e229a9eb1de20a21b167839c189beb726f9ca9d771437fd9606d00eea7c182975bac19f4b2887394dabf441bd94044d764154fdf01c0f0e4cfe755ff1c089718873c2ce9c4259dbd3f2dd0ad1915b35833303d5284f789bbad6dddc1d79b2f67ae85b6652ef50600af596e8ec282113357ab3d26d0c2d7e66cbbddaf9dd296f3828417ce2fd6a5a297a81334782774ad719fe43fde3369bd4ca205b7ad26ccfb7321ded242a6b3a22910d84bcaabcc2803c1d01a57b0af386e4ded49c76f288fe412e0d1eea9a9ca5cf0fd6a6737fb15133a595575e971195f991b9d1770ec71fc10bf43f69b831bf401e4d204f899d267ae74fdae2294a0139bfe980fe21c854a63f355619951cfc911b24f6e3cb46cbd12e6e196a861a6e6f05eb0d73a15d92d300936e7805eb080dc114729623340e4175332dc0e578727c097d36fd2fed5dc889a314be873383467870e6403b8b748c0ba8d1c29fa3841f486a1928c8409217be27807e4266916554ff07d3d241d7515a3d24dbc33dbb633048cfd13f86d081a2edba6689ee627c9a9d0e519d260a66fc7fb667755170e3aa36225b419fb39246f7951b4b1dc129ac0969b8223364e2131e4bd1b2a0b4c6716060471193ff7ce1168df783f30ba1b65a754d6fd2fe61aff78b911f08e48edee3d4be7a265b6cac765295cbf14db19d8d0a7e6f6f842c4866ce221740e6553f018a149977a34ee3b914628583d45654b22ce4e7c4c921d63ed4447989c4abc35f835762ef72e226c43368a3e281d800bca99176b384dd3c90f997206bc134f8050ce70d7eaf5995d8e960c93b33bd4b66851421e934a7eb77e399f2b99d01d78bfd6934faa534c0d87c0633e4b9a530b2155ec59685d045a6c4ce81ad3e5a8236c63e2407f7bb0ee533559cc10c86d42ed567ecde6537e09f736f451242cf3b4ce2ca2296c9d27e5aa2552dcdf72f8b566b973f31a408402648c7fe097083fafc2a085895bb6b5bdb9b4d71cdb053891269fa95bbfdba6d90e1443321435264397079cc45fd580177a4100744ebc7e057a97de5755a0d70432964894bb3471277fc96d0497c0c51d38541ce3d7ce20e89cc787bc3992c9cf9b18b65f0e305e3f57bc5a720d639d29106341c4e6c48631039e9e879feef7bcb764c398101b615608da11bea535446d856d9e4887ae52c22a1a80de32f8d1b9b07426c9a1e996e5e9f798da3f12cf3e5a0ad1de52f2d9f81b6568939c0c4314d2fc44ecf17bcb0ba10ee1572dc2d4a0df10556d80842d68368b42285d2171fc4a31dcec2eccde59c0445f185c38cd3d353782bace50ef4a1c85890798b38f62d641b5d059d62e66113b270e7cd305d36f7c775e7ba49c85b837f4c58a3cc7ae36414194883ee14ac802006c7bcd2eb62749f45348127de828faa568a623e34cf8f073f45b181f7e6e672578eee8a1a4b4ba3cbc41b7e449194fd1231124034cb55f1e7d985f466e9a1f8a45e915585bd9b6fdb1f4d292552ef9d371392af8abbaeb353809a5b9f7aa5059791910e983a1c7bd2b3bbaed704a249b8fef584ab454bf136b96e3943bc4a82c976a32fbfdf2e7817adf9190ecd6c4e5cbabdaf839cd182cf52eab75b0db1603d8a9060722dc2ad1ebd10712844c9d78c20e181a37e654e3f8c42ea74b5aa19b546d7a5d6b5e2e054b9641d5ffc7a159235b0a0000ec4014b895380f77eb7077e7f43b7fef9099a4081ef18ccf9a98040930b864b8dfeb87822ccdd9abca7c12331e739c50b7582937fe7b13c6bb3a0ecc7ecc38937542d15b13d9c92abc83bd0019cb3ec359eb7ae0bf411fddfb1e380cb8eba5df33cf3538eff56b253befda0bb2994fc402c74b5c6125d459cb3785f7ed2e3895c294d1872ed60bbc03c32ed3a3122a92aa9a28201e2080b5b29222803cd5fd814b1a7845303d530cc6c26e9eb644325e708644795aa3a7a6fa7d5f3b8261f3ea7061fa97b1e4caca4d6e78a2ec2800bef16db3bf632a8f5c11af325bdf410ad90613ac61abac3cb00b3cb5436392b229cb7eeea8fbe6d0ebd03d479c687b6884b14b9d710a0714cf4ce62efa59936bed10993634e8c2284a05173a91dbe7656e78c426f315d442a202f95ca8764e402367048ca15175f1c3bde855445e080b40d019afa749908a423263b1f0bc5cd934c1b3a1c231776f7fb759ffa0eb2734b16cda6ea85a35aca633e08a68c21aa0f6ccda21c302acc19820ba40d594a4435d5976f0654c822db904fe42bafc862604841e4384f6f06fe86a0c076bd411a45fe249d6fc7e8379308c0487905773f1f8c84fb87f4c08b14bad7906dca96427b72dca55925ca8b7cb30a34ce377d690d5a6545645d4e05dbad588d217632147388dd627e270c6e7049c1760963f63912ad6a2738fc6c0d7efa3ed2a1d3ff4665bd1a95e1fe01b00c1228ff68127e99fc374bbef761bf2adb28c55b1876d445b7263cfdd0fb9e655a1117c72186cbe1bec4f55418149329dd99531e5b1ddb1b5e4718d1eda4f4f6b9648d185cf4c15326e64715d7725888b51a8ea1a2ced5db1845cf0977601f303a4f008b57a0fb1aa25b60078baf6fd26734be0e825a24181d4ae332ee46ba7712bd2f8eb8153e7ba4e1aa50f8bc089caa8f00632a47a160b0e268844e33dd3939a2e1291d76f67d58ef829bfd047d8a3c3fe6c810e22b3de26d9e82fb0b0c5ed0303f1857fbabec6e05753948e3b5584dea475de7b59ce1d4101926ff8e6248fd4751be8ed405b49b9a42badbedd642184a5decd824fc6538a9ac4c04f5cee8d488b9850e1be6c77ae677fa91424472e943a81f7cae005f94ce8324fb0522509cbead46056d93b346d01fe9c20ecb96f0612bb98e4da857f1f6a6dc0de50bad944ecfea0f306eb449828d06f9ebf33afb0d69cdf4c76825d0f634a5136d7a8d5fa48f5411b95489042580107b05868a44551068542922b2b38a061b2360194b0d24041ae171093be9595dc0e2073e97573f7c5771fb9448884bede6ddb50aadf3b4c257ebff05142cdbeed7ab5d29e96cefcd6c74b8e0da84e89a2acfd0aa7069c594d98b10521bf0d8e4453f8dfed53846678b3c5b7e293effcd29ad3ca48dd9739f7fae31f3eb7c5d44e4a3b243328cfca2843161f67f46f8a1b7cee7b948290a212bb2be2e93254a6fe9a00b27251371d875f9dd22f12ccd4aaabcdaceb970af9edefb7b7aa192636b2aabcbd303f47aa987ce4990bead4b324b9db33f8c6a92cba74a008e0fa801149c436d24db34e0eac0b6024cd827382e1fec8e04aec30ec0d7d0a45ace230855f60e209d104c74e331248a393af2fb5ae1f3ef44c3e52e4431ee36d91470a5e0a1e90c708664e95e53b025958029ef42d2f00e879c866c9e5f4d66010250ebad0a0315c164a06347e56d5d5aa2eb5211e3095b4acd37401737836578af219772a8d4729973ce7a1cb6c9d5e703f02c4e48e4042335ea37ab908ab85ef4ef153e094179552c8000627c1a19daa540b5294b21f6ad9e0f673abc5f5d50f2c4af343813a03602af8f003147eefdd1d91ee023d0dece228e79390a4493242dc17f5919b323df7d5bf5cea62766c3b83cb8a486734ce52b46538f475c78493f0f57788439215c2437550eb17493631e171c7075b79581fe4d2abb31e9d4858034a6690a27d24d2803e67588848ceb96d40e8640ea7df7bbe90c821a10663519f028915b88db202bd43da314c365dd8eaade2ea1e8e4dde09b1b579b2e89548e8f326d9d81eb7706cd16112939ee1c7f9a0bb6d8053184a09cb240054ae0be7e765b6fea2d0044da0dc04ac455ea93cc052e2fbe45fa2a25c4533029938957dcd4e7653beb67a37a340c2bc587b8527983cfbc007539167594d3236e031188afa4482ae8ac094c8b35f7771c4d2d54c189ca51beec572ca2a1924fe43e62d51069de26a617df36379f84875efedcc1a15d3b8a5dbb8520e0dca871b3712221ac1bd3de4999e1d0668d36a2bf5ad171f687ca932a2b180132c4d0040e9627be06247bd064e8e4b293e1459ca49a60313ed257362e7af345c612cd1b0caa216f1060dddf0e759156500d322ecb299a08a0a90f84077b72b4e11d3574ee4f7e4a891275cc32f62ab72deb2b426166b82e2e8c6102b6e879ff3af4b9a5cfd9c1ab29680db4e685a5687f2a3bfc0de495410411e7831ee04099e58842c52dea4f8da2d5c5551b60da7658e8bebc47275de87f367a0666a015952b0d6275e73cd33db8839729deba85204b0bd43f5ea46fea628ab38f3e142202740e9a33bf8d1a39d23ab083174d273f2d2c08849f17a8b59358a0a64a0c1589d2e2a0f67cefa0a52b551735c485ce6e4ca35d8955eff5de88fe195b8273dfe277395589d2dd43a399377e04774e5399b9a49344752577877031a47fc16a987570d869b71e05386f89df8bcc07274ac0c0517dce39f8d07cc48fbd67509c9d37742006df3b46c6c4db8a2a1e3657692af5854b5b62de4793e4ad9317f17c7aac172d27a06e9c79de71a838dd66e268ab22a987128e78ff32f70d5e84bdf7e9a53410649537e6e6856f95dd888ec24a0f20d5f6638a0f9da2ceaa1a826a1f2cc0f39f21ebaafaa27b5fada790d97d05be0c2fe05caaf0b2343fdf2cdf38df1cbaff072184f17a3a02c03510e4be0785ceb0f98903aed28808d00cda2d85b23a6e3ebc1f08176667a873ccb9af96ba9739bb449e96b56a6541bcc7e8e0af5a006d3186b65407c81680e5b4b5532607e7d600e42d20abc0b748537320f02a7c3eb92a46beaa7af2d8935d134eef51b8594ae2f0807690785c83d72c0a67bcf96a2696bba60e7c0ce0b56c8d685208b992936a28d8c5a628217e09fd86c996d5519a90a78f1b191229705e5133f49d925fed773a6b3627ddb66c63858a34fd3f45e64132d92f90da1dc791a15f345064bf16d57e8eed52ec85cbaf6a13f945598a43bbdcc1c0e267582ababf24d6134ba03f0cf9be83cc3dc66c7471ec24ee5fdd69f10ef4ae3061cc5dfbcb7a3d99baac6e4266ab525158d629d91510ea5fccea574cd5493249653fafa47a63eaaa26f34a0df4b7720f003090e10a3815f11f9eee338c7a21413b65abfe9f4850f491375b7fd09ea6fb7a6bc6fc1e542fa4b3ea5cdb39a6bef0691f9092b7cf652f653aebec134e0ded21e222e30ecda83339895c6ea0cfada5863887012a3fc12209c9bd36c075058f76996b1427c5bb1265feef636722e15fa17b310034a8cf7acc7cf8e565c9eeff8874a074d170b1ef33c90bc1edb076f2491cabdd31e49475e7e30b62bd6865e5b03b6883c15a21af12ac63eec2c63bc3a6bfff6affdcd91af513b429f71e2a57769103ccd01c89740c9518298e4d731dd4cd5357713e052aa4f9f2ff80b2dce694987a65aa02728fe195037010d4e3070d279b7dceafd9dd02e50fbce458b47a43af16b41859029e0b21ef04bc3a56c2bea3b70924eed1dfe2ab4e767804ae1e8435b35965110dd59e856b0f4622c6eee2434ade7b39a2a1c9146849250f010d4edf1cd9ed3c070d9e9ee3750284f9c1923d5fe9c8994c9a3054c79c8269354972c43f662e42d72b8e271bb880e2fd60999281ae9a6030283a8d7702d0346bcda0144893ca3c4b48b72ce3d7262349ca9c0d0611eaaeaeacbaa244d36231b475dcceae7974794051d021f2b4116a64f3d33d913b852ec1fefcea6c4829747f26cbc367325010d3b4aa2b80c63e49353b13559c8c60f7c02f28217a4d451cd2419e400ce1ffcbb61b4296be730171f7d60f871811cf3190a97fae4cd7daa2de7d140c5479cc98db3cd5ac3050206a93fa411c686cf6931c0c09b3bc48039a91d63be5e208adabe1904a36b0e6251dd0ce6d710b724f7919f337d3ea37e55f41d5721fe381d7dfad1eb4f289680aba288c39713dca0c8f4d9ee52bf2affe228243d576228010800568580a25d8aa6533a43014c4199b4b636ea5bd7f73b94609c9bb4ad9a2733db8ee85750bdd980f51186db94379a1747fd9f42f783b9343f621107bab0046fdb2165e64eb785f758e8e883cf3cbfe2e82e4bf4f018719051f13b9fa57e954e50c3215e87d6683e802cdbf2126faeb9d96648a37bb2844d0b031600a2a17e3913b3d22319aa44f287f4e86f4b59491a32fd048855768ca987d457e31d98ec7e6344fed8ba3447c6e88cf899fadc566c95c06682396ae2ae255cb89164b7c85486186578f33e6b23653469b9ffa4721c04ae911a71430a5db4bc468dc7ba018630096d296e332fe84e0dbd260b04d3327e6c442651f6a1e7070b12e7cd010acbc01c38e918234ae425f5f83adfee4bd28f298964fe9d51fe89102e9da7cf463ac4ff006db2d98df5d70ed7b725b1d1bde6084d8951eed2fb561d6c63dfbd1d04ee98d8c508350b699b664a6b61d9ee8fe6f1381cbdb906c89274937bb366720c3d6ba78c608ee78b5734ca3cf2712a47b125c75b7322c8878e8130928927d92f4025a4eca8ac3ee25424ab44f3c0c0e40d2a6deb785a438861982e1a84c8fdb73078b8052dba9c3f1702c032bc92d2b9f19ceec6fd6651f790c094653ff368769819e3e2ed33c321f77ac9eb62e89a087f7664b7d64376f66c0cf42971f4ac9f2b51c6e3996a30f7428472748f65b2dfa2906e93a5f6f940ce8fa8abc7eba9c4b0e88249230c675447456995ca1e2adcb09dec39a3ce68a1e5a262ed7df7782927b1d5a77e36c52db221e1d34ae37b6266e31d5b4be616da0a7fec4ec1435de29b9a2477fcd1f7316aae3c363345fe70a1fbc0bb2dba8f943a028cd31ce9f95bf9d09251bcd09e61870931138512d7615fe117b85bab27cb4ef7b1bf4305bc0cc2e80a16efeb362dea0cfd18bbce62ed7852ef1d776ece9c4784f5d7281229a491a3836b746c923c8a7922daddd21d6d5aa9ae185522d711171334de5881baa5f6e78bfb9971fd7706679f29d86f25f5ac6e2397c39859a5997bb4b96209705e38e608021fca2d4a62ae88d480d70c481eb3983f92a14f3b012cdf838b278d022bf2e13ae73088ee00a9375eaf7892af336b4382d82bd18cf56ef727cc99f81d30396d1acd91f45c5713d5685b25ccd7ecd153eae50203f770ba151f37bb797f1d32057bfb6761d8303555174f8e6875aedafed658499e4f1200fc3c774adcadd95ac44642e97889c06ec088e8527b7a7baac6385b963ff65bee8223fcc929980216cf67245c58586b79cf0b9f1d51046f694da27ff9e237620bc6449273ee027ea5f73caef5210aebf5f6939f270c0017a8accdafbeeb14eb34a73afe5452f27c81e5dd007d82afdd5d9c04f2412e8b3b0cd0dc3161fc7b700125aeeb6ee3bec30f473b17726533063b2357674521509ceb9d8a6cdfe55f80c93474831021b24d979b63d83d40c3fcc66e3c11c9e823afd9f7a16a89cb8d57000756824c287b67568824a3306c204583f7bba04215a8cc907226732a8b138a305a2f198bf45017d83f04f5ae208b29aab352cd18a29db9389cc9302552753573ed8861c6f2b08589e869cb11cbc60df8a29c462782e342d88244d69ff1e70add94d33ff64b351941c28251ec97dc446ce38daafc600ca60aa433bf74d7490a298e565abc2506a7ad10005827f00fe92ead0830f0b2f04477112b32e3cca4145ddf99fd3eea6981b89d323656dd3aa576aa5448baa82a794c37e75a086534d97c804d1194f590458f51c2d92afbf5097239467ffba680008f1140bdc3d4bfa281083b57a3884c91e55a47c9be706125d841c58b7c4d6398a3d8fe00d0f4c1f1b488cf2a051f12964a42d284d6ee356f303904bf993d3f675cd080c040b0f5693ca6bbd271533ad7e0d176bc939d848fb168972f2166c4928913ff521a4f443a4113f0c418e320484abfdbac16a28fa89ec4b1b0c41a8dc2e33182632971f23cbf9d2b627e5a692c149a565cb57d04ba8ffc88a38d63c919d71c1835f1273d7028ae90c76f5fa75f61d7eea0c8d9fa28b9ff287380957d7a634a2b85c24ad572dc44135f9c8fdae22f69c3d64313005ac59e6a113c8ede58cc5e079f23979c0f9277cca556cc415242710656d5d95c34ea177067a5c760e0f8dea04743c474d3d5c9b8636f08f8e5ac177a3f5a6837edddcf62f334455a7e6861ee545b3173e55a0696b8f72658ba56ad6ef30480577f6a7b6908243e901231011d3107636efb098897d5af47919a1e58c51c76ce7a81b92ec075fba419556c1540e4e8f5294fdfbf5739d00ac5e73b7314b54d5b3e1f75bc3dff8021e33d87d3dbae5b7a21918e2f82333361c3c096bbc1768bd340b8dfaa940e8f3accc1b6215df9bb812800189a29b89b1413e604181ee0b40723555c29dc7825e54d70e833f0c4d89887b74d9cfde23efecc9de5f201ec7fbc24e02e95c7d92268d9bc40be49a711c5d24e615f206fdd24e1f0f94b094642ee36ed6ca5d704ba9a09518658fbe31f9d467cbf0713a5695ce107a9e9df9ac866c84cbc0a0af126f90cb3602713248ae63d470400e73c0a87624e28ba6da2ce3c8358ad0dc8af4851610fb0c9ba5c733f2b176bb558c09f935b32e1ba4eb8cb81b3f10074f80d0c3683b35458b5fdb0dca4d6900ad093a5d50d5c2b9cd707851416aa491943b48fdc29ecbd9393c437a51b629181ff60da82663bade1bb39660c3a10ee410a491343f7869ac954731b99b1c111e3c52f5e9d5ba3a92b02f5e0fd35a38711955744e6ef6b60e8c5031478ca1145ae12c076f5e2a1ac9bdd151c64d1c68d5b3846a124fe5901d86ebefeb3c23420dbfd9aa548ac8886c481598641993086f0c44af02e6cd1525f64fb6d422054c5ca719211d8b8ec5fc66ae83d0b4f76cf41fbe6ab737b38757f4b9804a40cfa7cbab24bf61970677ad0c88437bf426b205da43315413786a16cb41b28da18aff93bbf6c406172c93d65c261daba9013495d36ae60493f3c64ecdf3e4f7a6a9bfc82ddc2e23892362b69ddad1b0708a7e948cc1126a9f9ad28047d31d053198b724453e4b1757cda3a0401895f1726e62b311558f2e6ac3bcf6bb52513f5335999d2ee4a801ff1d642136b579b675286298501d42ec1a672c104175fd96b6c233027bae6a35c3d87a47213ccb28acec4a24f0160dfe58606711caad26dbf6aa0b27eee2506b363ddb8dd1195d8dae166d547598f9c009731b49bf03c0b2b13babba64b4dc31ba42a96f3de0bda172379c8a5f5210801d530e788ea8b74feda40f057d042d00fc5ce03a1cd1aa2e8e30d992207f27e92abd193739846ae112c97d2c549e44726f52d81d1581ccb48fd6ab2d534f62b5143f782cd36a7cc15db637394887194226ef1a0b89b780bbff9283475da6f444f9211be24e699c9e742287c437497d38095e4dbaf69b3d2e0144ae5a02bec1cb258e96adea9fd46a82ea4c89f74e2f528c61614e62bfb4bfa5f6d692c3a936aa37ae803781e1a9be57c947c6fdb36f41b76a7753c56850ddd481daad0d86c334498f941866c326a8baf675ddd7a7d403cdc667970a4e688c15c15938697391a62d01a856c62c21a1cb1aa407e955529c3680ebe480b529d247dc92227fb27e45829586855111454e015c876fd02a28053250f5a5ad384463620cae4d3652046a2fb065cef2be2225fdad657681a6ae228ffa3bbe5b7c43ff187fedcc74e0b5b442b37d6482f6951796b096f875f67863b9093d7405cd037567e1271aa542783527d276ef903dc1a1c0d5b634e796f946384619e70b2d43343f52c6c18b7d2a6905ca59d119121041bc53eb1c5e5953854ed384ef0428a9928618d8a75e29b246ed4ce55edb70b94f7e5b14837fad01ea60aa022b49ab0240f0709381fb200f4c1225f490a25a0238ee18ab360a107581946cd28bfda729c6bfd59028ab0892573dc2314f3b90bc2a70ddf50dfddd2e0c45bef5f046f0ee8a74b6360688aac8fe54e88f98a8a42fe312ed8f944158bab8ed8c39d5d20fb91f3e04a165a9194a18d9b17243247a6d5a11aa26e869a3a364e4f1b2f73efc94d247e2505a30c0328b3c4d30c69c4abf1f00e60a0951a2380f12520235e704d1e49c3100491ddf6e19815f022f942a9296adc9352a7d43ded7d84a8fc812b0a566719212681c7d7159a99779ab2b680d8836edb007f020ac26d57461a4a7f4f3ea3430b9335281d321d87d43bb0917844ee7e53582216936211ce8345eeee0a16c4808c61f124a47935ba16db68cc063f2455ec7acb1516c930e7c254380a8d0e0d5a969c1c887b22394f01f15ea99d90cf6037ff03307723269cd27f326e4715028f2418f18b7822ad7cac6a6acf15d3b9fd466b13fe5655e405c0e75d6dc556414e7d854457f8963b66b88c41d6f8f3a0de401c176c789f8a04184ca625f68746502190ce474d6cfc7e28d45d3a090623dd1d57236c99815da0ad965afc649d1ed1a0be676c64d19ce18ee1c804723fc0c3ed2da13960dd3be6ac0433bb550b7e205d7b0c9cbfa5efe17dc922c5733b58fd4564820ee574a8b4cfa1309cb6e5ce2d8e0368e3726643454b65e87c8b9d5dd28a855a0ee0435d00e4d48a8f6addb9335daec16d0276dc29c64257276d06f15b53fdf3dc6f808b1fa88b793dd1b9ebdf9e5bb544fae4d709931975be42e41c3f60074001031124dd708ea0734749014b9ea2f24465085e79baf617499309c0621495c4d250e025cf99e22dafeed1beae692963c3ba128526696a861eeaae50b2a36b605748f1bbbfec483eefa10065f6489efb8ec01b1702e7dd6b0cf56ab18498fa6184db4ccc0b3918ca0c9528dfcedaac42f329425b7a031c1ff16f6448d51fbce55ec31f9317ddb870980a5d9b3beba1fda601176d4b51225be4099676f4025634379c56690faddb06de7ccf0347e2f36553a11159db3f7c644976c48423b69f222ef82867c2b452a68f79c21ffe6542af9f0d3c6f9bab755bd344b017c6b016b1bd183bf1b904808038e510576f7bb0ac41dab8ff46639c5abcbd9f879082e9699468e26373dbba1d39f35ceb8863a59e871c842693ad2e4c9af029662fc0cbc772aa732a7ef71a83a71a0ef3523ec678bcd58fc8e1c5d0a912d2f7e062896b14ab790b374b7cb2be45573922382629de04510115e861fc49cd4ab92da508bd9a7ae99585316261518ca023544806482171923c1200d9601e2027cbbdc1b33a37a00df5e96bdd4f99b1ac02410fd98508f801666f49328f9c966c8d247db1db865b4fa24dc8626538ba170a7ae0b26bc55ef939e79b91a84ce21b3177b00bc747f4d13bd02124ba565be51995fab52cbc4c759b42b21b6bbe11986f1d86c12b89119bf84a1de00e8f3d5a3b2419abda1b5277d83310cadc65baa8ba9160bfc5deb1a313bc35c0dad7fa83ecacbef7058ee85cedfd5773b9299afddcd95f1e304b6f76c2ef4e20d6d548fb0e08326dabc57f72dc4ce4095fe14da8c00527cbdd2201de084679738827862deda58ad19b2ee890b9630e2227058c638a8cb32291a39837084b86a35901e2521fa7ec3357aa241c33b11473e5c6ba58f266ac472cc479562f5ba612c7504b0008231c485f1126ef3e8ad2788494302daa5dabc3d01572619eb136dedf90768204753b3fa9cce627d057295c5abd4a2171463c38aef7a4b29790cdb4b780b463a53aa7b925485600250bcab48ff714b5fc406330e96ad08e3add847adabcde47be4b7750876ee920f3010ec47a15671c15c2285f73230cd8206eb136693f6ca0e861dc5a45ab12dd806e1bf1ba28edc427259d99e4b75ed05483ced427e5388c48c5d125023064ee9f4307d26e8aa776fade8207510190028df6ce2341a16632419f708ded43e86ccda0da2d266b15b46628329a5d6d5020cb70d0df40f2d372df18b3546e7180867914265ec65567a44f827e01022d68f5eb41d05e32045aa85e468ba382e6fe46b327d8eb5e539c28d4e3ca7bdf262ff2511bc47bda4e3104474b39a6fca24e3bc55c113089b7e1338ff4958cf5aa2ee137c757868f180f86533494960388220d1bd123a543454b927eadc837e87d921cf3ee9e38ce539ff6ba81a7607254fc2b7bfb1991ece48220124428f1b166b06407324d5d5d67f0075ce1914ed472333630555ca7fc048b804809c36f88e9ab4cff85da118a443f2231e114cb8dbb9e89fd82a6c97e0863df5dfd2e0a884017ed6cd9dd78805398bd27a73151425be8b055495555cda430c8a354750e382545d26a4de72e616d752dce657673390b21cd8b20775dba6bdb596f7b5dde2632c3b103be02515b30350fa5eb8e2a71b30052e2643f4a9ced0878611b17fd1df208b23a49ada8557c702f3cea8bb1469542512ae94b6ababc2ec94b46ee425041f99db8d4f401b441013818b7a97fa824a2225cafaeaaeb3b332f80c4e336cf8c02b0d1a2d94627ef29e647984de1fcdeda761d7eccacba2b6768584d45d0cebdff46671e3d63d15f01419b683b92e2e9a3c454f1f1ed4704c2ccc815b767376437f074fb5e3b83737d3130546d5aed033a7498a8a02e3bd01325e107a673af5111eb78bb95a68bd628bef7014f8c0fbf9c56d34fcbe022d0157197c4c31e969d4ee94805dcbddbbcccbaa2f8406dfd7b5c8bf238e3fa6008cb309a6d96f1ea7b32e5819fe3af50714734b97e4920730f826b8f2473d599eca15f8e9f2aad3e1b8ba0ab977a472897b3b7222adb901092ef9ed3aa59456b9eee8a8185eed806b834308f3be42dda5fdcfd02e46aeb5a7a416867ecdfda0072097457b8299f367d28199ef493650e9089005fba9abec888e0cc909fa22ae2938ec0a331af128a9c7ce9ca74b7d24da8be07189370fbd9f6b7098d77bd27509d24946ea532ad5ddf56a564f3897c39efe2979dc6f74617e7ea845aeeac9ec3fe1e51916ac8c18428dd5a67d819a553a68c446a58a35b35ff57195d9e506de5051f3f87b4916fe3d8428fa03e27688e480e610bc6273d48a7188bc945535dadf69e009326a7c72349ce7847f04d724ee639c66a1757ace574c094fcc8bb958767bb91cc44b2f2ac38e2ca2d356f4603be748b62c9252db84d0c9e757c21e472cd2dda3eefe8d9d283330c6cc99202d80047c99683646033f9cedea632466f652559a5511abdd1d0162aa4baca6345c14d6533a2d817e4382b9f2faea1e3393aa81202385aac85f3b3214678d1253c0213a9aab47871797343f65ed663e7b754d4183d81660041c4d5a84223c117b35c91236263cab23bef90c9c4964c4b3baeca5f69b504c5af586a3e9f01e600d01240f730c1121ee8a8a7d0be38e175421398aab5eb17fd3ed3c75395874c1ae2341347c8310c4f3102066c1e57dbc953f412ea2220387e43b2930b5666dd1bf8e48ed94444d22c75491ff693c6934e774d0a89fb1a503d0ce0116c09a3623db7eac8bc46f2cba28330db29057eb96b934fc79fc8da624a28c1324c58b30cfbdebb44e88d0862c9d7ead3d45214da246821997c4203f573a25647949005f0c5e5e7fd486b756af3dc0e39fbb1cb478fa6449f702db34e5da4416d8ef575e5c4c08fe3158de4afe7150eee641dc901f4e1f01191a92bf614c5609e2cc14cd4e98746884c9fcdde20f386762f9aeaa36c632134a04992797b28e8a56b7dd6566a6d2b5e7dc9307f436518a6d71586e46552ff16fa89d3716dcf7c9145f57dcec994f5e72c47301510b44991a5e2ad056cc3858d5dd79b5d3fbee4d740e788b913c2a9d26a24078ec431ec1fe537927260605d00a886f1fb2393f4b60cb35b3407300ef62557d845d4d136171b3bc18e288c6862bda7f51827bc3849afbec7d78b3c09ff34e40e85eb1017f57331b1de520fa382814c6421cb60950b38b0b25d201d42015eb93dd02bd387c535e9a7bd820317becca4b054916653bc6b614fff055f53f9112445b08793f23b745a9ea277810af740a5e2e99e58c966924a19ad9c75d2da1cd0a01ca68e2ae4964ff5ec610ce35b9e190ef091a639cf5c36173ba79dcf73c37cd06f083fb78a8118d5659db4de7bac7f38d5d5b16a30fc68a4bd6a1597171de72d7770ecd15a2bd730658a36e399adbc216754a4cbcf9e22232ff6f23bea37bb15fdadaaaba27bc2559d5e314c80286029234e2d208f2bce206b65a95c37ab8b1b437de6e6cf566fa8f7be22bad3baa8e64dc10bfce20909e397a4ccc955709b071fe1e7ca49cedbd5874b8dac57420542f534f23efb5bc1e6414e5434a6f1d8886c0c878526abd12ca6aae370ed1bcf2bf2efbe39765797c72c7268a32fbfa9001c1ccc11439e36ca53f5a9be9793a556bbe509a8e658371af1a1255d73ec162b54c8e2f8fc8f414b0f1536149d4ed334730a1b01a16a0ca7e8317c1b75d31e289b0ea0ad2d1fc28a75d70df0503b1825e94e6970c0d27fe9bc940c587e06ec64a5cc54dc0ba51f9d9025e9c22f9789d36ae0e591f3ba7b18615ffd1661dc53a1adb2fb5b28d4167c4ff749af30df7424f656a57fda862eed244e65e2276c0ab9d0251a63e580256176531cd06d84be0d92f7f1f215bd93c2b284dce91e152255926b3886d6e9863f7deb1d2320638c503c980b49687f60371af0789e0dd3c353a49b02e8e4a004f9dc385d6b54755b6e4c7ec28db53e4810012b3be56f8d624be0dcb87088f5fb611c286a6ba5acb5daecce66e4cc750792a05f0c05c7e1c76fa4d28023fbc65d58a7e508c8c173fbec071a218c83824f90fe15d9c3410bde6cd6a33d3eb84d3a9a3c163656fd5aa815f3e854a7a8521e33ec22d8692ceaa684041544db61bb36be34a1bf0a8d1b0a4c6b1efa2730401a8faa410337e12a068ca149b1a6bf9ec58b3d4f64ef3048dc130009e88217ab4c644bda4d5767f9e109842cc2a1800828397e38d97d16ccc2e49e6d512bb6c4128eb4b4a7eaa19dfc6d3ec635dc1a2e3aa47241715e8eef468c9c7f959b98f0088cca5c2be1ab1a610ef30340bbba19dfc6eaf0a20c907868b43728f4c2cab238e974a08b47e3fac118573787590c5b5314abedcf4dafa9ac846a77692d252a644ecab688a344e8d014867fbdfa2d4ddaf1e761699122a8d743ed12fc85603962f3b7f52bfbdc18a688b454f4b8a3674a77addf183bd8ccf189fc33c67b1d639f41c9a42cdb7d8db1fcb462d126c59814a834f47baf041f0b8137c5c27f2180f944c40757db4e563995d288583ef9806f8223e3d4819ba18446d029f2264eb21aaeeaa0925e8ed2ac96c8bbe545f2f87b4eae072bf005ebd4c6e4f507f9a63957301f4afcdc28b339b7a28d818866804c5fd51ec033a0b0d80a86aeb99e993f8c6882e0b7d08adbf8ceca724fb73666ffb1abeec5cccb3591563ca92878af8eaedbc21e5222f03f7350122658a1ea814ea1ffc97931a45be492bba87b614e86e1d8b15191b18f79b72935ebcbd20d92d6c6a24fb3186841a3fdc8864721378b824c4e6f1d57ae8ca4d9162898e890b03fc57d8f6422ba4055eb9e9903c5660c91dfcfe8a75da22b1dfdc1836b5ae55b87221fc890f4b42269a1e369bf205f29e8ecfb16c2ebdc1fa4b84e0b60dc1bd5541a827327589bedc90d6d7bb9085a3970b8e7f943a3f7258e432d8364d38b6072a2b242807a170449ebe3a47d01579c51edda2b0b68e813d2f81ee47407918f2cb353d2533ba209befa66a9d60cde5daadf1add80ade6e2f9c5c85135f3e14bf7317be02324093be735e2907767a7a6529ab19c4b8da35b62da54fc9aa3c5fc5605fb34dfae73c37d26a0ed602208ee78eb213ad898fcd1ea1a09c23814c4d9c28f11400ff78076bac25c7b86ce5dfeac24551c9cc16ff5283266a5d143843518e8e5cf39263ae53e289bad0e32629b4047bae0cea5d041661432e53dd0d265cbba1b5c4424f5c47c56cf86071d4409afc2950e12ab41fa2960e22d2b8acf734ccc11e3ac3e0369b5ea6a311a14afc3f0655eec073cd68f048b8a823a70344b54f3bc0b118e3d5520d2dc77e9fe7890c38bb7e41dac4619df0cf8a4c0fe618d67fd0e9e3c8f8c338a329612234cbc2350a11b2f94000eb3508c8db48cc29a5be4ece05a3429dc06bc7636d1cfc32bd1cbd0cfd12bb75adb53063c22139936845df177fe8d789a05c458b8e7f126f193904b216cb475a9f70b23d6a85d1ec93dd9017e000780e7dbca39ef9a3203f29d8b6c6ac64db8ce55c88aea4333b0d767484bacd17132d4c69b8c78659523fd70e65a152ddeb196dba2f9be8a6e1c91a110965c32f893f8c3a1f96e21f679f9e45675dbcfda41fc31bafd5abced8d87c02887abe32c0e19b04f9dcea418f2c43f53c1666cae454503e0aaf9517e844b059f9b0841a8ea2ff0278b30253f1b7ffcf67675902f414e575ba9f908f5db38e47482f5eccf8d7902506baf76622b3860fdf08eb6f40cc253a555da7783062323667bb69d40024a1b1c155695c543b0c75beb0016d46bab7b6081f12d357795f13a575616cd88dd5fb0e53e4a7343a11fa466e1e25bd81d9099b089f9e6dc1353f8300bf4d97a89e02b1aa8b8b3fa6a1f57eba02a8e223d8317d73671c4fb3db92ab3933f4129912975b7c79c37cfafacf6e5796a5fe12cad45758183a11246f1373e38823fd1e2b3d8198049976ae141c68eb68ceb4f89fcb6fbbad672b8dc500a75eb5dbcef08dc085bcdb6d6a4fe06343cf91d918655ca79043b30af7a74b89650015089f189fbcfca389f7645872450d91d36878ce453735830420f19b093d4937e3dbd6e309b3664c08fa72c7f1182a8ae34056a40b37ac40cc02986f31a9e46168b0c86e0e2fef35fde4ab271f6fb24c1799827d2a6b7aceed3323a39fa29099408d57bd5abcf7bd6ed689145d548f5407dfc0f81558a715679807be4d09ddc170d1de4442e2d3b8f0be697733bec334c949f1a20725137d701630609020822f768607cad686a36607a80bef458769f7a41a997353e404178bc125f21bc4289cabc5a06bd447f0a8853a785be03e0ae6c695ca33fc1524916f059901368e2877ad8bce605378bfa1d17878493e27019c14094da280904525f10d404eec9600a8721879939983cb1834ddf5292f8a5218c296cfdb0cd67c8d16f78664841a304c54031af0f9b4b9342d22f314b20f2671317a0d3f31b31fa1472ba2beebda39fbd2efaacb1674ec5e2076f08b96c30d3c7f6597fd64b17c192d3529e84f90a50184bf0f31a216e8467c585d4e0f99cbb063be053de6efde5b80eb899432611d665bb60ef8a206eb8a10427d4367da941f7f219c50eb3ee0ca13aa1caa21a25bd2fd3a280562de9e4e2919529d0555c1e7268b7d40b4f0387c843cdbef1c0570a66839cc7a7b29c2ffc8026f4803012785818c594bc8f52404e788c3308c209ce1f0238b9d6cc0d91dc701a098cb28b22f7aa4a054759dd0af1dd96a00f98994d5d028604f39ae29bc3f6512ce016839df165dc3acbb59adf5792167d74b158e0f3029b3518f04b02e2a14015ce8b1b02937b7bf5572c66f0f4bc8b4fe127c1b03086363e37a2a9c3e3ab2f4d2a627ed5ac9be7e9c71b8c75fb88062746c06a3077f84217f196cc7463d3658aaf5e8a9ce5b1ea1424de4c735e514f6c4f34b2f38f951aee7923f10a6bc220080f0f43ee3499b6ece8b1586d80d483b8626172aedd2d3ce76e90f320202bbf8cd189ae489a228a0b8ff2e4344199dd99425b89a23242a79f0011d59e2f2ab1bce7af2df2b0b20a35f6f20dc9becb135957705c22d4bb26006d3b81dec887242eac19b0070381bb1b2c7ab9c85699f1a4922817dc439302845f810181f47c35ccd143ece1df18962c9b52cb2cadc567f123cd40c1a294005a92da7b5f03c12a09dc2de5c414587ecca48ce8ae0612226919be7a8db50c04aa3f7f16b8fd8e7cacbb91e2567af0de405e9114022ccb04da806a6dfa1b8176433ed7f981beca1dd74dd48e471db3578d0d6ed14c873b6779bc2e081d72e5f91ece56d7fa94a114ad60efc643c4d8f409a5e920023f65443c83e9792f557d656882f05c1cf55916a8c1f8a6698cdcf4c6d913839f47f105334dd0f35b7ec273847dc20a890f6615754d86963b1b359fd48d1c42b64ca4a4239cb86c3a7d4c825443d0e4d60219c412404ffd3a754dd9fa64de4feebcc28e82a99530036ea3cd7bff0ce36cbc8ab54a9dd775812327a99a464580ed46a22b48719c19a581a29454d32326e98f322bd12503d5e8bf9b0eab7e203d060cfd549986843d5332033227503f36e8c5bd001e604665f5c565aa01b23b44191e9d6015f450c38ac5e4157c87e663d2058bb32490a447e87e3db4c9567bd75d6f9eb8fcc3ffece2406f09aaaa4255aa320e6b6fbdf486ff6ec331bddc10f110a75c13ce120d719b0040ee1eaa6aa02e06e1f4794ff30e1308bc1fb5d67059789a109d1e78efdf643e22833cb685ed4a3f8d52cc73549f1697bab3d0e9484e40bf895a48b2dd2b5a14574a2d1b1cd6a93b2735b4be44b2d88475ee152a76f03f27a6c6725b42a5e2d1c486c6634783a38cfcb339e378cbaf6649b6014583b4a0d4d867c52e6b1dd4700d5474c377d2f87e8013ccff31be64bbd6b1f34d145a0ce68738789b724fbb82ef5a47954f02e407fd36ba7d9ffd7464a6c733b535ffc2482b2ba06f177f1a1ca3f8920b7f38648e2dfb0079764a042082b90e82b3ec1e782808c4177a3efaed531f74b70e3fc271c420bd8e23d936575b07df1d912b68ec39c4cddfcba3c15e931871b86799a6c6b64a2b7e52e839ec910e2a2a740c3eb4954d90a3aa338a11eeea6f7e37350c073e799c2f0115454391b9613749d347c06c3636ebe00d3c916a23be3e9426a01fb638774f5b44cb200896ed6de7e6942a944338e0a505d7071cb2477bd67ebc585598666c5710185a1bb91568759e291ebf3695892e99b801b9b45f9bbdc5f6cc775c7dd342ef9ca7c8d94268e4514525bdcbccb381e883da96b6edf84641aa4c0e17c1ff301052c568c47ed12b74edabcc14716fe1413fe6441aee33c2eb581b5b9c2beafe3cb18b19617a993c53f211347969bb9855b4e76f1c62fe19601dffa4764a853acabfeb17a85e84267a354dce1b0f4525281a447fd153a6702f8d469a52a14316b38e6fe1760f3b584f73a97e22d71c9fc3ced36cba5c9990ec3fd6dea4875e67c912dbd7a778bbea162e334fd5ab649e67b8c00eb8ccf3ccc5f277b77efff7fe0b5bae9625774a888c1319274e5e14dc6415dacaf5bed43d6e68e3e3e756fd36f9d68bae79193a8bd1feeb11cbcd1479b1a944d6e2d57c93589e253ea047bd0be5acd383aa554fcb7d240851e1d84152715ef3a6073fba335eda6abeeb0df988f5e52797a337114f29e6c3cfd89934d6bb30f6379436dad6853851f77b9a38c6a7fb8445617f0f170e7e43be401fbdf68ba219ec33e1824f1ba3916326c1d487cbfb8afc17f5fc8720548c74bc361d3cd75e2cb1770694ad5b6f361c9ffa058d69c9bf85e8f3d087472a09e08f43f5d6eea94945c9d8de3060dd4ddc32fd5b164cd3bc5fae1e255b23dafbcb2ade26cad5b17be3e7fce221878a1b91ea599834b0b387b002cb973b157fbe09afa45c43545858713ffc928cd4401f4302a23f74d6d40cab6389865012e5e9d9158a3372eade48799e6d9a69f5b383566bad44a38c4a42152a5328ac6896aa4dd78a646eca2cbc870a822eb640aa878aced3994bbaaa88fe6ad97a42f413ec8aa7dbb88e09245ede93b3116692cb10944eeaea62cb3be6fd2dac4b2d0562cf6fadd5d0aebb65444eb70593c3132c0058d8e2adb9fae7aefda2e7ce8b4138bc4defe819c526afcca99b73c9afec9f89e4ea77c2798c5dcf02a4d04cbafa1345dbafe61f0ce1588f53a865025f1c76b0844b9fdea8525d6c092ca4db68b70ba870577ef08977208dd1bb1d5808ec4fdd232ba9576bb10877de05bb2a4df91e381a61fa6b0a7a7097c76c7e2eed13e85a17b11274fb3a89606888e35da7b4cca6fc263ba14a9c570c1dd5df569c2c4d289268573f0173c78c23a3653aaf247f636777bd07ed2206d6a2705601f647a736c44fd0a373f9e9663f762d8e83848869f6af49a069ea20f36178b86e220d5aabca1d0ad6e5eb5043fc96ec9a1b034107efd8c4c2d4f81036e547c4ee1fe32161c236bc915bc7021340c5aa5c4d275f55d64c1b9c6bd39faf25b82f0707971c59cdee236ddb321e0421f7d53f5d6875d9661fd6c4836269868f45106e98a149f0b1064e1e494d4814ae473bc56caf0c6d8d900ab3608831f9b55f7e3f6c41b0d21d52bf6539095affd5e0842f4b42cc46bfbbd6f0abcd62a8641f429f11cfc1e7e0bbcc10e546ef1911d9a7103bf730facf56f425ec31528a5a333df7f6f4dba1e4973d07a7b5b8b55aab064e9be0776c13694410d8ce94d12e10d400911ad65fec7e19c5f93bd678f41beff7b3a6e1cfdccc949be4d749ce335cf3d0d605064c16169a565958b95de869f12129e266cf2515370984d033666fd7cb4a5d4b97db330fdb34abb309b29dd583e7b1dbd06d629b11f02e20b3d947eb8b87fb7b668be2f76497196a16146660f8b42624b949e11f2ef5a4d2f7b780da7309a964fe2af3bedd1a6c14cabe34c21fa3cfe265a85b96a22c629a54ed58cf8284f3b4c7331e666132b3653e5787b8c73b2fda05aae9363d143286791ea4df28d2733f44d87e82f02abc59fe92488564d896b7d548a0aca934794ad406ff1c9be0295cd1fe0228a7f38e5a45310db3ca0833ce90874a8d627dfb9a4b2fa781765012b9d2beb676eadc49ea6d1ceb38c98e1cae3f046c96cfe616e9183df549b67bc50d5786b01bddf548d18a25fdcaf6a2a89fbd4852e5b378901bcdfdb9d526a2f718e75899a21ff387c3e4c4ad2bf709e6632ae94ca3199ac96885c5e79fd8d4e00b6fdfc680417b16ca327249c1a672e6bdb18c25471ab21f310e9a2493a2966ab2eae0789b109237c87ee4fd8a0c1e66bfcad6a50a47a68ebbef22a3dfdf14520522d0a7136be284129d57cf06eb5ef28eec5c37db85427bb51a7c9597897b79b242b313a078f775dd6add1dffb10cd5134b52b7314b5e62879d87fcfb3899c68ceab96290ddd1d2b0918886b046304721fe797667f8a8b9f7beb161c01ba24ebf1e2e1e6f807e059c6f185c7d83e68a73bbdabfe2484a8f69fccae2c44832b0e34811875bd0f6b784bf6485291c6013e8f26c6452e43b7faba3123e0b792cf482d8262620ce207c45aa9ec883aadd415cdd91597a5b0d1bdb2047af0d73890ca1c25b03f571fbcd221fbd01638d8d589dbd41822911e8e370d9e0416ba6b86e3e0612d7eca718c71ff2cb56611aa3e1b6fb616f082c03c4342e8695fe3a340d956d5978ddcd1168f7a48f3d9f7b1a35ecaf9296f7c31de3c4200be456b92f7cd70f5cf2467ed52398b4787e31b19844d2b0669eb5fc30d10550ba817fc76795f21fc34f7a3d20745e0cdd5c8d296ab45eddb7e74593d2fc57f69937083cb14f665a1ef87d09a58a2447cdf86c2f3e4ff60e26e22a9304f59b9a92dde5f8a8f0cbf52c784738305e21d293b81a6b14e31702c7f4e933e376d95a7b639796c614cb0e1554ce02af40191dd1288336117472e6e1d2623bf7697f49ba822adff62b33212abf97f95cc9a229d16f62165a3d2b8b5ecd208723ed86b7d06987215be082397c48f33df859e9d8b9e015d188142daf720ce06d199763bdc606eaa138e3d8ada23b3bb39903710308927e05d6154699bcbe6d0e1d8a52eaefac9e51f999e610a8b26356c939371e40daca9d6cf25522625506e8f353f9d6824588a0f27bc8489df848670893b89430f7c77fb62c04249c1596ca84d32af1b8288d16fecaebd74042f77a06e17994826112233a6c7ea9e22476beb8874f2d95906b3e6c65ad248d12b07dfb34721d0d5b2e705512f7a85399dec7a69970c60aac5445356f199642671423eea4df6f3de696ad296ccb43edfb97e4e3fa3d54571ad108ad6559c93687092e67aa0c7cbdb0ccaf2e2d18689a2498145692132e5ca75f29478cfb13462924e7609e16e1197e233d7d10a7dac39dfd2a96762370c84d2d9df0230ebe2d3b6f632422581add9a30540708caa84ffc342390c7384cff5825bbfc995fc5df1583a0b2eb1a6621d7c179c84ecba764ee991126a636a365ecd78404aed744b3ad0b8abf61bd3257cce83f5aa453fceb2f9c1286ab90a056900db04b3049bb5dec05d11f7c73ba0efbc0a8ff12d8eb5148eeac01fcfcae2ddf0e69bd055694a85f62d17e5a39a371464edf7f02affe65dd96bb58745dd89e6ed8de2b037a07f96531cf43e27818eb2f4be12556317887d24933054b0b0dacaca06290dbf735128a7ed719aa366af46d4146095ea3cc948fedd16a7cf240cb13ee4b5365b31e7479a23d03ff1cfe87a0af295ba016a640a4bc5c5152aeb95b4e69395c5ca4ef077164f9ab2e943fa3d28f3d1bff1b4be80f0fbbe0fb49d4767b8f5d6ca47d80fb23e12b430743dbe69adeea33232b3b7799bffca53e6747d156f4ab8cadfa85a874ca9f96648c9d72654cdc3bbb7cac9d6eee762bda990b401f5ec9dee78e854c0b91cb41316132207122dd2b5f3625cbc79cc2121baefe1dfb3aea46b01bbf61784f1abdee3d72a676e2ac65ce990b1e4efe657d9c97900662799241d6cc7bce3d8c1086b79c69f6610136bb258e60e8fa365996432cee8896a3abba077f96c52f971fbd92d490eb1e7250d14d858016142fb5ad9e7296da81023b0793310ad67c7f9e3f87021aae12a6953138692f0e9342c85dcf231b30505622b75dcfc31abe8ae33dde60364794cd4cbd58c21b36417c82fd4ed438ad2af8e85802858f07cac30c625d8a9eae59a1a514851d767171d81bd5d2d9df94129a9451cfcf4b0cd889d113dbe3d6c526d17e488729b6a5ba1630326be8dad9bbae9b94e17047fa2ca7d37c0ae675cf675b80f09191033966fbe5834ffbec51eb2fd9f0266da07186c37a96cd44ac2f0f2261e8c231774bdbce0ed7677ea47662f9ed627ef66de389bd0f2d0281f8e951dbc5b217b0fa7b959938456abfb5c980af254cb489eedd6c08817b6174ceb2322e94f01d38bbe16aa0af423cb0d29a612d6e2eed68122ef4c013c21110985e1cc8dde22fc4d879d8c1476b780139a4cc59011c32ab96fbee0b1c6d5251b18a42f8c9ae5c735332a2c677dbd74c04d93160d462d0b4105098a07f64060f0e7f66fb27c0deca49d01555e46dc4898ef68be9806c796b9d6a597695fb59c8243af4fea89a1d222ca275a1d0db78acd518bf1fb23b197e662b7a57d0699ecfe0f86e5d6495bfb0d2569c411c1cc3beb415cf66c1d3cd0ae924164b768e24b8e98b7b98a718db622914ee8db2287a28bd6e322331f20ed265492c9ff2c544ebca235e68dc556e577a0fb4988ecfc8ee724fb86839c4ca2e69495632d1490c34ecfe4a5707f5f3a9c628f820a6da27862d517c5e6377e356f605f8f51ad387983b985df9806573cd89cd253bf4ee66e554bf33a2dc4bc604425b2ab4fad3961ad160f9bcf4e7f40773881239aaf61db13b57b8eb7955974f814994d7f3a528272f33b4bf47f2dd87fc9825f47b342cf09bb41bf1a126cac4c0023f49177de85b3dd53f1095dbd472b3219e29ec924b03c5a470c892483db32c4b62e3f73e3fd1469fc3de4fbd9d21a76433e1464583559da4d4b5ea577b53c5e216eb63376717ee677ebb290f76834de0f90809f3556e8511dd09371f0c76ce8f30c53cfe89b46fa36ed7dcb5ec8f0f641a9bdc385d91e2627ed5b5506150f283f228b1bfb0c70d6b66848536179e14d4d6bb777c57165235257fd1194405e577e6d512412111faa098776f7f3ca0734a9f6271ce6a9d41dd65b4d1db7286392b852723f1b4d790f270981ad4e121f14171565bc6d9e93f5326cc841d732add7268eda19fc757563e1465af5c90020917652febeb3cd2856313093f859d62eef3d946bd47106ebc20765cd067abbd349748b4a1b4bd32cce27613a2272c8bb9f2806bfd6a24e895b1244f098854b7275c4b0a0f8adabcd8b693a8bd87e43e25aaa2963d2486b9181dac98e32a0cf333fa59f105e2d81bd054bd574cdd7024a4acfb2d3a9a862ea5ace21e7f1af45054fc850f56b1b1d83ab3a91b9ebc3b0cee105fb3f0d25a84dc0fd3d95a50fc84a029394579bc4e30bd049678295c41321be892112a2ec1356fd45c74f3d56987a9ecf2c99bb06d03e531964ec15b6b36f2c36437f16febed37f04227e5e43fd01d905d731bd42969f23214799029f4f8d3885e158c8b024737d685a805f77dd3ef13c4c64f256749ef3813c4d2388479f2c97a023a35908c9353af62db5b4ae4feda3352e7c55083ab9d89b624a44ce439ffa7c7f1c9eb68f026afc8400d731b7701f1b4e362d567c887940a75423459fc599fd8f7c862f938f3263e9f9af5fbe0572021f56cf2c31065a22450588a8d74240fcd43c38c280d09d25ddfb6b8a5f2aa1bf2a844213aeffa853f3685cffd4a0df3081daa14592f71bf67e96bad78ced9c6f7136d5f733d7e3cdf5060ce22a928b85f996fca474f443577fb7539dd3539ddd5e8755fe26db21d1b462cfae8b9384de3a891e8e4826721e9e35a2162e25403eb86a0e8d2dd05c833604031b1443d7ea674fa0a8b111341481237a81ff7a3f7a26c243e82a74dae98f06dc201eb7a7ff5dbfe57bfee44d66ac869e02614998b41636eea6daee10958343b41cce1098e9d5ec0c42b85b83e118545cb38e072f7cf7de7bffb01127c079d64c6d5310ec3e804a734af98809342136c40b75f0eb3086cc48218a9c3d00be4eb9d709c1b679a573ef3960c48438492e6b7dfea148eb54da5d6a79a13c068eda3afaec1fd16a7d8b8a4619a78bc28718bcb4ac68b4a9268b809cb0984ba47aefbd9042c766b3642e8a3d3d59a66209b2e4a86fa9e5f067759736ea2f713fff86150a1d7526fbf6af1c24d1ca819d36f7da01f29d9962dfbb12e4151dccbe0ea27603d23cd9a9f15d64fc7169f72b8863e119959421e26b4675fb8771aa6f0307cba216b1ffeba87a4bcfdd876672873692a686f93e2fb8a16bf051dea05ae3224eb0ec1d95196d6fd245bfcbea3727af3c43c8aa87c55b4213480ea15858d075516fd6f6a3e54bf3cee0829097da9e832246fc00247ed5949d3a6636f4897695c9294a77cd7db86edf8c1ef061eea46477549e3f0eb7a4d5c425652fa7eb3ccb5a99f5d9524ae21bfb7195fa43936f2795c79b1e25b6bfc799643317076f3451845eb29914d0ca8b25235f1b7cc55741ee401e2bf5f20524e090b946d7987a38a9f2b74d7ab372a3398919bc850b023d8f99943f67b7ff229791e4c954bd852384b1e38e6c1e7831a7bcbd575f01c8e686e6bddaf6b2d44581fcc9d0aaf66faf8d7dc416d9cd1c2673e42a8f3f3fb62f0a7026dc199c340d899c7895549fe4203592b2e89e82be0df7eaffbf3f6e1b2438abd157cc8d0fd00e1eb87ba5a88737c1922777cea01119da715b640f14e469f2129a37bd36af3954f0c62cd0c4b7d3eeedb8c923249d15aa8f266dad45051d227b0f5a9042689aafa27ec15b8df1fbee458568290d0f113b4ef43fd7a783cef08fcc3d15e4ed38a05cdd8adefa91725892ea5c645fc4cf9eba91a82ec8fa2a7362d54f46f63bded75c4e1a7a601a328f123dd67c301828333b7b0a57fd69be0d6855934edc7acc2a70db43399d2fa1df5e2513005ba65831777cb7f725d4c5d6803fa1e51bf1b0379721f2dbe9be76dd37c410442addb467ac7b6403ce6a47c0a6fb8d358fa2653de18a7593e0ece93843b35541905f755da1111c7f5c4a474174286410897b03119dc3a905fab3c681990d56ec98359c3ea6ee48dc4c8399d51afc669c5710eca56d935e3311b31ec7ddb4f74159a3ba83691d86e37c6e51f3dd31ccfc24589a9abfee25d4cff3c02aa497d5ffd824d4b48ad5acc5fefaefee80b985bb6e0d058a483436cf4cfac34b46b378f3e2e2ea75f4aff2025a71f1f9791243544db89092fcf73f49870f741d4437b09a03141ba6390a19020fd7dd5b3f9b3ee47a850fdb2f29f058f442714a041cd3e8f7fdac1b20c630325b0e16287a823d8e65799722cca57f2106c72212acf97b61c524ac65d8872ae258755d754eb57e6b539351abd3583f971e4d84f306d634d926c97b1fa245560393bc6df88a1aa3bd4dea59ca4493c39bf5d5afbe053b1fe9d4be96e8ee889715b7a1c2dbc9be7cffef3467e71dd2da4aed16d6726849ae3c8773acdf419207378d0afedf6e427a807db279fd29677d27b870becdaf66e5051d143783acf1bc5ce51e0f8809e810d6a30e64bbafdab9f1e00f60edc1a48ff6cb007780044006af00100700048e35fa8d2654d6418c1ae0149400e48e4bd2610f7588907bede087f772ddff41391fbd65fd1324bce5fa4753990aa56aa39ac08647b78f64e1c267c915b5e90b4d3e8f42659864a4dbcd0132eac5a5136b49b2b4c51dfd562885a25dc897e6b64cbb82595089cdfcc34f7af94346272d094007ec4e8cb03c2ce0ce33dcb8641245a173b1607e8e3b03884e7d9c7a7946252f820f70aab2bebb033e521cbae5f98a4452f5d2568170334a8893a71bef2db8913229a06af39602eb8994abe454fef464d3d0df88ea23798353d41931f1b68f1498923fbc20ff689a689ee922ee1ee5b31f4777244a7fce551a5d12d33becdabfb3862213609630b0661aa7b254e1c5d542e883cb565c9f10a356dcbd9a45e65f79e791f8508f213cb5d61592c38abb6cba266531da27f9bd8f1245b671ef427be83832ffb988ab816a2777f54ec569903d63ec6f0482c16a8b045584885019bb8d4e2fb1a49644c1fe6e8afb0aaec60add02ad050a75d25ef6d3980423bb2bd93d563e74fb1c59815dd5c8bcac816062f8f848460bd85620d668b7559377066346873a3d9b2691fc514285f42e2055fad49303613331f749b783cba6b3504a5b51c88f0dd435c741f58b9b484fada068ebb277ce39bfd75b7327094ed9a42e0633fb1bf0b096440f1568453735ec8c0dc949cabcaaee38eedcc73a34fc809082778b39e1f52e13d442276abcddbcba29163c350adfa6a2ab5aaa71a61d43e628898df51d7549210c5be6f47cff37ddffe0a82a1a9cb5e147bdf4db7aaeb992a28e520a6f4e60e1f1259ee82a5c2e8820e3eaec66e9685e626563d11fb79995f4690cdbae63a5b9cf3ee0945421ad2da4cdeba93cd7ef63a5bde93a773383bf9f1ee68129f25904dca243bcd9093b7a1273379c948dc23cfda744d86de4925aff47509bbd09e2e19439a6627e06c9266197bdfac7841ce4e6217b5565d72803f6f23018878b0feb36b809d23869de79c766c37edf0890f5fd2fb2167c910ea5b3a13171ff4dd1e15e13630f374f9ca18b6fa7c83e0e6c5ec13aa0148676d5fbcc1b08b57471b8da78ee4c6d6b3589a0fbae9361bbf83cd16c4ef1d4f864c71b13d1eb165b4be6db4bebd97be5d96be25d2be1dd2c92ef8819e78c5277f6d7eec44e6f50569e57d6b93b4e632bfb4e0f5d46d57ba8496629c3042b5aa1e0ff4c5933f463946c6a0901ea5206bb867aca90afe822e9984e81aaa0fb4967c32758f2a3a276f6a5b698cca57182d099b1bcf754d078630f7df6d1c962fbb377274c5b9d38f853c36a4527ef3e5db6f758b57b48af95fe7e30eb79d1be6124e509880cca28acdb17555570e3401a67e7674de3f86afa1988c610e902f75dcfcfc26ab457a311c3f9beb8450fbcb5363baffac713c2303372438b71bcc1f315cc531934871ecc70622fa53efc0bc3efa2634e4d84b1c8c0271539b0630e136df41c21189307099699e82297b9fda91b59080bc23920227b1bef7a624e93713b08a0d01d5fc9ad51c1663cb2d375426f29ac57205b4b4a520ff7df79ac2060454f9a76901dcdf49bd4b020614610d006f3f56231177affeacaaba65b2c24ceecfbb3e62351cad01f8efffa8e66dcc8efff6eff75c55fffedfffc7bffd9ffff66fcd310efff83ffeed1fffa8e6e9f88f2a1bdbe1f79ffff8776fcee763fef73f2bfef73b6b87fd3f86b99eff5a9867455f6ff3397dffa31db3bafccf7f9cdbf0dfbed991fde75f36bc4cf5ffc8b3bda488ffad8d38dbbb115daeff6af36af9612386f55fff3fffeaf96afe51a8deecf9fc99ec2867466208fe278303aef85fe1ff95efff19d72a0df3f7f5ff664b1c701bc52304509b0a57277fb05ae1905af1088d0775a570f71fff9feb0f6ef0f5fc27d6136ee60ff6677d253ff7df9c7f38fec4fcc1fff8ff607ffcffe4f588526ef6bff99a7f69d078d0577fe5e490bff3fc3dffc3f53747293ffbdff6dfebfef665d253fc9df30ffec7b6f8fbfe338f252efc5b5f293f772836a62f727fedf34f4c2c7961f397b6bf72fcb5df546a8a3f9a7299ab7399ebff601f890bff8ef9b38f3f7c7fec3ff90bd9eb13c94bfed6fe5f3d9bff99efffeb08c546fd73ef94df9f1b5ff65fa5ff0bc03d3f184c00ee4497b9fd92846237dbb0120141a975ed6b6fc808fc44434eacd0657737a1113a483e9d74e32d90e12e52fcc606d4ad501cfb294efc20be1e18ddc5f68f3af76833cea86a8e6cb04bed9bce161a6ba9d88e0791cd5e6dc87071f8df2d6d39eacba08e7590b0bde89f6a72146685b5400459f973d90ae732daf65925e7d57bc1cc349bd2c172aa63e1d0372198f14bfddead07408d453ff4b848e932da94ff59462a5fc3591fafaefafff737fcbf8dc4c96bf75ff39f03a162e445ff2b471320c4df15c94cecc149ff4be9a3a484cf72b1e5bbe6ed1dd67c24ece7104d54d19241ae77a298db2948cefd02ab2047405407199b2d47b50eec1b332213b313c66a91af48a61ca574d584c4351c3833915479b8dfbe5c5c49cdfdf032a6ec960f8ee7916f8e91d717676bd7ad0f193a1aabb06576270e5e1707045bfa0a70b9e05530eb6e4edd7099d0ee71cc1dc4cf5d5f75379bda02bf44a42a2e146f4333d6e20f117f3347aa56ad5da7f87bd840f53fcf898e751d7b089be90d67d49c28cc309dfee4cbe652a56d161dca6837b8e1b11b18a4145ada117079843ffc1bb74d55c9eec1679c94e15cae6263e8c3640bcb37d8be4ae9ae4f648797646bcd84d41f75fa3531557e575e946635c0c45c52454147c25b6e82c7bb6d4095c95ac28a29cd4f7323d076e4779cff18f7d3fcd618d6b97b29dba56a0fb97e5ed60fc1937c2bad1473bf28ec77f8110fd1b9c9214e2af1f99cab07e9afd480a13ed160675b3f4a47999f50b3f30690d940753ff3159bdcb3092631fb045cfd62604039ac56e14d006d612dcd55ef30e03e50482f84cea4a2b482e16b8a1987c78fb36850bb3ca0e363ba9608e1b91e139c01e4dbd6cc8a394fe83ee17a209329a609bc99f3e673a9e85cbfc82abc6f10904cbe5f20a7852c3e31047d1cee062d4082173939698550615c2626b8faac176a591cd90beaa21a16680ca92abec4256929a73153ea0270b5058aaf6cee9dda62a433b38e36bb1ac1b9d4e94ab753edcc9b16ea801ecc974d0292e0e7c704dccdf12885e42814563f693d8a0b43fc66063dbc4ec2d623319f26cecf32f80dcfc189942a610a401749c8a18a26929f69706123075a662a17b4b1df96886b73958809ce5daebb99cc356a207273356d0eeb0c97e44ccc522d073ff54076f22a3b7fbf429fba7a4119ffc1b2902f8050f322b9fa387ddbdf2a3d1826ff2e4149c2b71135fc3eeac1478d31cfcff88c3f8102025157b66f4454bf17fa16d8b4a284bf52382b212b8625de9a7ff2cb7246b22f13d1006a3036eff4d437457ba4c3e4f9ebf997853903e76b9483552891dc832f5bf95147c56107f65c493750e3ec6a85b31d5e8c34241cfe46f99284f019df70f099dbc74cf392f0b73aa26acfcd7f0c83092ccfb09a7e6bdd443ea4057fd6f6a8b0ea5068b27a2458b01c12592afdfa453f115a700dc61cdc81bb82006aec1fcee47ed850caad983ecc1723e3ecabc3e7f5e2519736feac38fe356c1976e2bcdc83c026aaf88e00e52c6ee3f2a65ce6032c7e4fe477352c2f59ddef854ff406cbf0a16ea2b83e5ce91a185dd264b1e508444097e5a75a632ea4d3bc05e2608cf30dc65f65ff861e222a52816b48158d585b0ad1b43a7626636a08622aeb4ced856ee4ac30dcbf707c7e7974f3ef05ff8d04541ac74a7dabe3ba6fae829f7cbeb701142c3f33922bb7a3a388c981cb2ba9c32742f746e6766166e3c7051d354765f1c9db088d77845dc5a8fb0810675d272d7f9cfc341357aeb1b64f86e1787c78a4a5f53a0ef9c73fdb8957df988f3a6b0c117c9adeacb8aaabd964543e8b5ee964519869f2869b58810e6c839836ff662d6211f295fc1cada22d36e24d35e22c12d6d6927b4df2d9144124380f50221c818e3b0954b0613217e99cf64022dc01b97cf08b7ca43caffd8616be15379d8aea3437c74770d9813bf951b8019957919177094e09cde0e922616dcf138ecc972291e07906b37f2e8d2900060d07f8fd9488026332101291bcfc8b3a49802541296d0be1712013b7490c843a230566a9360d1875ce45d4bc192f4b532b72a73f3f364983701f40493aa972b52ae99fcdc107df831ad82943219ef69a85607dd91511b624be65d4a6b6842be4eec477e91eb60aa972a048f1408f2b064cfa7e82ef34a4160468f87c150a494d11dc9a600f766e4d1ce417662a14b731605fa7652e8f6d799caee1e13d42df6e9e4589f9baa071a1d0956d457d73185975fa2691a21239dc7720b836fd5f99d317440292340789ad8a8eddd1b726e611115037c701370151a3d009b98915dadbe10b6bb40cc12d30e715f6890012f2801758d1598c507b78f557aa297fd169ec1b62979578cfb83768b628493a35a0f2aed2628886c78715b55c8265a6e4fde007fb1fd2fd0a1670c24afd1ea9a979842006f442742a50a3c913908cb77383fa22dba7425280b40a5b129b9270046d30ada97636e800dfcd842b735458f346b26df3c7a99dc77bb183cb2c794de4aedb96cb89210c16eb4063b2d58d9c6219d50dde19b381b567cbe0593395b528f4eb670004d491b7ed71c1075e022a7bf2e326ad925037881fc6cd956b51957111c2f8b54848789562662dd7acad9e39a1e1eea50ff8d6aa0b358e544271c83d899f7ed2074931e0b5c2bb59ca45f4b691d9243562dccc5059e14013ec796a28e4c4583e8fa92b4e4c7cf91d943f59440014a937b4f979867ec9b61ecee5a61b77d13621b971d7d110e9b640ccb11353201d7bc11937ef366e09c232bf0c2d30bd88801bc059a9771cb151e6f294efb0c29be499690bf0ec8d1911952dfe6b49f5234dbc07f79503196bc71c584b516e193013f4e1081eaa20449485216595f3cc48f4cdbec40c4b596263c1bd8711826735253b27155c6b7c81133c1ba90d30f44b6f1202666d006e7fe0536ecfcd9648f697a6771bf31d6e4da7fdfe9066728eb239b5170edce2e27cdbee76adce5ae69b024185fdeb11e9020518e78910a7886bf6c605de9d65359f879027f61de034eb3a0cdc9c8ee5c3380fa03887bf99615b9568d7b67f1d2dfbf2f9dd89185fb6718827ca9a771e6d03c5fd96e7a0c1a963c008f6c0f0999bfc3603d6366c1922c98a1e9823c6868a88f7db25f89d8f764ddeb997e18402cdb2fb349f2280f8a2ec8caa8eb5f46d812694119b3fe290b674c3dc93b29b119c10df71fdc22ebcecab307c3d914f50d9bf98ee41379f86d32a89bd42a9cdb2cb9d69333e091814fcf608adf8b2b901f42ddb2930a0291b7ef7aca1024682a99f5892a1091cede152f3591c98141230c2828c7d85bca393edfd5a193f0cbac47d9cc6fe79707dc010445412c47f805d83648fbd5111620744bc74bdfa5e7e0a0adc19648fc462e8a630da02619c13fc3638d4e167ce8870b7f01fc02ae3d033e8d56088031fa95c6359822518d07aefd130810cec1b2e45788f9f1a74847177f8b11dbf5d70cd81092f58f6d269855af887a2c7271d33f8c06b9b2899cf21dd23dbb0945ba9139cc374445770b549f8d6a356868a495eaf6c28cec7201a19ef212780a2ac39767033112749523870a22b722fa8a9d6b4deb782c131a10303d9efa145a48abd59a48d6cc0bedafbdea1f8ede9f72a8f2ac3bebd7afd5805983db0799462e3f3827f702d5cbfb7a3c8d4758a4870ee9cdfc4e8d918d585f1c947c5b6422698bca5840ebe03590f2810447e36898dd73688afdeb0a43f0b5a85580b78d2c3de0d892071ae6892471578307d2da76924f20a21fc8a9ccf99f5bac61a343146be68390cd93e17bc0df0a81f9e7c61a1c8a90b09d898ce64b896c6fe917670f8ce977150f85e8ae50243b432d22c585693f612cc218943148ae7107e1b1fb39cd0ba3003b91682738e199dee1cd8b23f32170b15f8f0915d70559d2b104b751081cb2d4c599fb56244785830c0877ca3df1e7090c0ba729ada12d01d57033e80364cb198b5884c9d7b7e3c4b848700e6584edf144f1556de04a1f1618a98ae7e2953414e023a20396ece532fffd6523e71372393c657842353f8a8956cbe365c080575e0015d7e06349b9e93b6c99030c5833d0ce49b70a1f8e03517772adb422817d4bf5a272255b8471ae97f1cd60cce1973ad0e69f8d6f63003bba6d36ac7f7d3fd88cb4fae94d3a24bb1203b3021c0e7a433031125f706e216e4dd97737d804addfc4fbd7e142b9bf777f6be8496985eb85106ac7d6a15e0dfc0634a413e156585f9ba34d8b81636cda1948bb3cdda943d7e773c477658008f18818c53054c6d520df5ca13b6150ede87b51ea814a5c2edc81e1040614b28ee2252adf1dc618912c75d20ad5b5989763e6c840bc6996395ee9912011ae286bff39b8753aa89aa710e129776dbcbdd6b4ee15bdd8065980f61c7f0a18cd321360a2716d4102390e6110828ee05dc2c125f582e5388f9b2409a812de3aa60c027c53abb2b8c8047250c2fee7a635d5681ed1a2b4274a49cfdd74053a506bee45998dbe83b040a35996dc4060a8499a53c5bb76ea35471d6204fcd7a6f1e63a9d604d06e89737db2aff47c91ae923f822cf44bc6640ec6e6c685e8e0579f8357988fbf4035b041a25ac9560116dccf412e4787a71de0ae5ad04bf5721f0eabd178569b1d97d3b9e64ad3f0d8498cd1086b2a1dbe20fe00aa78562fc171d062984b4208891ef8ee9895987b83cc758a313448e49b86df9a1bc08a03abe96ff3692359db39941f4dbc4563a963e78b7a890e1906ae6905d215dc4c812a4e4ecfaff041f8dd665743728e07687b73734b0ebb68e8d4386b5dda0ba4acad0ac9e4555c498b24aef9f813b5ec8f53d72781b385d5143c2b37f5d88195283edf759da76420921861ac85fd7c362b4aaaafa8022fe1d479a1596ae104f74d5720adf2d56c993370316ee35540d9af272d39c45f72c70e0ae1a7a33ab69e54b84a0b2a112d4c8f3904f3db063ec67f5bf9699d9d5d1ba1e6100103a5a655f3f22d13b015e66bcaeecfd84c85eec4bbeac862a9fc0e92143a4bb40f7b2299dae83e8f0287926adec35ffb2baf592d01ab720a4ee4aedbc08fbd7139a436d2a057eab27d4525e365a8e6452673f9d9932acea8349a4447febafc0ed262d3408eca80cf84db42cfe728f717bf56ed3abf2b568350d90755ac2fc06db721ab1b2703d1965cf3d24ca276bc691724c028135fff2483099a88f23f04a059d241db05aefd66bc1a0f9a5a90fea2414501a33a16c335bf7bdac5f1362fbe594af6e33fcc20ea4070cb9a5bf82cfaddbd37021be13646da7977f8fc0a7e0a290123eec3a012adeca28efa546dc3180e32571d8447c82f6c315720936fcfb775a44c772568bb403ff83271cba2241e04d763a08088e25e5e268d4aadee74058965627c9116bea47ee359a1e4a8fd5a030f7bd743d1d9eed07c89442107f5d50c58172cdc1a042742148441551610adb1b62059e547a6a98d536d2440d45a3b3bfb615486b00b3230a55151dfb467438abfc21f83e039645fd1464cecaaa029d46edf2f5ad6180028f04379d199af6df27229d704f4dd7313543b9680d124570cbd533561b8a3d7866d787ec072458e7cc244251eb5d830c95e464661085fb07c678998ab1a3684496a28f9b9b9ca113559f38b9877768d2127d4ec0877ff2ef7eba498a114dc08c41298ba03b55632daa0766c99c3ac5333a3d255d03d6eda65ba53f8ac3c85e71b28fae2b1ae419b279b7c15b872087682b3aee2fb717b0e0614d86e59a1851f9213c2a17df2bb84917cee977a46b87adf95394d0acd444f3e020a2c359a81432cb429c80fd2af79c26dc15982bd8e5dafe5fd1854b9e4ecafe55b00e10a70140f8cd4376f881ff050c2ad0e2a14cd8354ab825fb9b14caa4b78587d5388e4b92df590a93bac4d6c78a134b32ab86d1faea081b31626207f8f69bb85b1fe3e52fdfc2065ad71a633c35d700d1704147fcf3e911e1bb251fd8f1ac5289bc0169508f9a754b3698a04e284a30b4da0f5535e544eb8481a1e04a72e187e11f55713210ee5d4f6a825c69d0e907535592bb5728f1dd55b084c0dadfad63cff13de38e9558fa6f21f83ab540dcbd3f340ed15e6d0c94a9557ed35afd7f01cf51ad86e8041e5c3723637de011356274ffa5a52ccce6e40d3115eaafcc8f2ce837dbdc64b25aa96ff7d003705dc6dced78d3e1194421fe746c92f54b29a1201dad5ba09582e8c7dd486526ab1ac4958a5d1e507d41bd09462469a8a82501ed3f962ba72aba86f4675d5d56497114b38b456c346518f09cf75cfa55c4a802e4d69bbc3bfad52db556be08e85e994053a2054fb47a27ad4cf009770755f5961e05e81cb3b3798f8304a8e8a7921a99c71c341514dbebd1cd8d8ed118a0c141748cb03a47a6491f69d7628f51270adeddc9041f73bd15ee4b907e6cf849bb55a81207ff4fab7ef70048e729626fa42d18d8213d3fdcba251d8d54249836eb6ebb8ba3dd8d7473a0231c9cb150197dda1d523f7de26f7a44d0278cdaa273a5aaeea7e20d66937e665b2ca88d717eeb96656288edbb7da76795b48650de4e081f989ac69c02d207e683dd7acdc5f7660d58529cf502d4d47789f473db276b05e86935a813421347b492a6cf75c52cc9c92a87b27d7624ba7a458ab551da0746398b0090aad89b264fd4a4011d54235802ab6c76c018139b2a9a6d2f76271d648275a61f64af94ba3d13c5c9170cf6e5aa37a6c57e4060997c2bcf37ed13fcfd8b865d2cf2aadfa44ef6d82276d08b0d747dd53a23f4cd017d6e27d7b0308fffe399f5f233094be6d912315901cd0540572d687b8fe295c80d47c0960d1b98c7c7cffd2d67c6ba5e63125ad6066d7abf822135840a38b25389ac3a0af074b43c8c52bba1072f51afee1ff001e0c40e99b604a130ed4c9e1ed40e6ac21366fd270a0041e146871a278dfa007dad0b7563ef7fd69f8b6e612345a18c0f3cf24a4cf9fbde1b74c524f6099bbdaba3ab8c730725ac428bfd20b9915be913a73c1ad74e939e320b2b331ef459e822b3fd680fdb808624e6e9bfa70b77b8130b396904ee681536407b52f49bf6408b9e0a77d9bc61d7048873ece96431ab4a14fad53e582f18238135c1cffc610a6533006e03c12aee3e175db13fc035c556ed871e652a60d1bb2e4c87d17b2d68061e4f0a02f6c5c16594211607cf9161665ba5c40407c81948685038d78fbc1e2186e3b6b73851c86b2ffaa01bf936a038843abc0d46dc2b4c2e814cccece1361011cca16e0c2018f130d231b50b0b7401029a19ceb33939f68b36bb2eaa7be68a9aee43b9e5c2636b9b2afd6893eb815513b7cc0df962b86ef160f3132c16f5ac07370ab0a708c80cf112701c69aeda06b649d3912fdbe94c9af804d04ac21347c09b82896abf96b55099588c22c6660dcdf64aa352b5f15968596c2ee609e61836fc59f8d5195dea1704a5fd630c813ad2b9a9238c2a56714d2012a43d09e70c9133dbd10efbfe3524dbc808fc807dc8e90b9354f1c9a1c37b8423550088fd9bdc2a820dc8102e4a81d5b0101cea159f6fd71f3150f95554d0c0c716affbb2f6b2f107605ad28ede511f7a22ae3d5d6b3a5350f910d7a8587a02158ca82bdbd56c884bf17db425529c052d4d51276bf72c45fbff08e382671a0f70d720c72fbc62da73dce9f0a00260ba4e6ada5ac252906561b6a7dcc4c80e5c0be2c36c14125e2e7d53a64ca60301efc70342089a7adb387daf7d9656bfe74be16b3d872da893a734f0b54cc9c1fff39432ba7314e1bef81b233595124c106cadb8699dadaccdefe1e21e03652fb1cd5d3c14ba55563450a6f6276ad8803971674b959814ec088d8d5a34321df9d53295e12f923517c14f0048f435f4bea4dd268f0d9964ba8239f2a4f7c4aa9f874931e6339d10b0cc0e6e96d7aa9e277f1f0f54515662f46a0ed9579a754ec213cad6a6f77015d67d970517c3504f00cc7b3b24d4696432a50b4ca97fd8c64b0db94415bd657af168a281b82f84cfe27c4705683d98e859018c24060d6432897d0c0cfc221d4960b6c3935b70afe7dfc550cf854881320d719b680ad53d72698bab4e06d91de96f8292ea7dc3918c0697f0253f4cb0397efc7e25bfba23a78897f38fc8e0a296735f7ad87cad6d5907bbb5acae54c89650efd4c06a77f39c3e56c157721506af19c776ec929fc37a46ed9cfc13b7f915ff524d6fe6d8f29a898eebcb2ea99986a98d81d4c39d0cffdbceae9e6bd5fa09361379cfa4d7ddc94aa8d196491a70c4febac4bc6afcd0af8ff8be4b2489e560982f88158e0b66cdc9d4176c8e03a38a77ff1ffde05b23ba37e919575d4499af6229b0810070746d738de2c541798f3e8443ba8f83aaf75b827a338c7f702553c196ad9b26ac813ddae31b5f353382f1347c059609e15c9a98a6de6262a5d0ce05df81a9b2b569bb38140efe752986769a5e1e7a811b38ed8f99c1dcc620f0c55eca39c179fd6b2ff3e464aaa8f10ed716d113c41a543c6dc68cc92b51b69a2e57e451539dedfd083a45aa2d902ddb009865ff4fff3c93020308f8ded49ff1eee95fc4118bbefc3c4f636e4963290a38bd7bbf94828dcaa6d46384f476d0c353cc8db8e631d33d9866b9b2913f05a536ec568812815725dc632e06e7c995993e586da49f893f072d038f755b6ae43d6b7b9c26e5566244cda52f3088e0b528af782bccb7b84f3187181416803f943fae937e93903f65014d0ae9c7672cdd5b853839f83a001d5992ec0b9cf1a3d1eafb22e809a9786d2e6e072462ce624a06e5cc87eddbe604d0e4b27259ec076764350176b0661db72de48f0e7105ac05c04b6a9d96095cfae7a627f886fc0cd42bbecae4356cbe2c8a9c3debfea3ba89ed43b8462539c2074ce72941c6aeadf1337e880f91a4874e908dc18b6fba1000f5fbc01df16968233316bc9c42cd704ebc492d7a0c9662da3dc53df84ac0a541bc29d6c8252713b40708b584b890003f80b55146ab87e3349bece7de6c547c211a18d821b8eb9e332d96e810954e507099e9b402dc5d7b52260dd7c763b0cf6699a6052134fdf42c6a0fcd9741dd32afd9a6ffe6da180a4f1edb7efaf976673c284d52aa239fcb638ee48b9dcac5febf244df057accf9a1ef82f6e687ad0712501738c30b4925ab9fa5702bb046301db49386ed836a85e5d8688c11bef2b98b552a187ef7b145ece10fe46795e523733bc1adeaffc86eecbc5db8083d97951e23844994138b22f85a7020f1220a791472206d3c371e6eaa611f103f01d0115960214a090610036f76d9dceb37483a59de6f0b815860afaa79b1b4024b56df0bf32cf321f4a8c26a7ee4bd24a845f733efef2d0150d46fafbd4966d67acf41c19b023ee1766a75dd81517da0cfbcd86d2c9390ae740427830520bc2f5a24ac566123783155bc9f6a81c09ab8d666e1da4ee2f951b5b0f94ac839c0e7d3d28ce0df95f666436894447fd4c299bb0cf4aeb61fa7c82c6fad64f24c4b903a74bcdc119f41607a1889e9412c0424da80e8d469b8700acc0bc220da380801b6dc82786c519d5eafe4034d76185bfee4a9069f08f87d14c6d1bfc2206b052160ea6b9bc3784569370421be2fcf56c08cab80614d25dd95320d6fd3f001602366bf3668b0065725549c7ee98c7ff3fd073a6fba2e97fc2b0cc3112e052737c1d77a678894237d9257c7a1b4300430fabafbd51c42010903a1fd9072e5f656d004de051fa01a13d3f77cb15df2c17fea8a0b5a07f404f381f2462bc90489452fe1303258159037e5d754bcf1497fcf928dfdd94efa116dc38f57dd5a4638a523758b5126b5a8bdb8e0453910f884b118b101ef6388c73786a972b1befa78699e1883720d0cacb3fc51945f7fb0be491a6cb07107f0235f1fb10deb88f08042a8690142505c90e2daeecfae031334c0b59ce7d650d751ab6e86e3676ceaeb238aadfee530626ba626baa039c5cb67b616e6a738a498709dc04df27524b1fe011377d1e95a00b9f9f082fa12fd0c4e100115a87d6d22126c147218d3a4562b315234317219a297f0580a98e21550aec028aa19eccfdd319f61221222629d03ebe5cfe382824ec0024289d0871e1cc20e2483e110d3ef15cb702d18e8aebb08b451619569c5abed490cd1bac655ce1a3eff74800eb9d4bc87b5ac805353249b0fe19e3a6a307fbb2d1a8dcecab59ccc830454574cd6ad1e8045d8aa1ed7891f83a73621a995e4d727797bb25d07bf9c30190d20e3bad1b509a4fec65c59fc106224f1a7cdde2ba494e1d5fcca25c068bb44f41e69aa957af00a25e1a166e899a01eeb62e576d0a5baa8ab04fd3327820fb331f7e1c2bf401e6607a8c94863e510ce65407cbc8f81ad96e4cad7c4f50f95f916f7291ae0a00f38f997134528ac0d17819c1c7cfd1898b31070d615a9a2dbbf45d6131c6a39dad25bd822cf0cbf7b887399762e2ebf074ded6c592c9d20217b2cfbf21809b7750d86e32bc1a815b5e132e0b9ed73ef3d476a05306b59fade420bf77c851295392f727a1532c1efadadd914dfa0e5ecffe2a59057c552822e76a68a7a52649b5ac5ec69f07c5003805ce46c0e1523630e2142bcec834d7db79ebe6459d7dd6ba1cf87d7cc8fa5ab8eb0a59f4bc97b33ae89696c9a204683900c9b751c9444be87005c5228139c32ebc1ba5c201075f7bcb700d85fe383b8fc64c67fcf9de576a62dcb99c3a1085fe99272f18c20d9fb7aaf7314993f22b5eeeaa6ddb326e9033b8c12ee5b1862af5d32a316dd3bee9fde87b1101649ae6c00f859575ec4ade735807d37974754a4aa8936cb9879a380f12c6bc1f3957bcac94e8b61cd7fa491ff6070a4f32acf80a0ab7dc08b9a0a5690413a6f4205c9664e017777990bb1b19c22d801849a82642ecb1d801c6caffee13770c8ce4c976782da306bafee87e044eafb800e88ae47122bf57e1b1384ee78050527c927e77b580b6d182b30043731b623ed79ad630ad5970ab83b39657ec31e444b8f281969823cbdaf4fae7f6a1ef50be0dbdaf8a15c95a99b4ee031ffad1b157c3ddbadbac7449c77c8ebcf71a96c863c78e8bc7bfb9bd593d075355d02050739385ef5235d921baca9c9acebdb81053743b2150e1e7d45bc56c0083630ce3a02bc241f167e30ca9e0f22a2287b029dd6778e13d1b7c50ab0eed4ed7d90e3e80ca80f18009cc9b913e9e308f46e37a1003cd7a681b49564a160bb3293a1cfae8908b75cc04a791af00e996e54a5d262cbe33827bd5cf0c8fc4ed3f2c559872b24d518910fc1a5352f4b68e6e1841dbe5f76fef63902482454c3f4fefd00588b9ecff82ce49eaf4b5d3fadcdc3bd955aa1eef7284d87630e6e610252c5c98de7164500d77289b7c3cc41c08c820791426d591cbb8c4f856ee8823744d9a6080739bf7055ebfd26f45b9f5d935131c5515d69e99b9792dc09648fe23ec9cf9a2cd9475b23ee0ae440d4d16489f81b8ddcb5466a6dabb5424a5c85f810857b41f69713f9fdadd410ec7a30e716b8a909fec2fc84f0de3e6ee9e131cf1012a64e36b3e51a0ececc93a877987cfb32cd4bfbae54c080d10c54bb18d41525ca3c5bf009478d4824013d0158c8a8cd4bca680ae18cfcdd9e28d41fb87d55287bfcefe05e861103c3bf9666f35bd8b50d3e0bf65a9fb78b7f09d90b5d20f47b2d1e1d3e2840d5abd820dc846fc0fbd2fc168e521b188cecf65fcea9b5c0ca602fb89a521a98da9d23fe8a8d91fd294ef7b55a5d64db20a238e26c2be4e2c2765684b3125e20dec06dd8c746a8dbe974a283336fdd7310d23a6fc6d7cca3a67735b5a6d42ec1f144098b56528f8463b8e96af3d671c5ee5303a6e2dbdbd307fb836c996e84c0611423ab187422098c23a75c940d6db934b52b9359e2850f9bd962683ccff0ed39d0d48e3473a82b1490f3c9800f858e2e2b45efca7d849e2d5496faef80c3e38f0d39f9cbb1b8837d8628d28c7d0479e27058513e519ac5a0f30d7e931f1ac27a1b54fc4a760f1068918f0523084dd92cafac3e5c91d0fd4f2f1d358bc9cf803063ff0c37c1d36f21362ec8bd81af7853b804865775067c1fb99c9db8ec1a05b8a3f05d2c442ecc049a3cf177c9918b5232dfc640266cac479db947fc1fbe94966e1420b32d297d43ab4e98ad69f8ae64a90dac330b67759af00327c80e45426a51a8492d9dccbcec9989636299df60761d1f6a1ac9f4814af88490625a50887d23390b6bea46c8d9026b8aa2317f2bc920648d83ea70300a77bc249fa7159b244227dfcb4610e110708901afdd925e7fa1492a0f2fd6740291024eef058de9d947fb01ea45b9c92177fb40882f950aad85b729dd54393f015bf5e7ae5eec88a9972b125dd51afa3ce3c70268e0097e4ef734e30d40e0e7830d2ea54d041be0fa411b2b631e6f7f79654a8e5dd4b8e45ce257b14f572003c36dc0974248ad453e3a0256362ae625d0700fbd0555b23882b435b17ea00d9a0515cd808f818fffebf211882287d96d3bf47a45a484e471bfa6e6fb9ec21ee18c735686343ee40f8193649ed1e8df37fca8526fa56e6235b411105df239a98d7b47ce37bf46a53585e15a6eff0c02bf1a22750436502241e8262847cc2f2fbad108d4797341540c606f0b04e4fdb0eddf2b5c6b4bd519e9521cd89161cc5ffe38d0422aca64df7c74b6821abe929beb162859aed09a600cc489a11370c402ab6e9c809f920d0ca24740d03805db63ecb23371bc1e5f475074f982b2114381428589d2d51793e619809f2add79436a89a0861121cc5f774303a513d4a00ef720aab155d1f8820b44a5a2a19fbe5a5b02810732e0502b2fde5643e3fd2040efe54298579311c9df06d5291cd043a11a9710b7185f8c8ee208d3f56d5b14a0ceb5b9355e41a6d5080c7fdc2b17056c9d1b312d5c615a4dcf6c5c127c7c0fe700a7aabb00f9ebf318e070cf7557f749e19990b37127969a9c6e275ce3bbe558213dbb69740d1134e03e504e7c3fcff7cc7154ecb929116ac6b834aadd8c4a332eb0486f93b82d581f663c0f3e86cab3a4db6a14cc92f18b0b3c4602482fae79b826bda8e666c540ccc7819827495dc86957c26e53cfd76d3bdcdb989901d98e105784404778f7805023e1b604ba66cffa042b182f1d9b01f4eb9d88187850dc3cc1ad849e2751cd510eb0b8ac92795bd9bbc9298a9843023da3ba568a0a4d350ab17ecd1f3c99a35a5bd578a459b730ca080c157fa357190ddc648be04b0dba7c09b4ebc6c5f6b97e89b36183200c52cdd1d5a90a86929b905184aa4970953cbefd25f0b4fae68da87cec39846e7c656d5fe422d5179044e4a4a62cb73106b0274cc04dd8ad5aef15830fd9e7b962fd226069a54b42e6a4b86360d6399cf6777dc2ed62140447b4893e04f79031f201be415c6d983d6709b06f8aa692485751edb6abbd1e4090808d97f4428c66611d09394505220cc12f712bb1947687fc68856643e9a0730910202c055ff0f92013a3852f2289db8f823c91b3811b8c334e1ba7ba44548ed5e2c93c579f55c2729ce1d842c636440c029e20008b7b82f791c09833dc1714d6c80643cd272796169cdafa8adf75835c76af605ee93e50c58cd25af887f146ac5e27156e18111c497c3da965d49ea82f811aa4cb08359292231032f34bf10cf8e67c66423a5431b75729f73cb0146f66df55e3925ce81e3539d18911589918881a688a4b8cb929d60241477d81a03eeb03f61181526442c10d0b9362f217a4a4342d2c84f095aec2be120e7298d82238808061b85872fd367d1c5ae9b54eac22270fc643abae53ff8e47f9f9b173b603c9fdb62cf0de8a8f80ede2f1d1e18d8b01a83380b80624391dc3b6396ef5851e2e033f69e6d42829a86198f54b36cbced2c9d265d0fa19410f38733519ceeb6d662831055440bb00d3e4788c72b3a003f5eb2e474a2f951aa3ced0df0e2ca93ebc855fd3b879ab53a05f923f211030febe2e2a4f58eb2b1ef6771c32a17dc711484650db307813c9e5232eeb5cd1fd11af365ccaa816c71ad3b1bae6f8c7681d884adb2902a0d86544060ad667c1edc2d836268c0fcb1561f2ae72415a952a475f10602774af14fd9a2f355f145ce300b7fa05642efbb5fd75c9f45b01e392b71432399f77cb0d01b5045b1c0f6e9edc273bca6186cdb681aec1a9fa86fffb2e40d2864b3b99af7f692ee82cd11f9bc1cbb3abe65cb1039aef922ab01b9df410d7447226a59db4c59d6f52cb6a37da736a501a30ee77509a14b6ab578f7ace56bd533838f5319d676bea1650fcc1c1c5742e1155e4210d99b944e9927d81be1f3387e43ff3f2f1f84f2a2c3fb1dec1cedd9c5e2dc90c00333fca4334b251616714627912b2876c5d5fd758f46a88fb1768a2ef1ac49c5d7c729a7d0a9cbe2700c9f4f9e27fbdcd7efa9c6159313560714e446f737da40297de6e57da22c40f36e62c04ce2332cd0dec1b1e9e8b17fd1ae4bc09957b2702d6f7eae3aa17bea307620a09592427e87a4d85170e80e4aa39d5cbcfc53aabfc40f1251171fdf1e0e53bc02812e98968d65ad6e10b105870134a3ccd089191b9b372081780ddba30575041788ae77479a64b640ffed06b15d4730a6f09f6a9c17cb862ccf9bfed2a3b961e44983c26a3a047fba6b9e7eb50d40b2f12e0efe3926d224bc7a8e6ef4f68fe1ca3f89ab5a596787c5b1e852689372e0962ba16c23b6a61428f0bd80fbcf2227dc8b57a991c306ae17dfef6207562fce5af0464dfac1665582934e9fe35aaf174d67e9fce35ea7f85629f23da83d97b6b3212d98745e6a6d800653b217d59048e1032a1c0d8fb7ba6dc774d82ae150fabb5251389d0d36e5de478feabfa2a4f7ac36420f3dab96e378803ad0fb345b33f946dd8f81df6a2c4f0bdbd89bbaf08fd657a3c432bdc4bc7149fc6ea9b7cb3c207edcb73af89cd686065b8142139c4573f95b666ded54ddd82adb7cb974fbfd5ee81acdf7171bad26d9291fc1d08e330474d86600702182fd1bc10ed7c3fdc13afae60f03b1c0d67853f5fd1acc1fa01f1b7fca2af00f8ecd7402bc02959b85634b9bde34d57eb74d02640582707e06834847b24682c9d7efa60c1217d366c3ff888448eab178e9efec05c7c71a06764ad6018f2120a503fb89ce59520a7250d94fb549db63acfe48d6a1988aec1f4875c329f59806434f50c918b817584313e469a0d3f354d40010f318e41324b21c89fdccf502c836d66c9405e67901fb09c1af11b6e115d0fca6f33bdc44b0e7881532fec8f55e072c2c3999cf5692ed0892e48d402d4a7632f68cd8f4678ce49c8e6233483cd95c5067223722043d682b3a857c1a3c309bbc1fd7bbf8066404c05fd4682104fbffb4fb58732ff92124a62f48a73627c2a2167bde8ac4533e772326f008986de981559689195765d4b4b0d1230c1edcf3771ac7cb60bca0b5b751b4c67777881d5b88bcf2baf41be490636d496ebc6c1719e440fefe82bbbb4195e894b770a405ca59347ae07356039bb53afce0aacca02f12698a72c822917b9c6ccb011810278b05e5e053874e6d59aa9796d405ec76abf48ea3f6f2d6f2f1e457887af8936e9678920b43121031099c7a909ae7836ad9eb99a1379c304bfe87be4d4af3a2316eb112ec95dab51edfcab95d79ac192bd18cef3068e110b05d77109efbe233fbce86633c013cbc3820628fd44f894f4df131b80bc7dbd4bcae68beffa1acc6a01021c45408675339b3649ceef51a03cfb5e03f7f051ec762964825bf124c9a468aba9125696138168a9cdcfecd8b77a7186a89d6581ee1fb703920162aeb55d8880f6f333add04dbaa2c65dabf6933afcca3fb7e0f207e6afa54a80a84d6886f0beb39cf1ac55c8c66a70fdcbbc1072d20ba8ab1ba2b07eb113ef7c451f432848d14fd29ec95c6c7c5afc7c6bcec3c71f2c3c6a04ecbab98499d9c602ad55346b31cc160a70c2631e48d5f1d9a32a9c98dfe5e399f0e46c59bb2af8dd1fe0fe56495e68efde2e58c26a511ad30a67c362c5fbef674cd5a13586bb635c323411700196933bede2f6f3f79d0271bd364b3f45ae01ad4c75c69291f0305111a139290dff4618e525cee521b1e6b256b7af7e0ddf82bda55a4b909f1ee06cca0f29fd62b948fbfe955ffcaa1768ed8230ee878608c105f3222e33776d3358f2b95fb5117357efcc8345c19c7e67f69003b7d762873079a011a2eb3c9fce8bbf58f3de5c9799ba904b957d04bbeb27a4d12b84c188a672be3321fc9a9a83afdb7ed1bafa58832284899aba22bb015969c2cddc11d4465e7f0b18311e0bfa18e186f8a43580c48be3c7deb548382fed4a54aef084292932c27bf81892e7abb428704fa86ebbb5ff828f4892e186ba52962a6d93986385ef13339adf1b248139597b809a093758fe2a4850c84dc1ae1368497e9911aef6efbbab7ed634786be21242299b4ea10b56114c7dadddf959f6417e649a867d35b4cd8a672400a04e72853fa4fdd3e033cb60f44d4533ae51f5bf9cb9090889aedd8da1585120d1f8e607f973e701e880077c08a645f9ce44228c0bed606ebd5d40210d0601d87ab4b32645c3c7e32d4b21c8498c4c61b02440709f0fb0126ef8da4204af4aebbb3eb63440352add18be30935b83ec88010222a9dfaf86ad94b7c8777ebc78942a51a02067fa0c41beb53dc66155dd4cfc88655ce61f9dc64077e59f0f6a80f4430119f909a5fed562c0d78dcb9f441236c55d5d5cf4d33454972f26794132fdb25ae9312fd0d71cf12b45afd1d850816bf8ce235b33997471fa305cc75bf6741708a603e5441d214b12feab04dc69baf31d4821c38d006fc33a683b3c4b3242438a6c19acd145eaa99e0bc3295f63fc02e82c15ed90635aa3a830d0b34fd8c1d5cc009155af6c196c4d74b3da2763ec757e636d2334f56d4291ba6e7f28c69c19f42561cd9953e37909940c8022fc8d3f7cd6e49716b9032859866b379929acf9f9c83f5a8b4fff0da5e905a062a1f70bc4d27d543c55ab7b3e5e010f15991ff8bfad8b06f3c8fdcef3bcf264f4a85f80031f8460ac65a60e9a2a103170bdf7a64b6eea3ad751f37549e35599d7b2181c4321542ec2515d04d3286045562d8f9fc54b784090cd6eb28eaed85c9335a4928709a4c2b5bd664d34f5312219fc2238b5735bfd6db9ca86c7651107ed0de2aec37d2da3a602b4751bb3868dfb6ef8004b87e1fdfa51253321edb2e992f3a5752acbf236c058dd36ab6adbfd619e58fb307a1aba952b489a5b611bce65abb7775497fc8d040ff3a7d0f5d08718cb0de87a4106520ae3932e27be863be5e26a5beb9d4bcc8a060b93397d9e1fc7b78e2b09cb9a495f9510856f72e540db23544f3a676576ae5521b421f856ab4d94635bd104ce2748381233d44a26b8bfa6c08955eaf4f3b213cfc598a345872cd25714a266220ec3dfa3eab9b4be305e3f8908799ac3dfe9f827ad5cdbe9ef54adc1af214b2f112f090936f1a385c24fb4c3f63b8f17e72426e2cab312c2ea990fc8378e3995439789127a891154dce820e8d2d562aa76070f7841f04f8ce931064a099ee127b3ab5345dee3243e4c5a0902e3d1206f157bbd68ad6bbda4e9e7478440aedb2293cfbdf9b90927f365b64387abac8628a1d0ec98dfaee91af3aa53c04e30f8dd77c1c980dd702ee56146403aa6310adb8edba498f6e8e547e2392044a62d34836b0ec04e0149a7f84df850195550f3e8c7aae538292850eed163088510800022dd57ebfca51716086ec37aa2e9d2af568166c26b82739669e16a97bfb54877d354d1c2aeb984f069ee983461c4702c15e51ef1505942f8d92eb86ebe0f80c989f79484281787caf571b5bb5c65b76f3e5b96d625c1723457b081a53a511e4d0c5b3a47854c2c07275bb559a8567c08255243f7430d983cd673291c27c7494fe701b07142cd1581fa49d040990b01a145ee6beb25b9b68f3a41ad3f628a72036686910ffc393f2f4543bdb484507cfa27dc7411641d1e21ce8003ddce4a36d41449a6a83fc193479902e2ca4d4027eadbb7ccd08204f11b5d205e805905ac5b3a2c989999cb5b68125dad6b4e6aa7c66fee304385c134dbc06c6115884fc246dab4dd637f47b85828ed2237a9b9e49cbe942f952ca3863cfea2176e4230ed78eb85aeef869e138666ce01a55f4bce9eb36986b735261edf1d7d459d54f47d9d9d3354b6656a22be7e682afc32bb74e443dbd88153dd4b02b3ed80749ddfdaae65a0cf4229f2e650ac8a51fa95ec2515c70543e8125441fc20e5950e8a326806ef2335931c012d6ba62bda8afd312b149c3eccf27e75859ffb73c92895c03c0dad96f8784273b69c5e4bb51a720583cb410c0c6fb00303c022c908cc7259299d1e25ee21b8015748216e84fd0edf7b688a489827fc07198e7e62e78d42a583298fdb6d76a46a84caf88519407ed903ed5ade4c705f088e53cf20d7b4f5352eacaf5fe301ec296bde8a513771d1ca9d8ac91b4251828a389b56e854b0223f98ad4994517cdcdd16c6ead6e0221f5fc8ad1827753ad38eb894682f8167b61e2cc082b389e3fcb69ae9ee7bf5a2ba71b9688b2165ca10786dc13025296504f1308757f65f9efbac6031a07fba3efd08b88d205e6103b856f065384d145d0be533b512c0061774a75bea48378b3da810033e347bb926e2c9800dbe041f186c546b3565402f42dd9051b513b8c6f6ab623b0475fc9a59ccb9a9ca1d3121f83530c6f5a22db7a67bf114c86eae1668f6a19267352d370742fbb3656a8ebf8f5061bf34663a66ac56f44de17e62d44ee8931edfbccc3d20df603d2514508ba093b43f2f51e4ba01f029a82e1f7afd08a3022a54cbc26c061c24717aabd815e223341d348db0a433e2ec0c5f769c98908b5d0b6582a3122cb63313e16e13c902cf140f35df8db538732d40a8e356373af9bbcd04a2a56a53617b1c048fbfc7f3f7c0f8499a58cd815c0870b4b1a3ed2354575042a954db84cdf058037fc13c303cca3db5a6a9d7d63274590ee19f96adb1b78ade1e3005e4c55378851721ce8f80b112393327c181fbfd3d0eab86b8e9b7cea2ec20d8c8fb564d6e033b4eca5f919de33a033cec73a60660d3d557e2517e38cdfb45251813d67fdc808ff10b9fb89c7bd953d65d71e5254481560f8aa6292ca39bd87e7a3f9f34197ea513076d1a0f3695752fce3cdcc67aa643985c02fbc23325772dcbfb59e47067e831f7865e8703b3056cfd59470af91d5e71113ec1fb8269cdea50c19f0d92b589c4f4a3516666bb12905bf70439ea141c1c8861e4415a9e9fcf2e735c8400012c0c6705e605e174905f9c71f74308ff9c0418122e06ae764b9c581e855e16c757a43b652ee46443ddc07914224859db845fcdde0f228f44ee5daa58050d0443c244d9f2330b21788003cf5bc997b4c3f01641d79a6a5e1567e6ad5de2e787ee5a19dd6eaf145714520846312bfbd34fed125022ef76258a1f76c7780a88f977f888f00d808bcf3b63e5de4783e8094e72abe009be102cf10ac457ff0c87558a78f23929079a031f4e90e98051c67b6d410aef8bc344ff19162a85668df9be4133004d84399377df4d3010db6c637e5ab8a67638ceab8559bcbe635fd27b647dbb3792a033f78925ba586ce7740fa5ad4ba6ccba490c0385082520ec6c76fd84fb68c0bec2e9cebdfc78cd10751559e755bd9dce5f90eb6c28c75182eacee7460bbcc4b4e160c8644d8320717a8953c962bf61225e39db6bf63a4102204e150405a225b444fe02bebb78994fe46ccd7e5905aff4a97fd76bc1d0c8a5a7e70dd0ea74fbc9685eba16d9a111850631fa0ae222a6b207dbda6b5957c2da17739ac06d701d570bcc3465325687374497707e5cb5107448a2ac1f92a5ddec229d8b0d964f4ff93b9f9419a9bcb5119f496eb8d6dcb76e0a026d86819a115ed37fb456a8aecc623448869eda3c7e64753edf8943aef472a2039dd92bd9c645a05ba317dbd38643c1849fb7e6e61da0c0545506d8096a005b639a888184a1eb5f28a5ac19a238206862c47f8c32fd592ef8663e4219ba1d39a2d6b109b93b30c0beca1415dc08889a9338f13b9eacd8ce7ceb3628ec93fe8f45b0160ec902cc0a633e46f4dcc582add886d78020faa97211b7e1537d6497ecc04405f0714be4466db9820cfceba3cc5dbf010b17cd4ceb90896a33fa13f12a120da923602ac119092deb93abaa27fca638f6c38ffdc65bdb8013870b0a4d5b4e700333012967964e5af3da01dcfa1a77425591d55bbf2b1b310c895767c4226056d88c3b39a94c4e7b7c7580e3dcb82af33aca22d89fc4338ea9c426ba96bb7ab1642023bcfb11b96ec17fb5a89a04d5884325480f3804e117e3b0094184aa68d36e3c2c3fa7ed76d40d02bbd9c545955e2e4a9f12814d2d48e43f4a2d05359917c09cc529f364deb4beea499879caad762275e7533c7490c09e8674700eefc36f5a90d436345ccd2d78c31e922fba92abdf0a22c81d9ac1242781530987d11c4d860a3f1c1eab02606d2de89cf69d6160f38590a9ad215a720db468a818ce28d72627a32e8c0cc984bba8832b8a57a141330572917fdb0df09a4b1ff227141cf94bd294d7f8e82aca8f8a252028d504cca0d8645956c348f6fcbc1ddaaaf6043afac2f4a070351cdd635fbd79ca604c9a6f0fa28d7404f4bc799569771360c5004a492ae52f212720cb7741cc03af10c8660a80fc540eebb0b3943ee687a2999f209c8fe2be507aa238fcf98191ee51af221ec0cdb228046520aa299e2343e8f9c7008b652e95b1db26e28dc8e86ea97fda25753a32ab7239b9e4804fb3bc63d6da854907ce6d38fb6a86faeb2657dd970f9843adc6f2d032daeed9161e786054b7673b8ed914e3f5d6bc4292bbdf4ac18ccf6eef0f628a1b2acdd7323172246b12a3c7107a04f6bb1d180fe3f8f665c99b1621981972065c764f2405bfc1949852664bc323915f1a8a91d0f89931d7883520a85e768b1cbfd7bead7f180696cbb4d1d7f32f7296b346ada5256796eec5daa996a961565bb7dad37172f8fed449c281c57cd0407f715ef83d438c6688cb41d5b55e9c8ea6dbfd032e2e0818c3beaa69a4273e378409c3a53b144f52a4ae54a5dcd0aacbb46397af9caf0d9331234c326fde59c9c3fc8226c6d716808297ab2b9b6eb3af70858d68ae77c543548e8f56a473cd9ce3f73ac4ab0baa8d4043f0e9a41c8d12f9cbb39276dce4023045313babf254d0bb562901e0c021e387020ba229e5efb0379911be08912a4353f69fc254d68f987755fd113199976a8db4c8777f99eafd09d575a8221156b66ed288eebeae4cbf0151e8daccbdaafab67dce16d027b817cd82536673fb2a7c196b068e57c9b74ef176004b592755bb29cc25cc09052a3fe541ab2218fcc40621cef16e46eeb3302f8c3a4ec59e82a3a7d89e4fe40dd0f6a1391c8bbfcbc331dd5a8c1515c0df11d83d5ded56b324bb503654359956a19fbb84ad5458699d305c574b6ede7467127f2906a1baa9efc35cacaab0a457bc6082808d37dd4cc09b8911b48f426917760e1f41a211b7cbad1354420547e5ae833a757f6982ebf5024c529ca175d15ebbe7b8d40fdd67797c05e7e738d3046b6782c8c77ec0b86ffd32db63248eedd7c8bef61c69f25f04ad86d7f0565fc51426402beb741435af609164ed294efcf1c7ea12b901bf89b34d9e915a42afbafa451bb76b047de9f834b9f203011123d5a8362af638caa89c30d5fd4adfc54d2e005d6472edd08e8893d7b3655bf95a51401a2c1164bae95ddb7ec680ba388bff0836a832b1e24491b08da92fba86a854504b200d3d0fa66e4dde006c1e67e0f24f55dbd49ba7bc600301d3b923e53b81a4b8802a2bd780814bc706a51fbc4b965bea5eb97b7e3670b0bc3dd94ab0db0003a1c0de4f37d995606edf659353be173095e1241848a4f2378b328c54805425d630b30197ea89ae4a44b9df5c6131c173c83b3820d38551c724e4ba8b0010354e016ebdca1b800e91635d9a9c0eee91cc3cd450e6207f9a731d1050b4d004aad5e3b3bdbb00eb8094d385b2a7bf282f4342be7c38b39e2739a14957be6defb0dc6382d6be399bd629905c7bedeeab7462afb34d3da9f4f66f71f2a24b38955414f8ac2b28cbde8e74cdee51157e9c818d71439a764180d6dcbb5f84029f5e0ea3bf85ebeeb6b67fe439e3b86bf080171e999ef2c7e50997c1781e4a894a758c3e68ba902aafcabb0dac0e102a8a573060b2369a8106c02cef8af2a1607e8669c58a7ee0712f731453225c7bcd9f6199d2d51feced393058588579913f70d54af7b58c81105cfc15206abe586bd56f93c80f576e45634c141810d0bbd70c4496dc5605f143d9eb14fc98a3f227229265083da14a825012ab2e56131e84420246f76c60d702a8661efde435b8d1ab076457251aab648b364b0c87acbe513b38f99da8dcc6af5baf67a030c04f560246b27b2821711eab8f0f98eeab14cacda641589054557bbb6ef9de89e2ab1ba99676a52e408b4df0f66784fe3cb009ef92a7fbc617ed6f4ec055e92c4372ad0386d3414651c7542dbc362129d499558f3983f7ccc0119759561cbc3402ed61cc7697cd216125f8c3669c3dbdddc6d426c16304e1850e10789888119faaa54c5b84a4868e5ab31108e64c57c3cbeaa5e7f1cf8f75950400990d5d5f15544237bdf0eb16edf6b1a52d9c6d1c28dd3d2df4772d117de73f74be7f60eb9dc123ab137884f77210a930657e7539c01670ae99aeb082b0afb09cabee94e0431e12f73a10e542021780786f18814c58896923cc5360a608cc5a8899d1b915dd9cc4834692b1c2b98d3c55875ed88f39705f58235c2f470d1400914f9cbc18022f4624897962d315af3d1c7cac81328e0675a2145a657f3f3b1f01ae6e825156d9cb0022c54d2fb18d282788004cf0d8b03841df6788080f306743835e18c55c0d21ed5be661c490002f1e6a60739d0071c3ed6a12d442c9fceefde0df404b4481bf848eea826dc8c0dc150093bf29a3fa33cf8fbc0c9661ee24ae7fa9fb3ee11ba86a0d7b88cc1ef0871905f1f905ec39c73ae0becc1d87f599c3514b019e2552f1e285f315c7709adddebaddeb56c17265ad2157bcb2827969b5ba4aae04a8ca3a9130a6d82a371874afbcb64d7e44f665bb35a600a79a8f072e8b2015557eb41950f2c9ce478fec84f08d47bdedfc97f043dc0f23defa7ac2d0850810b915f8b7cf70341f2bda6ede9200c3063789e0ac593ea926427d8361d8729d856b3703a211dbdc09f458022b41340243ce22fab2c27601134cf94bf08eb3f808e7e973fde82a094043d71ae92ab53929f7d6700de898ae8cb6b950677a5658cb78d0f96b81c913617fefbedd5b280ef3378bb3bca71d39b9101f362e31c143f4ae159c8761ba7532a6b300e37593bb7d2dccfa6c1108e75ab5c0aadd23088d52b32ee0c178548f8686dba22fb9ef18efc4f38a8c6d78da960f63e4c10879a9d72013f440f0ef3cd5b2cdcfd65b2e031c16fa3658cdad51b217c62556ab1cfdf9aa9ca049aba5c92ee00e3557ceaccf85deeb65831fb46e109f28ad4d232f1972c27136521527f61d748052c342da826d1201fb0e5ffa77c2a68b1dcbd4bd3618eaca9989c536afa6ce42ae55e2b7357e9b54f321f886466dcf8d3701420012533d1dbdcd570ac6c0fb6cbb99bd409731c73d2374aee0a0767e9f91318b17f8484c312777501c4c8aefe23eaaf50e6bb1d91749f4b75fd9bb2e00f112fae9ac0502ee0d572ceaa6ce63876d002fa825c5cf0a51739d88656c027dfefce8c1cc054e08b3222f0d4bf0650f4b342366e5fa0046fc1fe1dbd418bb958b1c9ccbdb0942008d49422713676e16311e554002ce236d4d1a370168c7f19d337f37f9ef1990381c0809d668757e65b9f083ca8fb31c27d19d0ce754cbec0367f3d2ebe2057902873b438c9867620ff45be962546112e0d46f4f4b869000e2d2da2164d85ada38ed46bfb596f7c6f72083c86b9d8a70a019c599ae9a45e754d1820e85160c80934475e9823a2a333c0c81565eb26ad401d3d7bd0034560590789cd424e7e7917b7864493da7d19e5f4b45845295044db1644022bbc99bd3fd7ec08627095f77ccbfaea6edafc4a49b921b84693f1f72e1bfc011758950b0e2645c12c880237262ab368f404f083ddbb57575396eb1cffdf3d2cbe908362753a69e66cd6a622f6603c83b3382bf645f11a35290375010b2c871d218ee97e78a2101ae5a000ae9fac00e286fedb98e1358ec891ecc24d79fa8fef41a79fcd1ff3837b3500013e14e41585579873a0430ef6341ed50d042f76e7219161034bf16bc49e9c6252ebfd7c5014e0e3d20e5b3461a0ec4d6d356afcd82d38576a6534f78261c3f6504f44a58e3e5c42b96c30af9add47b17c837d92338f67e4089788a173566f82532044431d29067af855499b98bdfc0efa955a068fc3c8834d3174e76aefeaaf30cce8c9cf33bb5f714060d37e1b18d3007268999fa31f4a46ad5ab5516e782892365547478886f8dc27a10a1cf7a7103ce37fcb0893ef30ccc8932d0a85a2724fb00a2fb35b423883c9a5af63ac0644c8cacaeb1ed02a42eccfb8d49c42cce068c5875122e5f1bc8831518eec6bd40c20a882f4fe3422f69bade014af53b060527bb25e976b51cef9ebabeed8779e8c946fb05cfe2a7e58dca74f0f160ebcb4581e6c19db9c159eac1c0712bcc8daad5a21fd69cb5a5961949695de93b4afe671326ce3980b584808f49acb6e5a2e62e1f3c7fc52638dfb1fbfed0202c6439d727cc36b343804516f401e39dd35bf1ea4ce4b0ac56ad006d2b066cbe17e7d076450cffcd5a8caefe0e52426d041c7fbd1830807255730e6a60467da5dd31fa465625df45dea4bbbac3e94d870e9c3f682b5a40af85d959531858182c6f5bfd32cc9bd73bb06abad652c2fa04d723b24b46002511b51e42f52a35248790b82f182e1f4042709e0f164c2f0d978a19d694496a59743278b84fc9175e79cbd017d8e9818b3c424b125fd8981806aeed064636979b0a70f81750b514235442c77ff592bbf8251ab76f3e0548dcdd95e5501d5687d9980ecd89a69f2973c26808a22106822a404d437ae973f79b50a60a1aa024b6316d311bc0b348c193287f52c1daf6fa5dc81423388998dbe51462903a8a26db331f713cb701776d7435da75679bc5b5e97f25eb226f0d4c772f61fc8654516ee61c2a61d5ba61d9b9a394a71136e16bfd73517bc239b318936bb4839c103bcc3b313ffcf7775e8edf991b6db17e597b3ad9057929ed4a2e6b1b00fb3d9f000e4512ee62ba56a60b548f45bc54803704d974795d5e1c3d8b4ab61b111020ce7bb30caa990038ac8bb694b6294ad9c061de4ec73e1e228cbc0c0e54e4e67f83fc0216364eb6562a8880455fa5c119984cf98ddf21b02cc0591b605f2ada414109d6f3c330b2e2a515b8cf8fe635365c74f702d83154d6c58de0f3325fa7564287f21e8e262e91d98035c740b8c88b7f08b24970205d8ab6f524c4ad4c18ad77f51d1f63eb63a57fc2dd52373a5320215dd1a7823de074842b390c74480e53d7070c09b3438652e1931b6b338bc07c46a0c8e00ace43220c3daa4d06f44c48effb19e30b09f3eea5bc629a54fa48ecc97f8c9cb7d6b43c90ad2f884078130a4fe34de3327c37ded370f567bddf7f269b60146a094a7a766d5655801a84a036bde10bf05cf0520a81ff7653bd1848634ef5c172df08349798bf77a8ce58637dfde8c1b4e3029738361f0c310e2ae358adb8a02743b4b09598fb940654f8139a17dfc9d4db796cef32bb1a23253d70f99413b9af3263beb69325a96e512c2bb7d1d8eeec7938b939a54f0415e1cf1b5ffd9ed7e798f26b8ef3c50f6106c541fb3c5ced880ed1deedf5ebebb48357c77e3e8b9c409ebf1a1ebbbc771c2907df0284aac4e59de91b3cbd5011b8410984c4816ce51db92bbea1db4cb59f22f3c820fe155c25edf2d3c73bf1f60d37284e76fdfbf605dc0bd312b62b217f67c1dfbd26124e7032473c39ae90848f2788009aaf7390747badb3462c60fc05a6454b40135e23bd81c1d16242d2e577d65a262b4cf52da9b4bca3a5ef6644e37b8beb5d7a38d36e4d80a1a92cf5fd7e19058c794474556e650dd58459230f918d5eb8bdc6ea62055e1d82bca5e5df8ba5f631113bbc6e4613f1ad46c62f110fb78e98f704e102592ac3b7a64a92fd199cc8d1a5444df458e8a1ba7f58a2683cb120486fd4ccf669cf292e271e2c889044d4abe26552c2e83b0edc10cae3cc9dd7f15efda6bd94d221652941781c65af0a85c2d615d79744da38faf91564bc0d56bc6c1150b24355d4fbd71537012a256335ac735a796bfa4ed41f046ebd6073ffd6953443a0d9079528bc5097725d00eb09260a9e73f8f3863f1e6d88717354590f773836ce47c8311039735a2baa2a205dc1762fc285f5ef6ea837a730a9f405e5c46b35a32bbae3f60d0a0bb74e205e143e374911cce25ecfce596630e9685074e8459d5fa435b4eee92beef5932eae9e7fefa770c9429f6a6e531aa311371ee39b3bbc7e7a56e028ac8e3d07797622224af27a42fa546d8e3a738032a4067c9993cde74bb27e4b9efca5d4136d3f1dfec189fe723bc27e6d828983a72e4eda616296d7c8aab3dec4e7c22b3fd6aab7480c58f074022c5317209a05d5cd0c2fa35e48ea96be9d450a119950c400b00f8d87ac6a72a775e0bd5842ad8f21763fef66ac35fa16763a2db310146e41f2b0667b55f34911e0cf1a8d5920e82435309884269b286f32936e8a90984d0051946c1edb7c1b442b7ee5e0dd7cb5d9f3d4710c1f71d4b96364e23c430f4608063c1f65e4fbe9cb1b01485d104785923e12bdd89b7e102c76df3907a29fa5f79840bead46553b8dbaab975b73d1ef802f9bd712f54a8fd3445a19837e35c655a882d96765db547f9bd275bd8b4336822662ec16405f3fa3c1e0d2e7f0d3fccac8c55a19f0eb488531e600e1982d22145fe4ebfd26a1c1dabff67b5b3514a1600da0dcb2c671ed823fe829f72a787d0219f0e65483970e94f204c2264cd4b6f3c89040abb15728ccf4fb4ecb37205d01568f7949f42ec878669909ef96ae7cba1530d55f4b1b04b6dcb6684e0b83709db6d61f242922ff2be865770c3587fe1201dcab3be413c27f84e3d5c1b01a52dc2d1d8039190a178acd0deef5737358a9929359b205f0aeb06b55811e85dde84fc061cc0a01169cd42fa8f2ba42f32e774f426928ef477c44e1907505e5e40bcdb900520229fb6238f956ec0e0de46839ee77ef04e691c23118484afcbdd638710bceb83e1dd11e325a0b27b6aa80760fe18033464a39f96b046292ea3ea5237edec79df17a1b9c13f7d54d72753f0d91767a0ba844fc4a465320ad4403c182e5738635084437a2272490dccfcca95e843c1ec3e697f39ccfe0d3d50c9873198dcb2a3e1755083b9a5c3077d14fb004c8c22c6affd2259bfb46e44c910e624411dce37b5c7dfe6392f0b9515e2fc27b8a314e7dde9ba0c4b58dd9f05dab6a74227e0a6619572af83bc4d75c5d688348759dd062ffc9153f6e2b58e99fca8b6c6d2a590dd9ae1894a701b5b3f9f54c1237263934a5bf2e896f77e35eb190835a7e196fbe57901a30f54ad4fc7b0f1ad73eef4510b8e82a5d756c5e99d84ba95053e81c9bc8d75c0297bbc48779d699007bc06f1b1c105ed0705729e08d5a72f06be91db02ff9121b984ce301bb9be3b0168960a085859ef86b5bf31af66e5e394bafb3ac93afc4551b6b50adaf5acf63c88d805a62ce84fda33669baf11ff17a6d7c3929611f3b3fb4848ef6fdc2e9d762f073b896bd7c2aae0760fe7a0defdd94b44c94a677da2cdc6bcc10088b48b0b147cd388357f5ed34642b3a4d26e1eba1d5ac791a61865fe36a29f2b2f718ca0da13646edcbe0764311b01acf095e83329da17e131187c55d08c85dbed929bebc41803a046a6e03d8f4740b1e02448eff86a56a3536eafd5ceabbb8efef610d323751bf0e7e0e282c8b78a10b030a869955ca86622c36f19f80e4fc0725d6e894b8c64e69547914ebe5736aebc779b204581a7835f2632c07df96004c1acb3bf095e95f5be0965773ba86065df864105eb97f82576e23f407091a1da36c539551f3e25557db77774b2620b99a64e39f254b69da03ea93da89675cf29b72edcfe643f02979d9e838a62bf88667c5549c2fd9a8a98063901434e0cbf1d2570c2f2d61a58f267ee58c97776540ebe80c50f512795e94a0581cb65780bd5e6ee2bfb31e382f0ac52126aa057d06c56613dd5d2d3be0094b946055501f58f15982c6bcf24dd4eaae1b9b20e3fb628f0aa80494d2f2220bbf18bb693e181c26405b2300582b8da2614cfe33a58d44f415ec1b6b859378369a774437d15aa954d21abe0a28d33bb7b40110d74163e8892eb94263bb59271aad4e81b58177a91cd3fce51a64605700861360896f3a1234cc5bb95c38d40ddc6fcc8e788dafe1101743d66208f4386608e816090101e2faf87c8b75b253a78e1eb19ec346f43170da31033b185e427a55b9237cd99d0c900890fa171049c95a3c2d4fb363718de2ea1440acd877ee0206628d50eaa60326620097a30467202c060013ac8d363753745dcdd738f90fa6829d3721d7f850274553af4fe7f7e648f03a03800b6f80fcb00ba2d796d9e0335805dfdc0d749fb8495b4ce5136843b9e157560136feb5eacb89ced1899b6a83ce6b27b4af088929afd446fdeabd3db81b3ce122d1ef463c16b9e10a40ceee5c213b27889762c37c383cffe60977711757fb6d54b5f32e6fc3d7f7cfc86f831bc59a50165e76c0ea898db3fa69b0bc851c42ffa8995126026eb859beb80c78883c2e07531b53c31d9ec846c79c7b8f086e1fc2210ae8f26a4c8d90d166711fe9d6398b77059637af17b41d2da85a93e84e86cd38fd4e1944421ae07e2ee15178d9d065046b144e74be8c68b9ac0bf05cb86080bec5d4e24d37de46578887e16316403c11f703b87c6733cd2521a6b818eccc4b412144e449c994d205f2252479e7d2252dc40475d835769201dd0282ab32a99a16570deca4115f909f2125646ec1102514e1008d065eaf1f2ea018e2a5f69f5d5432e042e444463d607df0d355a8b36f54efbaee7e9d427af1beb6c367adfcd585a4721402b41dfd43f4574aa8215237717acd253222e8b47d7344903f820a65f1cdcba1698aa92b32d61bb268c046506cf8c4994b3ed4185b1d5994acc190eed46d712b81b81fd15570d91212e70bd015cfc526d0e1712deefba957f53ae0f5b30b288a5ceb8a5ac1e5df911969ef5723f38f0da19f399f48f38e8fd82c9104f1da5cf0374ca198cc8e2580d55521ef8acaf0bef8586f8e56f934ac873835fd2022ddc6b463bde0eb537cb9a6112e19a150e5aa047aa55bcee5573ee4c719f71bd28202094d153f27ff465c67c85b822dc0a2ba8032b385f708ed2e1ae15232cdf8204cff8bb098bbe22d729cd7a556cb14134ee04897604a440da52acce8ecfad40f9efc6cb35e0856fc006e153db16b6f934e315f5323b81d0b9b5f76435dd1c715156845345bd13d783b46076fa369e502f2558c857d8e0e355db7e3ddb23db5345d09dc9fc649a5fe3df80a81fe604da168c3e90d13579d657e73571039afe63a602b9ae1ef61fc39963ef5cb61b7ba72b09ce5390fa1a2cbb5a892771d54cf79eb09cf25fb4ca1cabfc50bf2a7d0419972b1d377202a16501168d6fafc580109a5266b4c9a29a74c02a0adf54930016abf81d52651fbcec3937dab3d4c2e79dbc44b43c802c21d3a620e8d24ba3c675955647088b4df64270fbe9e4f92099f38bef37bb8175701b10e047744daa5657257d5045c0e9a11e31547bc06d4600da72494d6fac5d7c779cf32c0474884c17075361de0d73bbe235fc85108c5bea52d503997c3c12dac535f95e75d00bd120a6ff9cdbb38a487c8154ba9fa229d2d392565b28cba20d08a09c3468e4281b6a38872fbb230279df90966bc0a0f794466b306d3bb130332663ff51a289b26a032d0dc89ef1b3b4c0c81b9b04bc475045af7971b416c8a9daaf65ad84ceb3778275eb7435e6880a8d2f3d3221f9ae5b74f1b522fce16f1a343295769041516a490a5e2073e222b226267a9ad3cc7562b0505ca429347c9f05d05d2533dfa626dc3cf57245e5f64109c4fc2cc6c6d856609c454e034422505108e21bcd4cb410403bae47b8113ed92ae74652eb79950fc9c8d1c6f3151c70ebc0453e3a45b331c274c15276b64a82d9157682322c6b2af3aec75fe326bdeed0cf986aff789e00a147b84e60d4da9ba4163ba1b7bb6d3c32f570648c925c0ba609252ab4b6de91068abdcbab0e962c1754806797b04689ada13feeaa537c4a0b5c67c204915e42f4cd5a05e3bb5e88bf70c9f8a8d093da859169a019b209c5d538b423e5f3b451d39fbd9c38533a9dce4a96d66ded7dd322f31345721634a24855b8825812086131710c018cc5ea2c86ea439c5ad7e7700a679b3afcf5e9fd1bad7202e2042958254c6e0fd48f0cb0788ed9c2abd8299f6d8bd7746a36058daac6c578b44025a309b70f4872e0d781df7f24544f6d50e71c9cf3dc0ee96c9428d2ec38fffb4ef6ad968685d01624af54220cc4c70f4ca3ec8ce052849de1c715d772085d8e22b8a12941f46250eedaa0c063f6c40a8c803488a255fb59f7a99b1664429340654dfb073c21529f71be14bc42f573aa747f6574a05df88e44ebc61a4cb3599f234660bdfd6c95343ec3340f234306be47033df4a18fb433abcfcbde0ddd890b0cd15d87806a65d9d05ec17203288d08e1a0d87a93f8a09a528933e9bfd2ebed8c4a8df62d20bd128b0cb00f4d5da3520240ce9aef708ae2edd721d763085b65be16652d7c9edad73b700b25ea02d4ab0e18d4637d3a2d22619a12e92717ea8e3f276f8d4ebc03035cdd1a1ef30147be773eda13ee45df912756889b8ab8f567992a55d1af10278a0eb2b623b7b9f345e527f37a4582e24affcab2df8774ede45be50790d1e15b49d21bb07608d17eb315f16ca5069c4ec13b326201c03a4809bea24405f791982c318c9ecf26a26c2c54bac9d6d71546da25533f16cbe076e42c7c7f45bfa136c2363256f87268e8677f986ffbccbe86407ee40bad228ea65dcc1f795a7ef514c89042a50a25f9fe3f7db55f19827dbbfba3b79dbd5f47021c53d89c31581e764f0cda76d70c293c07d30106bbf19c00d3a366b5a109cf7fd62a575fd5dcc4fb73030e2052135f401668cc9bfebbbc61dcaaec111cc1ffe27e8a4c857be15fc72ce00cf65b758b5954caa8a795556111b9ef84d21711901ed722c649bf26ff9ccbf74f5c20a75741200d639c1e8bc79f802ca97e076324186f710b8bfcd569b936bb968a7e3f8b319216f839df4b01c94aeb580f3b7b53b65dc6396c67b6e8175917857b97856fc56ecfc3137f078a7e42a62b6d5769855b6d1ee9c534689fbd7709cd818d9135538c2f2fb5218f275eb7351c1d532d46fcae12b18d9f2fdd5bc939c08e9d64f7a6412d50598cf2da61d7ef14d98bec2edbf1b9535f63741d028d7c73bf3429eee78f120d0edefebb95bedb703cda4cce397d487e756950acf0ad92ff869b04b6f127c6583e4298c9889d2f815da2403f0801b2b979f30e22adb8b60dff13711f96367cd5ac712dcd01f28e08eca80f42ac1bd7819a2d0fc4ea02b832c638d3da2471b642d25518c04c0524f8bef229a4d980f4d21451e962509f627f98d12e1965c86f027a09772679002c58b2fe20466cd9feba13de642b9540fa8bb9137688bf591ae0400fba5a54797dd33253a34b9eae80d6a071fc1e688cc64d88500f02c51eebc253544aec566833d433733d9f19a233eac63468cb1d7ab25bc9e1c20cb985660b42c46ebbc4c0cd256728720cc40815cd5ba50048de43a00528d3b07ce8e1a1aec55d6db84b7d6f40fe18a0d701dc06ea8d25a6152e0729cd9a0422439fb27818b2ed7ec59bf93435d351963d890b92ce6debd9a1f017605ec2d37b82510caabc7e6938fd59e91f98d6f0d9a46579eb303867a757ea98f63249e80bead9e410aae04c6c09435b278876a41e0d9470e215baa2147b3a34fb1fa9a227e69f515d33a7d8b34885cd5eb385ae43bc2d9c55bb29228aad245de72a3be82fdaaab1882ad4e9bfaf971646a52ea8454777d42e2c8aefd7648aa05ee2758d21791bf0055eeab6348bc2e005ca6aa2779d43b915fc3933c000218a30f7b8267383911b3a921aa1cbd43ae2c2ba0941727dde45f80c763bf6ed8d352900065e9622cb295d48271bf65578fd8932268551774bf7b4ded08c751cc97c0ca07a5192bb541df7211781eaec0a8e5b8b36d62f63b820259a2fb483af58b31d73b5c414c165b5f1155bbd763bb0c790562a7d2f3d76bf79739c3c61d6ea287647b5fe1334256f1d5f905812449cf7e622e72f615a99d6504d67045ca12e6bf60bbf88b83feb507cd037c120c5f0ff4f5726bc8190735ad0075a4a9e71735d184cf0ff3fa341164fc0a5e3971fa143b6eb7f56307653e125cafbb07795ee0f1c9fd7da067cf6f27c3fdb0046abeb1dd4770dd6cc70ee78f5187386841040ee13c339aff3b039d0bb6b3f481e28a5bec8a2c624468e71c992623f16dff88a5fe7e54ea1f27075057ac5f94cff8f405f1cf0d137ee4c0c4b1fa6c770c9e443f14d633869415e1007138316e564b7f4db70b6af988e4f58a62e4ccb5756d77a50d9082546b4f6487fa8781f8c49e78380c7a7fb760cbf2c8e525e7fbb3d3f1669fb2402b51a1507a9457ae0469fd8a39c09823b02695eeab845375a912831f358f50bf378e294779cd695acfdecfcb57121e90618d87c5c399e088bdeeec1f7520b9e08c752f031b7c0571a3a31b9427e4f111c0d69c1ddf28de7ffb823bda0d3e60a817b93e413a82f9a70a200d089f6e712827d125b283bcbedaf276e580b5e6a3b49fab5a3845aa118d404d02d83c83b748836b0eb15a522652f02b5c4e7b545cb907b592f4e2a9f7ad3b6a18b7c62457cf3f6ea991d8aa18d7090d9aa961daec106aa3ce0df956794eeb3ec47a50b8c2096a5df131979733a738770ae822bc366e024bbf5617843317ede3f33b7b7a9f1597eeeea3148978a1121361f4ed71e814a15f550ce6961d0230a2f1ab9b7cceabdcf202145b42079ec8e7009cfd6bd655a04d8eef451ea0617d24887992661dae5c72be46d03ff1413251d6bfb3ab7075670a4fca4d0eb6c5c70f758a122689952c3a472b9e734bf231658260e54e271f1d996e46fa4633661233872089a1264976f87d99a1783b6c416f72057fe07643046bc9be3641283a284046a7ca5fdd8985b0808f4b36d60bfc405372ef453beb54a5ba76dbe388de44177298552922181a03b9e386c05a50dc354b641e2f0f4b04cccfe468efb7fa996fec7038b3f46faf6881579d5bcfd1314597fdc4101691c7fc37bd86a114d4e3f9a8a788fdd3583ef811844f3d2cbe218432f72e2099f6eca8d37d25ace94e7587cd02938a6d19e58c85aa471bef45a74021f18b68fbbf7709722d621c1630d7971e6a2eb691e5fbf56637c5bc4b500fcfa506312073e1c715a2528cc56914a05faa403bb51f92541639fbf23ee41d59d1a654318d54b39d5c673f40de741f5ba2059e0fc269d1d65bef02e69c6933a5e1f85b3d1e4828231c3e344418b06fe870e34a7610d0d1b97ff110f00f98a8fa0945b9dd7dbe117faf41cc7f3f7939bb800e821cb0a387d578b5cfe0f0a6d5a2a8237f6b21eda8c7fa514ff85181f739491d9c895e73b18564b3bbf50bc9f2a78716a99d65aaf8843583566a299c83f78e7f4486cda378343de9c4cb473d485e052f8c9363a67d81a7c0ac6e0f55cc25454e06ec7a3e5c8d1fc34b98878ba0bccbd43955ad785e3dbe9f73bbfe63b1c66812b049e2e085f8db86858e7bf50d519744c7b6c0cbbcbdcfef806bf6f4cbd38b9951c85cd569094ed98a4ec5ffe5adc17d3a40219c7dab2f2e6960422f8ef21df192b091f95e938ef8ccb7ae958f848cd7fa951c2e820e47420749c35405be088bdc41f296488d91671bdeed96af874e71795c394e930361bd2af1c8fb27110b2802af11410545d0d3c8f497abe38a497c595e7b77664ed5461f0bd9f22f59127eaa30876a05d60f9a1c064fbc1040e33eccb411c491ce7ecbcf6bd2159f6cab7ebd85b4716d4c1135e12cf6b83645651d7c6edd35b07ff1562a76b8b5cb43c153c4dcf734e9b0fa7c35597e03e95068e74afdfee30b3fea917de283add8b943cacbcee72ed73b2dfec664f246d8f6f2c285b47efcc907c37b404db59ca05aa55fb5dadf1c295a1c7324b83fa1ef9959fa90b61464508170e22b7dece44a16c573c6fee4110d5765bc7a5029e801ce2cf89cf9d024c1776bf729da8309e55ab837cf0b46d844eb12d5eba2fefddac2cb6cf4cac0204b66df26662dea648cf265e2f9fcda2a4d93c3916377aad6c1c05a877c52dc73f7ef2162c321be09034f6c1dcb231fc36811bf0b132f63d8ad2329f69457bf351590e3f7e70f0b67def5fefe29de0d0c020bd919ffe9bf73bc27cbe0d8ea683fcce702dc2bd6eb8b1281a4f0884725788d824a6170a2ea8919f4b1339ef1ae728dc08a3e9486ea35b5aa8a6c236d131c8af40872c47dc44ea7c2fb5d8d41610ee4574a7ba902ca20c5ed36a71365ec6fc41897b07e28efc4905a0d97f45cbf2452e702bd9fd18130fdefb958d491dbc1e77f1fb329740ff9f5cf565b4e9053d363f92745ccbb24dfdccef4ecd99fd43505192c5ed8c8bebca56f6ada309e00cbf1e878c7192f10dfef56afe0131134ff3442c34d98f8fee1afd741706d85389f7c4aec199bf3fc45e16c57b7d05296b7d754af2f11441c62d70d4526394629f9bec184e169ff9613dd08cf55e58e94ee3b3e388c1e283fe60da73313dd1e3efae77c4277feabc7f873991c49c798520dc2affb92a772253fbe8341fdf59e293bacc33e1fc3bdae8d8ce2069bc2a3e76000779ce34123d1ef57470bb6af763e308b23b9b031bf2ff5757bf5c88c04b9c90c1691d019e2f65e0007a97b112b6160df0c0443a017f701c2f2442a8fbf549a36fe9ed7861d7d1cfddcf7dc5f1a8e458a02aa8dd1091ae4a1008516e9482a39830b351107aea4c8adb200a1bb85c5dbce28a0074c419ea39b03e13300d283d084aefdd14bf1779b2478a74099bd46ac63171ed015be45aad85e1d1e5b1f71ecd1ee5a3232bf0b42d48a6beef76a28d5f28bca7538165007385508a1bbfba96c9ce0e58b1f12da226b23e7085a09422998f4f77b23d066204c52a96fc12589d226d872851a9c9c4c9e9e84a3da2bbdd8a3a6e58a78ccf287835f03a178a17833bd0de3f820e2428e01885774a91f4454a34e80c13e73921c7ca83c58055229ce27a60ec4207a8465becc113a3709a1ae5dc12ecdcace204c7d735c78ce0bcb7ca9c32637ff9d68fc5aebfe4a9d59d0713670460ea031238a2105c20f20796db5448f4a722d89643c0b5e2803cc1139c72007fc7c89cd824328f96bf04e7eec59f75f6cfde86346db450d2a60f448db03cfc94949e4054e21bcc9fe6da14b2c2db21f4952b4c85fcff3b72e0627898b009ae1d15cf768def56addf6a183aeee09e441986aa859a65e29f0f9a14d0deff2dbbb6cfbe69a6bd6232cf8607b4ba81c83ac1cbaa42830103a788b27bcfdae4c0702ac7204faf8eb012959c693d9e9143c165222a333f185f3aad049b80bdc2e4eccfd8eec2f8f01c039050c394a2095d13893f6a645df7dcc6a7c3954b47432dbea79cc50c858df1e32d62e3f4d5d26eac6f57b39353d3639c5a801fa7036787860548d806eef495cc48e00cccda6a4ce16b35d82da415b0ce5a0b8a40aeeade3ad52e159ec9d5546069fbb0ed05454fb4d6f83d551726551206d55eab5dd024081d426ed010a221fd9d1138448d70e8cfd0e009caa1cb3f47a220cc09e1ac1c227697a7a43aca862ea334f411bfc8e1766e024aa1e04c3b03f9242a0856b2de7c7db49dc235d820a774e69ecdfd2d2bf0f809007c1160c549ac93d39ce43c8fd64bd23c1eb20733bc4db1d40b5088cdd6eedadf3131c7c06f6f8b6090f4fdc0266970a7506316b54cca4c17ca320cd6b9081af3ce635ab1f69f0a51abe712e01254ee4535f3cf78de3252bf689ace9fd6f3b18c329468352506a23b1105213696a57d9bf1db1a466b8be33b09db1758d7d2b67334052509bd665be579ae76044bf5e4e7873d8de811cc19820bba3beb120722b3ce70a0d579335709dc9fffcdc92ea77af46d8bd62bf9bcbb2d0fcd4435040f644c15fc89ee729fa983fc825351cce39804b47e79d6b663015ce7dfec4b7b85a7f0b654e20f4f45856470707bed73e6a6072926d4d050f079550e3e25d8785c8c7f8bec638d8141262cacea4e5f36072ba892effc373ee8109cc211438a156a463ff7269cb42417e7207b5f6014179cdc60a6843054afc3a9dfbd188c4c86f02d8f7fa2098a8649dda2dc4e9a87c12a22202cfc925c38c87739d58ae607c180c24fdd64767e45ad0a465f8252134dcd17b49425d690634e3acfeaa004175c5504206dad080e2c5f396504a123bfb66caf21564a12cec8c577d835796b2f4dfbe701a9a10421d729a4bdeff2e9f777378a72bd393fe3344e27a1a97d4c10ade942ad4d0d75e1784c3798ac48a6376834989f719d03d5bac42cefc307c73d2cb7334a9115e14944d446fbe05abe51f2f9479af666bfa66e96ca87e33be7985084c24c498e406f19edfe9fcd79d7e8047ee180a9385ab2ba68e87d7f9256a97dfe4cf051bc1277de63e30ec205c4171907d6d416621be53e52e0a333609b5173451c036ac74ac50f5018e0350874af13c094c0706b15d09de8130d8c25d3e0b1b364edb137bae3ee4f719ac46dac4868770f8c198578ecf73180d3f38ae787cdbe9425df16259f681020ce783e349fe6d3576e2b9361223e43db7e48c95ca252636b221b9d4040d0fa5eea91b5658e92b6a5876e75eebef55aac3261762360124d42fd8884596908b87567c274c060b75deb1a15960d0c948a42a74287d55311199ed180b172a1a0c855aa2e43541516879fdc3bbb0bb7ecd637fb57c5dd877636025ef8bc38722f97d493e504824f882aee33a4507b13a6978f4e4b61aa2a203f56a8c1a69284f9a820df4a746bdc23663f39985c3dce18e1b7f6fd95d1b7e5ea31bc2460a12287cecdb589eecaee0d9eb2752cb1ae54024bc54f65c049fb834fe3d48f47a298e9892905c6aa0bef867ce50683586123502f9a7e5e45b854a297881481869bc035742f8432854bfdf78036ad0d76e9b85d88c93730c0d746c5e4deda03192c1d045ef01f017d9cdf696b1c651022a221a73053c2bb2c3796372c12b97e5ee62a53097046f027eebee95a836b5c1c8c1e81a47f84af8103a55c0a3d5c95430dd8e8725599e7ef1ed37f8bb69d8b494592ef49b8afbb31581e5ed7ca3faa430f272d812b91d4319752894ad7fdeeaf64defbab0e3dd18daa8ce5aab0d08087f1a885b34c1611ad80e7af24d124c04e0bde5d259ee925ce6120c7095908dd34ea2859bc4100a761042734c56289edc7e522a3389a2f6331aa337a05883110ab0e73f31f4e98d67055b2d8e0fd49adaf89f3897045f8adfc2f5a9f2223ce1f45e1b4dd225150ad032be70e0d12930e1e72061721926a85b47b8fe787700d2bf77a3b034b84c07fa7a2b4c289c6bcb8110be582f6e02f7866ab44e072beec22e34100affe6315f7a39eb4aa9801c5c63136dde859a3820707f1271e24ba5118da62ca07638141bd5485304a4d042eef450a82fa4a49c37affe4c0f4afc0d5e36fb420c2e3e56d6c05371bd64e91111d794599e6eceef29375b79e32a5c040b716b5f0e9901893d17d363f9da18904001356b0a6e9d261f42bc50caef734411589d49323f70b91c3f8bcc8ae8011a4009466e1392cb760822721c39c6c2dff7a161a0b97ac7633efda4f154f6040a0fb78912f553793171e2b4733f7403b4cfc8969b33336fdb4770101a108a94c0470df25d6f5c2198742fc68e976b58ad775bfeb2a8ce0d065c6254c330913d0e17a7b007f84d4347f3545343d4fd2ecb623c81f64a058915967b1d89dc0a1867edd077ed0ab9a06562e4859c2e5ca2514fb239d8493619ba71eef7e2d0246cd447323c84a669aec33cc4edd3061ec7ed040107c3431f0c8cc07e59526b0267c1559c79f6e36d48dafef4a4d6444e91cbb4d8aa46bca55d837cca41b9bb35f7957050edbe225abb5696d4373ffe696255490d1dc17182c685ff8678d7382a85ffa7f10ecbe3a9ed084dbe8d45bedee6b4f910cf07b999ac1a359a5dfcccb41a1cde495b4258b370f52b01bae6788a07e7accd5b99dc8a0b657f794a8231640cadf72c20e65af9f0bc20088a24499aa625aeeb36cde77f9ba3c4ef35806364abbb387d5b9a258a896e2a38bd39bffc0d30f46f9b5eb1420c2cf756e748248296bcf4681e229cf5c9b86acd53351ec3d54f37454fd96718052f62368db591003294d1b8c47bb91150a8e40e77590aa823a53f84758a7fb899e6797e454345790d2f8e717099039158836eca11e59e3a1284e03302ff7530f10785ef5e1f6d6ea78377e3bbd16ea9ae7c6cc5503c4b34bfeb44519d209a48d155a5104a51de5da05594672a58d2d8d7a8459bb4fbf5e5e5b1e647e371146d7e0cb4f06242ea94ca63cf9870dd762f4848eda03522e90fea4059a666f0dd3b8f76956acda6a80439c93fa37564f0254428ba3516cdd3ecdbd6fd2fed6c8d9db03dbcf5c3bde0ae9a2acce0222bb279f7f6951e3c154f0a5e8e77058df199455152abb7e10a2939bb2a2218cbd1638ab3dd83fe2e9977ab2d94e842c72a5f08d47f4c44363f249e0caeb9b3274a7ffb98494123bc0264c58ee3377fc5998668f365cd05703f0c45c1ecbf1fc266bac186eaf85aa6b8985e4b0b25c8943f081724a533e3a0121ebfb25058b120cda70b922e44dc91c414bc3731853a82ea0abbb94f326e6718b8aecf67f6cbb9c65b06ea9167efcbe8582cc479bfc360cbb8290cdeba3acc26b3e9739065bf43f363d8bc5df3b64bfd5511f333dc978e423fa6519426d0bab46dfd63ef1979619f1fcb597b2934c36cc25b4dab85de89cddb204a2ee8f8b2d91fe2668cbdbcfdf1b5d248eac1d7e79bc35ceb906766faebc19abcab2aa0ef4f78b87119757bea6c04ed4bdcb73dee3bfeb1310f43c1478d33115d41a4d619e3d3d4ba8f68a77619c0e4fa85dd040fff7b46eb52d120d60312765874f5479f0d90ebd6de0fa9ded1ba307d120075cd483cde4e0bde94acfc8f2bff890a691a31c8c32f116efc3e669ba2589c6bcdc2fe099cb25e4fe125328e7fd66197884a8a449fd42f6727ac174fddb0523a8299e435a33a90a3f94223577ec697fad528ec5e93dc78e242f410aa3c849c2f350e19b8d1b676d7eea69a39cc929d5be0cae8f496043fa5bbe639b34f8dfbdc95632acce18af3cfb78c561ca2b00b53f7458539743e0d513c4483f3543b8c0f2d9cd07555489190454cf5de8707d886f6562fe7360ab81248ae4ec6b0f39374f26fbdd173e163272e506099c2e55b20379bdc2d4295f57b319a5713be95e9a992e795960d917111e5ec298bcc16f2399b098a973cf12c7799ecf77ee4e0525e04d8f8a3af150c17dc7644de7743f99f64c40c524c5a105b9d1b3e22e477865639a83479a8f2daa532afc2b68da152ae378ec9683dd9ef06167223b002fb697d849b3f531537d6f3623ea7cc5ce3f499a5dacbb0772f635e1f2cf879f1dfefbddab6eb44f08048b6f40623249083534531bd797b3ffc6710c813765819eb53364f70a0d815693e570479327f8bf4b6f48b22dac58ebfd8e60382fe9d0143429a03646dd8c66176f674e096353494f45ebbebbc44f22919cad023db5314b61391cc333eb0137e4526e3737238c2a788853eb84481488313f2b981369f2ffc4e984e3cf7cb0e4abbed5e9a2c1dd7c17203fbb3dc7d80df7cbcb9b2e690515111366e04e70307f1337215f7ae3f3977bb30a105d3e8b0f50d303a6a133de15b7c40cdd7c517120927ad4d5ef3a42f37da89450048f9da3d3d65453bb368c8555c23f983d741de8f56f0bb11b6e2a526861afe9e71c8a3ea956d4fd5d6963fd6004d8971af107afc452eeca1cc798d34e37ce21a5fca57f44b088bc5956d8940280ab845fef9600c47a8e4e07f2516eafe7933a657848606499d75faa38c5714ca978a79db79a0af4b2221ab3dc438fb206533785c80385be51000ae7c04c5aa5389ff62f0956fcad57a2199277c26d27d56fd14691bbcce15f126804f5d53bd73bd2e0afc589f4e20c947c965d367a0246893cb1af06a9fbcae32745bb274558d689ccf13e8ad2189f8ce2337ea25e941d7294f07af40e019fe9a1157e93b336285241ce18230f6bf1fd6853e8786cb0928749afed782d2e4eb70614bf98f7dad425db94e073164c1cd21ee9e8d2a3873b2536ea2e5a60e23c214698ff64da834822df247638843ccd0777c4917057768c7f4d70da8956c65eb7d22db64590d3e3c514b7fb14b467ed009b58c6547c469124d2ccddc55bfdca55096183b506ebf62c163bec2981d271027e57b904e22e85048ffd5e06d903209f30993dccfdba10ed7db663d2d53105646f61daff0fe41a7bfd27076e55b49999129a0ea7e6e8d7b438ce7e678e86ba691348d70084d126ea840dee71358d7acb00906314e008cf58bc818a4e87a33c7dcabfb41036d1ce8279762aba8e577251452fef824493e08ae48c5ec47835691d8f66468e64d72f6cf806a90c205d60d14d84eed86df25be0967555f908b751c68afab6654883428e8720973e2423a74b4db78bb13483f6af8c5cc583f78430bcaeceef07735d6a75d41474ef8586b04846380ec9d5a758441d37ea1ba59f58b23c314b948f7f75966bf4db44520417a294bed69a2fcfe59e4c78581cb8f9fcfc6b4897a51dbc6f72eaf91a4c25aee8220636d8c5889ea233fce949149c763c80b2479547b7e8dc1724f67b80241356c6741bedf7da9812f84be4d0c07a28475f141e8307dc3afccaa854dbe1aa3f23f0c61bc311dd53d42caa7ba5694845f27e9faae129c8b70342401f182c34ef905a2833931753d8c3ee55324af43d33bf9272f14c89fda89247d6ce9f4186146de240206699ed59a5ff32a6a3611084b3a3483e52587d4e7316fdb4f07076e66fd8b9e780946613d5fb97bc308808932940cc5ec79d12cfe6cb29546b76654772cf00958958dc028f368dea276cddefc97e3b82516972553d43ac34a78aefc87f4509a20ff12525713a96fc1c28dbfea250bda5b7a97a29f7ef5119a1f7930f9a811c9281af9f8cb6b327640c14361727f8789f2e0eb327e870ff3a312a50652a945cf7a6dfad0c8dcf6223a87946835f45dbe14f84dfbfef9c68b9add1594f086aeed3ed7b19f8d82997d0b4e4ded0ce56d2fd083901f2cb0ab7599e26bfdc832880a5cb568eac7b1ef702f03cdb93e6585a58dc5cd4601f5a6f57aa51132281979f73b705af8f5e2d2482e841e8f1e8545a0eb257ffdfd6785c07b3e76267acd97379071c50d132e1c64caac51a644bb7f32f58427f8cc885268c5c05d47a1ae4a94920aea57f09ef84ed286e28aded8b68bdc7d35505f69eef2571a2f1a4ef908cffd403f988c42a254d1b8be4b51b8e305edd2278976a7df018df0acfe39116fd6210ca048250da715789ba29b83e62d1d3bb1231b7d408999c405ee100c837cc0be75c309c5aa1b9362a8ddf357b9ec260fb3f2cf07f4fff7c125f689db882296d83dafc166f3eb49db346192dd77b475bbaba4fc83048dec0f888037ee56a14dff3bd851423f4e53983a25f950921c5c38b4a48c3655e8e4446a0fc15ba3e98bc1725e0bb80b7e2c6d28b42589b566033ac3f2a6365593ee0de77fae90080d456f08eca42dc5572478846d1d0a6f20cdf4ede530502e9e16c9c645894159f81159df66d2d6f7b3180f3092e20d3ba81d2a756f182fdb0e2b655ae73abe404ad1fd14ca8d0745f39307281ea8607e3d1c46dd6eef9716b46d43a577d42159a4be7856f1df501b854a59507e1abee846457ad444da6da3af614bd3467303580e0a10e80681c1750d05b4ceb0def541099e150de26e816fd89d8aa84b3f51d15ea7b5b42424bdb49156675699377432b188864ce233a1a67f8d7f90fc448890a013af65f676b785dd5f2f61c7a9a678c3015e66bd5610ff660e7ad8190efd46952eb9a65e65571816abdef3276bf40fe78aa4f975b3c6e389417b35f0982a1e1f97604d2bfd1b5bf0e54281a2061d2ba482b7543782078f373f29ed3857275ecf2657d0f03218727cb0086e6f34fa205482fed2e046a9e644a529444cebb9b4c987922ff0595351786248a623d0feeb8d5fca6b77a1ac69cf2be571e146b0af210955448a97f385ed1062303ada66eba070581d388757abb31093f8d5b333e843438a48f11b3334436b9a911661b80bc2f7f7ba3f48c1c09f2b6846014b1e6fb518960e49b6c3641dbfa512bbf731ce339ff8c0e9301f4e825633c8fbbb26707c6516753a9464307a6dd861236bf01b603c5910bc297cb4a4914ca451c5de2a640b7e097357583447b366e2be5ad8fdfbae1c30847c21e405976f601f5dbcc8c5d2882797fca4cf3c466f776a383ee198722a18bb11a7a10b04c00b0577265e0153d61d9b5627f914969a96917f9485aaf48977a335047c91c226303b8f6f4cf42d6d0f4687c11b7a226ee357a0edb281da4b925141d5fa57d13dbfb07b25427b43df4d8b1c77887c68a4094ab67aca3409d7c69bb28294eb189134716294f7558a82e1c3f57712bf7b3b1b4f4ba1aa69c65e7744911562c39f76f0880576948f409e0389e34c45ec5871702b82e138f72a3ad843cdd070b1b517645ae06b823ebaabb92bf1f6101dd09c04c1de5ed1c0a4aafebb31cd4a7ef3826dae10eabf55bf03175a5061c95fc5fc3f56cee3057e1fdbf2fbfe2b7a3b98c1a1ecb23d4d2f24e76c9753b9768e728ee55430fffbf0fdf534bc65f37817b411e820740fe2b338dc4c929bf9a8c521d066f011cfc2edc25394601abcd10a642c5b7fed191e4ba942dd0d652267c1b622d9489072338fa0a83b4fb434516b6e35157ad3b3877ff5a843061242a05b02e57c67ab8ccb63362bb02da1022efd89f6188ff13aa6365bdb58da26c69518d7739b4600a91da8938756e12f0faa7267a3d97395c447704683d623a9fdf3b93df1bd9dd0db04720a8c9a213be08cbd92bea7789266e9a3f4860dc4d57c6dd0bcc16583220493a8859ef8860e04a7f5d11aa5fb4df1d7e514d9973b618369e37a4b31962a3e5ae1482de07d1e96611db3d59bc88c912a9a269e8067dc86b75904a08110640605162039704621f15492c092ddd37d078386cd910694808485ea9c76ad285e72cab7c0cff2052e2068ef87f46898eb8b5b79411be288c42b072b121c21a829db034c10a6cc0358b85ad1345b510ffcb57b5980cfcc002ac9110b450bbf407d9e3a4b98864843d59938909d6a4dbb3a78634f2002991302407aa01b1931d08f76eefcaed73dd0f0c353a78ecf8fadeec2b9bddcd6ae6106e159b372e1e999fe39d75ed7c40357cc8dba48473cda167a20427a077a0d36e42b81ba5e7ab8f0a0cb5c27dfdb24f82600c525a63f3b9f141aaf992c6b0d709caa984f24f77a8094a8f3d587a9539d42c1f07ff557f205d0027dd10b6397a4209f6fe9edd02ea6f643472c2ab7bb182cda3da828ed972ba56f0c119b2d5896845f4f7b70d7cdf93b0d084d0c98d4b0c49192b59c003d10b50e291d6810f403201a97ccdd50a8a7476b90619fdac07ba5483b4e6600239ea2a22059411ea0e1e0565f20d9d6e4cfc64b152dbb7907b973022f605264a22c917fb7eeeca83aa13d76cc31c9c8d712e8098cd062d560179e05f5e13dbedf5bb4214870255935c90e20a6d4c2c009a54af2e5e39bb93f377efeaa8eccf3c2429141309c6820c5f3ac4c7e721471fb6933eebb38d2ca41b1df24ac1da8350fa05213fcccaacaeed3d34cc54878f6fabba0d349d06d00f1c96e043a84815ea65f37abdad442048e034312b139e801d074ccbe7ad810029e776f457bc44b0ce83f4c1076110086f5c8a04dde38bbe9e14830fa00ec2cb3914689118b87e9e1da4921d0ef028fffc5b3be1226a91637fe8b35141b9f50c5938fba213476d3e3cd5163c9137939cb5e86d566428640cc2759a911cdc5a013bb0e4fb208d17d6cb07624fdf6147c3f6102c9ae19b2a0533a88bd53f99c5c935a6389f75e3c1092e26b0031ebf983ac1cbe236277f5ab7b4898557e5e5ca4e9d543a045c57bc9196b9d10bf3be8e8677aa7afc693ddc2669f5400065082c38368b6f9ba77258bcf4f0ed72d4f10070197e5ebaaf1d225ba828383a35204c652aa0b2a6912c57bebeeb400a307475a66f20584b0e3bdd76b1eaefc7838d89ada735727b0be5ca05334b86519adc0290a1dbf2d45e0acb3e266649ef9bb278bf7c860d8efdd944cc2146e5009c6924ca430a6bfd1e7469d76d441954c42202620283a8b4606aa2e11bc71728d10de6096e8fac164d080124c8178521bc87f64dfd11301b5717683d2df44da2fcdb3e22e649e71c94ae32656e0eaadde83dec70da5b04821d6965f27f7ced3faf30640d6acd3b2bef3f964f1dd98c477492e8362b5bbea0aa3d081217f228130a73f9cb85deec0e73e015cc209a22e8749160d4a97a853ddd78182dae4524f2868cf766a13593a4867df9e5c34bb01e72061bb612ed9bf53e77a20e58ef2a9445903ef9f82472680f2abe33c26d7be299352ca2381a62ff8f34e37b47fa36caf79042c50d6afc44d765a18416ee397146548b9d71087f83583437884cb48db0e40b084b171fd76632a8e96d9c4f1486ab4954110f56b3f6f9be80bc6963c25511342e88ad166e92a8a553e62354a2f183e18947b133715973ac1b288a64575d7012b446614e0d4d46b52240497d047cf23aad4f7175ac728191f3266ed5abd8348172798495e01f3cc019da7e7ba03d2e1ced2f479da5ec5e59eee19bb3a352f0cafde40b02cf3f9e13094a2ac691c5a4f3b41c3c2d136e35f551e476e263eb3b292dbf49cf40650d0991394c7dbd5531092546c288770fef19aefe9defa4a2ecf098d5c01c226fe6ab08bb9be863de1e2db3b245d8a005e9f7e3907d1928301113eadb80937c7f5450707b9b397899b8b312135846d4cada7920f979deb913d934731e4bd80dfddc3f815547e630c3f5eacc0a28fc479b968a5ed5b2f279e2ddd11c731b4e129f080d91ae022b71bb9eb905a09e4e7df4ea520f40adc00bf6752e6c0d581288a8e12b23ccb93e20431351d301beb817cc292d6b678fd6ded4f9bde8b9bebe8744d3fe7dbb376c024f4fd0bdc2982579cf80ccf9f8a7989c2864d1cade53eb2be653da833bf1394908bad50a1eac553afc4d5819709d1a3df4592bc8e953bbeea7645585cb55e50eb2eb0e98c4a8094a1dfd2a61f0ec924fd21c81ff7b3ae3c7f2191968bfdf551c392f44f71af9c0fae65edf643a13a3ab48eb57df31edd932c8bdbc10ea75302a94b4cee1d8aaeece5f022b2455cea1085a7308fd9c7a357450523987442e0c4502b156a940d18815148bb85e7c1f12b460f2902cc2595f94c794680f53c7a7bf48998d4cbbee45a20420a24fd08c422863538d878068a84e06399d49772f8a003c397d480beda1fc9149e1cdf669a278c46866342e2ee6f04c7537fa2eea87c0f89a067f573cfc95729dfdd6f1c314d1b8854cc8abfe6228f89a4e4e24d1c71a574220c767ef62ffaf4dc41504e458b3dc1a11a0f4845f4200a21a2f8a901b0529700d7123b7e17412eeea1e834a7e7f84e469d3dc39b8696389b489d692eab7350c2cc279ee8618774f5eac9aa4d8d657b2bb5e9a6a0001b324fe322c101bc8b97a487384fc883b96b3f0fe6743d158ffab72722e8a2d031499ece20f6ccf111fb3ae556b4b1fd074231fe39be217303fc791ce73e5971747594f28b5332ee2d60399f69effb4a9d782223087b1e8694911be31824ceeabf9f2023baefe95e2145f1b0a2133b392bcfd4d87eb0f2c57f81b51df3579cbe92777ceeebc43f2e7ec2c43e61f9b1faeb6ef014022d1f6d16c73235b8be3e0d4f4b2ff3848834e7fc462b167c033efefd54bcf5eb945c61e932cd053411e7abe32ecdee27bef7e55550881536a52c62efa7a42b15230d69f5f0fc71433387ad22888e58b741dacde8690ac6c38b703249dc093005c67ec9cf45f112160446f1921aee5bbd9f020f5d384abb0c9d7b1b3f75ae8bc80792c4dd6b3cc63d5e2ab3e5fbcc646996bef5afe5f6db808c0bd8d2ef933c05c27e68404407cf8554274a8642b0cfbde581ce9a4d4460f9c4bd01bc84845ab2f83d4a84f0948c646eaf345080afa45f319033d995b2b9b1c50efc044f427a9ce0a492bed353f5b8575caf834a184c33b2b2833d3d03085383a79b64a60237ed0981a33d2606599cdab4250eb25b7f14fa4d8d142a4c18225354ab1488a1a780f31744a77314c0654c01015dc58c95a9db31ed71545d39a054a8da9fefaa76faf47308cbd506afff389430143c3796ebf5959f5ad2d6d3cb0c3d239480fbeaf6b38b9620ad992a4b128b773695d864569e17666a7ffb70dc2460f176931a83e4786e2181d5bd652404eee57a907135e45ff372053c5be2b1f8caa12b7bc2bbb5a728aef5b95a12c5d3da85afd3a6dc0253cb0e4b353e9e69b804dfaf03117904b690c13456384f0827ec8dcb79ae346b0faed299c22948847556652f34c372a70b758645f829ec88f0a65e1d44844592224c1ed240e72ba8aa2e3139d8c6109c4548d36452de9cd27473f1f5c0fa34f2f271a45cc51d0e55fe861ff00025310fbf51bb659db512c7172b6605c6555224afaa2e2e2c7bdfd78f6ff310e830ffecc72953feb91f71c54d55389f22de2d7c74b5411c61923a1dc0d01ad3b58009859d56ce9733042a670c9c7b7abb4a1c9fcfd4e5d3028d330a7c9c97d184afa7307e28ef701f0b5daa4c5230b541eb2abee50d2f49ea31b192300321a9cd10b0f59c7f95066fd53cb819c29ae77bbff6d1be10a586cbb3e2c16aefc3b4df0ecbd378951d17276afdd60445beb87a457d3d102e64fe19ed5160eb94debcb1dd77228cdfaf5e1b1ce9e0b971607ebbb7adf16ce244dec6c6f0fc5675226acf83f3b892eed6402fe57664563d758c7099e417fa091916bf05ee89b7917e137429d316f1aa6d7a79b3e99d7d8f176e6be6fc0df1e9973957edca7d85d7b5ca1af1218dcb127f8c65a06632557365b815aa6c87963a6e4f60737bfcdc8497f9bd3110bcca75c5383ddd2162ab8ae776834e24927cfdb897597b537c895175dde1f2e555866666de830bcb7ee3d5fff6d62c265ffcc539f3541ecf9da4c8f649b0f70b84392645b628197354d53ab21aaceb2dce5dd073b5ecf143a239edf18497d6295d2797c295c2c274c11a24d2b8c07c6881131a2e3b7de9fca19f6dfa31a0d84f8fc8eab200efc2ba07b2c1e01148f3649d96dcfb501f0e10b1756360984a0aa0b4c25ac983bbcbf96c2cc5407db59231f1cb6f07edac3cfd650df090add94f4eb186a3e7b2c27a18a4f5e693877df9c1c531776913c23a9a882f9a24f8e429c031109f86459706ffdf2bc3b37f875fc0ed62a414bdfea3f48b5cfdf7cefda75507042dfd7f7d6ee4bf50fe1f958f528f73e0bfe4252cdadc1c85e0bf5600fce93dde76571d7773fed981fa2b64a4b5d31142fffce7fffac7dffefef72ccd3bb44efb58fcefadf995ffe7eff97494eb3ffef67fff5f000000ffff8a71c36e1edc0200") + mewn.AddAsset(".", "../../runtime/assets/wails.js", "1f8b08000000000000ffccfd8b7ae33696280abf8ac4c96603d1122dcad7a20c6b3b1527e39e4ab976d9497646d178d31428b18a02d524285b6df27f9fff35ce939d0f17de24ca76f5f4397dbeafca224110c46561ddd742d74f99c78388218e9fd76edc61e4391f15859d1851fc1cf8884de814c794a731eb886b8b3eada2982723f14a444411790e1c0aa1d3b5413f749ef37ca45fe2e225cf0d431415ef4204d5758c21b242d21d5465796c2d0987d8f20883d89a91aaabc080e2e7d88ac425ceb29b872fd4e3d68cfa01a39fe2684563be91d59e294b9734761f42ea740730a7dca139ce21b662521fba9132f5f6cce812be59d1c8efdc6e960f51689aead7e2d12d8f0336bf73e7a6b9ef8bbb75e179ed8629758c5fa2591a5223c7b0ef65e3fe9e26ba5af15a77a0bacb1bc3978b629bcc34112731e218c399c98a15e2a3c04747e2a911c94f19a41813374df1cfaabe54bd24d69212dd392fa62ea788a561884573b12560614fd7291833eabb69c88ded1957a3e03986a1ec5022e7a59a648efd2846128c3a01eb701c5b3344218272b80c3f9740c4a6b9f510b099ec17441817f045c51c31b20bcd5ba31d9735aa562dddf7dc69795842b0e81703c335806160e273d1d692e88a7a8a5671c42331486be126378fac982cb50bc40ba28d15310c88516c25c43eb2718e260d288f056426b42366cde3865a2288488cec018640fc6248498c8e3178e2cec6e092181d0e31f82446a7181251fc0e43287e87d8f2614562747486612d7edf6158881730ccc4cf19860d09ac1f5deefe16d04798938d696eaac1c01309ac6bc6cf2ee3d8ddc0237932cda7dae3071258bf068c9fbd0fdde58ace54b5257930cd875ab54bf1de0a3d61b8228fe2ea11c31dd99e39b8217756907c2aee6f7cb8250b64d4769781e10b9921e3ee8f4f573fde5f7efe7cf9c7fddde5cf06866bd245ddc0921df821f57d1a67597783e113b936cd6e770df7a46bc367f25c8ec6b14176bd71531f8763c335e3f689ba19ca0ad5dd35e387437573241f55773f8591bb7d7b72a46ecf72f8da805b0d4629e2d8343df4195cb1bff391d82754ec91cf3898d06996a14fa46bcbcd89ba9fb2cc281aa936d765965d12427ed20faa99c5a6892e490ddcf9228e1e3b779b15bd8ae32846c635f3a238a61eef046c1d79ae6c18e7f009e3ad8e98e61a895fb8acfad2bdcab22b42c89df8d015b9acade9fe066a95ae64539f04642c7197902b516709571822d3ec7ae80a6e6bcddc0bba118a427816187e771ba7882f82048fc5dfc997a9b38e82596790e7188a2ef86a0c5f80e2d1b569aec5a7e7e2d377e2d373b8c3c00bca449e3f5ede5dff76a5e1ed875f7ffae9eab3730d2da5f7bf5d5ffd7eeb7c822d0075ee4df30bb862c2356cd54120f0d157b1e8256ade599e3b379e53de09920e8b78c7ed88599b755cd19258a55ac3ef2396f038f578146f7f632dffde288c7409b50fe6344c68a7c0cc4caf958f043852ac706b4c82099b4ada20c910217196e9c662d158d5dab774bfe3551d164351732e7180b38d1b031f45f26f5c52110d57b28729116b3a4ac5364a6bd02536d68c8694d34ead78c2a7f9d5844f4db31b675982ae80433c66ce27d37c9cf06996319c17ddb9e52e0fbc9dfe28f49c8eca7ead6bbdd33d43aa57726fa78dae4cb89ccd4bdd073d7d231e6f0a304ec42a159d7a2a3ae5b9dc5b8825cdf3da77bac587b22cad8d2a05497a72081281e09d5d8a29d08d267a4641070c4208cb32b1fc826e05490d70bf42ede6b27653e26de72acf617bae509dc02b782ab815a06d085152f25f5cbe2044fc354d9e8faa2d4991c679f3307a70c3bb459010129b66758bb3acacf418b059f4282ba8cbfac38486be7c242eea0f982c150c6781519151746e1124064638c79abe2f8204627476847173e8f8b9ea737d90d52a77bb1cd51655170ef29639541c9b6402044f303c533c81a0e28229387b27b8026a29a6145c1221e3f16b62e0517b1ff4585c095848fc10b177d46d3af69c00234373b8464f10a517ba7428fa2416ca5a06ece50ff28bc1384214710cef068353fbddbbe1f1d1e9d1e0dd3b1b3b83fc6d13a8217687e11d0b56b14b08772a02593d7d6104c7fba629f0515774166fa335c595208e7b4689da5847f7a864555ffaa6e0ea22c5a8c9951c0eea9da871affa3ddd6464f9b2244036c418e73b88a9c64093185eeac1d07e053a14932657ebc5f5d720792c38ce40b1a2a9664505a77a78a238d5b313c5a91e9fb57f170aec000984b082352c08b7b8a41f3023dc521b1c36845b0977a5e81393d9983a9b319d2ca602692de039c70e52b7cf39aef14102612602612a916a45d824994248b8c52245a47ea67c8cd624423124189be6da52224d2c2a767d341b27cea2873663c3321ce3df0cdc4b805b7e147b7426aa4b4ea34b48283fa0e16e55426088bd88f180a574e4a215843847dc4a16ee32cb42d30ce52536cd00adc010d70674071852d11b5801c72fa185617d4abb14a15dc6e8b44bda45bae75cca3a7bf8a9d33cc7969bef223785c89ff32da167efd296c2552515bdbe3b8e0fd5ee385120353c1520d53a8c11b37c42c7bb943af05120f00d232962724a03146388708dda7aba728dc0063e32e6941b01ebc4596624fa72071318979e4793248a151648d295183c9d9558c09040245f16cc93dc970ab0f0cef62c665522538f06215075ed875114bfbc5b83e4a3fb1171d2e3783c7090c0b4d48931e2dbf35c5bba42bc7ab9e562c9b095848147d119f4ed9716eff050638413b5789a461d297470742cd0c1646aadd264017e8b206f13c2212643f1e39343f1939023f1139213f1b322c784f02c0b0b445bb6b18605cc60839f0b26710e4ff04802b4c6f04022217c2e0945a2d221864b92a2072ba46cce17423e1dc01dd964990737848defd01a2eb113cb8b01d682c4e8f2e26a74d5eb091619adb2ec4a60940721fb3c91259a9387c9d514aee0110bb638f011c33793ab29791a49363bf0d1134e1e030d649e9bd0cea153d0fd91bc3fd6f79db9ba3f29eeafd4fdd071d57adcc01ce745b389e621bb763127e1b86f3b7e9625e3c4b9c9eb0c94989c2bd75b383e1a6058ba2bc71748dc0f424e63c747430c49b4a48e8f0e31d0358d378e2f56cf0fd8ccf1d1b1baba6633fae4f8e8e4adbc81fb04c1cb6c42059bb4e24c3bf1b9e019e21e13ab10a0f865cc71a261ef4833481819c98a7a01ddc70c556427959fb56a5249d105b5f6849034cb04934108127d4cf12498e231732214bfd4a761d1a9d7282e45d11b89ade6ff0a526b3749edf19122b543b194c4b704050d896f5126a915ac8866605c6c25ab30e095a6c5c0a30819011393c66fa334f6a801a88d772cb0428e31a0f699851822d5779774bb42a0ef4656ca12d7a7e05725951e1192aab44696472d0c9dc0a63b3a46966582601acc5d5203675950de00c310a2185b891c1359595fa280952d94cdb231730c0363e05d42e818b9e36e629a026d9b26f24977801d2dc58932f0c70aa33b815e29ec94451e923405a35dad0c54f30dbbb4ba8d7d5d048969264ab9a1c790656e2582e01612fd32296ea86f916d720c5ec4fc609e16654351f618075cdf1f897bc513b16d6e641fb32e70a0dc317c9774be77d95f78470ca1b3a47c11cd3a11eb0871e355061a220894e053a84335e03795a1b652861e9e62a90a3d7c87614d3ceb77ea7efdc55d090632550d2e08a38f9d35ccc8426e960d5908be06e6646125948f683b333357f3bf909236b01ca2b65d3d2b6b61c194e610b4d5da54b57289d665c79e482860d4e5d4c0a3d5e4694aba03d8d31b21193cbdd4914454c0633e799a3a7bfba12ae5798d5e24943b545a542258b889138046244e1b1f82381e0b34e650c4053b9e8b37398d7fda524b6dd3ee020f8b65e9ba4808df28261162185b6217745b61e89a79d172e5f2e021a49d987a3458d3180414f58c4e4cff9606718d19ebc4f94b80fbfc76a06ed1c1eef6ae4d4c2c07fc6d72e27125272a947fa6005fb0c4ae86755f73cc49c122cf29afb1e63fd2c48b8395a06b8a594e9c1d4b1327a962963dcd2cfbb8a195927c7b834b7665192e57bf1b597ec5e383c0852fd2462d064b7a6d188a1c35b43dbbf8b1ab2553e3ef8694f0e4e8ae93ab129fa1814087e316a5c16d81ee05848e83a2a386811ddd28c7b9befc6685819e43a5326818db6288045833d3dcc5ed281662ae2607d834bb1445a4e4b9cb8664037bde9638f9c67fe5e5ee7feff3fbd077c4d634e65af9d1e151671507cb80076bda51a2cf1bf899432d2a0cdf09e8a613e3fede8b62daff92dc270b37a6b3fb7b639a65116a7b2090cc680f0752d905b46e6bc2a7a494d405b117180a23634de324885862c0648aa56c829e7599631c5ab67568c0329a5127181bab34a68663287d84015eb4dac4c17cc11de3fffaff778603fb5de747ca82a4f3294d165fdd98ae3be8ef6114c491f7d58a536ce42f50eaaefd02d81debcd825b51771bdb30e68505e435c1dc8de7e992329e6881e87c380e109df0a964a32271e150a95e167f274c2c87bc8dd4ed4b8b2c8d9191c652055bdeb0edede99d68859b6637429cc463eed44d8601364d416202786ef22d8392477911f28e34e86d7745e0a1cb62320c42688b32a59cac1ce17d3cbd1466218674478ae063e3d7d209c151ec9128fc9886a1e16cb3a428de5ab01a429676f29a55003152a23188301ec74e30a68861c7b829d4a548c8390ce33664d06172e3533aae4d8193be84bf8f5e5abbc057cade72e835cf052d07c75a0e1e38db0c41cd6e2fb111c3b91281ed9daaf14e5dc1791702f34e6de953b25d1f68f1c661db1b4292697907229ce72ff4dc5dadc20d6250424cab1eafcdf4af8cfe03a9fafa4ce7574fab9aa7017da21e785a8cab95c77415ba1e0597a4e01344c9817b00113978f8fe600ea9ea3705c335707117a93b810ea915ba0997827d968982a82a105c4589370f101e8f0f64279061e0893d1d213fcb126c9ac86ddd04623c2e11824ab11b12d344b164bbd5e090f15f46cfd5a24dcff80e8dbb7ffe99600334917631c6e09b2662c4ad778b123d1017b8ac404527aa1ac4d58ae331b50251d0a393c1542339876148e42b54975cd8a6e9e9799a0ca61037e4333f8a5144ec5174be8d2efbc351d4ebe112d0cbe79348488e74121574470acc34af5b99dd5709e4b1404bd49a459e6c155212218100231468079eab908a27af6818d2f1567dc1a83fbfc1e274ba9fe511f82842146abc618c9f059520acd81aec251472a631b1546a50647ca59b574d5781a2e7e287b4294d0a4dd2a050a1c62e9b454bf472b3dae6858c9e66ddeb38db7004238fef8d1eeaf5e21ec525db24f8976f102b1a345deb868e8652f3e4b91c190aa20c30ca7d6d60c9b2b7b2f51fdd254db2ac559dc4257adabfb67ae6b5b2cc96b8e645194dd033f5be07aea423e09348ec37ad454d488052f0a5570737cdb84b62b56d46fe4532926a538fb893a4d79be22ef17069f42cfd1064c544ab58799649a38d8b4dd39d245342485c92902c4bb26ca0114a979b66df6e2a3a03e685e98c264e8aa4e25f6cff1b5fdced28b0ebeb3531ea9e0960342d1c06180d4f25b54e3b328801068f3e449e1bd242d35353fa189a6537a62f7228b5c14843bb1524f2b76db90df944322c3b3aff761aa3c5c7fd66c8b69e29ee61944a1fbeb1b247a610a081547ef1493a25f18bb656057187dfac9f2d084724dda55a047029c9d4560e6759dc256ae2240f19d7cc81638a626c9a9af942318927c1144b9aa4d1b4535e01a38f152688c7ca0122c6487234e381f3a2467a58f1992f8fb4146f9b32af328a4ca67afc88d5c7489e732c48cb0eebf1ec479163e739d842ce99f029fa218a42ea326cf95194bfa864d628e99d66d68f864ae570a80dba2743ed7aa8b56d87a71819d757f79f3edfdcdd1852e35cf52687906c0d8603232e32023f965a5a8849a0d187f47c6356c23721b56641b20add0d3158c4a8019e60a5289bbd5f04e14ce01d662571c10121e38bbb76957ac33130204ee43471caf8efd2eda3249dd88a569421417e1fe38053649cabf72e8a1ad64f1ad19eff79a01f19a2ba1746094558da8c7f1ac5fdfe086b557058f32d0a26f1745a1a6110ae23a486c76d7d0fef0079e1ca304649d5b6dcd9a098a604ea0fa4936c3cf1a7840bb80d519de51ec74ea4cc26908a2addc10b384793fbc2bf441b18de49e35dd0586677c78bb336d2745cd1aa1aae6c53007249bf41102b0f8ff9c49bb6fa6fd4a1de34792760097799b7f36cdcb8ab3ae7345e51bd1bbb52fa7ac35668687cf4d092c6d0b20c19f7f7f273f7f746c09ef3710bdc776d107b56ba7a21fe9a9e0eedf8c9d63e81450770e1853799626024ae8f51a2a99a74b82bd404355621c620584a60635eb4196027b6ca0f9200e23c478525f48dd6062d05765163fad9ae4b4dcd0fd5e8a1781cf78c8ee11806ee1975bfd4b7e84c0f9bbe34c860ee3a98bb8a98a7098d2fe7947103679961bc894e3ee7ad6a46885e5b400848649a5daa66f4d9768639d88a970bc6bb96ef4879939506906e979926abd9c77287beae2ad6a4fcf0b8e9142249e0b7388604c898056b03ff03ee215becfdf66af0604dfb45fd3e8ffa5ae501a5a5ac5448eeb65bb5258493d75199ad71d9918d2dcd0116e4ec1583b0a730934b06e00b022ca893d8611d0f77294a21961a284ffefa4a671863596bc40a71d21d615985b0892b785ed344ffbf00f920b893f29d12aafd1dae742fdbaf2495e415bee3e0dfb23f2bf4f1a775d0d01c566292374911c725dd8a09f125f7e43638ad9a95542a95ba5d49544860b1285eba61f0f7567fced20c52a8275004866508f9e943f448e3f7aea0abb9a030d6cce52e79cec12581a5bcac89f1d1009f04d6a79b0f7ffc74fde103313e19b5950bde245ceda26f21657e9bd8d4ca41bf6b6c3ac1d7d6a234ce14a7a4cdf14747ca2e7974acec924727da2e89911124efa5f477bb8aa93b9302048635d9dab2928c54bc60874f5653415378213be2c9602af8861c6358901019aadcc030dbf16c4c2b3345d71ee9209ac96adad4574a3579b7cb9c408815238a9e954b9ea3e50d90d0e57407a03ce19cee3acbba8b5c6a653d97effa1d6b75500029f194ed1a4292a01406623a068a09247d1b28d9d6b28cd8391d31251b06a46f4bf626752a650b9bc20c0558b9f8f550445c543097185fecf89cee10a15fdca760992e3b6e18468f74d69108a3439f3c4a67d28e287100198ce2f36814f77ab0eaf5b0c4098169fa28841508065039e6c84e5c907fc65745cbbd1e04b8a0e2a11e155941986f1b14f6026b21f0bfd33145430daec3a182d77792b54f0567013e49add2728bd46a77ae398d2521ad6f280fa9e09f02225013c3b88aaa3d4b2e6cbb1dd0d024595b396e67005f033693ea7b0cbbd0ef6b98619577a810fcc43b4009d74abe5e41425996d10b52e0e3312a5ed2c25d117da7ef66115391788ed24209714fd7a0faa19d3b4a7a6f3c65133aad2ae8c20905515e3dc83114ef6208ac52c74e74f8124485f64b5c9535236450c663293a7e03db5308340694975aebd7d64cbb0e5ab9ee6963f396adf950a1b3a18c39f3911194c0012bd2b54793a944b2828430fac48d80a180e84284f118452445a9d8aeb84b76a409d3449444d85991ae10c1a5a0ae0a9f730c4996b9884288b3cc13bf2d6e34d2694620c29a46a880bb2a6281c20fbffefcf31ff7b7973f5d7ebebebfbebbfa7c7977f3f9d659bd9502147c86de53036cb58407c9793cd502f4b19a471dba773cd0ee2a879a2c28aa7072a203f706d8f265e89eb2a3cdc4b3530c1bb1023686b9debf4f642e7d571ec95ceedf0742eb3171b0240f70496815f17745a88cb2803b42adcf2e9b2b740437e4ca721f12b82557d62a7a842fe44a39a0c235b9b2c2680e9fc895f5e1e310ee5b354405dc0831557640c8161e39fb3eeeb3be0d2e41f6f9b987fb36f8c4bdb8b02121c34389c96fd110fac323dc9717a7a7d8190869fb7c906552076b9af6013f1f8c6d6750520a21450942d6253ccb3821c43e1808c8e25dc265454a5cec204abea06bc4f1c1270cfc7b1410f9098af1b92d60aadf87e07b32c480788fd09e7f41ec71721038c9f7a29eddf731fe3eb820435157e0e1035157d673c5c7f457f48b2822887f1ff46d2cdf66a226f1b1237a254bfcfa2332c078c42ec8d9289dac7abd29191e1f9b11440764787c02ac4fce14d5a1849e9fb32c02af47d8c8bb18d4eb53a0aabe27eb9746ef7e7f35cd883d3cfb3e843487cfad7caec09a0a3d4244cebea7729902b94c9158a6940462993c12f54fc12554ae1c9fb8fdfe1412620f4f4d5ff6d0bfb820a7b26789e8cbf7498f4fdc29b8fdbeee96229e89295aee4b08482e2e48dfab8614cb17e3ed17035feada129c10bb9f8e0ae29a104282421d1c8f3fba1f1d7fdcb70f068e7d3018c53da2e738e99354134e242a3836fe3e960b90f40507db1a96c92787d3f3f3e151c627c3e9f9b97d92f1893d3d3f3fcbf86430cde197969726622df83487f77b1f02bfb8383387c7c7d31c7e7abd96b8b04f8aabe1917ef3435b8fef1187e1211ce11c3eee7b7e3c84339cc30f5b80b040752d03db27ee3d29da2bcdfd38875fb7bd3da902a988ac502f16e8f00971b97a518f5d04d6c386d30f8a19d33c10327e8f2336571c8f81474ac3fc8402eb41622d2cdf4904ecf5d4fb37be2fb09be452a43bba801e5685878f5dc7b562baa6b1122a7edce9a3404f852e5bf5d32bfb99f6d885f7867e16fee52e7942de565f7d92f6bc7a5f0531ee4502b90f46e1391b85bd1e76277e2f9c9264128c4387f5c3be3dcd450702c59bbb0db6ff4108ba1867d956b9c0b00fa8af1fba6dd2bdac02aaa26d1d637df9d1fd8835bfa6c883d1250f16739734c7b8729fff0d7e2768d96a12524cddb26870256d70b5801b528f02ff83acd103869fc960f4472119ff3cc2e837f2c7e467211607acb3ccb2142de1377898fc36c5a3df1b6aee652ebaf39da22948fc5da221c6f0d77ac4b1207bd78c9f8dbe2baed00086f6d1e9d1d9e189e061aa72bb2a7f87a1fb9da09cea056c9ad59d2dd98b7a50f3b36e61cb75eeafb560400e4ce00db15b710e09e532bcfcad2fe4f0ac3ca455420869166bae4031f5cdf5c35a82130b317ad42cb70448473ba056f49861216b55502e786d88b24cbe55837e2290e3e50e91d71db8842a6a14838fb8e85255a2f923b1b36a4d424012c4e45e0b045d0f2ee8f61e8be4ae31549d5e699091a617da0f9c10c518efbea6ada6b5c1cb8971787da03154fbd2091aa396b50987ed3988ab12f51e09700e9169a21fd0128caaa681e1077409c6835e107db7fbbc6cc9c018b6c06bbe035ee596fb558dcb062ea4fc0262a47bed3684ed7947d695890d5aa28175d52170d816bb2fec712562db45503d2e2d529a2eb2c9608a05a51424abecd73ff7639dfac78af11c0edbc6fe15e9af1cbdfd2bb8ecf63fb1cd8b8b8b816c576787686bf8f33fd0300c0f71d5eec9d18bed9e7d43bbc74385b85a10dd8f2540c12fd2a4b407bfb5d5db86bc5a3d0108ef81edf67058ebe1705ad91e9216e0fa6fb6b70d48b5e6c4a2fcf40f74ef9fd9de2ef06c35f8e11f69b00135b50605b87cfc8606733cdaa06d92041bd42412ac2e919225b0521a25972f68f2f76aea21ae78954805f74aed2db0493485f86d1ef6878513ccfe28f0ca0da89036069adc6a936ca4691aeb12520489562275934475a2b8e423abb084b7e91ab4feced6fed27bfb5c26f4101d94eab2980488956e3ae98e6a555a3bd2768c00b1540bb6af3df8158176a5add91533ef5f7823cc269e9050f9e80537b0d6711e6e85c76b3da53dd076e8d73c299a8b63f9a3d434996976d9c49b9a668c1878bb6ec3ed328fd422bde84a5cc4bb1e6affb59a1e2cd57e3b6d36f2166c5daadcb969a2486d1622635dd3493095f0f7523f86f58e68bb429bc2760bba95b34109da7c124cb38c4f8cfff93fcbb7a5b7b798ce97fcbc9bdf8388746d69e816cf033280943c33fad432c7cf4a3fda0d7abd3c075556af1591ee20cf47e984b678baa8050235cf7e1c2d51da5006aacd38cc713d70e5a5f00d012751d330123787f29c8f82d6bebc38be588e22cf81a300efdae5f77a4d956a581de5a9dd6f6c6d553ad46ad893a18e763bc6b022a9156a9b39ac9542ff7ab9a4b3c0e5141624b5bc90ba71553423323f8e4793043624b57ea149e2cee9fb85cb180d614e52ebc72059893ec31319c02379cee1611b901eb792010899506fc5c7099f8eb4bb8cb806860428b7cb9675c95742fc65a3da03e2d24e8873b86a3c48ad559470dd77c47b8601da69da8bc29e717060f456d6224a38ce476bd35c64195aef419b9329c4c41eed90bf78849932db56a83016126c81e21e27bdde530334da0ca87ccc9d9faa0f63ed27ae31aae097287ac2f094c3a2d1c1da0ce6d2ef50ac9841888b6678dc34bece2c018c7781f7152da570eecc4d736eb1e871aba22c2bea6cc62820289282f6065b628f0c2192bfb615b1a59a5b720994f828a8cf37046063ec7453cb9dcdaed694f10f41c229a3716bc6b2da9b59965ac152665b927e138910baafc4788c88c5d49d6d6404a4b71004d50858274486f2b0309a415e49c347ac560b5bbb0dd59728b162ba8cd654bda808a602bd064f9d507e172c699472395d30c0b98328b982dd3123434f950197d0b571d30c21a4cf35c83de82cdeecab2923565acca92329a0aee268192454ae1c47751b1cadf1305d99dea9bc6e4968f1833beb7c526d3533748d98cccb40a549457c31a64914aea97203d6255fa8c7094571ddefcdf2db76b9e867f40daeaadad07e7884eb4668153cb06b853eb0547c42979028876771e9446fb693165eb1efb499543b40ea28fb23c90dd59810f049376831d41f580725072a7bb3e30a59b7e55bf3384a570979761de3d4c881e7609c1a5d420ca3749ce0607c77ee5e18328820d9f3553476f081b48f8a6f8e763f5dac80c63a92e1af05a8689267b80f3a1eb3968d6128804623c32c335cd1bf7832986699f1a0aeed69be27264aaa5f43d5cd950a345db70d4166a62dc5fd551bcd3fcde1b44b0c63c2a78861e5edb036cdd6c6a4cfdd817b50e5f7dc371fa43b9086c61c0c396e43199d50bce5720b8d8289dbd6c338c7104f5653641818ba4ccc89602ea4734496197a41f517ba7e96353ed94d54ef67028626aba9b4f6ad400eb8695f87666c12538323c41b8bf988c69ab72a82e2668d782767eb69e9fac7ea4fed5c4cf09c6c2683293c91cdc49e8e22b41d7b041ce61822b41dab042b1812c2c64d46ab30281411b8120619cedb74188d4a38c7109a26ddf98e98a52a71d2dba2aca44871862d6fe1c697fc0521b398dd1e8ac7548ea088207a31154e1964b8374aae70c0d27bb535c6b7a35b0c482d7b92acaa338e954435d845e76a9a3aa2f522cb821a0c9d75924894046cde89f882c61dbe7059c72d327f093955ec864a4c0d645a248d72bb2ad260df17ff4d7e514613cabc0e415ba07ed574f4b6bc5087afcd23d5869cf87c9065f1ff607b65f152cbfc1afb5d52ded22b7a7852cb68f412ff2a7699072e7e160451429c2f3505324ac617ec7a8afc52265f113e0efbb6338035e1d24a2906e29d0f65eeb2d14839357502d649f0b34b1201f0ab1e598f1e62ea7ecda5c71359031fafce074e784e566d4b334b3dda89fc0e5daef846e7e17c0cf8a2c3a24ec0021eb86119b62d3fcbc7ab0b3270c28bd548348f550764a05f8c5c50bd00bff261749b313821f5b9e3a1ae8d4105497b486ecfbd93fdae16e41ca36399f6783255c6bed7e7bb6867576f0511a1e32256b0780ac332b353418651237574bbf723ab98775632ef128545387764f0a9749553918702bf3e046c56674f7eb9bdbeea587f5a0716a7891408a1c65e3a1e8aacea166bf5248dd76e583c2beef19bb99a77b558c2ca55d13ed189b9b45879b6e5ac78a2c5ca7afc0aacaa255997f99ddee21c982043be66c8018b2ba7d5250112581057b3e233e2a145b94f3682758099a04829aa8539cc1c06336535428bbd21428b17428482668850b4132214ee09118298e8560ade5a06aa151a955591db6503f3c299635f4cd11acdfb1b1848f66e30da9ccf479b5e0f925e0f6fc4ce5b98a68fe4ec4c3695d05944af9204e8dbbd01df359589f66123515be1bb7adc060f654aaf5595d2eb8dabbfaa967ff5e2faeb646ea593a858ee4d09054f244292e378dcf512d5ee228fe3985032706c798d5430e8bcff841d1493c7fe102859a11005da1e2a9e6098f7e23efd073c45b56e77cb5534212eda00158cee60b43ea7a375af87d1823cf5d638609d8d584d31d2cd643195a05b8c815088cfa9d64890a7d1fa7cde576fcfc8ba17035a90758fca36c69bc96c4a440b456a2a51a05c14c87cb4be98f7692f1eadfb7d5c3e5ff7ed69993c2ebe50e931d7447ee3e249d515dfe9dbfa4b7dfbf56f8911c6b28f9bc9baf734ad0541af7bc352d029d690c87e41d20ab05b307a76d690fa74320310e27c0dbeb40ba19b24c19c69c94fddecca7e65c0d53e8d22c22a213389b34cc8aafb330197aabc9d9cb42ae5b044193afb704df318bf1ef57da4c2be8b8455d5bb2d542930cd03155ad1f1a219d58445f355c14b111a65d0d7a9e66f8e356518eee7b60a4d99327d804752cb974efb3ef86430f2cfe332a6afd7539f4a483cf1a723c13e27d2af8243022e6290e017939b16b68023ed6079ac83d24eb6dc5d3f533f945061448fec3fa4176dd3bf5f07d9583e92aeef32f0d02ff9bf312b9ce8e5311bce9b6d155b7137c7ef740880f6f63cd6fa5a4d5705f358c62028e0ac87e92459d6e6f2ff9c03938227d111ea95696b124fc92918ee8337a3fe7c117cf91a2e59b4fa5b9cf0427c370c6ce9a48fa891cb8f4df854050b9c7649829e73e078120b61beb5b92e0990ac25981e953fcfd8cab4d4840d57e621d9b53525c416ccaf3ca2c2b3fc5174918ccac4ee6b5810bfa65e95b1e23023e158d0f5629142b4c0d81125b021b3a2e1b9a09917f3115e93d964deeb4d819a66b7a4bf6b99546cb29e92c5643dadf1fece8b8134f505eabe148d23d327b524acd21130c5daed26eb6b31271d9dd6723c5264a42cf1a295fb104a06ccdb312c293ec59ba453d30c90072944ea5097bae6b1bef8a2aa58ffee76e2ed97f2546bd1e7f85d335d755b04594077128c09e1ac840ea02455b8a3605fc025839177e18eb08a2b8f09955153c026f1f44563ee4bfccd3b6d0e3b2a12d11689a975d2c053b531ed778ac1d15ed8c377ca0d7b78a8dcb04f0ea58ec9daf1208719595bed3ee4b02149c32436df476cf6ebcb0477f0048ff859c6f042a2e4c80758c2e596f543a66f23646d9ad705e3792d754e33152fdbb92d8a6f277c3a6ae6a15561078ebcd47107eaa6083cd89f9e4710c7b8885c7c21194e554f887f7784f58c5a1cc80de9da704bea6ea85fc8ed6433cdb2db6d53e4da346f27eb295c1331b62f597685d6183e9132050233cd5b4bf73ccbbee82346d00309d0a7ca194ed080456be4c183b49d98260ab32c400f9810b29099f153f4000becb4d8331e269ba969bae84132f9183cf40077d01dc82c7aa169a2d5e46e4ae61857212072adbe986671df25e48bf4c1344d7443ba03b86e01972f8d9c9fa2e5eea398a2cd9410729d652eba850d5c63584dd8945cc31a073e5a121591923857b5b012b1e4ced3f85a14eaa8133d67a2a41671f22871f3a580a1251653debd314d797b9b653eba854b584e2ea7586539aef834b62301ccb2ec268765b997976fddcb2787b865ebd5f1649119f1b030931e8aedfdadfb4d613ebf099c958abe726f8d100565ee55b9f8730c422cf5a16bcb25f726fe94b82f67e07f216b7b71d9e1a83211d7cf9aaa6ba465f87f6bc0bd86f32ea96fac17a9cfab87212889b83d1ba74a099850de2933e8c8e4976ed2713bf56c36ff202a2f88d051c101aae4af278d304b5ba67f6d1c080561fda8ab1549ea4ec34208dd115eb50b5305c0a5536e01ca6dc1d45d999a010d8b54e9b64ec350f78095b3dfaafaa81be956c58102f5a4699a8fd1671c419d98125d5877b5a542749607ee110f35f24188898640ea20b4336f82317251d4a758903b310c8d6360a1ef02c1830d46f43c1a61991557bafda159af076babf04145b4d7c3357df14ba29d5dd067a956dd492611750909ca4070d3a428a867d0899a7ed26f742b921e32cff9289ab464fe9b12e3ef468d5932263aa9e5dfa702376b808ef0eed172654da3a7fdad7ac6d4c89da8ecff37c5db690645b020ae92067d9dfe31d1e163a1467432504c9ff076ac0e781b1ea913de8e072a46cc3e523162f66080e149f03b368647bd4f1ec4fd50a69280a5ac34c470292f0e315cc98b230c77a2da21861b59708ce156ab66bfe8e0b36b75b0077cdad114de13435b930df84cbec810b5afe48bfce22fea5e8798de63784f5c4bd7869f886b95a8053e10b7ca7ef691b8a5b7ca0fc4b57ccabd05fc4a3e9ae647abc8e4093f925f4df3576b7d96658601bf913bcb87dfc96ff007a9394e6cd0470c3f936e177d30cd0f456eb43565dc345d99834608f7b200c377e41addb784a4be2f4ce162a95833fd4d4c10dfc9d8f369da3c12083160b8b0797611faa3ee32514af87a663e4b237b1031d52bd3445d2fcbb8e507cc0dc30d364d6ef1056588e15aca8dd834055ef9b1c881808c13ebc4c0a629a3a86fabe2f78b385ad283931343ca29f057f25d96759f9a82e37b4b1f09a1741ff529c9d56b7fdbf55428c7d75d238edbbc42900cea5d50999e92e5f0f7d65c22cc62110ffc80cef073754dba03bdcf99155357be958c96683b7f9f0a50622a692e04c42684c9036528a402bf1506837454263a031f124227a9104542128c132bfaea2496ef06a124267af5614d0a17085890c49a454b3750c77a85631464191a0afcabab041133cdffadb224d7ca888da12bf07438f648e4a085692e042b4b6324b04288220c0bd3440b8b3e051c49df8381e0370921a513c8788d7e42c5beeb7b0b37601d6fe385d4c0d8412ef91bf2301eebf4f11eac608d9d952873d628aa29b416a6d9f56507d4b7d6d25fa336bf643285fa12d8109b66b731c4ff50463d9971eadff7058c8e7e1e23444963032243fe181857be2d40c5b793889118a815b080abaabc60bbb6f62ca2183b943ceb0604e193af3b710e2822eec48898d1e3533c8e10c58e91b285cb66219d9503d006f92b64fc5a3cebe8d63a5525c100c27f6ce9c81e8ac494db184388be1a008568f2bf105366859b06b0fe31fe68d165c051d5abcfd5072970ecfc3b6aeb3170a0720fd6c1ea8f2c13df190f1d1b628b0aa45ad86ef579349231f95f6d06365bf28fb535ed726be5c694f11cfef75b065d0da56ce4df55af0d3d8cb27c5196839e22a52df9cf9658c36d513352a83486484c400e9cb7bcc4ac59c4689621752113eacbb4a214175f243168944086f077f96a57c686b0b606154a126d158dd7db94db5f8be685b755b5373b9ee4981f042c491c32eb043ca1a1afe3a722f23714e351345eee28052929dd33e437a2c277e33f11e302040462f94fc48beb5a6e4e2e360c0575948ac008bbe3b68b71db3b2f969fd50de4a3ef4c1335235e95131dbc877b0c0b99deab26b66ad7f9cffa4e749e23d56be505a2bbad6e6ae8487c5e164a4503a0a61fe3d77a9e89fb22e70214c8495c2ba01557250673265328814f3c91e3770a8f189d3dbb19da98a0f7f5982d41b0daac58e417cd4253f21bd25169ef6b27195bd157d2768e409671a092bab4e9f999690a34a8880b113b4b5d96befa7a6b0a208c2b4cad9c56a9ccf41bab4536cdbfebe30bc532032dd06c0e72c65b93b52d82443117fa6b62211a6e89054f2484060a729571d3419137bd0735b86eb9106ac06538873bcb27bfb546681342deaba0ff605cb8133abf0b1a055eabd3e90f5996d6adf2cd13ac0b2be5208767c952b6cdc0257a0f3f688bbf5bf39a933b091aad3fc6eeaad6ee77393ceb6defbccf3184e83ddc17746b25d8df80f825fb9b9602e9fdb6994b34a4a6a925b2ee37bdab4a7f3055536dbf72d180958b2d15177bbfe56599fa9c5cacf609f14c93cb533849307eef948ac017dbfd6b0ecf6e18b60c404124f90dc9e40871c95c45f25a3257c116a554bb6d815851594ce5642af839f0883d9a23de3cc348856ea7bd9ee09eec51a0364711fee6f57a10177e721c2b786fbcef67993c0c0882893b251cfa7d2fcba8b4b2618824ed2d8bf29a3cace8ae4adbaccf808bab5d17bb5b47aaec9b10390951cb24448d49d81d77b43daa6a7a1599c535872cdd578aa2ddbebe24d7eba45b27ef8a1825a596d3deb3a7032dd40ea458db449b1203243c5aade8ac8627d2901396ef3be3412ac90bb7d2c26b00e6f0244ffc8b21113c8f34ae87784578993da245fc58134f1e7af1ca31c652172d5374c9dc0668ad43e61764003312a0229d061ecd2e16a385ce65bc21c9f8095134277cb298e2c9600af3893dc5ce139205d83437f524897ea1f6d98c6a1a745f262f5e917579fe9674d3eaa2395949ad35c258322123fd5117ade009e65ade49bee933582ec63eef6d1f751501780114f61b36a2c64906d198218a62392bb19c1586ca031959e1ff2898502e8f4a960b546acb02a91e2a0f2d819de3a9b68269a010eaa472252c8f2f5d697dc9baa616596855c78c24d62f29973135370f098dd734ceb2c4fa9d3efc47c0b79fc0464963524731274989d79feada8715da607824214ac0f85b4a53fa4be0c5117793af068607f2689a8f5a4c78c832445b32e94a0de0933c967ba31901a9005002db281ae16769f266109148c287e4b758dd6d414d66344e117682c2a389e779752d5b5432680e4fe3b4de914d15674271eecc4cb37b8082d54230d9c12a9a65c1ca9d61eb7b4132e9237df81af0834039272cf01879028dbaa44cbeab04c03bfac43f46332abda705accd10c556a42617b9f0ec2ddcd8f5388d7f74b92b5580d0e895ab32097aa4ebe55845be684c37463e296f4a9cdf78d957c851a044a7f1406fba4462cb9aa6f0a1cdd1e0d9670e07692228ce60094c130572be0853b90722c22045586a635fcf43ab5df74e5f70832d8edc88a450d94c165d8b5f65dac93fb0fccabb1f298e51510f416e6a08ff055f95d75c72651fa2908e62d38c0bb282ecfa2909457a36fd58f071e5a59401bef56ced67f9b2e0e7b5673bc2f9f651db459dd2fb7de770b0fde6a8d64117bc2f2d53d41935db91620c8558d823c65ca6940ee62c8ae97b37a1ba3890c5cb34e44118b0a274294b6711bf0c8bf7135994b2c08b6645b55496253cf0be6e74d1c690c8f08d512f3a397bebb9adf6a14e5aa6b5d1a7274a1b7d7abac71fb0700c55a9c316e4e0cfefd0e43bf32fff679afd39fb7336cece27ff7531fdfe021fcc61b6f3141fcc471495611230dc8e7a28f32595c5b5f44385e368409457443c563bd089277c37bf65501c04a614078e3a040795fa7e152b519fc3a0602163c14b29493590cc80ab1401852fb4c6ded2ad4565935d147684c2b5b5cd956b34cb3214143503ac44e60d596b20125fdaa83eccc9ba0083d1ba76ecc9202f949d4f64321d6965e62349d01a162a565d39b63e62e93f2e4a9e141ffc88a1bbd1a586414acbc7e36420fd5feb9ff1d102d27a098639c6e5b71f60490c032ec900aec8607475fe54b8855df57af8f9913c4daea6a515ebaef125b821215a210f3d2ae53486ca077880e15670f85f883dfa72fe5834faa5d7c3b775669e10821ec8e3e4cb148f1f1cddfa839ecf6bf2a863aec4e0676a863e91c9ddb47032ba851b315925a45c9be627d5fcb56ae2be5ca36604e727ac53f7dc138aee600137700bd702466e2ec8a569a2658f2cb491f0126e70ef1e2ec94defae186061f15df6ca5a389f8e4aab30455ca7b24ac12b8091f6ca3c6e3e892a5fabd90ec4a7a6895212a054ece1859006b52638a96d335680b957f88a043a50060db0f61af9aef00b31be33e4e14986597a8a7055f07fca82580f650014ab677fd979e6ea27e786e39174129486d4be8da72ad26134a3be9b86dc514e85bda04a0f5712b7c047c985afba1f92354a0eec2a858cd2ae33273c27feb884936812f6ede9b81ca38d1d55d4ab17b1dc23d124e9dbd3bc31a932e2ca301c2f579a80d7f34d0cf71ce3d612ce2039d6d2fe8818c6f2f095586062af80fd02e59c0fb2ccbd20fe581e59a3f11e0a882747f13e9ad14b8e5c8ccf8f8f87ef4eb22cb8383e39b4df6599db13245988b6e956e59e2daa9f1c0e0759965e1c9f1e1e1d8ef9d82ba6c5c54ee0887bbd84e0f686d849fbf28d1e0afaf24be7e7f600f74e8e8f0f4f9a11229efc8a13c81811d5a4b8690d1289916d0f3032547215038e5acf266e04e0d4cefa2ab487129fb72ed28b7ef2da4dbe3881b33875590bb42747cd749ec381922cf4e1b35aaa38395156dad33365a51dea4c9eb6cee479385446da6365a33dd236daa37758da6755325069a0b587da407b5c3a774a3bedc999b6d30e959976785c37d32a03ec276d80bd2737960f9fc9ade5c3577d4e5294b219fc42a27a4ad0f7c46db853fc44dcca9de203f1da329edeff767df5fb2d7c249e75f7c7a7ab1ff5c3bbcb9fe10751b659d1994a7afb6be3b6f2eef99178965b3d785f71b2f01bf1ac20a9b5f1fb5effe48134b694f92d197d443f0a2111513ca217f1084793784a988ce22f951f39fcb1d5e0bd04913d7911af9b79117fde6bfbec348e41789f650d6f1342102373d1b92c336ee5f996cdc72c87efda8f6ffc4d7ae61889f430ad1d886d9a4c9ed4639a1a7df4182e093ac339fcb5bdbdefc41d99a95360f13841437594abf35999f31af6dd3a3fd645cd574df34986d16c50ac1ddf0c313c793ba7f21406799da86b19595b6665d1cf8a33a80d6c9addd82a6ef5d34a89ab9f5705e37bdd3907a943b9b51684e37c148cd1872c43b7964ffe0a37964ffe067fa05f6be9dbd45d2d595b55522674932545e6390caf8728743fe412885a8f8b70fe0acd33189cbfe5eddebb128915e499f01e0ac6c6fbd05daee84c1f9aa143705c2267b9c72121728e7b1c66249a7853d89019ccc9c6346b5ec470439e73b8ad7f2956b01fef83fd66558533af6b11e3d45a07f471e24e51fc3debd17a624c81e3b50542a5a47af180685e4f302abf10c874d08892af88627c3e180f1c7a313c3e1e0f8f8f1d99161743a43e9fa8cf47f5cfd37a07044c34ed0139ce471fc6825512081a35fb510bb9f611870d781804a08f7f167f4a462b1a2be5450c0b240d7251116f288f976f3ec48ebec7ce6fa295dfd14680eea562cee4b5aab046b172b27830cd07b4811f305ca1259ae12635944ebf9b2c13ef72984df854be545b6e32c7cebed115c31a151c880b0919c824a64254105d90a64f31605c62a1d66e8f02124348d428472aae3dae79aa8dea29b622d9ecac0cddfd6527c163e0239492593fc4e7837d95cae0269492158af0f70cf7c28bd9de365d921e30f5924bc4fc2af7b8ce7b9412f77ba63ced3e215ea6950cea9924c37a8ec9147468b80b02f4e49afd240d01a3e4dc1de15bc4653c5f7301e7a4be2e8fe8578c615ed7de7489d8ab219a43f378ba0d868faafca300c29b8937251b68049f6adcb3e99219240b7729b1d00d06e3873feeae6eef3f5d7dbebffa70f5cbd5c73ba3829896870280dbdf998b77e6fbdeb9431eceb1d3aa3179fde849edf4796a2bbeab3dbfbae636bcada4e72ea1d635e367b2acee6d9b66d9d6d91a6e996437da49b2eb9649761b1926b87e0aaa8e8cb6d0d765ae5d17719c638169b6237b6ace15fa7dfad8f1c4702bb7d1b07219dd374bcd331c4f35777a52043968b5cd00ef61a55e39bdd887044258a9546aebdd489e0559efc91937abce8b5dc0860468556a1dba0292bb29da60e9581e928dc2152b15583ceaa284845bc68c9592bb136d8b92fb71669aeb8ba169a205f1d002eac9e96088555ebe55a933f025efa75543586c714606a3f882c913457cc11fccc60bb49ab02930ec88df7de7f2ec15158a68195b47eed5e67c44f5444b0617195eb4dafc1ef045c0764ecc68e644080a77df6f48c7f866d96627a120a455446fed48cca955f5b7f5e4ba52e9e99100c5e5a4bb324cd753c784327191b4c4e6b7e6150c498a2ab2908c3d2742097818f77df0faae80155be59d3f774dd33df77b32cc82f46df07b24ecdbe0ca1f3c0afbfdcec560847d4110e3b1ccd8124ffc32863596d9e67b64255e5c7d7352c662d18fb145d734debcb6f2b292d12ab946b5d57e63b6d6b7afb5eee7c9e9abb0e90761b8a7835acf5574b39636e85bfb2105d720e4345672b50a74ab774ba2f33d686bb7c79cc65b7daed2b94595d3fc9bb3e0c624d0514d8b2069640d004a06e05652a5c22c9e6084908b47ee051d617f428554496b52a5ff0f4e119bbdbe5e6cf6af03a8a29752fffb96aeca8affe2fe6a8dc96bbd55d5b6fafaff4627d57175eafce2d77a59d4fbd74d69fd70bd573b2babfd0bfaaaf9491d467e621759dd1a219a02e5c8501685815ca23d75127906dd57ba496470918e8e8390440d8cb522517db8b0269e697ab52c55e91416a4db5d9b26aac501cab0bf2c53261975d738b2ad9c20edb3ad3d29713e5a55917a6d6720255bf53186958ef66babeeb756d7fd84197417a2205557df02224dbc2e8f81fa12056c1b3844593b64140696e89f40788627af52c0d29eb51752ff0984b0388ecd3e6cb84ad943993aa034a4ba62b66a1d029f74bbae69da0713bbf100d9d01fe0f30124246d0ea161aeceb2a4913633f0915f592c5b730266592de1756b3ee9b8af98b1dd5d2b6d4d1e4a2142f5fd8b3186f47c209fc6bd148fd20b3218a5fd3e0e7c248f1767a6c926e9b4eeb6905607bef7eddc71df9a3af3351f85c9b4320c77e32cdb0ee3d77e736918429dfd2d7c67ec1c6cdc7ea8f66b8468e9aefe09eccfd25ded43a8dfcaf8ec1146148713200ecd43d631560918bf79179ebe13e2adcf5fdb89b1cc59f6ede4e2ff315a273a2e5399bdade79f45d5ffcf747f1b0f572e1abbbd97672835c944c15173284e2b2e74140a211c0c25733ca2e7f10873e9ba3aa15350bf3215bcb8eaf7992e63b5e4f0fab8be6f643cb4da433bab9cd552643787ea136f47ad536a86902d7dfdd0732e5d60b76622a1dbebe73602198216a4d7bab36c8136a534111611ba320baa4722446b7a0aa961f57aece2b5a3047496a9917fee8db09ad09e3f2574e2f77ad31c83ffad94f1b496f0f6adb848d127950cce27c12bb32c4dc4adb32cf3826d639f5a2e99ade06775785eb44f440be4a9cd71e505a11018c518f978e45f04239c4c82298927414d444bfe91493bc656122de96be840d4f95771e82dec5712c57cb78bf11e54a53da4a232f4fc1fdda9b6ce20639fe26d98dae94dfae0b69e28ab00c22ba36be22a7f4c20f35dd73c99518ae266be5e8c51ac8f7b82b8660feab9dfc7d68e021b22548f9da74e8018508cfbeeb7d0bca6e8a1b757b9310402682c90dc513cfa10796e4895b1561e41ae775942baddd4349b5bcdad129ba4c856bc7bb8b51db5cb9c0dc3ede611ee12f5aa7c8a771eef6abf65befd328d42b3beea8b6a4aecf5a8b9b2cdcaad9248c18826632d93e8e5c68ed7c27143f8df5a899ac0e791d4346b032bd6a2be0a5272699d7d45406476d4bdc25591ba65674e8ad970017959f69ce3f2b35de2be3975b976e2b48b74697abf0db5b78aad0ff13d3dd1791deb6e9c2ab9f94a4dcc5a0c7595260b5854b2c88c74576d892f54d25f74347c77f4eee474f8ee188c8da1d03cd299addb7c3865af4b4b31313c8310c37d78f08ad46507e8017f7f8027f634cb8ebac4e0b44a6ba6139df76d5c26241f76eb69cb450557be5f56106d58d5736b8cc5ff5a85fa538caa2717769619e5236b5c3e18b719c0f5aed1c44a2c442dd76735494e7c71713128fcd78aa34c27d351db9943132acbbb51756e7b473bee51e01054d9408ae886c9145604d5dd8cc746a0fc0350cdcb786c2ccb42ed4a3a36d2b24839148f8d8d2c0115e42270855e736e25511a7b14563d636ee011f248a8ba351388d234bb08b964567311bd5898262a2212354bb0004fbb7962f06ab2a32e3d2ff823d35c1798010a8f331b4b4fb8c9605a99a55c28292809301ee15a070821ba59d3ac159787867716849449c9c65d5fd492010b8681b34c77dc30b0b33d068cabaf06e3a4f4770cb093e48e3128e047f383833d30b4ed59c84d5341ce645a3827eb832363996e78b2eb32181509614a1f6856f840b3177da019441063876efb40cba4c67514141567a8c612fc54f663a05d425472f2b4e1099dd63ca10555e202cd343ca1d7c443212898c2b02161018b3027286c85e1b00d86c35d189e29e09d1b189e24e4aed16c1c3ac67fa1b163f4420dbf3d031b2aa16ce58b50dfab517daf3e36f6aa28290d8dc5d654eed5097a82151e4f56536752793a3f90012cc9002ec9643a5a9e17ef8ef0f3530d4c67e3a5a3f42e5770275b9a8d57ce4a83d512d7ddb8efb20c5d9105f251ad0531f481b3c418cade6142c8035ecab0b0256c70190e77a960b968fd01c46b9745aed66ac49dcb721437c41edd9c93c26bb96f8f6e54ac9b6eeb6e7233ddd7c6923c90ab325bdcf6c7c5a77321c174672fe6aad2a4ae3aef6ae9726ff1f2b16025b9912e7355ca25c4089f04533cee765979b008915efbaf2a76622b46ac38f2f43997f73260728628183fd287b49dcbf10497a66b5d333f6a67856a957e7763b68f65f26bf5a4b0d8ae11aed5fac9e56ed85a2bcc719181400f27526f4560dcac28fbf5f387d6f73645ebbade4f41485b2bce65ac293a3bc495577bd05c6015c9cf4160a207d7fb7afda313c3cadd84913b73583eead69756e5d7b51edd204c1ee26036a7e3dd22eb913e2491f795722ba16c8638767425fac469ccdcd00ad83afa2a4023477fbdbdf96825124705fe46888e79d9d5b4c8686984d1dc80e790ae69e870d0a7fe382caf55f6e4e154c8982938e0b547ae7e14c8c5af3ff1f593c762c5eb0f13fd90aa65ae3f0af5235fad2dc7798c4e061894c52346ef4ee4df53f9f79df87b7a24feda8353f523cb6cfb50fd1cab9f13f5a3aad867ea47d51c0ed48fad7e86ea47bd3e544d0f552b43f5de50bd77a8de3b54ef1daaf70ed57b87eabd43f5dea1fafaa1fafaa16ce56ca0e073056b01a1e5f017db4776487f93b8c85a1767198ac940f9e6e898cc1a3f4b4bb2369a45cf29e13da36ff45608e78f8b20a4683d49559eeef8628095f365ed50a83a9847a8cc8917861d1e758c1eef191d1e2ce9ac13a5dcea7ca67f4b69c23bd73f3a1da397cad8f1188fc427c833574daa2c298ea7535438111491f85465fd089021b68701cf0f019b056cfed15d8a3d3373b9eb6c0130c339a4b5b84f1d965786dc4997f87222670df5ef02196a2359464f3a0097f536352dc10c193fc4d1634263ab441275d89cefafab1005c7f94aa7cab6bc78b3e2513dd95a955942f9ff175aa5f2ecb5fa8bd69cf2cf2e9b45cbdfa4f90aa923905b3c58b793bd7faf1ce1e5bb08e7024b49183d1b2a907b2a694a872b8eabdbd44f082e1d353cbd5911532e3adf4c98c8222e8f49e9b81d2f749344254b2c1a340a07557992659c657d5b29bbde6ba4d81a9cad396469afe018fa7697882d20c3a1e23e9167d63c36b6cd43b16d1e277c2a4febcbb2c9b448a8451f3b4f72a423f1a4482552adeb529a91a4670be3063cb3fd405828318a141aa5105ff1f23996a7bd5f4aca83ecc377351271d50cf3ec3433b38bd78c1ec7d01d6c077b76edbceaef5db9f8e8ae998bbb19c85b3990d82376be73ce002b529bc7b554f7ace2f2a8f437c2dba90db74e492c620fa9e046f8844e493ca1d332048ce778cf395d1adc0514503653e752cd10139c44c05b89ee17419deb6491d46fb2ec39879d46478ad37bfe481f7f5028a62547c5a40c99e345ce71cbc0963ae141ca674506fca265c9ba96725e99fc5b190f58c551d21eb10b91a61481af505489c0f4b1a3779351742202a3c8d5e076d66e18cc3a5fdcb5abfcec3bc18c32991328b60cc1844ca2a94c0b1e4dc9732eb7d9249ae62ae300b356d10a61fdd5e0c5af06dff6d560ba1d39ccc8a082f41855c649bd659a67d794686f219db659093171ede898067a60840b1899b73cad70470e718e700e0582d95ded1127332a24ac5f3f5fbf8f96ab88c9146ce52175077f26bd83391806ae8a2683fe3bb7ef4f9f87b978f43fbe33c524c85404446288951b2792ed6aa47c888971cdd4548a5a9d959b247426c869c1143a9d72fe99a5b92f30ac8e3e5bd2e91865ca7899884820614f3a7f962b182b7c438992ad45abc10c22b22e352e45fe09a39894ce5fcaaf5230fe22d73ca6f320e174d6ed768df24b0d121bd4bf1ae05c1e0059300f91d5a0f918b473a2e80530d5c238d2d95f902ec04e54a63260c5a1a81f231ef89bdde4b20277d72d2a12976b838cb6dac9228dddea3b4f948b7e044409bc0c4be6a3be74acb674096a2e9be85827a18c8b959309b936564726e8eb0852d121126be75149d550804d332ef007051be79230c5790e97b3993a27b435e7d6562289ab902e652ec1e228d0516c71fac40987b2e64334db344e0e15d0619a4bc9305d3331dfef6f6f5bb0dede6ff18d4c0ec3c446bce43c0e1e524e9121931f8321be7fe025893c105dd6bd5d50cac7f51bcb4b923bd94f8735fab62f5106c718aa870beaceb2acbc9d53ae3b97fcb0b9732593880c51c9104c116e7c418d3ae0ce971c6ec9f38768ee50d0ac9a13815cb6c479bed9ce79f6a023c36ed82f69c88355489d07b85a06dc59c2bf5337e60fd46dae5925ea094e65742956b88691d419c5fa982b294e0bbc4449edf0ab06cbbd54aef6a20f97de57163d8674366f665412bb597ca6c68d252517e6562f755226ae59675174bcb6e339187f11d84b34244f31be776e6aacd41795d215e777a84e5de116c35288734198384284a53303e7533cfabf030000ffff732c3f539ac90000") + mewn.AddAsset(".", "../../runtime/assets/default.html", "1f8b08000000000000ff5491416fe3201085ff0acb1e92486b735d6d8ca528c921a7acd4566a8f6398d8b8185318dc4655ff7b459c46ed0586c71bde7ca2fab53b6eef9ffeef594783adabbc320bae951c1dafab0e41d7d580044c75102292e4894ec55f7e553b225fe04b3293e48fc5c3a6d88e8307328d45ced4e8081d497ed84bd42df2ba8a2a184f2c062579ee8dff8408f05ab686bad4a488e1da54aa71102713b049edd75e5843280688844134c958fde3a6d0b92cfbf83b12043a7a74a825859483c59c5c5762666a467dae2b6d2666b4e4e07df66833dd46a4b347c909df48f430c1acf2fa949c22333ab6d1faeea22dfbf88729b0b601f57cd8adde2708ecfa88647a5469b8f00404c2bdc57c5a2e66c362b59e8b3207c93eae6ffe3c6009dea3d3dbce58bd9c8dabf5c7379699425c3eef330000ffff57b0215ecc010000") } diff --git a/lib/renderer/webview.go b/lib/renderer/webview.go index 18e966e9..ceea7561 100644 --- a/lib/renderer/webview.go +++ b/lib/renderer/webview.go @@ -25,6 +25,7 @@ type WebView struct { config interfaces.AppConfig eventManager interfaces.EventManager bindingCache []string + debug bool } // NewWebView returns a new WebView struct @@ -48,13 +49,22 @@ func (w *WebView) Initialise(config interfaces.AppConfig, ipc interfaces.IPCMana // Save the config w.config = config + // defaulthtml + HTML := config.GetDefaultHTML() + if len(HTML) == 0 { + HTML = mewn.String("../../runtime/assets/default.html") + } + + HTML = fmt.Sprintf("data:text/html,%s", HTML) + fmt.Printf("*** %s ***", HTML) + w.log.Infof("URL: %s", HTML) // Create the WebView instance w.window = wv.NewWebview(wv.Settings{ Width: config.GetWidth(), Height: config.GetHeight(), Title: config.GetTitle(), Resizable: config.GetResizable(), - URL: config.GetDefaultHTML(), + URL: HTML, Debug: !config.GetDisableInspector(), ExternalInvokeCallback: func(_ wv.WebView, message string) { w.ipc.Dispatch(message) @@ -95,6 +105,7 @@ func (w *WebView) evalJS(js string) error { if len(js) > 45 { outputJS += "..." } + // var outputJS = js w.log.DebugFields("Eval", logger.Fields{"js": outputJS}) // w.window.Dispatch(func() { @@ -103,6 +114,11 @@ func (w *WebView) evalJS(js string) error { return nil } +// EnableDebug enables debug! +func (w *WebView) EnableDebug() { + w.debug = true +} + // Escape the Javascripts! func escapeJS(js string) (string, error) { result := strings.Replace(js, "\\", "\\\\", -1) @@ -172,51 +188,58 @@ func (w *WebView) Run() error { w.log.Info("Running...") - // Runtime assets - wailsRuntime := mewn.String("../../runtime/assets/wails.js") - w.evalJS(wailsRuntime) + // Inject firebug in debug mode on Windows + if w.debug { + w.log.Debug("Injecting firebug") + // firebugLite := mewn.String("../../runtime/assets/injectFirebug.js") + // w.evalJS(firebugLite) + } - // Ping the wait channel when the wails runtime is loaded - w.eventManager.On("wails:loaded", func(...interface{}) { + // // Runtime assets + // wailsRuntime := mewn.String("../../runtime/assets/wails.js") + // w.evalJS(wailsRuntime) - // Run this in a different go routine to free up the main process - go func() { + // // Ping the wait channel when the wails runtime is loaded + // w.eventManager.On("wails:loaded", func(...interface{}) { - // Inject Bindings - for _, binding := range w.bindingCache { - w.evalJSSync(binding) - } + // // Run this in a different go routine to free up the main process + // go func() { - // Inject user CSS - if w.config.GetCSS() != "" { - outputCSS := fmt.Sprintf("%.45s", w.config.GetCSS()) - if len(outputCSS) > 45 { - outputCSS += "..." - } - w.log.DebugFields("Inject User CSS", logger.Fields{"css": outputCSS}) - w.injectCSS(w.config.GetCSS()) - } else { - // Use default wails css - w.log.Debug("Injecting Default Wails CSS") - defaultCSS := mewn.String("../../runtime/assets/wails.css") + // // Inject Bindings + // for _, binding := range w.bindingCache { + // w.evalJSSync(binding) + // } - w.injectCSS(defaultCSS) - } + // // Inject user CSS + // if w.config.GetCSS() != "" { + // outputCSS := fmt.Sprintf("%.45s", w.config.GetCSS()) + // if len(outputCSS) > 45 { + // outputCSS += "..." + // } + // w.log.DebugFields("Inject User CSS", logger.Fields{"css": outputCSS}) + // w.injectCSS(w.config.GetCSS()) + // } else { + // // Use default wails css + // w.log.Debug("Injecting Default Wails CSS") + // defaultCSS := mewn.String("../../runtime/assets/wails.css") - // Inject user JS - if w.config.GetJS() != "" { - outputJS := fmt.Sprintf("%.45s", w.config.GetJS()) - if len(outputJS) > 45 { - outputJS += "..." - } - w.log.DebugFields("Inject User JS", logger.Fields{"js": outputJS}) - w.evalJSSync(w.config.GetJS()) - } + // w.injectCSS(defaultCSS) + // } - // Emit that everything is loaded and ready - w.eventManager.Emit("wails:ready") - }() - }) + // // Inject user JS + // if w.config.GetJS() != "" { + // outputJS := fmt.Sprintf("%.45s", w.config.GetJS()) + // if len(outputJS) > 45 { + // outputJS += "..." + // } + // w.log.DebugFields("Inject User JS", logger.Fields{"js": outputJS}) + // w.evalJSSync(w.config.GetJS()) + // } + + // // Emit that everything is loaded and ready + // w.eventManager.Emit("wails:ready") + // }() + // }) // Kick off main window loop w.window.Run() diff --git a/runtime/assets/bridge.js b/runtime/assets/bridge.js index 5385f26b..630aa4d0 100644 --- a/runtime/assets/bridge.js +++ b/runtime/assets/bridge.js @@ -95,13 +95,6 @@ function startBridge() { window.wailsbridge.reconnectOverlay.style.display = 'none'; } - // Bridge external.invoke - window.external = { - invoke: function (msg) { - window.wailsbridge.websocket.send(msg); - } - }; - // Adds a script to the Dom. // Removes it if second parameter is true. function addScript(script, remove) { @@ -211,6 +204,11 @@ function start(callback) { } function Init(callback) { + // Bridge window.invoke + window.invoke = function (message) { + window.wailsbridge.websocket.send(message); + } + start(callback); } diff --git a/runtime/assets/default.html b/runtime/assets/default.html index bcdd7f67..aa20ddca 100644 --- a/runtime/assets/default.html +++ b/runtime/assets/default.html @@ -1,18 +1 @@ - - - - - - - - - -
- - - - \ No newline at end of file +
\ No newline at end of file diff --git a/runtime/assets/firebug-lite.js b/runtime/assets/firebug-lite.js new file mode 100644 index 00000000..0825b07b --- /dev/null +++ b/runtime/assets/firebug-lite.js @@ -0,0 +1,10945 @@ +(function(){ + /************************************************************** + * + * Firebug Lite 1.4.0a1 + * + * Copyright (c) 2007, Parakey Inc. + * Released under BSD license. + * More information: http://getfirebug.com/firebuglite + * + **************************************************************/ + /* + * CSS selectors powered by: + * + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ + var FBL={}; + (function(){var productionDir="http://getfirebug.com/releases/lite/"; + var bookmarkletVersion=4; + var reNotWhitespace=/[^\s]/; + var reSplitFile=/:\/{1,3}(.*?)\/([^\/]*?)\/?($|\?.*)/; + this.reJavascript=/\s*javascript:\s*(.*)/; + this.reChrome=/chrome:\/\/([^\/]*)\//; + this.reFile=/file:\/\/([^\/]*)\//; + var userAgent=navigator.userAgent.toLowerCase(); + this.isFirefox=/firefox/.test(userAgent); + this.isOpera=/opera/.test(userAgent); + this.isSafari=/webkit/.test(userAgent); + this.isIE=/msie/.test(userAgent)&&!/opera/.test(userAgent); + this.isIE6=/msie 6/i.test(navigator.appVersion); + this.browserVersion=(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]; + this.isIElt8=this.isIE&&(this.browserVersion-0<8); + this.NS=null; + this.pixelsPerInch=null; + var namespaces=[]; + this.ns=function(fn){var ns={}; + namespaces.push(fn,ns); + return ns + }; + var FBTrace=null; + this.initialize=function(){if(FBL.FBTrace){FBTrace=FBL.FBTrace + }else{FBTrace=FBL.FBTrace={} + }FBL.Ajax.initialize(); + var isChromeContext=window.Firebug&&typeof window.Firebug.SharedEnv=="object"; + if(isChromeContext){sharedEnv=window.Firebug.SharedEnv; + delete window.Firebug.SharedEnv; + FBL.Env=sharedEnv; + FBL.Env.isChromeContext=true; + FBTrace.messageQueue=FBL.Env.traceMessageQueue + }else{FBL.NS=document.documentElement.namespaceURI; + FBL.Env.browser=window; + FBL.Env.destroy=destroyEnvironment; + if(document.documentElement.getAttribute("debug")=="true"){FBL.Env.Options.startOpened=true + }findLocation(); + var prefs=eval("("+FBL.readCookie("FirebugLite")+")"); + if(prefs){FBL.Env.Options.startOpened=prefs.startOpened; + FBL.Env.Options.enableTrace=prefs.enableTrace; + FBL.Env.Options.enablePersistent=prefs.enablePersistent + }if(FBL.isFirefox&&typeof FBL.Env.browser.console=="object"&&FBL.Env.browser.console.firebug&&FBL.Env.Options.disableWhenFirebugActive){return + }}if(FBL.Env.isDebugMode){FBL.Env.browser.FBL=FBL + }this.isQuiksMode=FBL.Env.browser.document.compatMode=="BackCompat"; + this.isIEQuiksMode=this.isIE&&this.isQuiksMode; + this.isIEStantandMode=this.isIE&&!this.isQuiksMode; + this.noFixedPosition=this.isIE6||this.isIEQuiksMode; + if(FBL.Env.Options.enableTrace){FBTrace.initialize() + }if(FBTrace.DBG_INITIALIZE&&isChromeContext){FBTrace.sysout("FBL.initialize - persistent application","initialize chrome context") + }if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("FBL.initialize",namespaces.length/2+" namespaces BEGIN") + }for(var i=0; + i0){path=reLastDir.exec(path)[1] + }path+=backDir[2] + }else{if(src.indexOf("/")!=-1){if(/^\.\/./.test(src)){path+=src.substring(2) + }else{if(/^\/./.test(src)){var domain=/^(\w+:\/\/[^\/]+)/.exec(path); + path=domain[1]+src + }else{path+=src + }}}}}}FBL.Env.isChromeExtension=script&&script.getAttribute("extension")=="Chrome"; + if(FBL.Env.isChromeExtension){path=productionDir; + FBL.Env.bookmarkletOutdated=false; + script={innerHTML:"{showIconWhenHidden:false}"} + }var m=path&&path.match(/([^\/]+)\/$/)||null; + if(path&&m){var Env=FBL.Env; + Env.useLocalSkin=path.indexOf(location.protocol+"//"+location.host+"/")==0; + if(fileName=="firebug-lite-dev.js"){Env.isDevelopmentMode=true; + Env.isDebugMode=true + }else{if(fileName=="firebug-lite-debug.js"){Env.isDebugMode=true + }}if(Env.browser.document.documentElement.getAttribute("debug")=="true"){Env.Options.startOpened=true + }if(fileOptions){var options=fileOptions.split(","); + for(var i=0,length=options.length; + i1){for(var i=0; + i":return">"; + case"&":return"&"; + case"'":return"'"; + case'"':return""" + }return"?" + }return String(value).replace(/[<>&"']/g,replaceChars) + }this.escapeHTML=escapeHTML; + this.cropString=function(text,limit){text=text+""; + if(!limit){var halfLimit=50 + }else{var halfLimit=limit/2 + }if(text.length>limit){return this.escapeNewLines(text.substr(0,halfLimit)+"..."+text.substr(text.length-halfLimit)) + }else{return this.escapeNewLines(text) + }}; + this.isWhitespace=function(text){return !reNotWhitespace.exec(text) + }; + this.splitLines=function(text){var reSplitLines2=/.*(:?\r\n|\n|\r)?/mg; + var lines; + if(text.match){lines=text.match(reSplitLines2) + }else{var str=text+""; + lines=str.match(reSplitLines2) + }lines.pop(); + return lines + }; + this.safeToString=function(ob){if(this.isIE){return ob+"" + }try{if(ob&&"toString" in ob&&typeof ob.toString=="function"){return ob.toString() + }}catch(exc){return ob+"" + }}; + this.hasProperties=function(ob){try{for(var name in ob){return true + }}catch(exc){}return false + }; + var reTrim=/^\s+|\s+$/g; + this.trim=function(s){return s.replace(reTrim,"") + }; + this.emptyFn=function(){}; + this.isVisible=function(elt){return this.getStyle(elt,"visibility")!="hidden"&&(elt.offsetWidth>0||elt.offsetHeight>0||elt.tagName in invisibleTags||elt.namespaceURI=="http://www.w3.org/2000/svg"||elt.namespaceURI=="http://www.w3.org/1998/Math/MathML") + }; + this.collapse=function(elt,collapsed){if(this.isIElt8){if(collapsed){this.setClass(elt,"collapsed") + }else{this.removeClass(elt,"collapsed") + }}else{elt.setAttribute("collapsed",collapsed?"true":"false") + }}; + this.obscure=function(elt,obscured){if(obscured){this.setClass(elt,"obscured") + }else{this.removeClass(elt,"obscured") + }}; + this.hide=function(elt,hidden){elt.style.visibility=hidden?"hidden":"visible" + }; + this.clearNode=function(node){var nodeName=" "+node.nodeName.toLowerCase()+" "; + var ignoreTags=" table tbody thead tfoot th tr td "; + if(this.isIE&&ignoreTags.indexOf(nodeName)!=-1){this.eraseNode(node) + }else{node.innerHTML="" + }}; + this.eraseNode=function(node){while(node.lastChild){node.removeChild(node.lastChild) + }}; + this.iterateWindows=function(win,handler){if(!win||!win.document){return + }handler(win); + if(win==top||!win.frames){return + }for(var i=0; + iscrollParent.offsetHeight){return scrollParent + }}}; + this.isScrolledToBottom=function(element){var onBottom=(element.scrollTop+element.offsetHeight)==element.scrollHeight; + if(FBTrace.DBG_CONSOLE){FBTrace.sysout("isScrolledToBottom offsetHeight: "+element.offsetHeight+" onBottom:"+onBottom) + }return onBottom + }; + this.scrollToBottom=function(element){element.scrollTop=element.scrollHeight; + if(FBTrace.DBG_CONSOLE){FBTrace.sysout("scrollToBottom reset scrollTop "+element.scrollTop+" = "+element.scrollHeight); + if(element.scrollHeight==element.offsetHeight){FBTrace.sysout("scrollToBottom attempt to scroll non-scrollable element "+element,element) + }}return(element.scrollTop==element.scrollHeight) + }; + this.move=function(element,x,y){element.style.left=x+"px"; + element.style.top=y+"px" + }; + this.resize=function(element,w,h){element.style.width=w+"px"; + element.style.height=h+"px" + }; + this.linesIntoCenterView=function(element,scrollBox){if(!scrollBox){scrollBox=this.getOverflowParent(element) + }if(!scrollBox){return + }var offset=this.getClientOffset(element); + var topSpace=offset.y-scrollBox.scrollTop; + var bottomSpace=(scrollBox.scrollTop+scrollBox.clientHeight)-(offset.y+element.offsetHeight); + if(topSpace<0||bottomSpace<0){var split=(scrollBox.clientHeight/2); + var centerY=offset.y-split; + scrollBox.scrollTop=centerY; + topSpace=split; + bottomSpace=split-element.offsetHeight + }return{before:Math.round((topSpace/element.offsetHeight)+0.5),after:Math.round((bottomSpace/element.offsetHeight)+0.5)} + }; + this.scrollIntoCenterView=function(element,scrollBox,notX,notY){if(!element){return + }if(!scrollBox){scrollBox=this.getOverflowParent(element) + }if(!scrollBox){return + }var offset=this.getClientOffset(element); + if(!notY){var topSpace=offset.y-scrollBox.scrollTop; + var bottomSpace=(scrollBox.scrollTop+scrollBox.clientHeight)-(offset.y+element.offsetHeight); + if(topSpace<0||bottomSpace<0){var centerY=offset.y-(scrollBox.clientHeight/2); + scrollBox.scrollTop=centerY + }}if(!notX){var leftSpace=offset.x-scrollBox.scrollLeft; + var rightSpace=(scrollBox.scrollLeft+scrollBox.clientWidth)-(offset.x+element.clientWidth); + if(leftSpace<0||rightSpace<0){var centerX=offset.x-(scrollBox.clientWidth/2); + scrollBox.scrollLeft=centerX + }}if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("lib.scrollIntoCenterView ","Element:"+element.innerHTML) + }}; + var cssKeywordMap=null; + var cssPropNames=null; + var cssColorNames=null; + var imageRules=null; + this.getCSSKeywordsByProperty=function(propName){if(!cssKeywordMap){cssKeywordMap={}; + for(var name in this.cssInfo){var list=[]; + var types=this.cssInfo[name]; + for(var i=0; + i"); + var pureText=true; + for(var child=element.firstChild; + child; + child=child.nextSibling){pureText=pureText&&(child.nodeType==Node.TEXT_NODE) + }if(pureText){html.push(escapeForHtmlEditor(elt.textContent)) + }else{for(var child=elt.firstChild; + child; + child=child.nextSibling){toHTML(child) + }}html.push("") + }else{if(isElementSVG(elt)||isElementMathML(elt)){html.push("/>") + }else{if(self.isSelfClosing(elt)){html.push((isElementXHTML(elt))?"/>":">") + }else{html.push(">") + }}}}else{if(elt.nodeType==Node.TEXT_NODE){html.push(escapeForTextNode(elt.textContent)) + }else{if(elt.nodeType==Node.CDATA_SECTION_NODE){html.push("") + }else{if(elt.nodeType==Node.COMMENT_NODE){html.push("") + }}}}}var html=[]; + toHTML(element); + return html.join("") + }; + this.getElementXML=function(element){function toXML(elt){if(elt.nodeType==Node.ELEMENT_NODE){if(unwrapObject(elt).firebugIgnore){return + }xml.push("<",elt.nodeName.toLowerCase()); + for(var i=0; + i"); + for(var child=elt.firstChild; + child; + child=child.nextSibling){toXML(child) + }xml.push("") + }else{xml.push("/>") + }}else{if(elt.nodeType==Node.TEXT_NODE){xml.push(elt.nodeValue) + }else{if(elt.nodeType==Node.CDATA_SECTION_NODE){xml.push("") + }else{if(elt.nodeType==Node.COMMENT_NODE){xml.push("") + }}}}}var xml=[]; + toXML(element); + return xml.join("") + }; + this.hasClass=function(node,name){if(arguments.length==2){return(" "+node.className+" ").indexOf(" "+name+" ")!=-1 + }if(!node||node.nodeType!=1){return false + }else{for(var i=1; + i=0){var size=name.length; + node.className=node.className.substr(0,index-1)+node.className.substr(index+size) + }}}; + this.toggleClass=function(elt,name){if((" "+elt.className+" ").indexOf(" "+name+" ")!=-1){this.removeClass(elt,name) + }else{this.setClass(elt,name) + }}; + this.setClassTimed=function(elt,name,context,timeout){if(!timeout){timeout=1300 + }if(elt.__setClassTimeout){context.clearTimeout(elt.__setClassTimeout) + }else{this.setClass(elt,name) + }elt.__setClassTimeout=context.setTimeout(function(){delete elt.__setClassTimeout; + FBL.removeClass(elt,name) + },timeout) + }; + this.cancelClassTimed=function(elt,name,context){if(elt.__setClassTimeout){FBL.removeClass(elt,name); + context.clearTimeout(elt.__setClassTimeout); + delete elt.__setClassTimeout + }}; + this.$=function(id,doc){if(doc){return doc.getElementById(id) + }else{return FBL.Firebug.chrome.document.getElementById(id) + }}; + this.$$=function(selector,doc){if(doc||!FBL.Firebug.chrome){return FBL.Firebug.Selector(selector,doc) + }else{return FBL.Firebug.Selector(selector,FBL.Firebug.chrome.document) + }}; + this.getChildByClass=function(node){for(var i=1; + i1&&doc.styleSheets[1].href=="chrome://browser/skin/feeds/subscribe.css")){return true + }return FBL.isSystemURL(win.location.href) + }catch(exc){ERROR("tabWatcher.isSystemPage document not ready:"+exc); + return false + }}; + this.isSystemStyleSheet=function(sheet){var href=sheet&&sheet.href; + return href&&FBL.isSystemURL(href) + }; + this.getURIHost=function(uri){try{if(uri){return uri.host + }else{return"" + }}catch(exc){return"" + }}; + this.isLocalURL=function(url){if(url.substr(0,5)=="file:"){return true + }else{if(url.substr(0,8)=="wyciwyg:"){return true + }else{return false + }}}; + this.isDataURL=function(url){return(url&&url.substr(0,5)=="data:") + }; + this.getLocalPath=function(url){if(this.isLocalURL(url)){var fileHandler=ioService.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler); + var file=fileHandler.getFileFromURLSpec(url); + return file.path + }}; + this.getURLFromLocalFile=function(file){var fileHandler=ioService.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler); + var URL=fileHandler.getURLSpecFromFile(file); + return URL + }; + this.getDataURLForContent=function(content,url){var uri="data:text/html;"; + uri+="fileName="+encodeURIComponent(url)+","; + uri+=encodeURIComponent(content); + return uri + },this.getDomain=function(url){var m=/[^:]+:\/{1,3}([^\/]+)/.exec(url); + return m?m[1]:"" + }; + this.getURLPath=function(url){var m=/[^:]+:\/{1,3}[^\/]+(\/.*?)$/.exec(url); + return m?m[1]:"" + }; + this.getPrettyDomain=function(url){var m=/[^:]+:\/{1,3}(www\.)?([^\/]+)/.exec(url); + return m?m[2]:"" + }; + this.absoluteURL=function(url,baseURL){return this.absoluteURLWithDots(url,baseURL).replace("/./","/","g") + }; + this.absoluteURLWithDots=function(url,baseURL){if(url[0]=="?"){return baseURL+url + }var reURL=/(([^:]+:)\/{1,2}[^\/]*)(.*?)$/; + var m=reURL.exec(url); + if(m){return url + }var m=reURL.exec(baseURL); + if(!m){return"" + }var head=m[1]; + var tail=m[3]; + if(url.substr(0,2)=="//"){return m[2]+url + }else{if(url[0]=="/"){return head+url + }else{if(tail[tail.length-1]=="/"){return baseURL+url + }else{var parts=tail.split("/"); + return head+parts.slice(0,parts.length-1).join("/")+"/"+url + }}}}; + this.normalizeURL=function(url){if(!url){return"" + }if(url.length<255){url=url.replace(/[^\/]+\/\.\.\//,"","g"); + url=url.replace(/#.*/,""); + url=url.replace(/file:\/([^\/])/g,"file:///$1"); + if(url.indexOf("chrome:")==0){var m=reChromeCase.exec(url); + if(m){url="chrome://"+m[1].toLowerCase()+"/"+m[2] + }}}return url + }; + this.denormalizeURL=function(url){return url.replace(/file:\/\/\//g,"file:/") + }; + this.parseURLParams=function(url){var q=url?url.indexOf("?"):-1; + if(q==-1){return[] + }var search=url.substr(q+1); + var h=search.lastIndexOf("#"); + if(h!=-1){search=search.substr(0,h) + }if(!search){return[] + }return this.parseURLEncodedText(search) + }; + this.parseURLEncodedText=function(text){var maxValueLength=25000; + var params=[]; + text=text.replace(/\+/g," "); + var args=text.split("&"); + for(var i=0; + imaxValueLength){parts[1]=this.$STR("LargeData") + }params.push({name:decodeURIComponent(parts[0]),value:decodeURIComponent(parts[1])}) + }else{params.push({name:decodeURIComponent(parts[0]),value:""}) + }}catch(e){if(FBTrace.DBG_ERRORS){FBTrace.sysout("parseURLEncodedText EXCEPTION ",e); + FBTrace.sysout("parseURLEncodedText EXCEPTION URI",args[i]) + }}}params.sort(function(a,b){return a.name<=b.name?-1:1 + }); + return params + }; + this.parseURLParamsArray=function(url){var q=url?url.indexOf("?"):-1; + if(q==-1){return[] + }var search=url.substr(q+1); + var h=search.lastIndexOf("#"); + if(h!=-1){search=search.substr(0,h) + }if(!search){return[] + }return this.parseURLEncodedTextArray(search) + }; + this.parseURLEncodedTextArray=function(text){var maxValueLength=25000; + var params=[]; + text=text.replace(/\+/g," "); + var args=text.split("&"); + for(var i=0; + imaxValueLength){parts[1]=this.$STR("LargeData") + }params.push({name:decodeURIComponent(parts[0]),value:[decodeURIComponent(parts[1])]}) + }else{params.push({name:decodeURIComponent(parts[0]),value:[""]}) + }}catch(e){if(FBTrace.DBG_ERRORS){FBTrace.sysout("parseURLEncodedText EXCEPTION ",e); + FBTrace.sysout("parseURLEncodedText EXCEPTION URI",args[i]) + }}}params.sort(function(a,b){return a.name<=b.name?-1:1 + }); + return params + }; + this.reEncodeURL=function(file,text){var lines=text.split("\n"); + var params=this.parseURLEncodedText(lines[lines.length-1]); + var args=[]; + for(var i=0; + i0){setTimeout(this.sendRequest,10) + }}},getResponse:function(options){var t=this.transport,type=options.dataType; + if(t.status!=200){return t.statusText + }else{if(type=="text"){return t.responseText + }else{if(type=="html"){return t.responseText + }else{if(type=="xml"){return t.responseXML + }else{if(type=="json"){return eval("("+t.responseText+")") + }}}}}},getState:function(){return this.states[this.transport.readyState] + }}; + this.createCookie=function(name,value,days){if("cookie" in document){if(days){var date=new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + var expires="; expires="+date.toGMTString() + }else{var expires="" + }document.cookie=name+"="+value+expires+"; path=/" + }}; + this.readCookie=function(name){if("cookie" in document){var nameEQ=name+"="; + var ca=document.cookie.split(";"); + for(var i=0; + iobjects.length){format=""; + objIndex=-1; + parts.length=0; + break + }}}var result=[]; + for(var i=0; + i'; + var tabNode=this.tabNode=createElement("a",{id:panelId+"Tab",className:"fbTab fbHover",innerHTML:tabHTML}); + if(isIE6){tabNode.href="javascript:void(0)" + }var panelBarNode=this.parentPanel?Firebug.chrome.getPanel(this.parentPanel).sidePanelBarNode:this.panelBarNode; + panelBarNode.appendChild(tabNode); + tabNode.style.display="block"; + if(options.hasToolButtons){this.toolButtonsNode=createElement("span",{id:panelId+"Buttons",className:"fbToolbarButtons"}); + $("fbToolbarButtons").appendChild(this.toolButtonsNode) + }if(options.hasStatusBar){this.statusBarBox=$("fbStatusBarBox"); + this.statusBarNode=createElement("span",{id:panelId+"StatusBar",className:"fbToolbarButtons fbStatusBar"}); + this.statusBarBox.appendChild(this.statusBarNode) + }}this.containerNode=this.panelNode.parentNode; + if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("Firebug.Panel.create",this.name) + }this.onContextMenu=bind(this.onContextMenu,this) + },destroy:function(state){if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("Firebug.Panel.destroy",this.name) + }if(this.hasSidePanel){this.sidePanelBar.destroy(); + this.sidePanelBar=null + }this.options=null; + this.name=null; + this.parentPanel=null; + this.tabNode=null; + this.panelNode=null; + this.containerNode=null; + this.toolButtonsNode=null; + this.statusBarBox=null; + this.statusBarNode=null + },initialize:function(){if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("Firebug.Panel.initialize",this.name) + }if(this.hasSidePanel){this.sidePanelBar.initialize() + }var options=this.options=extend(Firebug.Panel.options,this.options); + var panelId="fb"+this.name; + this.panelNode=$(panelId); + this.tabNode=$(panelId+"Tab"); + this.tabNode.style.display="block"; + if(options.hasStatusBar){this.statusBarBox=$("fbStatusBarBox"); + this.statusBarNode=$(panelId+"StatusBar") + }if(options.hasToolButtons){this.toolButtonsNode=$(panelId+"Buttons") + }this.containerNode=this.panelNode.parentNode; + this.containerNode.scrollTop=this.lastScrollTop; + addEvent(this.containerNode,"contextmenu",this.onContextMenu); + Firebug.chrome.currentPanel=Firebug.chrome.selectedPanel&&Firebug.chrome.selectedPanel.sidePanelBar?Firebug.chrome.selectedPanel.sidePanelBar.selectedPanel:Firebug.chrome.selectedPanel; + Firebug.showInfoTips=true; + Firebug.InfoTip.initializeBrowser(Firebug.chrome) + },shutdown:function(){if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("Firebug.Panel.shutdown",this.name) + }Firebug.InfoTip.uninitializeBrowser(Firebug.chrome); + if(Firebug.chrome.largeCommandLineVisible){Firebug.chrome.hideLargeCommandLine() + }if(this.hasSidePanel){}this.lastScrollTop=this.containerNode.scrollTop; + removeEvent(this.containerNode,"contextmenu",this.onContextMenu) + },detach:function(oldChrome,newChrome){if(oldChrome.selectedPanel.name==this.name){this.lastScrollTop=oldChrome.selectedPanel.containerNode.scrollTop + }},reattach:function(doc){if(this.options.innerHTMLSync){this.synchronizeUI() + }},synchronizeUI:function(){this.containerNode.scrollTop=this.lastScrollTop||0 + },show:function(state){var options=this.options; + if(options.hasStatusBar){this.statusBarBox.style.display="inline"; + this.statusBarNode.style.display="inline" + }if(options.hasToolButtons){this.toolButtonsNode.style.display="inline" + }this.panelNode.style.display="block"; + this.visible=true; + if(!this.parentPanel){Firebug.chrome.layout(this) + }},hide:function(state){var options=this.options; + if(options.hasStatusBar){this.statusBarBox.style.display="none"; + this.statusBarNode.style.display="none" + }if(options.hasToolButtons){this.toolButtonsNode.style.display="none" + }this.panelNode.style.display="none"; + this.visible=false + },watchWindow:function(win){},unwatchWindow:function(win){},updateOption:function(name,value){},showToolbarButtons:function(buttonsId,show){try{if(!this.context.browser){if(FBTrace.DBG_ERRORS){FBTrace.sysout("firebug.Panel showToolbarButtons this.context has no browser, this:",this) + }return + }var buttons=this.context.browser.chrome.$(buttonsId); + if(buttons){collapse(buttons,show?"false":"true") + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.dumpProperties("firebug.Panel showToolbarButtons FAILS",exc); + if(!this.context.browser){FBTrace.dumpStack("firebug.Panel showToolbarButtons no browser") + }}}},supportsObject:function(object){return 0 + },hasObject:function(object){return false + },select:function(object,forceUpdate){if(!object){object=this.getDefaultSelection(this.context) + }if(FBTrace.DBG_PANELS){FBTrace.sysout("firebug.select "+this.name+" forceUpdate: "+forceUpdate+" "+object+((object==this.selection)?"==":"!=")+this.selection) + }if(forceUpdate||object!=this.selection){this.selection=object; + this.updateSelection(object) + }},updateSelection:function(object){},markChange:function(skipSelf){if(this.dependents){if(skipSelf){for(var i=0; + ilocB.path){return 1 + }if(locA.pathlocB.name){return 1 + }if(locA.namewidth||el.scrollHeight>height)){width=el.scrollWidth; + height=el.scrollHeight + }return{width:width,height:height} + },getWindowScrollPosition:function(){var top=0,left=0,el; + if(typeof this.window.pageYOffset=="number"){top=this.window.pageYOffset; + left=this.window.pageXOffset + }else{if((el=this.document.body)&&(el.scrollTop||el.scrollLeft)){top=el.scrollTop; + left=el.scrollLeft + }else{if((el=this.document.documentElement)&&(el.scrollTop||el.scrollLeft)){top=el.scrollTop; + left=el.scrollLeft + }}}return{top:top,left:left} + },getElementFromPoint:function(x,y){if(shouldFixElementFromPoint){var scroll=this.getWindowScrollPosition(); + return this.document.elementFromPoint(x+scroll.left,y+scroll.top) + }else{return this.document.elementFromPoint(x,y) + }},getElementPosition:function(el){var left=0; + var top=0; + do{left+=el.offsetLeft; + top+=el.offsetTop + }while(el=el.offsetParent); + return{left:left,top:top} + },getElementBox:function(el){var result={}; + if(el.getBoundingClientRect){var rect=el.getBoundingClientRect(); + var offset=isIE?this.document.body.clientTop||this.document.documentElement.clientTop:0; + var scroll=this.getWindowScrollPosition(); + result.top=Math.round(rect.top-offset+scroll.top); + result.left=Math.round(rect.left-offset+scroll.left); + result.height=Math.round(rect.bottom-rect.top); + result.width=Math.round(rect.right-rect.left) + }else{var position=this.getElementPosition(el); + result.top=position.top; + result.left=position.left; + result.height=el.offsetHeight; + result.width=el.offsetWidth + }return result + },getMeasurement:function(el,name){var result={value:0,unit:"px"}; + var cssValue=this.getStyle(el,name); + if(!cssValue){return result + }if(cssValue.toLowerCase()=="auto"){return result + }var reMeasure=/(\d+\.?\d*)(.*)/; + var m=cssValue.match(reMeasure); + if(m){result.value=m[1]-0; + result.unit=m[2].toLowerCase() + }return result + },getMeasurementInPixels:function(el,name){if(!el){return null + }var m=this.getMeasurement(el,name); + var value=m.value; + var unit=m.unit; + if(unit=="px"){return value + }else{if(unit=="pt"){return this.pointsToPixels(name,value) + }}if(unit=="em"){return this.emToPixels(el,value) + }else{if(unit=="%"){return this.percentToPixels(el,value) + }}},getMeasurementBox1:function(el,name){var sufixes=["Top","Left","Bottom","Right"]; + var result=[]; + for(var i=0,sufix; + sufix=sufixes[i]; + i++){result[i]=Math.round(this.getMeasurementInPixels(el,name+sufix)) + }return{top:result[0],left:result[1],bottom:result[2],right:result[3]} + },getMeasurementBox:function(el,name){var result=[]; + var sufixes=name=="border"?["TopWidth","LeftWidth","BottomWidth","RightWidth"]:["Top","Left","Bottom","Right"]; + if(isIE){var propName,cssValue; + var autoMargin=null; + for(var i=0,sufix; + sufix=sufixes[i]; + i++){propName=name+sufix; + cssValue=el.currentStyle[propName]||el.style[propName]; + if(cssValue=="auto"){if(!autoMargin){autoMargin=this.getCSSAutoMarginBox(el) + }result[i]=autoMargin[sufix.toLowerCase()] + }else{result[i]=this.getMeasurementInPixels(el,propName) + }}}else{for(var i=0,sufix; + sufix=sufixes[i]; + i++){result[i]=this.getMeasurementInPixels(el,name+sufix) + }}return{top:result[0],left:result[1],bottom:result[2],right:result[3]} + },getCSSAutoMarginBox:function(el){if(isIE&&" meta title input script link a ".indexOf(" "+el.nodeName.toLowerCase()+" ")!=-1){return{top:0,left:0,bottom:0,right:0} + }if(isIE&&" h1 h2 h3 h4 h5 h6 h7 ul p ".indexOf(" "+el.nodeName.toLowerCase()+" ")==-1){return{top:0,left:0,bottom:0,right:0} + }var offsetTop=0; + if(false&&isIEStantandMode){var scrollSize=Firebug.browser.getWindowScrollSize(); + offsetTop=scrollSize.height + }var box=this.document.createElement("div"); + box.style.cssText="margin:0; padding:1px; border: 0; visibility: hidden;"; + var clone=el.cloneNode(false); + var text=this.document.createTextNode(" "); + clone.appendChild(text); + box.appendChild(clone); + this.document.body.appendChild(box); + var marginTop=clone.offsetTop-box.offsetTop-1; + var marginBottom=box.offsetHeight-clone.offsetHeight-2-marginTop; + var marginLeft=clone.offsetLeft-box.offsetLeft-1; + var marginRight=box.offsetWidth-clone.offsetWidth-2-marginLeft; + this.document.body.removeChild(box); + return{top:marginTop+offsetTop,left:marginLeft,bottom:marginBottom-offsetTop,right:marginRight} + },getFontSizeInPixels:function(el){var size=this.getMeasurement(el,"fontSize"); + if(size.unit=="px"){return size.value + }var computeDirtyFontSize=function(el,calibration){var div=this.document.createElement("div"); + var divStyle=offscreenStyle; + if(calibration){divStyle+=" font-size:"+calibration+"px;" + }div.style.cssText=divStyle; + div.innerHTML="A"; + el.appendChild(div); + var value=div.offsetHeight; + el.removeChild(div); + return value + }; + var rate=200/225; + var value=computeDirtyFontSize(el); + return value*rate + },pointsToPixels:function(name,value,returnFloat){var axis=/Top$|Bottom$/.test(name)?"y":"x"; + var result=value*pixelsPerInch[axis]/72; + return returnFloat?result:Math.round(result) + },emToPixels:function(el,value){if(!el){return null + }var fontSize=this.getFontSizeInPixels(el); + return Math.round(value*fontSize) + },exToPixels:function(el,value){if(!el){return null + }var div=this.document.createElement("div"); + div.style.cssText=offscreenStyle+"width:"+value+"ex;"; + el.appendChild(div); + var value=div.offsetWidth; + el.removeChild(div); + return value + },percentToPixels:function(el,value){if(!el){return null + }var div=this.document.createElement("div"); + div.style.cssText=offscreenStyle+"width:"+value+"%;"; + el.appendChild(div); + var value=div.offsetWidth; + el.removeChild(div); + return value + },getStyle:isIE?function(el,name){return el.currentStyle[name]||el.style[name]||undefined + }:function(el,name){return this.document.defaultView.getComputedStyle(el,null)[name]||el.style[name]||undefined + }} + }}); + FBL.ns(function(){with(FBL){var WindowDefaultOptions={type:"frame",id:"FirebugUI",height:250},commandLine,fbTop,fbContent,fbContentStyle,fbBottom,fbBtnInspect,fbToolbar,fbPanelBox1,fbPanelBox1Style,fbPanelBox2,fbPanelBox2Style,fbPanelBar2Box,fbPanelBar2BoxStyle,fbHSplitter,fbVSplitter,fbVSplitterStyle,fbPanel1,fbPanel1Style,fbPanel2,fbPanel2Style,fbConsole,fbConsoleStyle,fbHTML,fbCommandLine,fbLargeCommandLine,fbLargeCommandButtons,topHeight,topPartialHeight,chromeRedrawSkipRate=isIE?75:isOpera?80:75,lastSelectedPanelName,focusCommandLineState=0,lastFocusedPanelName,lastHSplitterMouseMove=0,onHSplitterMouseMoveBuffer=null,onHSplitterMouseMoveTimer=null,lastVSplitterMouseMove=0; + FBL.FirebugChrome={isOpen:false,height:250,sidePanelWidth:350,selectedPanelName:"Console",selectedHTMLElementId:null,chromeMap:{},htmlSelectionStack:[],consoleMessageQueue:[],create:function(){if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("FirebugChrome.create","creating chrome window") + }createChromeWindow() + },initialize:function(){if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("FirebugChrome.initialize","initializing chrome window") + }if(Env.chrome.type=="frame"||Env.chrome.type=="div"){ChromeMini.create(Env.chrome) + }var chrome=Firebug.chrome=new Chrome(Env.chrome); + FirebugChrome.chromeMap[chrome.type]=chrome; + addGlobalEvent("keydown",onGlobalKeyDown); + if(Env.Options.enablePersistent&&chrome.type=="popup"){var frame=FirebugChrome.chromeMap.frame; + if(frame){frame.close() + }chrome.initialize() + }},clone:function(FBChrome){for(var name in FBChrome){var prop=FBChrome[name]; + if(FBChrome.hasOwnProperty(name)&&!isFunction(prop)){this[name]=prop + }}}}; + var createChromeWindow=function(options){options=extend(WindowDefaultOptions,options||{}); + var chrome={},context=options.context||Env.browser,type=chrome.type=Env.Options.enablePersistent?"popup":options.type,isChromeFrame=type=="frame",useLocalSkin=Env.useLocalSkin,url=useLocalSkin?Env.Location.skin:"about:blank",body=context.document.getElementsByTagName("body")[0],formatNode=function(node){if(!Env.isDebugMode){node.firebugIgnore=true + }node.style.border="0"; + node.style.visibility="hidden"; + node.style.zIndex="2147483647"; + node.style.position=noFixedPosition?"absolute":"fixed"; + node.style.width="100%"; + node.style.left="0"; + node.style.bottom=noFixedPosition?"-1px":"0"; + node.style.height=options.height+"px"; + if(isFirefox){node.style.display="none" + }},createChromeDiv=function(){var node=chrome.node=createGlobalElement("div"),style=createGlobalElement("style"),css=FirebugChrome.Skin.CSS,rules=".fbBody *{margin:0;padding:0;font-size:11px;line-height:13px;color:inherit;}"+css+".fbBody #fbHSplitter{position:absolute !important;} .fbBody #fbHTML span{line-height:14px;} .fbBody .lineNo div{line-height:inherit !important;}"; + style.type="text/css"; + if(style.styleSheet){style.styleSheet.cssText=rules + }else{style.appendChild(context.document.createTextNode(rules)) + }document.getElementsByTagName("head")[0].appendChild(style); + node.className="fbBody"; + node.style.overflow="hidden"; + node.innerHTML=getChromeDivTemplate(); + if(isIE){setTimeout(function(){node.firstChild.style.height="1px"; + node.firstChild.style.position="static" + },0) + }formatNode(node); + body.appendChild(node); + chrome.window=window; + chrome.document=document; + onChromeLoad(chrome) + }; + try{if(type=="div"){createChromeDiv(); + return + }else{if(isChromeFrame){var node=chrome.node=createGlobalElement("iframe"); + node.setAttribute("src",url); + node.setAttribute("frameBorder","0"); + formatNode(node); + body.appendChild(node); + node.id=options.id + }else{var height=FirebugChrome.height||options.height,options=["true,top=",Math.max(screen.availHeight-height-61,0),",left=0,height=",height,",width=",screen.availWidth-10,",resizable"].join(""),node=chrome.node=context.window.open(url,"popup",options); + if(node){try{node.focus() + }catch(E){alert("Firebug Error: Firebug popup was blocked."); + return + }}else{alert("Firebug Error: Firebug popup was blocked."); + return + }}}if(!useLocalSkin){var tpl=getChromeTemplate(!isChromeFrame),doc=isChromeFrame?node.contentWindow.document:node.document; + doc.write(tpl); + doc.close() + }var win,waitDelay=useLocalSkin?isChromeFrame?200:300:100,waitForWindow=function(){if(isChromeFrame&&(win=node.contentWindow)&&node.contentWindow.document.getElementById("fbCommandLine")||!isChromeFrame&&(win=node.window)&&node.document&&node.document.getElementById("fbCommandLine")){chrome.window=win.window; + chrome.document=win.document; + setTimeout(function(){onChromeLoad(chrome) + },useLocalSkin?200:0) + }else{setTimeout(waitForWindow,waitDelay) + }}; + waitForWindow() + }catch(e){var msg=e.message||e; + if(/access/i.test(msg)){if(isChromeFrame){body.removeChild(node) + }else{if(type=="popup"){node.close() + }}createChromeDiv() + }else{alert("Firebug Error: Firebug GUI could not be created.") + }}}; + var onChromeLoad=function onChromeLoad(chrome){Env.chrome=chrome; + if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("Chrome onChromeLoad","chrome window loaded") + }if(Env.Options.enablePersistent){Env.FirebugChrome=FirebugChrome; + chrome.window.Firebug=chrome.window.Firebug||{}; + chrome.window.Firebug.SharedEnv=Env; + if(Env.isDevelopmentMode){Env.browser.window.FBDev.loadChromeApplication(chrome) + }else{var doc=chrome.document; + var script=doc.createElement("script"); + script.src=Env.Location.app+"#remote,persist"; + doc.getElementsByTagName("head")[0].appendChild(script) + }}else{if(chrome.type=="frame"||chrome.type=="div"){setTimeout(function(){FBL.Firebug.initialize() + },0) + }else{if(chrome.type=="popup"){var oldChrome=FirebugChrome.chromeMap.frame; + var newChrome=new Chrome(chrome); + dispatch(newChrome.panelMap,"detach",[oldChrome,newChrome]); + if(oldChrome){oldChrome.close() + }newChrome.reattach(oldChrome,newChrome) + }}}}; + var getChromeDivTemplate=function(){return FirebugChrome.Skin.HTML + }; + var getChromeTemplate=function(isPopup){var tpl=FirebugChrome.Skin; + var r=[],i=-1; + r[++i]=''; + r[++i]=""; + r[++i]=Firebug.version; + r[++i]=""; + r[++i]=''; + r[++i]=tpl.HTML; + r[++i]=""; + return r.join("") + }; + var Chrome=function Chrome(chrome){var type=chrome.type; + var Base=type=="frame"||type=="div"?ChromeFrameBase:ChromePopupBase; + append(this,Base); + append(this,chrome); + append(this,new Context(chrome.window)); + FirebugChrome.chromeMap[type]=this; + Firebug.chrome=this; + Env.chrome=chrome.window; + this.commandLineVisible=false; + this.sidePanelVisible=false; + this.create(); + return this + }; + var ChromeBase={}; + append(ChromeBase,Controller); + append(ChromeBase,PanelBar); + append(ChromeBase,{node:null,type:null,document:null,window:null,sidePanelVisible:false,commandLineVisible:false,largeCommandLineVisible:false,inspectButton:null,create:function(){PanelBar.create.call(this); + if(Firebug.Inspector){this.inspectButton=new Button({type:"toggle",element:$("fbChrome_btInspect"),owner:Firebug.Inspector,onPress:Firebug.Inspector.startInspecting,onUnpress:Firebug.Inspector.stopInspecting}) + }},destroy:function(){if(Firebug.Inspector){this.inspectButton.destroy() + }PanelBar.destroy.call(this); + this.shutdown() + },testMenu:function(){var firebugMenu=new Menu({id:"fbFirebugMenu",items:[{label:"Open Firebug",type:"shortcut",key:isFirefox?"Shift+F12":"F12",checked:true,command:"toggleChrome"},{label:"Open Firebug in New Window",type:"shortcut",key:isFirefox?"Ctrl+Shift+F12":"Ctrl+F12",command:"openPopup"},{label:"Inspect Element",type:"shortcut",key:"Ctrl+Shift+C",command:"toggleInspect"},{label:"Command Line",type:"shortcut",key:"Ctrl+Shift+L",command:"focusCommandLine"},"-",{label:"Options",type:"group",child:"fbFirebugOptionsMenu"},"-",{label:"Firebug Lite Website...",command:"visitWebsite"},{label:"Discussion Group...",command:"visitDiscussionGroup"},{label:"Issue Tracker...",command:"visitIssueTracker"}],onHide:function(){iconButton.restore() + },toggleChrome:function(){Firebug.chrome.toggle() + },openPopup:function(){Firebug.chrome.toggle(true,true) + },toggleInspect:function(){Firebug.Inspector.toggleInspect() + },focusCommandLine:function(){Firebug.chrome.focusCommandLine() + },visitWebsite:function(){this.visit("http://getfirebug.com/lite.html") + },visitDiscussionGroup:function(){this.visit("http://groups.google.com/group/firebug") + },visitIssueTracker:function(){this.visit("http://code.google.com/p/fbug/issues/list") + },visit:function(url){window.open(url) + }}); + var firebugOptionsMenu={id:"fbFirebugOptionsMenu",getItems:function(){var cookiesDisabled=!Firebug.saveCookies; + return[{label:"Save Options in Cookies",type:"checkbox",value:"saveCookies",checked:Firebug.saveCookies,command:"saveOptions"},"-",{label:"Start Opened",type:"checkbox",value:"startOpened",checked:Firebug.startOpened,disabled:cookiesDisabled},{label:"Start in New Window",type:"checkbox",value:"startInNewWindow",checked:Firebug.startInNewWindow,disabled:cookiesDisabled},{label:"Show Icon When Hidden",type:"checkbox",value:"showIconWhenHidden",checked:Firebug.showIconWhenHidden,disabled:cookiesDisabled},"-",{label:"Override Console Object",type:"checkbox",value:"overrideConsole",checked:Firebug.overrideConsole,disabled:cookiesDisabled},{label:"Ignore Firebug Elements",type:"checkbox",value:"ignoreFirebugElements",checked:Firebug.ignoreFirebugElements,disabled:cookiesDisabled},{label:"Disable When Firebug Active",type:"checkbox",value:"disableWhenFirebugActive",checked:Firebug.disableWhenFirebugActive,disabled:cookiesDisabled},"-",{label:"Enable Trace Mode",type:"checkbox",value:"enableTrace",checked:Firebug.enableTrace,disabled:cookiesDisabled},{label:"Enable Persistent Mode (experimental)",type:"checkbox",value:"enablePersistent",checked:Firebug.enablePersistent,disabled:cookiesDisabled},"-",{label:"Restore Options",command:"restorePrefs",disabled:cookiesDisabled}] + },onCheck:function(target,value,checked){Firebug.setPref(value,checked) + },saveOptions:function(target){var saveEnabled=target.getAttribute("checked"); + if(!saveEnabled){this.restorePrefs() + }this.updateMenu(target); + return false + },restorePrefs:function(target){Firebug.restorePrefs(); + if(Firebug.saveCookies){Firebug.savePrefs() + }else{Firebug.erasePrefs() + }if(target){this.updateMenu(target) + }return false + },updateMenu:function(target){var options=getElementsByClass(target.parentNode,"fbMenuOption"); + var firstOption=options[0]; + var enabled=Firebug.saveCookies; + if(enabled){Menu.check(firstOption) + }else{Menu.uncheck(firstOption) + }if(enabled){Menu.check(options[0]) + }else{Menu.uncheck(options[0]) + }for(var i=1,length=options.length; + ichromeRedrawSkipRate){lastHSplitterMouseMove=new Date().getTime(); + handleHSplitterMouseMove() + }else{if(!onHSplitterMouseMoveTimer){onHSplitterMouseMoveTimer=setTimeout(handleHSplitterMouseMove,chromeRedrawSkipRate) + }}cancelEvent(event,true); + return false + }; + var handleHSplitterMouseMove=function(){if(onHSplitterMouseMoveTimer){clearTimeout(onHSplitterMouseMoveTimer); + onHSplitterMouseMoveTimer=null + }var clientY=onHSplitterMouseMoveBuffer; + var windowSize=Firebug.browser.getWindowSize(); + var scrollSize=Firebug.browser.getWindowScrollSize(); + var commandLineHeight=Firebug.chrome.commandLineVisible?fbCommandLine.offsetHeight:0; + var fixedHeight=topHeight+commandLineHeight; + var chromeNode=Firebug.chrome.node; + var scrollbarSize=!isIE&&(scrollSize.width>windowSize.width)?17:0; + var height=windowSize.height; + var chromeHeight=Math.max(height-clientY+5-scrollbarSize,fixedHeight); + chromeHeight=Math.min(chromeHeight,windowSize.height-scrollbarSize); + FirebugChrome.height=chromeHeight; + chromeNode.style.height=chromeHeight+"px"; + if(noFixedPosition){Firebug.chrome.fixIEPosition() + }Firebug.chrome.draw() + }; + var onHSplitterMouseUp=function onHSplitterMouseUp(event){removeGlobalEvent("mousemove",onHSplitterMouseMove); + removeGlobalEvent("mouseup",onHSplitterMouseUp); + if(isIE){removeEvent(Firebug.browser.document.documentElement,"mouseleave",onHSplitterMouseUp) + }fbHSplitter.className=""; + Firebug.chrome.draw(); + return false + }; + var onVSplitterMouseDown=function onVSplitterMouseDown(event){addGlobalEvent("mousemove",onVSplitterMouseMove); + addGlobalEvent("mouseup",onVSplitterMouseUp); + return false + }; + var onVSplitterMouseMove=function onVSplitterMouseMove(event){if(new Date().getTime()-lastVSplitterMouseMove>chromeRedrawSkipRate){var target=event.target||event.srcElement; + if(target&&target.ownerDocument){var clientX=event.clientX; + var win=document.all?event.srcElement.ownerDocument.parentWindow:event.target.ownerDocument.defaultView; + if(win!=win.parent){clientX+=win.frameElement?win.frameElement.offsetLeft:0 + }var size=Firebug.chrome.getSize(); + var x=Math.max(size.width-clientX+3,6); + FirebugChrome.sidePanelWidth=x; + Firebug.chrome.draw() + }lastVSplitterMouseMove=new Date().getTime() + }cancelEvent(event,true); + return false + }; + var onVSplitterMouseUp=function onVSplitterMouseUp(event){removeGlobalEvent("mousemove",onVSplitterMouseMove); + removeGlobalEvent("mouseup",onVSplitterMouseUp); + Firebug.chrome.draw() + } + }}); + FBL.ns(function(){with(FBL){var throttleTimeWindow=200; + var throttleMessageLimit=30; + var throttleInterval=30; + var throttleFlushCount=20; + var refreshDelay=300; + Firebug.TabContext=function(win,browser,chrome,persistedState){this.window=win; + this.browser=browser; + this.persistedState=persistedState; + this.name=normalizeURL(this.getWindowLocation().toString()); + this.windows=[]; + this.panelMap={}; + this.sidePanelNames={}; + this.sourceFileMap={}; + this.sourceCache=new Firebug.SourceCache(this); + this.global=win + }; + Firebug.TabContext.prototype={getWindowLocation:function(){return safeGetWindowLocation(this.window) + },getTitle:function(){if(this.window&&this.window.document){return this.window.document.title + }else{return"" + }},getName:function(){if(!this.name||this.name==="about:blank"){var url=this.getWindowLocation().toString(); + if(isDataURL(url)){var props=splitDataURL(url); + if(props.fileName){this.name="data url from "+props.fileName + }}else{this.name=normalizeURL(url); + if(this.name==="about:blank"&&this.window.frameElement){this.name+=" in "+getElementCSSSelector(this.window.frameElement) + }}}return this.name + },getGlobalScope:function(){return this.window + },addSourceFile:function(sourceFile){this.sourceFileMap[sourceFile.href]=sourceFile; + sourceFile.context=this; + Firebug.onSourceFileCreated(this,sourceFile) + },removeSourceFile:function(sourceFile){if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("tabContext.removeSourceFile "+sourceFile.href+" in context "+sourceFile.context.getName()) + }delete this.sourceFileMap[sourceFile.href]; + delete sourceFile.context + },reattach:function(oldChrome,newChrome){for(var panelName in this.panelMap){var panel=this.panelMap[panelName]; + panel.detach(oldChrome,newChrome); + panel.invalid=true; + var panelNode=panel.panelNode; + if(panelNode&&panelNode.parentNode){panelNode.parentNode.removeChild(panelNode) + }}},destroy:function(state){if(this.timeouts){for(var timeout in this.timeouts){clearTimeout(timeout) + }}if(this.intervals){for(var timeout in this.intervals){clearInterval(timeout) + }}if(this.throttleTimeout){clearTimeout(this.throttleTimeout) + }state.panelState={}; + if(this.persistedState){for(var panelName in this.persistedState.panelState){state.panelState[panelName]=this.persistedState.panelState[panelName] + }}for(var panelName in this.panelMap){var panelType=Firebug.getPanelType(panelName); + this.destroyPanel(panelType,state) + }if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("tabContext.destroy "+this.getName()+" set state ",state) + }},initPanelTypes:function(){if(!this.panelTypes){this.panelTypes=[]; + this.panelTypeMap={} + }},addPanelType:function(url,title,parentPanel){url=absoluteURL(url,this.window.location.href); + if(!url){throw ("addPanelType: url is invalid!"); + return + }this.initPanelTypes(); + var name=createPanelName(url); + while(name in this.panelTypeMap){name+="_" + }var panelType=createPanelType(name,url,title,parentPanel); + this.panelTypes.push(panelType); + this.panelTypeMap[name]=panelType; + return panelType + },addPanelTypeConstructor:function(panelType){this.initPanelTypes(); + this.panelTypes.push(panelType); + var name=panelType.prototype.name; + this.panelTypeMap[name]=panelType + },removePanelType:function(url){},getPanel:function(panelName,noCreate){var panelType=Firebug.getPanelType(panelName); + if(!panelType&&this.panelTypeMap){panelType=this.panelTypeMap[panelName] + }if(!panelType){return null + }var enabled=panelType.prototype.isEnabled?panelType.prototype.isEnabled():true; + if(enabled){return this.getPanelByType(panelType,noCreate) + }return null + },getPanelByType:function(panelType,noCreate){if(!panelType||!this.panelMap){return null + }var panelName=panelType.prototype.name; + if(this.panelMap.hasOwnProperty(panelName)){var panel=this.panelMap[panelName]; + if(panel.invalid){var doc=this.chrome.getPanelDocument(panelType); + panel.reattach(doc); + delete panel.invalid + }return panel + }else{if(!noCreate){return this.createPanel(panelType) + }}},eachPanelInContext:function(callback){for(var panelName in this.panelMap){if(this.panelMap.hasOwnProperty(panelName)){var panel=this.panelMap[panelName]; + var rc=callback(panel); + if(rc){return rc + }}}},createPanel:function(panelType){var panel=new panelType(); + this.panelMap[panel.name]=panel; + if(FBTrace.DBG_PANELS){FBTrace.sysout("tabContext.createPanel; Panel created: "+panel.name,panel) + }dispatch(Firebug.modules,"onCreatePanel",[this,panel,panelType]); + if(panel.parentPanel){panel.mainPanel=this.panelMap[panel.parentPanel]; + panel.mainPanel.addListener(panel) + }var doc=this.chrome.getPanelDocument(panelType); + panel.initialize(this,doc); + return panel + },destroyPanel:function(panelType,state){var panelName=panelType.prototype.name; + var panel=this.panelMap[panelName]; + if(!panel){return + }var panelState=panelName in state.panelState?state.panelState[panelName]:{}; + state.panelState[panelName]=panelState; + try{var dontRemove=panel.destroy(panelState); + delete this.panelMap[panelName]; + if(dontRemove){return + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("tabContext.destroy FAILS "+exc,exc) + }delete state.panelState[panelName] + }var panelNode=panel.panelNode; + if(panelNode&&panelNode.parentNode){panelNode.parentNode.removeChild(panelNode) + }},setPanel:function(panelName,panel){if(panel){this.panelMap[panelName]=panel + }else{delete this.panelMap[panelName] + }},invalidatePanels:function(){if(!this.invalidPanels){this.invalidPanels={} + }for(var i=0; + iqueue.length){max=queue.length + }for(var i=0; + i tabWatcher initialize "+tabBrowser) + }httpObserver.addObserver(TabWatcherHttpObserver,"firebug-http-event",false) + },destroy:function(){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher destroy\n") + }this.shuttingDown=true; + httpObserver.removeObserver(TabWatcherHttpObserver,"firebug-http-event"); + if(Firebug.TraceModule){Firebug.TraceModule.removeListener(TraceListener) + }},watchTopWindow:function(win,uri,userCommands){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.watchTopWindow for: "+(uri instanceof nsIURI?uri.spec:uri)+", tab: "+Firebug.getTabIdForWindow(win)+"\n") + }if(!win){if(FBTrace.DBG_ERRORS){FBTrace.sysout("-> tabWatcher.watchTopWindow should not have a null window!") + }return false + }var selectedBrowser=Firebug.chrome.getCurrentBrowser(); + var context=this.getContextByWindow(win); + if(context){if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("-> tabWatcher.watchTopWindow context exists "+context.getName()) + }if(!this.shouldShowContext(context)){if(context.browser){delete context.browser.showFirebug + }this.unwatchContext(win,context); + return + }}else{var url=(uri instanceof nsIURI)?uri.spec:uri; + if(!this.shouldCreateContext(selectedBrowser,url,userCommands)){if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("-> tabWatcher will not create context ") + }delete selectedBrowser.showFirebug; + this.watchContext(win,null); + return false + }var browser=this.getBrowserByWindow(win); + context=this.createContext(win,browser,Firebug.getContextType()) + }if(win instanceof Ci.nsIDOMWindow&&win.parent==win){win.addEventListener("pageshow",onLoadWindowContent,onLoadWindowContent.capturing); + win.addEventListener("DOMContentLoaded",onLoadWindowContent,onLoadWindowContent.capturing); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.watchTopWindow addEventListener for pageshow, DomContentLoaded "+safeGetWindowLocation(win)) + }}this.watchWindow(win,context); + if(context&&!context.loaded){context.loaded=!context.browser.webProgress.isLoadingDocument; + if(context.loaded){dispatch(this.fbListeners,"loadedContext",[context]) + }if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher context "+(context.loaded?"*** LOADED ***":"isLoadingDocument")+" in watchTopWindow, id: "+context.uid+", uri: "+(uri instanceof nsIURI?uri.spec:uri)+"\n") + }}if(context&&!context.loaded&&!context.showContextTimeout){context.showContextTimeout=setTimeout(bindFixed(function delayShowContext(){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> watchTopWindow delayShowContext id:"+context.showContextTimeout,context) + }if(context.window){this.rushShowContext(win,context) + }else{if(FBTrace.DBG_ERRORS){FBTrace.sysout("tabWatcher watchTopWindow no context.window "+(context.browser?context.browser.currentURI.spec:" and no context.browser")+"\n") + }}},this),400) + }else{if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> watchTopWindow context.loaded:"+context.loaded+" for "+context.getName()) + }this.rushShowContext(win,context) + }return context + },rushShowContext:function(win,context){if(context.showContextTimeout){clearTimeout(context.showContextTimeout) + }delete context.showContextTimeout; + var currentURI=Firebug.chrome.getCurrentURI(); + if(!currentURI||currentURI.spec!=context.browser.currentURI.spec){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> rushShowContext: Do not show context as it's not the active tab: "+context.browser.currentURI.spec+"\n") + }return + }this.watchContext(win,context) + },shouldShowContext:function(context){if(dispatch2(this.fbListeners,"shouldShowContext",[context])){return true + }else{return false + }},shouldCreateContext:function(browser,url,userCommands){if(!this.fbListeners){return userCommands + }if(dispatch2(this.fbListeners,"shouldCreateContext",[browser,url,userCommands])){if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("-> shouldCreateContext with user: "+userCommands+" one listener says yes to "+url,this.fbListeners) + }return true + }if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("-> shouldCreateContext with user: "+userCommands+" no opinion for: "+url) + }if(dispatch2(this.fbListeners,"shouldNotCreateContext",[browser,url,userCommands])){return false + }if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("-> shouldNotCreateContext no opinion for: "+url) + }return userCommands + },createContext:function(win,browser,contextType){if(contexts.length==0){Firebug.broadcast("enableXULWindow",[]) + }var persistedState=browser.persistedState; + delete browser.persistedState; + var location=safeGetWindowLocation(win).toString(); + var prevDomain=persistedState?getDomain(persistedState.location):null; + var domain=getDomain(location); + var context=new contextType(win,browser,Firebug.chrome,persistedState); + contexts.push(context); + context.uid=FBL.getUniqueId(); + browser.showFirebug=true; + if(FBTrace.DBG_WINDOWS||FBTrace.DBG_ACTIVATION){FBTrace.sysout("-> tabWatcher *** INIT *** context, id: "+context.uid+", "+context.getName()+" browser "+browser.currentURI.spec+" Firebug.chrome.window: "+Firebug.chrome.window.location+" context.window: "+safeGetWindowLocation(context.window)) + }dispatch(this.fbListeners,"initContext",[context,persistedState]); + return context + },watchLoadedTopWindow:function(win){var isSystem=isSystemPage(win); + var context=this.getContextByWindow(win); + if((context&&!context.window)){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.watchLoadedTopWindow bailing !!!, context.window: "+context.window+", isSystem: "+isSystem+"\n") + }this.unwatchTopWindow(win); + this.watchContext(win,null,isSystem); + return + }if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> watchLoadedTopWindow context: "+(context?(context.uid+", loaded="+context.loaded):"undefined")+", "+safeGetWindowLocation(win)+"\n") + }if(context&&!context.loaded){context.loaded=true; + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> Context *** LOADED *** in watchLoadedTopWindow, id: "+context.uid+", uri: "+safeGetWindowLocation(win)+"\n") + }dispatch(this.fbListeners,"loadedContext",[context]); + this.rushShowContext(win,context) + }},watchWindow:function(win,context){if(!context){context=this.getContextByWindow(getRootWindow(win)) + }var location=safeGetWindowLocation(win); + if(context&&location!=aboutBlank){TabWatcherUnloader.registerWindow(win) + }if(context&&context.windows.indexOf(win)==-1){context.windows.push(win); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> watchWindow register *** FRAME *** to context for win.location: "+location+"\n") + }dispatch(this.fbListeners,"watchWindow",[context,win]); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> watchWindow for: "+location+", context: "+context.uid+"\n"); + if(context){for(var i=0; + i tabWatcher.unwatchTopWindow for: "+(context?context.getWindowLocation():"NULL Context")+", context: "+context) + }this.unwatchContext(win,context); + return true + },unwatchWindow:function(win){var context=this.getContextByWindow(win); + if(!context){if(FBTrace.DBG_ERRORS){FBTrace.sysout("unwatchWindow: no context for win "+safeGetWindowLocation(win)) + }return + }var index=context.windows.indexOf(win); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.unwatchWindow context: "+context.getName()+" index of win: "+index+"/"+context.windows.length,context.windows) + }if(index!=-1){context.windows.splice(index,1); + dispatch(this.fbListeners,"unwatchWindow",[context,win]) + }},watchBrowser:function(browser){if(FBTrace.DBG_WINDOWS){var uri=safeGetURI(browser); + FBTrace.sysout("-> tabWatcher.watchBrowser for: "+(uri instanceof nsIURI?uri.spec:uri)+"\n") + }registerFrameListener(browser); + var shouldDispatch=this.watchTopWindow(browser.contentWindow,safeGetURI(browser),true); + if(shouldDispatch){dispatch(this.fbListeners,"watchBrowser",[browser]); + return true + }return false + },unwatchBrowser:function(browser,userCommands){if(FBTrace.DBG_WINDOWS){var uri=safeGetURI(browser); + FBTrace.sysout("-> tabWatcher.unwatchBrowser for: "+(uri instanceof nsIURI?uri.spec:uri)+" user commands: "+userCommands+(browser?"":"NULL BROWSER")) + }if(!browser){return + }delete browser.showFirebug; + var shouldDispatch=this.unwatchTopWindow(browser.contentWindow); + if(shouldDispatch){dispatch(this.fbListeners,"unwatchBrowser",[browser,userCommands]); + return true + }return false + },watchContext:function(win,context,isSystem){if(this.shuttingDown){return + }var browser=context?context.browser:this.getBrowserByWindow(win); + if(browser){browser.isSystemPage=isSystem + }if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher context *** SHOW *** (watchContext), id: "+(context?context.uid:"null")+", uri: "+win.location.href+"\n") + }dispatch(this.fbListeners,"showContext",[browser,context]) + },unwatchContext:function(win,context){if(!context){var browser=this.getBrowserByWindow(win); + if(browser){browser.persistedState={}; + delete browser.showFirebug; + dispatch(this.fbListeners,"showContext",[browser,null]) + }dispatch(this.fbListeners,"destroyContext",[null,(browser?browser.persistedState:null),browser]); + return + }var persistedState={location:context.getWindowLocation()}; + context.browser.persistedState=persistedState; + iterateWindows(context.window,function(win){dispatch(TabWatcher.fbListeners,"unwatchWindow",[context,win]) + }); + dispatch(this.fbListeners,"destroyContext",[context,persistedState,context.browser]); + if(FBTrace.DBG_WINDOWS||FBTrace.DBG_ACTIVATION){FBTrace.sysout("-> tabWatcher.unwatchContext *** DESTROY *** context "+context.uid+" for: "+(context.window&&!context.window.closed?context.window.location:"no window or closed ")+" aborted: "+context.aborted) + }context.destroy(persistedState); + remove(contexts,context); + for(var name in context){delete context[name] + }var currentBrowser=Firebug.chrome.getCurrentBrowser(); + if(!currentBrowser.showFirebug){dispatch(this.fbListeners,"showContext",[browser,null]) + }if(contexts.length==0){Firebug.broadcast("disableXULWindow",[]) + }},getContextByWindow:function(winIn){if(!winIn){return + }var rootWindow=getRootWindow(winIn); + if(rootWindow){for(var i=0; + i tabWatcher.watchWindow addEventListener for "+eventName) + }this.listeners.push({window:win,listener:listener,eventName:eventName}) + },unregisterWindow:function(win){var newListeners=[]; + for(var i=0; + i tabWatcher.Unloader; PAGE HIDE ("+this.listeners.length+") "+win.location,event) + }onPageHideTopWindow(event) + },onUnload:function(event){var win=event.currentTarget; + this.unregisterWindow(win); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.Unloader; PAGE UNLOAD ("+this.listeners.length+") "+win.location,event) + }onUnloadWindow(event) + }}; + function getRefererHeader(request){var http=QI(request,Ci.nsIHttpChannel); + var referer=null; + http.visitRequestHeaders({visitHeader:function(name,value){if(name=="referer"){referer=value + }}}); + return referer + }var TabWatcherHttpObserver=extend(Object,{observe:function(aSubject,aTopic,aData){try{if(aTopic=="http-on-modify-request"){aSubject=aSubject.QueryInterface(Ci.nsIHttpChannel); + this.onModifyRequest(aSubject) + }}catch(err){ERROR(err) + }},onModifyRequest:function(request){var win=getWindowForRequest(request); + var tabId=Firebug.getTabIdForWindow(win); + if(!tabId){return + }if(request.URI.spec!=request.originalURI.spec){return + }if(request.loadFlags&Ci.nsIHttpChannel.LOAD_DOCUMENT_URI){if((FBTrace.DBG_ACTIVATION||FBTrace.DBG_WINDOWS)&&win==win.parent){FBTrace.sysout("-> tabWatcher TabWatcherHttpObserver *** START *** document request for: "+request.URI.spec+" window for request is "+safeGetWindowLocation(win)+"\n") + }if(win==win.parent){var browser=TabWatcher.getBrowserByWindow(win); + if(!browser){return + }delete browser.FirebugLink; + if(safeGetWindowLocation(win).toString()=="about:blank"){var referer=getRefererHeader(request); + if(referer){try{var srcURI=makeURI(referer); + browser.FirebugLink={src:srcURI,dst:request.URI} + }catch(e){if(FBTrace.DBG_ERRORS){FBTrace.sysout("tabWatcher.onModifyRequest failed to make URI from "+referer+" because "+exc,exc) + }}}}else{browser.FirebugLink={src:browser.currentURI,dst:request.URI} + }if(FBTrace.DBG_ACTIVATION&&browser.FirebugLink){FBTrace.sysout("tabWatcher.onModifyRequest created FirebugLink from "+browser.FirebugLink.src.spec+" to "+browser.FirebugLink.dst.spec) + }}}},QueryInterface:function(aIID){if(aIID.equals(Ci.nsIObserver)||aIID.equals(Ci.nsISupportsWeakReference)||aIID.equals(Ci.nsISupports)){return this + }throw Components.results.NS_NOINTERFACE + }}); + function onPageHideTopWindow(event){var win=event.currentTarget; + var doc=event.target; + if(doc.defaultView!=win){return + }if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher pagehide event.currentTarget "+safeGetWindowLocation(win),event) + }if(event.persisted){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher onPageHideTopWindow for: "+safeGetWindowLocation(win)+"\n") + }TabWatcher.unwatchTopWindow(win) + }else{win.addEventListener("unload",onUnloadTopWindow,true); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher onPageHideTopWindow set unload handler "+safeGetWindowLocation(win)+"\n") + }}}function evictTopWindow(win,uri){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher evictTopWindow win "+safeGetWindowLocation(win)+" uri "+uri.spec) + }TabWatcher.unwatchTopWindow(win) + }function onUnloadTopWindow(event){var win=event.currentTarget; + win.removeEventListener("unload",onUnloadTopWindow,true); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher onUnloadTopWindow for: "+safeGetWindowLocation(win)+" typeof :"+typeof(win)+"\n") + }TabWatcher.unwatchTopWindow(win) + }function onLoadWindowContent(event){if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.onLoadWindowContent event.type: "+event.type+"\n") + }var win=event.currentTarget; + try{win.removeEventListener("pageshow",onLoadWindowContent,onLoadWindowContent.capturing); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.onLoadWindowContent pageshow removeEventListener "+safeGetWindowLocation(win)) + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("-> tabWatcher.onLoadWindowContent removeEventListener pageshow fails",exc) + }}try{win.removeEventListener("DOMContentLoaded",onLoadWindowContent,onLoadWindowContent.capturing); + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.onLoadWindowContent DOMContentLoaded removeEventListener "+safeGetWindowLocation(win)) + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("-> tabWatcher.onLoadWindowContent removeEventListener DOMContentLoaded fails",exc) + }}var context=TabWatcher.getContextByWindow(win); + if(context){context.onLoadWindowContent=true + }try{if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.onLoadWindowContent:"+safeGetWindowLocation(win),win) + }TabWatcher.watchLoadedTopWindow(win) + }catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("-> tabWatchter onLoadWindowContent FAILS: "+exc,exc) + }}}onLoadWindowContent.capturing=false; + function onUnloadWindow(event){var win=event.currentTarget; + var eventType="unload"; + if(FBTrace.DBG_WINDOWS){FBTrace.sysout("-> tabWatcher.onUnloadWindow for: "+safeGetWindowLocation(win)+" removeEventListener: "+eventType+"\n") + }TabWatcher.unwatchWindow(win) + }function safeGetName(request){try{return request.name + }catch(exc){return null + }}function safeGetURI(browser){try{return browser.currentURI + }catch(exc){return null + }}var TraceListener={onDump:function(message){var prefix="->"; + if(message.text.indexOf(prefix)==0){message.text=message.text.substr(prefix.length); + message.text=trim(message.text); + message.type="DBG_WINDOWS" + }}} + }}); + FBL.ns(function(){with(FBL){Firebug.Lite={} + }}); + FBL.ns(function(){with(FBL){Firebug.Lite.Browser=function(window){this.contentWindow=window; + this.contentDocument=window.document; + this.currentURI={spec:window.location.href} + }; + Firebug.Lite.Browser.prototype={toString:function(){return"Firebug.Lite.Browser" + }} + }}); + FBL.ns(function(){with(FBL){Firebug.Lite.Cache={ID:"firebug"+new Date().getTime()}; + var cacheUID=0; + var createCache=function(){var map={}; + var CID=Firebug.Lite.Cache.ID; + var cacheFunction=function(element){return cacheAPI.set(element) + }; + var cacheAPI={get:function(key){return map.hasOwnProperty(key)?map[key]:null + },set:function(element){var id=element[CID]; + if(!id){id=++cacheUID; + element[CID]=id + }if(!map.hasOwnProperty(id)){map[id]=element + }return id + },unset:function(element){var id=element[CID]; + element[CID]=null; + delete element[CID]; + map[id]=null; + delete map[id] + },key:function(element){return element[CID] + },has:function(element){return map.hasOwnProperty(element[CID]) + },clear:function(){for(var id in map){var element=map[id]; + element[CID]=null; + delete element[CID]; + map[id]=null; + delete map[id] + }}}; + FBL.append(cacheFunction,cacheAPI); + return cacheFunction + }; + Firebug.Lite.Cache.StyleSheet=createCache(); + Firebug.Lite.Cache.Element=createCache() + }}); + FBL.ns(function(){with(FBL){Firebug.Lite.Proxy={_callbacks:{},load:function(url){var resourceDomain=getDomain(url); + var isLocalResource=!resourceDomain||resourceDomain==Firebug.context.window.location.host; + return isLocalResource?fetchResource(url):fetchProxyResource(url) + },loadJSONP:function(url,callback){var script=createGlobalElement("script"),doc=Firebug.context.document,uid=""+new Date().getTime(),callbackName="callback=Firebug.Lite.Proxy._callbacks."+uid,jsonpURL=url.indexOf("?")!=-1?url+"&"+callbackName:url+"?"+callbackName; + Firebug.Lite.Proxy._callbacks[uid]=function(data){if(callback){callback(data) + }script.parentNode.removeChild(script); + delete Firebug.Lite.Proxy._callbacks[uid] + }; + script.src=jsonpURL; + if(doc.documentElement){doc.documentElement.appendChild(script) + }},YQL:function(url,callback){var yql="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"+encodeURIComponent(url)+"%22&format=xml"; + this.loadJSONP(yql,function(data){var source=data.results[0]; + var match=/\s+

([\s\S]+)<\/p>\s+<\/body>$/.exec(source); + if(match){source=match[1] + }console.log(source) + }) + }}; + var fetchResource=function(url){var xhr=FBL.Ajax.getXHRObject(); + xhr.open("get",url,false); + xhr.send(); + return xhr.responseText + }; + var fetchProxyResource=function(url){var proxyURL=Env.Location.baseDir+"plugin/proxy/proxy.php?url="+encodeURIComponent(url); + var response=fetchResource(proxyURL); + try{var data=eval("("+response+")") + }catch(E){return"ERROR: Firebug Lite Proxy plugin returned an invalid response." + }return data?data.contents:"" + } + }}); + FBL.ns(function(){with(FBL){Firebug.Lite.Script=function(window){this.fileName=null; + this.isValid=null; + this.baseLineNumber=null; + this.lineExtent=null; + this.tag=null; + this.functionName=null; + this.functionSource=null + }; + Firebug.Lite.Script.prototype={isLineExecutable:function(){},pcToLine:function(){},lineToPc:function(){},toString:function(){return"Firebug.Lite.Script" + }} + }}); + FBL.ns(function(){with(FBL){Firebug.Lite.Style={} + }}); + FBL.ns(function(){with(FBL){var chunker=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,done=0,toString=Object.prototype.toString,hasDuplicate=false,baseHasDuplicate=true; + [0,0].sort(function(){baseHasDuplicate=false; + return 0 + }); + var Sizzle=function(selector,context,results,seed){results=results||[]; + var origContext=context=context||document; + if(context.nodeType!==1&&context.nodeType!==9){return[] + }if(!selector||typeof selector!=="string"){return results + }var parts=[],m,set,checkSet,check,mode,extra,prune=true,contextXML=isXML(context),soFar=selector; + while((chunker.exec(""),m=chunker.exec(soFar))!==null){soFar=m[3]; + parts.push(m[1]); + if(m[2]){extra=m[3]; + break + }}if(parts.length>1&&origPOS.exec(selector)){if(parts.length===2&&Expr.relative[parts[0]]){set=posProcess(parts[0]+parts[1],context) + }else{set=Expr.relative[parts[0]]?[context]:Sizzle(parts.shift(),context); + while(parts.length){selector=parts.shift(); + if(Expr.relative[selector]){selector+=parts.shift() + }set=posProcess(selector,set) + }}}else{if(!seed&&parts.length>1&&context.nodeType===9&&!contextXML&&Expr.match.ID.test(parts[0])&&!Expr.match.ID.test(parts[parts.length-1])){var ret=Sizzle.find(parts.shift(),context,contextXML); + context=ret.expr?Sizzle.filter(ret.expr,ret.set)[0]:ret.set[0] + }if(context){var ret=seed?{expr:parts.pop(),set:makeArray(seed)}:Sizzle.find(parts.pop(),parts.length===1&&(parts[0]==="~"||parts[0]==="+")&&context.parentNode?context.parentNode:context,contextXML); + set=ret.expr?Sizzle.filter(ret.expr,ret.set):ret.set; + if(parts.length>0){checkSet=makeArray(set) + }else{prune=false + }while(parts.length){var cur=parts.pop(),pop=cur; + if(!Expr.relative[cur]){cur="" + }else{pop=parts.pop() + }if(pop==null){pop=context + }Expr.relative[cur](checkSet,pop,contextXML) + }}else{checkSet=parts=[] + }}if(!checkSet){checkSet=set + }if(!checkSet){throw"Syntax error, unrecognized expression: "+(cur||selector) + }if(toString.call(checkSet)==="[object Array]"){if(!prune){results.push.apply(results,checkSet) + }else{if(context&&context.nodeType===1){for(var i=0; + checkSet[i]!=null; + i++){if(checkSet[i]&&(checkSet[i]===true||checkSet[i].nodeType===1&&contains(context,checkSet[i]))){results.push(set[i]) + }}}else{for(var i=0; + checkSet[i]!=null; + i++){if(checkSet[i]&&checkSet[i].nodeType===1){results.push(set[i]) + }}}}}else{makeArray(checkSet,results) + }if(extra){Sizzle(extra,origContext,results,seed); + Sizzle.uniqueSort(results) + }return results + }; + Sizzle.uniqueSort=function(results){if(sortOrder){hasDuplicate=baseHasDuplicate; + results.sort(sortOrder); + if(hasDuplicate){for(var i=1; + i":function(checkSet,part,isXML){var isPartStr=typeof part==="string"; + if(isPartStr&&!/\W/.test(part)){part=isXML?part:part.toUpperCase(); + for(var i=0,l=checkSet.length; + i=0)){if(!inplace){result.push(elem) + }}else{if(inplace){curLoop[i]=false + }}}}return false + },ID:function(match){return match[1].replace(/\\/g,"") + },TAG:function(match,curLoop){for(var i=0; + curLoop[i]===false; + i++){}return curLoop[i]&&isXML(curLoop[i])?match[1]:match[1].toUpperCase() + },CHILD:function(match){if(match[1]=="nth"){var test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(match[2]=="even"&&"2n"||match[2]=="odd"&&"2n+1"||!/\D/.test(match[2])&&"0n+"+match[2]||match[2]); + match[2]=(test[1]+(test[2]||1))-0; + match[3]=test[3]-0 + }match[0]=done++; + return match + },ATTR:function(match,curLoop,inplace,result,not,isXML){var name=match[1].replace(/\\/g,""); + if(!isXML&&Expr.attrMap[name]){match[1]=Expr.attrMap[name] + }if(match[2]==="~="){match[4]=" "+match[4]+" " + }return match + },PSEUDO:function(match,curLoop,inplace,result,not){if(match[1]==="not"){if((chunker.exec(match[3])||"").length>1||/^\w/.test(match[3])){match[3]=Sizzle(match[3],null,null,curLoop) + }else{var ret=Sizzle.filter(match[3],curLoop,inplace,true^not); + if(!inplace){result.push.apply(result,ret) + }return false + }}else{if(Expr.match.POS.test(match[0])||Expr.match.CHILD.test(match[0])){return true + }}return match + },POS:function(match){match.unshift(true); + return match + }},filters:{enabled:function(elem){return elem.disabled===false&&elem.type!=="hidden" + },disabled:function(elem){return elem.disabled===true + },checked:function(elem){return elem.checked===true + },selected:function(elem){elem.parentNode.selectedIndex; + return elem.selected===true + },parent:function(elem){return !!elem.firstChild + },empty:function(elem){return !elem.firstChild + },has:function(elem,i,match){return !!Sizzle(match[3],elem).length + },header:function(elem){return/h\d/i.test(elem.nodeName) + },text:function(elem){return"text"===elem.type + },radio:function(elem){return"radio"===elem.type + },checkbox:function(elem){return"checkbox"===elem.type + },file:function(elem){return"file"===elem.type + },password:function(elem){return"password"===elem.type + },submit:function(elem){return"submit"===elem.type + },image:function(elem){return"image"===elem.type + },reset:function(elem){return"reset"===elem.type + },button:function(elem){return"button"===elem.type||elem.nodeName.toUpperCase()==="BUTTON" + },input:function(elem){return/input|select|textarea|button/i.test(elem.nodeName) + }},setFilters:{first:function(elem,i){return i===0 + },last:function(elem,i,match,array){return i===array.length-1 + },even:function(elem,i){return i%2===0 + },odd:function(elem,i){return i%2===1 + },lt:function(elem,i,match){return imatch[3]-0 + },nth:function(elem,i,match){return match[3]-0==i + },eq:function(elem,i,match){return match[3]-0==i + }},filter:{PSEUDO:function(elem,match,i,array){var name=match[1],filter=Expr.filters[name]; + if(filter){return filter(elem,i,match,array) + }else{if(name==="contains"){return(elem.textContent||elem.innerText||"").indexOf(match[3])>=0 + }else{if(name==="not"){var not=match[3]; + for(var i=0,l=not.length; + i=0) + }}},ID:function(elem,match){return elem.nodeType===1&&elem.getAttribute("id")===match + },TAG:function(elem,match){return(match==="*"&&elem.nodeType===1)||elem.nodeName===match + },CLASS:function(elem,match){return(" "+(elem.className||elem.getAttribute("class"))+" ").indexOf(match)>-1 + },ATTR:function(elem,match){var name=match[1],result=Expr.attrHandle[name]?Expr.attrHandle[name](elem):elem[name]!=null?elem[name]:elem.getAttribute(name),value=result+"",type=match[2],check=match[4]; + return result==null?type==="!=":type==="="?value===check:type==="*="?value.indexOf(check)>=0:type==="~="?(" "+value+" ").indexOf(check)>=0:!check?value&&result!==false:type==="!="?value!=check:type==="^="?value.indexOf(check)===0:type==="$="?value.substr(value.length-check.length)===check:type==="|="?value===check||value.substr(0,check.length+1)===check+"-":false + },POS:function(elem,match,i,array){var name=match[2],filter=Expr.setFilters[name]; + if(filter){return filter(elem,i,match,array) + }}}}; + var origPOS=Expr.match.POS; + for(var type in Expr.match){Expr.match[type]=new RegExp(Expr.match[type].source+/(?![^\[]*\])(?![^\(]*\))/.source); + Expr.leftMatch[type]=new RegExp(/(^(?:.|\r|\n)*?)/.source+Expr.match[type].source) + }var makeArray=function(array,results){array=Array.prototype.slice.call(array,0); + if(results){results.push.apply(results,array); + return results + }return array + }; + try{Array.prototype.slice.call(document.documentElement.childNodes,0) + }catch(e){makeArray=function(array,results){var ret=results||[]; + if(toString.call(array)==="[object Array]"){Array.prototype.push.apply(ret,array) + }else{if(typeof array.length==="number"){for(var i=0,l=array.length; + i"; + var root=document.documentElement; + root.insertBefore(form,root.firstChild); + if(!!document.getElementById(id)){Expr.find.ID=function(match,context,isXML){if(typeof context.getElementById!=="undefined"&&!isXML){var m=context.getElementById(match[1]); + return m?m.id===match[1]||typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id").nodeValue===match[1]?[m]:undefined:[] + }}; + Expr.filter.ID=function(elem,match){var node=typeof elem.getAttributeNode!=="undefined"&&elem.getAttributeNode("id"); + return elem.nodeType===1&&node&&node.nodeValue===match + } + }root.removeChild(form); + root=form=null + })(); + (function(){var div=document.createElement("div"); + div.appendChild(document.createComment("")); + if(div.getElementsByTagName("*").length>0){Expr.find.TAG=function(match,context){var results=context.getElementsByTagName(match[1]); + if(match[1]==="*"){var tmp=[]; + for(var i=0; + results[i]; + i++){if(results[i].nodeType===1){tmp.push(results[i]) + }}results=tmp + }return results + } + }div.innerHTML=""; + if(div.firstChild&&typeof div.firstChild.getAttribute!=="undefined"&&div.firstChild.getAttribute("href")!=="#"){Expr.attrHandle.href=function(elem){return elem.getAttribute("href",2) + } + }div=null + })(); + if(document.querySelectorAll){(function(){var oldSizzle=Sizzle,div=document.createElement("div"); + div.innerHTML="

"; + if(div.querySelectorAll&&div.querySelectorAll(".TEST").length===0){return + }Sizzle=function(query,context,extra,seed){context=context||document; + if(!seed&&context.nodeType===9&&!isXML(context)){try{return makeArray(context.querySelectorAll(query),extra) + }catch(e){}}return oldSizzle(query,context,extra,seed) + }; + for(var prop in oldSizzle){Sizzle[prop]=oldSizzle[prop] + }div=null + })() + }if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var div=document.createElement("div"); + div.innerHTML="
"; + if(div.getElementsByClassName("e").length===0){return + }div.lastChild.className="e"; + if(div.getElementsByClassName("e").length===1){return + }Expr.order.splice(1,0,"CLASS"); + Expr.find.CLASS=function(match,context,isXML){if(typeof context.getElementsByClassName!=="undefined"&&!isXML){return context.getElementsByClassName(match[1]) + }}; + div=null + })() + }function dirNodeCheck(dir,cur,doneName,checkSet,nodeCheck,isXML){var sibDir=dir=="previousSibling"&&!isXML; + for(var i=0,l=checkSet.length; + i0){match=elem; + break + }}}elem=elem[dir] + }checkSet[i]=match + }}}var contains=document.compareDocumentPosition?function(a,b){return a.compareDocumentPosition(b)&16 + }:function(a,b){return a!==b&&(a.contains?a.contains(b):true) + }; + var isXML=function(elem){return elem.nodeType===9&&elem.documentElement.nodeName!=="HTML"||!!elem.ownerDocument&&elem.ownerDocument.documentElement.nodeName!=="HTML" + }; + var posProcess=function(selector,context){var tmpSet=[],later="",match,root=context.nodeType?[context]:context; + while((match=Expr.match.PSEUDO.exec(selector))){later+=match[0]; + selector=selector.replace(Expr.match.PSEUDO,"") + }selector=Expr.relative[selector]?selector+"*":selector; + for(var i=0,l=root.length; + i":return">"; + case"&":return"&"; + case"'":return"'"; + case'"':return""" + }return"?" + }return String(value).replace(/[<>&"']/g,replaceChars) + }function __loop__(iter,outputs,fn){var iterOuts=[]; + outputs.push(iterOuts); + if(iter instanceof Array){iter=new ArrayIterator(iter) + }try{while(1){var value=iter.next(); + var itemOuts=[0,0]; + iterOuts.push(itemOuts); + fn.apply(this,[value,itemOuts]) + }}catch(exc){if(exc!=StopIteration){throw exc + }}}var js=fnBlock.join(""); + var r=null; + eval(js); + this.renderMarkup=r + },getVarNames:function(args){if(this.vars){args.push.apply(args,this.vars) + }for(var i=0; + i"'); + this.generateChildMarkup(topBlock,topOuts,blocks,info); + topBlock.push(',""') + },generateChildMarkup:function(topBlock,topOuts,blocks,info){for(var i=0; + i=array.length){throw StopIteration + }return array[index] + } + }function StopIteration(){}FBL.$break=function(){throw StopIteration + }; + var Renderer={renderHTML:function(args,outputs,self){var code=[]; + var markupArgs=[code,this.tag.context,args,outputs]; + markupArgs.push.apply(markupArgs,this.tag.markupArgs); + this.tag.renderMarkup.apply(self?self:this.tag.subject,markupArgs); + return code.join("") + },insertRows:function(args,before,self){this.tag.compile(); + var outputs=[]; + var html=this.renderHTML(args,outputs,self); + var doc=before.ownerDocument; + var div=doc.createElement("div"); + div.innerHTML=""+html+"
"; + var tbody=div.firstChild.firstChild; + var parent=before.tagName=="TR"?before.parentNode:before; + var after=before.tagName=="TR"?before.nextSibling:null; + var firstRow=tbody.firstChild,lastRow; + while(tbody.firstChild){lastRow=tbody.firstChild; + if(after){parent.insertBefore(lastRow,after) + }else{parent.appendChild(lastRow) + }}var offset=0; + if(before.tagName=="TR"){var node=firstRow.parentNode.firstChild; + for(; + node&&node!=firstRow; + node=node.nextSibling){++offset + }}var domArgs=[firstRow,this.tag.context,offset]; + domArgs.push.apply(domArgs,this.tag.domArgs); + domArgs.push.apply(domArgs,outputs); + this.tag.renderDOM.apply(self?self:this.tag.subject,domArgs); + return[firstRow,lastRow] + },insertBefore:function(args,before,self){return this.insertNode(args,before.ownerDocument,before,false,self) + },insertAfter:function(args,after,self){return this.insertNode(args,after.ownerDocument,after,true,self) + },insertNode:function(args,doc,element,isAfter,self){if(!args){args={} + }this.tag.compile(); + var outputs=[]; + var html=this.renderHTML(args,outputs,self); + var doc=element.ownerDocument; + if(!womb||womb.ownerDocument!=doc){womb=doc.createElement("div") + }womb.innerHTML=html; + var root=womb.firstChild; + if(isAfter){while(womb.firstChild){if(element.nextSibling){element.parentNode.insertBefore(womb.firstChild,element.nextSibling) + }else{element.parentNode.appendChild(womb.firstChild) + }}}else{while(womb.lastChild){element.parentNode.insertBefore(womb.lastChild,element) + }}var domArgs=[root,this.tag.context,0]; + domArgs.push.apply(domArgs,this.tag.domArgs); + domArgs.push.apply(domArgs,outputs); + this.tag.renderDOM.apply(self?self:this.tag.subject,domArgs); + return root + },replace:function(args,parent,self){this.tag.compile(); + var outputs=[]; + var html=this.renderHTML(args,outputs,self); + var root; + if(parent.nodeType==1){parent.innerHTML=html; + root=parent.firstChild + }else{if(!parent||parent.nodeType!=9){parent=document + }if(!womb||womb.ownerDocument!=parent){womb=parent.createElement("div") + }womb.innerHTML=html; + root=womb.firstChild + }var domArgs=[root,this.tag.context,0]; + domArgs.push.apply(domArgs,this.tag.domArgs); + domArgs.push.apply(domArgs,outputs); + this.tag.renderDOM.apply(self?self:this.tag.subject,domArgs); + return root + },append:function(args,parent,self){this.tag.compile(); + var outputs=[]; + var html=this.renderHTML(args,outputs,self); + if(!womb||womb.ownerDocument!=parent.ownerDocument){womb=parent.ownerDocument.createElement("div") + }womb.innerHTML=html; + var root=womb.firstChild; + while(womb.firstChild){parent.appendChild(womb.firstChild) + }womb=null; + var domArgs=[root,this.tag.context,0]; + domArgs.push.apply(domArgs,this.tag.domArgs); + domArgs.push.apply(domArgs,outputs); + this.tag.renderDOM.apply(self?self:this.tag.subject,domArgs); + return root + }}; + function defineTags(){for(var i=0; + inumPropertiesShown){break + }}if(numProperties>numPropertiesShown){props.push({object:"...",tag:FirebugReps.Caption.tag,name:"",equal:"",delim:""}) + }else{if(props.length>0){props[props.length-1].delim="" + }}}catch(exc){}return props + },fb_1_6_propIterator:function(object,max){max=max||3; + if(!object){return[] + }var props=[]; + var len=0,count=0; + try{for(var name in object){var value; + try{value=object[name] + }catch(exc){continue + }var t=typeof(value); + if(t=="boolean"||t=="number"||(t=="string"&&value)||(t=="object"&&value&&value.toString)){var rep=Firebug.getRep(value); + var tag=rep.shortTag||rep.tag; + if(t=="object"){value=rep.getTitle(value); + tag=rep.titleTag + }count++; + if(count<=max){props.push({tag:tag,name:name,object:value,equal:"=",delim:", "}) + }else{break + }}}if(count>max){props[Math.max(1,max-1)]={object:"more...",tag:FirebugReps.Caption.tag,name:"",equal:"",delim:""} + }else{if(props.length>0){props[props.length-1].delim="" + }}}catch(exc){}return props + },className:"object",supportsObject:function(object,type){return true + }}); + this.Arr=domplate(Firebug.Rep,{tag:OBJECTBOX({_repObject:"$object"},SPAN({"class":"arrayLeftBracket",role:"presentation"},"["),FOR("item","$object|arrayIterator",TAG("$item.tag",{object:"$item.object"}),SPAN({"class":"arrayComma",role:"presentation"},"$item.delim")),SPAN({"class":"arrayRightBracket",role:"presentation"},"]")),shortTag:OBJECTBOX({_repObject:"$object"},SPAN({"class":"arrayLeftBracket",role:"presentation"},"["),FOR("item","$object|shortArrayIterator",TAG("$item.tag",{object:"$item.object"}),SPAN({"class":"arrayComma",role:"presentation"},"$item.delim")),SPAN({"class":"arrayRightBracket"},"]")),arrayIterator:function(array){var items=[]; + for(var i=0; + i3){items.push({object:(array.length-3)+" more...",tag:FirebugReps.Caption.tag,delim:""}) + }return items + },shortPropIterator:this.Obj.propIterator,getItemIndex:function(child){var arrayIndex=0; + for(child=child.previousSibling; + child; + child=child.previousSibling){if(child.repObject){++arrayIndex + }}return arrayIndex + },className:"array",supportsObject:function(object){return this.isArray(object) + },isArray:function(obj){try{if(!obj){return false + }else{if(isIE&&!isFunction(obj)&&typeof obj=="object"&&isFinite(obj.length)&&obj.nodeType!=8){return true + }else{if(isFinite(obj.length)&&isFunction(obj.splice)){return true + }else{if(isFinite(obj.length)&&isFunction(obj.callee)){return true + }else{if(instanceOf(obj,"HTMLCollection")){return true + }else{if(instanceOf(obj,"NodeList")){return true + }else{return false + }}}}}}}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("isArray FAILS:",exc); + FBTrace.sysout("isArray Fails on obj",obj) + }}return false + },getTitle:function(object,context){return"["+object.length+"]" + }}); + this.Property=domplate(Firebug.Rep,{supportsObject:function(object){return object instanceof Property + },getRealObject:function(prop,context){return prop.object[prop.name] + },getTitle:function(prop,context){return prop.name + }}); + this.NetFile=domplate(this.Obj,{supportsObject:function(object){return object instanceof Firebug.NetFile + },browseObject:function(file,context){openNewTab(file.href); + return true + },getRealObject:function(file,context){return null + }}); + this.Except=domplate(Firebug.Rep,{tag:OBJECTBOX({_repObject:"$object"},"$object.message"),className:"exception",supportsObject:function(object){return object instanceof ErrorCopy + }}); + this.Element=domplate(Firebug.Rep,{tag:OBJECTLINK("<",SPAN({"class":"nodeTag"},"$object.nodeName|toLowerCase"),FOR("attr","$object|attrIterator"," $attr.nodeName="",SPAN({"class":"nodeValue"},"$attr.nodeValue"),"""),">"),shortTag:OBJECTLINK(SPAN({"class":"$object|getVisible"},SPAN({"class":"selectorTag"},"$object|getSelectorTag"),SPAN({"class":"selectorId"},"$object|getSelectorId"),SPAN({"class":"selectorClass"},"$object|getSelectorClass"),SPAN({"class":"selectorValue"},"$object|getValue"))),getVisible:function(elt){return isVisible(elt)?"":"selectorHidden" + },getSelectorTag:function(elt){return elt.nodeName.toLowerCase() + },getSelectorId:function(elt){return elt.id?"#"+elt.id:"" + },getSelectorClass:function(elt){return elt.className?"."+elt.className.split(" ")[0]:"" + },getValue:function(elt){return""; + var value; + if(elt instanceof HTMLImageElement){value=getFileName(elt.src) + }else{if(elt instanceof HTMLAnchorElement){value=getFileName(elt.href) + }else{if(elt instanceof HTMLInputElement){value=elt.value + }else{if(elt instanceof HTMLFormElement){value=getFileName(elt.action) + }else{if(elt instanceof HTMLScriptElement){value=getFileName(elt.src) + }}}}}return value?" "+cropString(value,20):"" + },attrIterator:function(elt){var attrs=[]; + var idAttr,classAttr; + if(elt.attributes){for(var i=0; + i0 + },hasErrorBreak:function(error){return fbs.hasErrorBreakpoint(error.href,error.lineNo) + },getMessage:function(message){var re=/\[Exception... "(.*?)" nsresult:/; + var m=re.exec(message); + return m?m[1]:message + },getLine:function(error){if(error.category=="js"){if(error.source){return cropString(error.source,80) + }else{if(error.href&&error.href.indexOf("XPCSafeJSObjectWrapper")==-1){return cropString(error.getSourceLine(),80) + }}}},getSourceLink:function(error){var ext=error.category=="css"?"css":"js"; + return error.lineNo?new SourceLink(error.href,error.lineNo,ext):null + },getSourceType:function(error){if(error.source){return"syntax" + }else{if(error.lineNo==1&&getFileExtension(error.href)!="js"){return"none" + }else{if(error.category=="css"){return"none" + }else{if(!error.href||!error.lineNo){return"none" + }else{return"exec" + }}}}},onToggleError:function(event){var target=event.currentTarget; + if(hasClass(event.target,"errorBreak")){this.breakOnThisError(target.repObject) + }else{if(hasClass(event.target,"errorSource")){var panel=Firebug.getElementPanel(event.target); + this.inspectObject(target.repObject,panel.context) + }else{if(hasClass(event.target,"errorTitle")){var traceBox=target.childNodes[1]; + toggleClass(target,"opened"); + event.target.setAttribute("aria-checked",hasClass(target,"opened")); + if(hasClass(target,"opened")){if(target.stackTrace){var node=FirebugReps.StackTrace.tag.append({object:target.stackTrace},traceBox) + }if(Firebug.A11yModel.enabled){var panel=Firebug.getElementPanel(event.target); + dispatch([Firebug.A11yModel],"onLogRowContentCreated",[panel,traceBox]) + }}else{clearNode(traceBox) + }}}}},copyError:function(error){var message=[this.getMessage(error.message),error.href,"Line "+error.lineNo]; + copyToClipboard(message.join("\n")) + },breakOnThisError:function(error){if(this.hasErrorBreak(error)){Firebug.Debugger.clearErrorBreakpoint(error.href,error.lineNo) + }else{Firebug.Debugger.setErrorBreakpoint(error.href,error.lineNo) + }},className:"errorMessage",inspectable:false,supportsObject:function(object){return object instanceof ErrorMessage + },inspectObject:function(error,context){var sourceLink=this.getSourceLink(error); + FirebugReps.SourceLink.inspectObject(sourceLink,context) + },getContextMenuItems:function(error,target,context){var breakOnThisError=this.hasErrorBreak(error); + var items=[{label:"CopyError",command:bindFixed(this.copyError,this,error)}]; + if(error.category=="css"){items.push("-",{label:"BreakOnThisError",type:"checkbox",checked:breakOnThisError,command:bindFixed(this.breakOnThisError,this,error)},optionMenu("BreakOnAllErrors","breakOnErrors")) + }return items + }}); + this.Assert=domplate(Firebug.Rep,{tag:DIV(DIV({"class":"errorTitle"}),DIV({"class":"assertDescription"})),className:"assert",inspectObject:function(error,context){var sourceLink=this.getSourceLink(error); + Firebug.chrome.select(sourceLink) + },getContextMenuItems:function(error,target,context){var breakOnThisError=this.hasErrorBreak(error); + return[{label:"CopyError",command:bindFixed(this.copyError,this,error)},"-",{label:"BreakOnThisError",type:"checkbox",checked:breakOnThisError,command:bindFixed(this.breakOnThisError,this,error)},{label:"BreakOnAllErrors",type:"checkbox",checked:Firebug.breakOnErrors,command:bindFixed(this.breakOnAllErrors,this,error)}] + }}); + this.SourceText=domplate(Firebug.Rep,{tag:DIV(FOR("line","$object|lineIterator",DIV({"class":"sourceRow",role:"presentation"},SPAN({"class":"sourceLine",role:"presentation"},"$line.lineNo"),SPAN({"class":"sourceRowText",role:"presentation"},"$line.text")))),lineIterator:function(sourceText){var maxLineNoChars=(sourceText.lines.length+"").length; + var list=[]; + for(var i=0; + i57)&&event.charCode!=45&&event.charCode!=46){FBL.cancelEvent(event) + }else{this.ignoreNextInput=event.keyCode==8 + }}}},onOverflow:function(){this.updateLayout(false,false,3) + },onKeyDown:function(event){if(event.keyCode>46||event.keyCode==32||event.keyCode==8){this.keyDownPressed=true + }},onInput:function(event){if(isIE){if(event.propertyName!="value"||!isVisible(this.input)||!this.keyDownPressed){return + }this.keyDownPressed=false + }var selectRangeCallback; + if(this.ignoreNextInput){this.ignoreNextInput=false; + this.getAutoCompleter().reset() + }else{if(this.completeAsYouType){selectRangeCallback=this.getAutoCompleter().complete(currentPanel.context,this.input,false) + }else{this.getAutoCompleter().reset() + }}Firebug.Editor.update(); + if(selectRangeCallback){if(isSafari){setTimeout(selectRangeCallback,0) + }else{selectRangeCallback() + }}},onContextMenu:function(event){cancelEvent(event); + var popup=$("fbInlineEditorPopup"); + FBL.eraseNode(popup); + var target=event.target||event.srcElement; + var menu=this.getContextMenuItems(target); + if(menu){for(var i=0; + ithis.textSize.height+3:this.noWrap&&approxTextWidth>maxWidth; + if(wrapped){var style=isIE?this.target.currentStyle:this.target.ownerDocument.defaultView.getComputedStyle(this.target,""); + targetMargin=parseInt(style.marginLeft)+parseInt(style.marginRight); + approxTextWidth=maxWidth-targetMargin; + this.input.style.width="100%"; + this.box.style.width=approxTextWidth+"px" + }else{var charWidth=this.measureInputText("m").width; + if(extraWidth){charWidth*=extraWidth + }var inputWidth=approxTextWidth+charWidth; + if(initial){if(isIE){var xDiff=13; + this.box.style.width=(inputWidth+xDiff)+"px" + }else{this.box.style.width="auto" + }}else{var xDiff=isIE?13:this.box.scrollWidth-this.input.offsetWidth; + this.box.style.width=(inputWidth+xDiff)+"px" + }this.input.style.width=inputWidth+"px" + }this.expander.style.width=approxTextWidth+"px"; + this.expander.style.height=Math.max(this.textSize.height-3,0)+"px" + }if(forceAll){scrollIntoCenterView(this.box,null,true) + }}}); + Firebug.AutoCompleter=function(getExprOffset,getRange,evaluator,selectMode,caseSensitive){var candidates=null; + var originalValue=null; + var originalOffset=-1; + var lastExpr=null; + var lastOffset=-1; + var exprOffset=0; + var lastIndex=0; + var preParsed=null; + var preExpr=null; + var postExpr=null; + this.revert=function(textBox){if(originalOffset!=-1){textBox.value=originalValue; + setSelectionRange(textBox,originalOffset,originalOffset); + this.reset(); + return true + }else{this.reset(); + return false + }}; + this.reset=function(){candidates=null; + originalValue=null; + originalOffset=-1; + lastExpr=null; + lastOffset=0; + exprOffset=0 + }; + this.complete=function(context,textBox,cycle,reverse){var value=textBox.value; + var offset=getInputSelectionStart(textBox); + if(isSafari&&!cycle&&offset>=0){offset++ + }if(!selectMode&&originalOffset!=-1){offset=originalOffset + }if(!candidates||!cycle||offset!=lastOffset){originalOffset=offset; + originalValue=value; + var parseStart=getExprOffset?getExprOffset(value,offset,context):0; + preParsed=value.substr(0,parseStart); + var parsed=value.substr(parseStart); + var range=getRange?getRange(parsed,offset-parseStart,context):null; + if(!range){range={start:0,end:parsed.length-1} + }var expr=parsed.substr(range.start,range.end-range.start+1); + preExpr=parsed.substr(0,range.start); + postExpr=parsed.substr(range.end+1); + exprOffset=parseStart+range.start; + if(!cycle){if(!expr){return + }else{if(lastExpr&&lastExpr.indexOf(expr)!=0){candidates=null + }else{if(lastExpr&&lastExpr.length>=expr.length){candidates=null; + lastExpr=expr; + return + }}}}lastExpr=expr; + lastOffset=offset; + var searchExpr; + if(expr&&offset!=parseStart+range.end+1){if(cycle){offset=range.start; + searchExpr=expr; + expr="" + }else{return + }}var values=evaluator(preExpr,expr,postExpr,context); + if(!values){return + }if(expr){candidates=[]; + if(caseSensitive){for(var i=0; + i=candidates.length){lastIndex=0 + }else{if(lastIndex<0){lastIndex=candidates.length-1 + }}var completion=candidates[lastIndex]; + var preCompletion=expr.substr(0,offset-exprOffset); + var postCompletion=completion.substr(offset-exprOffset); + textBox.value=preParsed+preExpr+preCompletion+postCompletion+postExpr; + var offsetEnd=preParsed.length+preExpr.length+completion.length; + return function(){if(selectMode){setSelectionRange(textBox,offset,offsetEnd) + }else{setSelectionRange(textBox,offsetEnd,offsetEnd) + }} + } + }; + var getDefaultEditor=function getDefaultEditor(panel){if(!defaultEditor){var doc=panel.document; + defaultEditor=new Firebug.InlineEditor(doc) + }return defaultEditor + }; + var getOutsider=function getOutsider(element,group,stepper){var parentGroup=getAncestorByClass(group.parentNode,"editGroup"); + var next; + do{next=stepper(next||element) + }while(isAncestor(next,group)||isGroupInsert(next,parentGroup)); + return next + }; + var isGroupInsert=function isGroupInsert(next,group){return(!group||isAncestor(next,group))&&(hasClass(next,"insertBefore")||hasClass(next,"insertAfter")) + }; + var getNextOutsider=function getNextOutsider(element,group){return getOutsider(element,group,bind(getNextByClass,FBL,"editable")) + }; + var getPreviousOutsider=function getPreviousOutsider(element,group){return getOutsider(element,group,bind(getPreviousByClass,FBL,"editable")) + }; + var getInlineParent=function getInlineParent(element){var lastInline=element; + for(; + element; + element=element.parentNode){var s=isIE?element.currentStyle:element.ownerDocument.defaultView.getComputedStyle(element,""); + if(s.display!="inline"){return lastInline + }else{lastInline=element + }}return null + }; + var insertTab=function insertTab(){insertTextIntoElement(currentEditor.input,Firebug.Editor.tabCharacter) + }; + Firebug.registerModule(Firebug.Editor) + }}); + FBL.ns(function(){with(FBL){var ElementCache=Firebug.Lite.Cache.Element; + var inspectorTS,inspectorTimer,isInspecting; + Firebug.Inspector={create:function(){offlineFragment=Env.browser.document.createDocumentFragment(); + createBoxModelInspector(); + createOutlineInspector() + },destroy:function(){destroyBoxModelInspector(); + destroyOutlineInspector(); + offlineFragment=null + },toggleInspect:function(){if(isInspecting){this.stopInspecting() + }else{Firebug.chrome.inspectButton.changeState("pressed"); + this.startInspecting() + }},startInspecting:function(){isInspecting=true; + Firebug.chrome.selectPanel("HTML"); + createInspectorFrame(); + var size=Firebug.browser.getWindowScrollSize(); + fbInspectFrame.style.width=size.width+"px"; + fbInspectFrame.style.height=size.height+"px"; + addEvent(fbInspectFrame,"mousemove",Firebug.Inspector.onInspecting); + addEvent(fbInspectFrame,"mousedown",Firebug.Inspector.onInspectingClick) + },stopInspecting:function(){isInspecting=false; + if(outlineVisible){this.hideOutline() + }removeEvent(fbInspectFrame,"mousemove",Firebug.Inspector.onInspecting); + removeEvent(fbInspectFrame,"mousedown",Firebug.Inspector.onInspectingClick); + destroyInspectorFrame(); + Firebug.chrome.inspectButton.restore(); + if(Firebug.chrome.type=="popup"){Firebug.chrome.node.focus() + }},onInspectingClick:function(e){fbInspectFrame.style.display="none"; + var targ=Firebug.browser.getElementFromPoint(e.clientX,e.clientY); + fbInspectFrame.style.display="block"; + var id=targ.id; + if(id&&/^fbOutline\w$/.test(id)){return + }if(id=="FirebugUI"){return + }while(targ.nodeType!=1){targ=targ.parentNode + }Firebug.Inspector.stopInspecting() + },onInspecting:function(e){if(new Date().getTime()-lastInspecting>30){fbInspectFrame.style.display="none"; + var targ=Firebug.browser.getElementFromPoint(e.clientX,e.clientY); + fbInspectFrame.style.display="block"; + var id=targ.id; + if(id&&/^fbOutline\w$/.test(id)){return + }if(id=="FirebugUI"){return + }while(targ.nodeType!=1){targ=targ.parentNode + }if(targ.nodeName.toLowerCase()=="body"){return + }Firebug.Inspector.drawOutline(targ); + if(ElementCache(targ)){var target=""+ElementCache.key(targ); + var lazySelect=function(){inspectorTS=new Date().getTime(); + Firebug.HTML.selectTreeNode(""+ElementCache.key(targ)) + }; + if(inspectorTimer){clearTimeout(inspectorTimer); + inspectorTimer=null + }if(new Date().getTime()-inspectorTS>200){setTimeout(lazySelect,0) + }else{inspectorTimer=setTimeout(lazySelect,300) + }}lastInspecting=new Date().getTime() + }},onInspectingBody:function(e){if(new Date().getTime()-lastInspecting>30){var targ=e.target; + var id=targ.id; + if(id&&/^fbOutline\w$/.test(id)){return + }if(id=="FirebugUI"){return + }while(targ.nodeType!=1){targ=targ.parentNode + }if(targ.nodeName.toLowerCase()=="body"){return + }Firebug.Inspector.drawOutline(targ); + if(ElementCache.has(targ)){FBL.Firebug.HTML.selectTreeNode(""+ElementCache.key(targ)) + }lastInspecting=new Date().getTime() + }},drawOutline:function(el){var border=2; + var scrollbarSize=17; + var windowSize=Firebug.browser.getWindowSize(); + var scrollSize=Firebug.browser.getWindowScrollSize(); + var scrollPosition=Firebug.browser.getWindowScrollPosition(); + var box=Firebug.browser.getElementBox(el); + var top=box.top; + var left=box.left; + var height=box.height; + var width=box.width; + var freeHorizontalSpace=scrollPosition.left+windowSize.width-left-width-(!isIE&&scrollSize.height>windowSize.height?scrollbarSize:0); + var freeVerticalSpace=scrollPosition.top+windowSize.height-top-height-(!isIE&&scrollSize.width>windowSize.width?scrollbarSize:0); + var numVerticalBorders=freeVerticalSpace>0?2:1; + var o=outlineElements; + var style; + style=o.fbOutlineT.style; + style.top=top-border+"px"; + style.left=left+"px"; + style.height=border+"px"; + style.width=width+"px"; + style=o.fbOutlineL.style; + style.top=top-border+"px"; + style.left=left-border+"px"; + style.height=height+numVerticalBorders*border+"px"; + style.width=border+"px"; + style=o.fbOutlineB.style; + if(freeVerticalSpace>0){style.top=top+height+"px"; + style.left=left+"px"; + style.width=width+"px" + }else{style.top=-2*border+"px"; + style.left=-2*border+"px"; + style.width=border+"px" + }style=o.fbOutlineR.style; + if(freeHorizontalSpace>0){style.top=top-border+"px"; + style.left=left+width+"px"; + style.height=height+numVerticalBorders*border+"px"; + style.width=(freeHorizontalSpacescrollPosition.top+windowSize.height-offsetHeight||box.left>scrollPosition.left+windowSize.width||scrollPosition.top>box.top+box.height||scrollPosition.left>box.left+box.width){return + }var top=box.top; + var left=box.left; + var height=box.height; + var width=box.width; + var margin=Firebug.browser.getMeasurementBox(el,"margin"); + var padding=Firebug.browser.getMeasurementBox(el,"padding"); + var border=Firebug.browser.getMeasurementBox(el,"border"); + boxModelStyle.top=top-margin.top+"px"; + boxModelStyle.left=left-margin.left+"px"; + boxModelStyle.height=height+margin.top+margin.bottom+"px"; + boxModelStyle.width=width+margin.left+margin.right+"px"; + boxBorderStyle.top=margin.top+"px"; + boxBorderStyle.left=margin.left+"px"; + boxBorderStyle.height=height+"px"; + boxBorderStyle.width=width+"px"; + boxPaddingStyle.top=margin.top+border.top+"px"; + boxPaddingStyle.left=margin.left+border.left+"px"; + boxPaddingStyle.height=height-border.top-border.bottom+"px"; + boxPaddingStyle.width=width-border.left-border.right+"px"; + boxContentStyle.top=margin.top+border.top+padding.top+"px"; + boxContentStyle.left=margin.left+border.left+padding.left+"px"; + boxContentStyle.height=height-border.top-padding.top-padding.bottom-border.bottom+"px"; + boxContentStyle.width=width-border.left-padding.left-padding.right-border.right+"px"; + if(!boxModelVisible){this.showBoxModel() + }},hideBoxModel:function(){if(!boxModelVisible){return + }offlineFragment.appendChild(boxModel); + boxModelVisible=false + },showBoxModel:function(){if(boxModelVisible){return + }if(outlineVisible){this.hideOutline() + }Firebug.browser.document.getElementsByTagName("body")[0].appendChild(boxModel); + boxModelVisible=true + }}; + var offlineFragment=null; + var boxModelVisible=false; + var boxModel,boxModelStyle,boxMargin,boxMarginStyle,boxBorder,boxBorderStyle,boxPadding,boxPaddingStyle,boxContent,boxContentStyle; + var resetStyle="margin:0; padding:0; border:0; position:absolute; overflow:hidden; display:block;"; + var offscreenStyle=resetStyle+"top:-1234px; left:-1234px;"; + var inspectStyle=resetStyle+"z-index: 2147483500;"; + var inspectFrameStyle=resetStyle+"z-index: 2147483550; top:0; left:0; background:url("+Env.Location.skinDir+"pixel_transparent.gif);"; + var inspectModelOpacity=isIE?"filter:alpha(opacity=80);":"opacity:0.8;"; + var inspectModelStyle=inspectStyle+inspectModelOpacity; + var inspectMarginStyle=inspectStyle+"background: #EDFF64; height:100%; width:100%;"; + var inspectBorderStyle=inspectStyle+"background: #666;"; + var inspectPaddingStyle=inspectStyle+"background: SlateBlue;"; + var inspectContentStyle=inspectStyle+"background: SkyBlue;"; + var outlineStyle={fbHorizontalLine:"background: #3875D7;height: 2px;",fbVerticalLine:"background: #3875D7;width: 2px;"}; + var lastInspecting=0; + var fbInspectFrame=null; + var outlineVisible=false; + var outlineElements={}; + var outline={fbOutlineT:"fbHorizontalLine",fbOutlineL:"fbVerticalLine",fbOutlineB:"fbHorizontalLine",fbOutlineR:"fbVerticalLine"}; + var getInspectingTarget=function(){}; + var createInspectorFrame=function createInspectorFrame(){fbInspectFrame=createGlobalElement("div"); + fbInspectFrame.id="fbInspectFrame"; + fbInspectFrame.firebugIgnore=true; + fbInspectFrame.style.cssText=inspectFrameStyle; + Firebug.browser.document.getElementsByTagName("body")[0].appendChild(fbInspectFrame) + }; + var destroyInspectorFrame=function destroyInspectorFrame(){if(fbInspectFrame){Firebug.browser.document.getElementsByTagName("body")[0].removeChild(fbInspectFrame); + fbInspectFrame=null + }}; + var createOutlineInspector=function createOutlineInspector(){for(var name in outline){var el=outlineElements[name]=createGlobalElement("div"); + el.id=name; + el.firebugIgnore=true; + el.style.cssText=inspectStyle+outlineStyle[outline[name]]; + offlineFragment.appendChild(el) + }}; + var destroyOutlineInspector=function destroyOutlineInspector(){for(var name in outline){var el=outlineElements[name]; + el.parentNode.removeChild(el) + }}; + var createBoxModelInspector=function createBoxModelInspector(){boxModel=createGlobalElement("div"); + boxModel.id="fbBoxModel"; + boxModel.firebugIgnore=true; + boxModelStyle=boxModel.style; + boxModelStyle.cssText=inspectModelStyle; + boxMargin=createGlobalElement("div"); + boxMargin.id="fbBoxMargin"; + boxMarginStyle=boxMargin.style; + boxMarginStyle.cssText=inspectMarginStyle; + boxModel.appendChild(boxMargin); + boxBorder=createGlobalElement("div"); + boxBorder.id="fbBoxBorder"; + boxBorderStyle=boxBorder.style; + boxBorderStyle.cssText=inspectBorderStyle; + boxModel.appendChild(boxBorder); + boxPadding=createGlobalElement("div"); + boxPadding.id="fbBoxPadding"; + boxPaddingStyle=boxPadding.style; + boxPaddingStyle.cssText=inspectPaddingStyle; + boxModel.appendChild(boxPadding); + boxContent=createGlobalElement("div"); + boxContent.id="fbBoxContent"; + boxContentStyle=boxContent.style; + boxContentStyle.cssText=inspectContentStyle; + boxModel.appendChild(boxContent); + offlineFragment.appendChild(boxModel) + }; + var destroyBoxModelInspector=function destroyBoxModelInspector(){boxModel.parentNode.removeChild(boxModel) + } + }}); + FBL.ns(function(){with(FBL){var consoleQueue=[]; + var lastHighlightedObject; + var FirebugContext=Env.browser; + var maxQueueRequests=500; + Firebug.ConsoleBase={log:function(object,context,className,rep,noThrottle,sourceLink){return this.logRow(appendObject,object,context,className,rep,sourceLink,noThrottle) + },logFormatted:function(objects,context,className,noThrottle,sourceLink){return this.logRow(appendFormatted,objects,context,className,null,sourceLink,noThrottle) + },openGroup:function(objects,context,className,rep,noThrottle,sourceLink,noPush){return this.logRow(appendOpenGroup,objects,context,className,rep,sourceLink,noThrottle) + },closeGroup:function(context,noThrottle){return this.logRow(appendCloseGroup,null,context,null,null,null,noThrottle,true) + },logRow:function(appender,objects,context,className,rep,sourceLink,noThrottle,noRow){noThrottle=true; + if(!context){context=FirebugContext + }if(FBTrace.DBG_ERRORS&&!context){FBTrace.sysout("Console.logRow has no context, skipping objects",objects) + }if(!context){return + }if(noThrottle||!context){var panel=this.getPanel(context); + if(panel){var row=panel.append(appender,objects,className,rep,sourceLink,noRow); + var container=panel.panelNode; + return row + }else{consoleQueue.push([appender,objects,context,className,rep,sourceLink,noThrottle,noRow]) + }}else{if(!context.throttle){return + }var args=[appender,objects,context,className,rep,sourceLink,true,noRow]; + context.throttle(this.logRow,this,args) + }},appendFormatted:function(args,row,context){if(!context){context=FirebugContext + }var panel=this.getPanel(context); + panel.appendFormatted(args,row) + },clear:function(context){if(!context){context=Firebug.context + }var panel=this.getPanel(context,true); + if(panel){panel.clear() + }},getPanel:function(context,noCreate){return Firebug.chrome?Firebug.chrome.getPanel("Console"):null + }}; + var ActivableConsole=extend(Firebug.ConsoleBase,{isAlwaysEnabled:function(){return true + }}); + Firebug.Console=Firebug.Console=extend(ActivableConsole,{dispatchName:"console",error:function(){Firebug.Console.logFormatted(arguments,Firebug.browser,"error") + },flush:function(){for(var i=0,length=consoleQueue.length; + iobjects.length){format=""; + objIndex=-1; + parts.length=0; + break + }}}for(var i=0; + i1){traceRecursion--; + return + }var frames=[]; + for(var fn=arguments.callee.caller.caller; + fn; + fn=fn.caller){if(wasVisited(fn)){break + }var args=[]; + for(var i=0,l=fn.arguments.length; + i1){objects=[errorObject]; + for(var i=1; + i0)){var oldest=frames.length-1; + for(var i=0; + i0&&commandHistory.length>0){this.element.value=commandHistory[--commandPointer] + }},nextCommand:function(){var element=this.element; + var limit=commandHistory.length-1; + var i=commandPointer; + if(i=0&&i',msg,"",'"] + },onKeyDown:function(e){e=e||event; + var code=e.keyCode; + if(code!=9&&code!=16&&code!=17&&code!=18){isAutoCompleting=false + }if(code==13){this.enter(); + this.clear() + }else{if(code==27){setTimeout(this.clear,0) + }else{if(code==38){this.prevCommand() + }else{if(code==40){this.nextCommand() + }else{if(code==9){this.autocomplete(e.shiftKey) + }else{return + }}}}}cancelEvent(e,true); + return false + },onMultiLineKeyDown:function(e){e=e||event; + var code=e.keyCode; + if(code==13&&e.ctrlKey){this.enter() + }}}); + Firebug.registerModule(Firebug.CommandLine); + function getExpressionOffset(command){var bracketCount=0; + var start=command.length-1; + for(; + start>=0; + --start){var c=command[start]; + if((c==","||c==";"||c==" ")&&!bracketCount){break + }if(reOpenBracket.test(c)){if(bracketCount){--bracketCount + }else{break + }}else{if(reCloseBracket.test(c)){++bracketCount + }}}return start+1 + }var CommandLineAPI={$:function(id){return Firebug.browser.document.getElementById(id) + },$$:function(selector,context){context=context||Firebug.browser.document; + return Firebug.Selector?Firebug.Selector(selector,context):Firebug.Console.error("Firebug.Selector module not loaded.") + },$0:null,$1:null,dir:function(o){Firebug.Console.log(o,Firebug.context,"dir",Firebug.DOMPanel.DirTable) + },dirxml:function(o){if(instanceOf(o,"Window")){o=o.document.documentElement + }else{if(instanceOf(o,"Document")){o=o.documentElement + }}Firebug.Console.log(o,Firebug.context,"dirxml",Firebug.HTMLPanel.SoloElement) + }}; + var defineCommandLineAPI=function defineCommandLineAPI(){Firebug.CommandLine.API={}; + for(var m in CommandLineAPI){if(!Env.browser.window[m]){Firebug.CommandLine.API[m]=CommandLineAPI[m] + }}var stack=FirebugChrome.htmlSelectionStack; + if(stack){Firebug.CommandLine.API.$0=stack[0]; + Firebug.CommandLine.API.$1=stack[1] + }} + }}); + (function(){with(FBL){var XHRSpy=function(){this.requestHeaders=[]; + this.responseHeaders=[] + }; + XHRSpy.prototype={method:null,url:null,async:null,xhrRequest:null,href:null,loaded:false,logRow:null,responseText:null,requestHeaders:null,responseHeaders:null,sourceLink:null,getURL:function(){return this.href + }}; + var XMLHttpRequestWrapper=function(activeXObject){var xhrRequest=typeof activeXObject!="undefined"?activeXObject:new _XMLHttpRequest(),spy=new XHRSpy(),self=this,reqType,reqUrl,reqStartTS; + var updateSelfPropertiesIgnore={abort:1,channel:1,getAllResponseHeaders:1,getInterface:1,getResponseHeader:1,mozBackgroundRequest:1,multipart:1,onreadystatechange:1,open:1,send:1,setRequestHeader:1}; + var updateSelfProperties=function(){for(var propName in xhrRequest){if(propName in updateSelfPropertiesIgnore){continue + }try{var propValue=xhrRequest[propName]; + if(propValue&&!isFunction(propValue)){self[propName]=propValue + }}catch(E){}}}; + var updateXHRPropertiesIgnore={channel:1,onreadystatechange:1,readyState:1,responseBody:1,responseText:1,responseXML:1,status:1,statusText:1,upload:1}; + var updateXHRProperties=function(){for(var propName in self){if(propName in updateXHRPropertiesIgnore){continue + }try{var propValue=self[propName]; + if(propValue&&!xhrRequest[propName]){xhrRequest[propName]=propValue + }}catch(E){}}}; + var logXHR=function(){var row=Firebug.Console.log(spy,null,"spy",Firebug.Spy.XHR); + if(row){setClass(row,"loading"); + spy.logRow=row + }}; + var finishXHR=function(){var duration=new Date().getTime()-reqStartTS; + var success=xhrRequest.status==200; + var responseHeadersText=xhrRequest.getAllResponseHeaders(); + var responses=responseHeadersText?responseHeadersText.split(/[\n\r]/):[]; + var reHeader=/^(\S+):\s*(.*)/; + for(var i=0,l=responses.length; + ilimit){name=name.substr(0,limit)+"..." + }return name + },getParamTitle:function(param){var limit=25; + var name=param.name; + if(name.length>limit){return name + }return"" + },hideParams:function(file){return !file.urlParams||!file.urlParams.length + },hidePost:function(file){return file.method.toUpperCase()!="POST" + },hidePut:function(file){return file.method.toUpperCase()!="PUT" + },hideResponse:function(file){return false + },hideCache:function(file){return true; + return !file.cacheEntry + },hideHtml:function(file){return(file.mimeType!="text/html")&&(file.mimeType!="application/xhtml+xml") + },onClickTab:function(event){this.selectTab(event.currentTarget||event.srcElement) + },getParamValueIterator:function(param){return param.value; + return wrapText(param.value,true) + },appendTab:function(netInfoBox,tabId,tabTitle){var args={tabId:tabId,tabTitle:tabTitle}; + this.customTab.append(args,$$(".netInfoTabs",netInfoBox)[0]); + this.customBody.append(args,$$(".netInfoBodies",netInfoBox)[0]) + },selectTabByName:function(netInfoBox,tabName){var tab=getChildByClass(netInfoBox,"netInfoTabs","netInfo"+tabName+"Tab"); + if(tab){this.selectTab(tab) + }},selectTab:function(tab){var view=tab.getAttribute("view"); + var netInfoBox=getAncestorByClass(tab,"netInfoBody"); + var selectedTab=netInfoBox.selectedTab; + if(selectedTab){removeClass(netInfoBox.selectedText,"netInfoTextSelected"); + removeClass(selectedTab,"netInfoTabSelected"); + selectedTab.setAttribute("aria-selected","false") + }var textBodyName="netInfo"+view+"Text"; + selectedTab=netInfoBox.selectedTab=tab; + netInfoBox.selectedText=$$("."+textBodyName,netInfoBox)[0]; + setClass(netInfoBox.selectedText,"netInfoTextSelected"); + setClass(selectedTab,"netInfoTabSelected"); + selectedTab.setAttribute("selected","true"); + selectedTab.setAttribute("aria-selected","true"); + var file=Firebug.getRepObject(netInfoBox); + var context=Firebug.chrome; + this.updateInfo(netInfoBox,file,context) + },updateInfo:function(netInfoBox,file,context){if(FBTrace.DBG_NET){FBTrace.sysout("net.updateInfo; file",file) + }if(!netInfoBox){if(FBTrace.DBG_NET||FBTrace.DBG_ERRORS){FBTrace.sysout("net.updateInfo; ERROR netInfo == null "+file.href,file) + }return + }var tab=netInfoBox.selectedTab; + if(hasClass(tab,"netInfoParamsTab")){if(file.urlParams&&!netInfoBox.urlParamsPresented){netInfoBox.urlParamsPresented=true; + this.insertHeaderRows(netInfoBox,file.urlParams,"Params") + }}else{if(hasClass(tab,"netInfoHeadersTab")){var headersText=$$(".netInfoHeadersText",netInfoBox)[0]; + if(file.responseHeaders&&!netInfoBox.responseHeadersPresented){netInfoBox.responseHeadersPresented=true; + NetInfoHeaders.renderHeaders(headersText,file.responseHeaders,"ResponseHeaders") + }if(file.requestHeaders&&!netInfoBox.requestHeadersPresented){netInfoBox.requestHeadersPresented=true; + NetInfoHeaders.renderHeaders(headersText,file.requestHeaders,"RequestHeaders") + }}else{if(hasClass(tab,"netInfoPostTab")){if(!netInfoBox.postPresented){netInfoBox.postPresented=true; + var postText=$$(".netInfoPostText",netInfoBox)[0]; + NetInfoPostData.render(context,postText,file) + }}else{if(hasClass(tab,"netInfoPutTab")){if(!netInfoBox.putPresented){netInfoBox.putPresented=true; + var putText=$$(".netInfoPutText",netInfoBox)[0]; + NetInfoPostData.render(context,putText,file) + }}else{if(hasClass(tab,"netInfoResponseTab")&&file.loaded&&!netInfoBox.responsePresented){var responseTextBox=$$(".netInfoResponseText",netInfoBox)[0]; + if(file.category=="image"){netInfoBox.responsePresented=true; + var responseImage=netInfoBox.ownerDocument.createElement("img"); + responseImage.src=file.href; + clearNode(responseTextBox); + responseTextBox.appendChild(responseImage,responseTextBox) + }else{this.setResponseText(file,netInfoBox,responseTextBox,context) + }}else{if(hasClass(tab,"netInfoCacheTab")&&file.loaded&&!netInfoBox.cachePresented){var responseTextBox=netInfoBox.getElementsByClassName("netInfoCacheText").item(0); + if(file.cacheEntry){netInfoBox.cachePresented=true; + this.insertHeaderRows(netInfoBox,file.cacheEntry,"Cache") + }}else{if(hasClass(tab,"netInfoHtmlTab")&&file.loaded&&!netInfoBox.htmlPresented){netInfoBox.htmlPresented=true; + var text=Utils.getResponseText(file,context); + var iframe=$$(".netInfoHtmlPreview",netInfoBox)[0]; + var reScript=//gi; + text=text.replace(reScript,""); + iframe.contentWindow.document.write(text); + iframe.contentWindow.document.close() + }}}}}}}dispatch(NetInfoBody.fbListeners,"updateTabBody",[netInfoBox,file,context]) + },setResponseText:function(file,netInfoBox,responseTextBox,context){netInfoBox.responsePresented=true; + if(isIE){responseTextBox.style.whiteSpace="nowrap" + }responseTextBox[typeof responseTextBox.textContent!="undefined"?"textContent":"innerText"]=file.responseText; + return; + var text=Utils.getResponseText(file,context); + var limit=Firebug.netDisplayedResponseLimit+15; + var limitReached=text?(text.length>limit):false; + if(limitReached){text=text.substr(0,limit)+"..." + }if(text){insertWrappedText(text,responseTextBox) + }else{insertWrappedText("",responseTextBox) + }if(limitReached){var object={text:$STR("net.responseSizeLimitMessage"),onClickLink:function(){var panel=context.getPanel("net",true); + panel.openResponseInTab(file) + }}; + Firebug.NetMonitor.ResponseSizeLimit.append(object,responseTextBox) + }netInfoBox.responsePresented=true; + if(FBTrace.DBG_NET){FBTrace.sysout("net.setResponseText; response text updated") + }},insertHeaderRows:function(netInfoBox,headers,tableName,rowName){if(!headers.length){return + }var headersTable=$$(".netInfo"+tableName+"Table",netInfoBox)[0]; + var tbody=getChildByClass(headersTable,"netInfo"+rowName+"Body"); + if(!tbody){tbody=headersTable.firstChild + }var titleRow=getChildByClass(tbody,"netInfo"+rowName+"Title"); + this.headerDataTag.insertRows({headers:headers},titleRow?titleRow:tbody); + removeClass(titleRow,"collapsed") + }}); + var NetInfoBody=Firebug.NetMonitor.NetInfoBody; + Firebug.NetMonitor.NetInfoHeaders=domplate(Firebug.Rep,{tag:DIV({"class":"netInfoHeadersTable",role:"tabpanel"},DIV({"class":"netInfoHeadersGroup netInfoResponseHeadersTitle"},SPAN($STR("ResponseHeaders")),SPAN({"class":"netHeadersViewSource response collapsed",onclick:"$onViewSource",_sourceDisplayed:false,_rowName:"ResponseHeaders"},$STR("net.headers.view source"))),TABLE({cellpadding:0,cellspacing:0},TBODY({"class":"netInfoResponseHeadersBody",role:"list","aria-label":$STR("ResponseHeaders")})),DIV({"class":"netInfoHeadersGroup netInfoRequestHeadersTitle"},SPAN($STR("RequestHeaders")),SPAN({"class":"netHeadersViewSource request collapsed",onclick:"$onViewSource",_sourceDisplayed:false,_rowName:"RequestHeaders"},$STR("net.headers.view source"))),TABLE({cellpadding:0,cellspacing:0},TBODY({"class":"netInfoRequestHeadersBody",role:"list","aria-label":$STR("RequestHeaders")}))),sourceTag:TR({role:"presentation"},TD({colspan:2,role:"presentation"},PRE({"class":"source"}))),onViewSource:function(event){var target=event.target; + var requestHeaders=(target.rowName=="RequestHeaders"); + var netInfoBox=getAncestorByClass(target,"netInfoBody"); + var file=netInfoBox.repObject; + if(target.sourceDisplayed){var headers=requestHeaders?file.requestHeaders:file.responseHeaders; + this.insertHeaderRows(netInfoBox,headers,target.rowName); + target.innerHTML=$STR("net.headers.view source") + }else{var source=requestHeaders?file.requestHeadersText:file.responseHeadersText; + this.insertSource(netInfoBox,source,target.rowName); + target.innerHTML=$STR("net.headers.pretty print") + }target.sourceDisplayed=!target.sourceDisplayed; + cancelEvent(event) + },insertSource:function(netInfoBox,source,rowName){var tbody=$$(".netInfo"+rowName+"Body",netInfoBox)[0]; + var node=this.sourceTag.replace({},tbody); + var sourceNode=$$(".source",node)[0]; + sourceNode.innerHTML=source + },insertHeaderRows:function(netInfoBox,headers,rowName){var headersTable=$$(".netInfoHeadersTable",netInfoBox)[0]; + var tbody=$$(".netInfo"+rowName+"Body",headersTable)[0]; + clearNode(tbody); + if(!headers.length){return + }NetInfoBody.headerDataTag.insertRows({headers:headers},tbody); + var titleRow=getChildByClass(headersTable,"netInfo"+rowName+"Title"); + removeClass(titleRow,"collapsed") + },init:function(parent){var rootNode=this.tag.append({},parent); + var netInfoBox=getAncestorByClass(parent,"netInfoBody"); + var file=netInfoBox.repObject; + var viewSource; + viewSource=$$(".request",rootNode)[0]; + if(file.requestHeadersText){removeClass(viewSource,"collapsed") + }viewSource=$$(".response",rootNode)[0]; + if(file.responseHeadersText){removeClass(viewSource,"collapsed") + }},renderHeaders:function(parent,headers,rowName){if(!parent.firstChild){this.init(parent) + }this.insertHeaderRows(parent,headers,rowName) + }}); + var NetInfoHeaders=Firebug.NetMonitor.NetInfoHeaders; + Firebug.NetMonitor.NetInfoPostData=domplate(Firebug.Rep,{paramsTable:TABLE({"class":"netInfoPostParamsTable",cellpadding:0,cellspacing:0,role:"presentation"},TBODY({role:"list","aria-label":$STR("net.label.Parameters")},TR({"class":"netInfoPostParamsTitle",role:"presentation"},TD({colspan:3,role:"presentation"},DIV({"class":"netInfoPostParams"},$STR("net.label.Parameters"),SPAN({"class":"netInfoPostContentType"},"application/x-www-form-urlencoded")))))),partsTable:TABLE({"class":"netInfoPostPartsTable",cellpadding:0,cellspacing:0,role:"presentation"},TBODY({role:"list","aria-label":$STR("net.label.Parts")},TR({"class":"netInfoPostPartsTitle",role:"presentation"},TD({colspan:2,role:"presentation"},DIV({"class":"netInfoPostParams"},$STR("net.label.Parts"),SPAN({"class":"netInfoPostContentType"},"multipart/form-data")))))),jsonTable:TABLE({"class":"netInfoPostJSONTable",cellpadding:0,cellspacing:0,role:"presentation"},TBODY({role:"list","aria-label":$STR("JSON")},TR({"class":"netInfoPostJSONTitle",role:"presentation"},TD({role:"presentation"},DIV({"class":"netInfoPostParams"},$STR("JSON")))),TR(TD({"class":"netInfoPostJSONBody"})))),xmlTable:TABLE({"class":"netInfoPostXMLTable",cellpadding:0,cellspacing:0,role:"presentation"},TBODY({role:"list","aria-label":$STR("xmlviewer.tab.XML")},TR({"class":"netInfoPostXMLTitle",role:"presentation"},TD({role:"presentation"},DIV({"class":"netInfoPostParams"},$STR("xmlviewer.tab.XML")))),TR(TD({"class":"netInfoPostXMLBody"})))),sourceTable:TABLE({"class":"netInfoPostSourceTable",cellpadding:0,cellspacing:0,role:"presentation"},TBODY({role:"list","aria-label":$STR("net.label.Source")},TR({"class":"netInfoPostSourceTitle",role:"presentation"},TD({colspan:2,role:"presentation"},DIV({"class":"netInfoPostSource"},$STR("net.label.Source")))))),sourceBodyTag:TR({role:"presentation"},TD({colspan:2,role:"presentation"},FOR("line","$param|getParamValueIterator",CODE({"class":"focusRow subFocusRow",role:"listitem"},"$line")))),getParamValueIterator:function(param){return NetInfoBody.getParamValueIterator(param) + },render:function(context,parentNode,file){var spy=getAncestorByClass(parentNode,"spyHead"); + var spyObject=spy.repObject; + var data=spyObject.data; + var contentType=file.mimeType; + if(contentType&&contentType=="application/x-www-form-urlencoded"||data&&data.indexOf("=")!=-1){var params=parseURLEncodedTextArray(data); + if(params){this.insertParameters(parentNode,params) + }}var jsonData={responseText:data}; + if(Firebug.JSONViewerModel.isJSON(contentType,data)){this.insertJSON(parentNode,jsonData,context) + }var postText=data; + if(postText){this.insertSource(parentNode,postText) + }},insertParameters:function(parentNode,params){if(!params||!params.length){return + }var paramTable=this.paramsTable.append({object:{}},parentNode); + var row=$$(".netInfoPostParamsTitle",paramTable)[0]; + var tbody=paramTable.getElementsByTagName("tbody")[0]; + NetInfoBody.headerDataTag.insertRows({headers:params},row) + },insertParts:function(parentNode,data){if(!data.params||!data.params.length){return + }var partsTable=this.partsTable.append({object:{}},parentNode); + var row=$$(".netInfoPostPartsTitle",paramTable)[0]; + NetInfoBody.headerDataTag.insertRows({headers:data.params},row) + },insertJSON:function(parentNode,file,context){var text=file.responseText; + var data=parseJSONString(text); + if(!data){return + }var jsonTable=this.jsonTable.append({},parentNode); + var jsonBody=$$(".netInfoPostJSONBody",jsonTable)[0]; + if(!this.toggles){this.toggles={} + }Firebug.DOMPanel.DirTable.tag.replace({object:data,toggles:this.toggles},jsonBody) + },insertXML:function(parentNode,file,context){var text=Utils.getPostText(file,context); + var jsonTable=this.xmlTable.append(null,parentNode); + var jsonBody=$$(".netInfoPostXMLBody",jsonTable)[0]; + Firebug.XMLViewerModel.insertXML(jsonBody,text) + },insertSource:function(parentNode,text){var sourceTable=this.sourceTable.append({object:{}},parentNode); + var row=$$(".netInfoPostSourceTitle",sourceTable)[0]; + var param={value:[text]}; + this.sourceBodyTag.insertRows({param:param},row) + },parseMultiPartText:function(file,context){var text=Utils.getPostText(file,context); + if(text==undefined){return null + }FBTrace.sysout("net.parseMultiPartText; boundary: ",text); + var boundary=text.match(/\s*boundary=\s*(.*)/)[1]; + var divider="\r\n\r\n"; + var bodyStart=text.indexOf(divider); + var body=text.substr(bodyStart+divider.length); + var postData={}; + postData.mimeType="multipart/form-data"; + postData.params=[]; + var parts=body.split("--"+boundary); + for(var i=0; + i1)?m[1]:"",value:trim(part[1])}) + }return postData + }}); + var NetInfoPostData=Firebug.NetMonitor.NetInfoPostData; + var $STRP=function(a){return a + }; + Firebug.NetMonitor.NetLimit=domplate(Firebug.Rep,{collapsed:true,tableTag:DIV(TABLE({width:"100%",cellpadding:0,cellspacing:0},TBODY())),limitTag:TR({"class":"netRow netLimitRow",$collapsed:"$isCollapsed"},TD({"class":"netCol netLimitCol",colspan:6},TABLE({cellpadding:0,cellspacing:0},TBODY(TR(TD(SPAN({"class":"netLimitLabel"},$STRP("plural.Limit_Exceeded",[0]))),TD({style:"width:100%"}),TD(BUTTON({"class":"netLimitButton",title:"$limitPrefsTitle",onclick:"$onPreferences"},$STR("LimitPrefs"))),TD(" ")))))),isCollapsed:function(){return this.collapsed + },onPreferences:function(event){openNewTab("about:config") + },updateCounter:function(row){removeClass(row,"collapsed"); + var limitLabel=row.getElementsByClassName("netLimitLabel").item(0); + limitLabel.firstChild.nodeValue=$STRP("plural.Limit_Exceeded",[row.limitInfo.totalCount]) + },createTable:function(parent,limitInfo){var table=this.tableTag.replace({},parent); + var row=this.createRow(table.firstChild.firstChild,limitInfo); + return[table,row] + },createRow:function(parent,limitInfo){var row=this.limitTag.insertRows(limitInfo,parent,this)[0]; + row.limitInfo=limitInfo; + return row + },observe:function(subject,topic,data){if(topic!="nsPref:changed"){return + }if(data.indexOf("net.logLimit")!=-1){this.updateMaxLimit() + }},updateMaxLimit:function(){var value=Firebug.getPref(Firebug.prefDomain,"net.logLimit"); + maxQueueRequests=value?value:maxQueueRequests + }}); + var NetLimit=Firebug.NetMonitor.NetLimit; + Firebug.NetMonitor.ResponseSizeLimit=domplate(Firebug.Rep,{tag:DIV({"class":"netInfoResponseSizeLimit"},SPAN("$object.beforeLink"),A({"class":"objectLink",onclick:"$onClickLink"},"$object.linkText"),SPAN("$object.afterLink")),reLink:/^(.*)(.*)<\/a>(.*$)/,append:function(obj,parent){var m=obj.text.match(this.reLink); + return this.tag.append({onClickLink:obj.onClickLink,object:{beforeLink:m[1],linkText:m[2],afterLink:m[3]}},parent,this) + }}); + Firebug.NetMonitor.Utils={findHeader:function(headers,name){if(!headers){return null + }name=name.toLowerCase(); + for(var i=0; + ilimit&&!noLimit){return cropString(file.postText,limit,"\n\n... "+$STR("net.postDataSizeLimitMessage")+" ...\n\n") + }return file.postText + },getResponseText:function(file,context){return(typeof(file.responseText)!="undefined")?file.responseText:context.sourceCache.loadText(file.href,file.method,file) + },isURLEncodedRequest:function(file,context){var text=Utils.getPostText(file,context); + if(text&&text.toLowerCase().indexOf("content-type: application/x-www-form-urlencoded")==0){return true + }var headerValue=Utils.findHeader(file.requestHeaders,"content-type"); + if(headerValue&&headerValue.indexOf("application/x-www-form-urlencoded")==0){return true + }return false + },isMultiPartRequest:function(file,context){var text=Utils.getPostText(file,context); + if(text&&text.toLowerCase().indexOf("content-type: multipart/form-data")==0){return true + }return false + },getMimeType:function(mimeType,uri){if(!mimeType||!(mimeCategoryMap.hasOwnProperty(mimeType))){var ext=getFileExtension(uri); + if(!ext){return mimeType + }else{var extMimeType=mimeExtensionMap[ext.toLowerCase()]; + return extMimeType?extMimeType:mimeType + }}else{return mimeType + }},getDateFromSeconds:function(s){var d=new Date(); + d.setTime(s*1000); + return d + },getHttpHeaders:function(request,file){try{var http=QI(request,Ci.nsIHttpChannel); + file.status=request.responseStatus; + file.method=http.requestMethod; + file.urlParams=parseURLParams(file.href); + file.mimeType=Utils.getMimeType(request.contentType,request.name); + if(!file.responseHeaders&&Firebug.collectHttpHeaders){var requestHeaders=[],responseHeaders=[]; + http.visitRequestHeaders({visitHeader:function(name,value){requestHeaders.push({name:name,value:value}) + }}); + http.visitResponseHeaders({visitHeader:function(name,value){responseHeaders.push({name:name,value:value}) + }}); + file.requestHeaders=requestHeaders; + file.responseHeaders=responseHeaders + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("net.getHttpHeaders FAILS "+file.href,exc) + }}},isXHR:function(request){try{var callbacks=request.notificationCallbacks; + var xhrRequest=callbacks?callbacks.getInterface(Ci.nsIXMLHttpRequest):null; + if(FBTrace.DBG_NET){FBTrace.sysout("net.isXHR; "+(xhrRequest!=null)+", "+safeGetName(request)) + }return(xhrRequest!=null) + }catch(exc){}return false + },getFileCategory:function(file){if(file.category){if(FBTrace.DBG_NET){FBTrace.sysout("net.getFileCategory; current: "+file.category+" for: "+file.href,file) + }return file.category + }if(file.isXHR){if(FBTrace.DBG_NET){FBTrace.sysout("net.getFileCategory; XHR for: "+file.href,file) + }return file.category="xhr" + }if(!file.mimeType){var ext=getFileExtension(file.href); + if(ext){file.mimeType=mimeExtensionMap[ext.toLowerCase()] + }}if(!file.mimeType){return"" + }var mimeType=file.mimeType; + if(mimeType){mimeType=mimeType.split(";")[0] + }return(file.category=mimeCategoryMap[mimeType]) + }}; + var Utils=Firebug.NetMonitor.Utils; + Firebug.registerModule(Firebug.NetMonitor) + }}); + FBL.ns(function(){with(FBL){var contexts=[]; + Firebug.Spy=extend(Firebug.Module,{dispatchName:"spy",initialize:function(){if(Firebug.TraceModule){Firebug.TraceModule.addListener(this.TraceListener) + }Firebug.Module.initialize.apply(this,arguments) + },shutdown:function(){Firebug.Module.shutdown.apply(this,arguments); + if(Firebug.TraceModule){Firebug.TraceModule.removeListener(this.TraceListener) + }},initContext:function(context){context.spies=[]; + if(Firebug.showXMLHttpRequests&&Firebug.Console.isAlwaysEnabled()){this.attachObserver(context,context.window) + }if(FBTrace.DBG_SPY){FBTrace.sysout("spy.initContext "+contexts.length+" ",context.getName()) + }},destroyContext:function(context){this.detachObserver(context,null); + if(FBTrace.DBG_SPY&&context.spies.length){FBTrace.sysout("spy.destroyContext; ERROR There are leaking Spies ("+context.spies.length+") "+context.getName()) + }delete context.spies; + if(FBTrace.DBG_SPY){FBTrace.sysout("spy.destroyContext "+contexts.length+" ",context.getName()) + }},watchWindow:function(context,win){if(Firebug.showXMLHttpRequests&&Firebug.Console.isAlwaysEnabled()){this.attachObserver(context,win) + }},unwatchWindow:function(context,win){try{this.detachObserver(context,win) + }catch(ex){ERROR(ex) + }},updateOption:function(name,value){if(name=="showXMLHttpRequests"){var tach=value?this.attachObserver:this.detachObserver; + for(var i=0; + i\s*/,""); + var div=parentNode.ownerDocument.createElement("div"); + div.innerHTML=xmlText; + var root=div.getElementsByTagName("*")[0]; + if(FBTrace.DBG_XMLVIEWER){FBTrace.sysout("xmlviewer.updateTabBody; XML response parsed",doc) + }var html=[]; + Firebug.Reps.appendNode(root,html); + parentNode.innerHTML=html.join("") + }}); + Firebug.XMLViewerModel.ParseError=domplate(Firebug.Rep,{tag:DIV({"class":"xmlInfoError"},DIV({"class":"xmlInfoErrorMsg"},"$error.message"),PRE({"class":"xmlInfoErrorSource"},"$error|getSource")),getSource:function(error){var parts=error.source.split("\n"); + if(parts.length!=2){return error.source + }var limit=50; + var column=parts[1].length; + if(column>=limit){parts[0]="..."+parts[0].substr(column-limit); + parts[1]="..."+parts[1].substr(column-limit) + }if(parts[0].length>80){parts[0]=parts[0].substr(0,80)+"..." + }return parts.join("\n") + }}); + Firebug.registerModule(Firebug.XMLViewerModel) + }}); + FBL.ns(function(){with(FBL){var ElementCache=Firebug.Lite.Cache.Element; + var cacheID=Firebug.Lite.Cache.ID; + var ignoreHTMLProps={sizcache:1,sizset:1}; + ignoreHTMLProps[cacheID]=1; + Firebug.HTML=extend(Firebug.Module,{appendTreeNode:function(nodeArray,html){var reTrim=/^\s+|\s+$/g; + if(!nodeArray.length){nodeArray=[nodeArray] + }for(var n=0,node; + node=nodeArray[n]; + n++){if(node.nodeType==1){if(Firebug.ignoreFirebugElements&&node.firebugIgnore){continue + }var uid=ElementCache(node); + var child=node.childNodes; + var childLength=child.length; + var nodeName=node.nodeName.toLowerCase(); + var nodeVisible=isVisible(node); + var hasSingleTextChild=childLength==1&&node.firstChild.nodeType==3&&nodeName!="script"&&nodeName!="style"; + var nodeControl=!hasSingleTextChild&&childLength>0?('
'):""; + var isIE=false; + if(isIE&&nodeControl){html.push(nodeControl) + }if(typeof uid!="undefined"){html.push('
',!isIE&&nodeControl?nodeControl:"","<',nodeName,"") + }else{html.push('
<',nodeName,"") + }for(var i=0; + i',name,'="',escapeHTML(value),""") + }if(hasSingleTextChild){var value=child[0].nodeValue.replace(reTrim,""); + if(value){html.push('>',escapeHTML(value),'</',nodeName,">
") + }else{html.push("/>
") + }}else{if(childLength>0){html.push(">") + }else{html.push("/>") + }}}else{if(node.nodeType==3){if(node.parentNode&&(node.parentNode.nodeName.toLowerCase()=="script"||node.parentNode.nodeName.toLowerCase()=="style")){var value=node.nodeValue.replace(reTrim,""); + if(isIE){var src=value+"\n" + }else{var src="\n"+value+"\n" + }var match=src.match(/\n/g); + var num=match?match.length:0; + var s=[],sl=0; + for(var c=1; + c'+c+"" + }html.push('
',s.join(""),'
',escapeHTML(src),"
") + }else{var value=node.nodeValue.replace(reTrim,""); + if(value){html.push('
',escapeHTML(value),"
") + }}}}}},appendTreeChildren:function(treeNode){var doc=Firebug.chrome.document; + var uid=treeNode.id; + var parentNode=ElementCache.get(uid); + if(parentNode.childNodes.length==0){return + }var treeNext=treeNode.nextSibling; + var treeParent=treeNode.parentNode; + var isIE=false; + var control=isIE?treeNode.previousSibling:treeNode.firstChild; + control.className="nodeControl nodeMaximized"; + var html=[]; + var children=doc.createElement("div"); + children.className="nodeChildren"; + this.appendTreeNode(parentNode.childNodes,html); + children.innerHTML=html.join(""); + treeParent.insertBefore(children,treeNext); + var closeElement=doc.createElement("div"); + closeElement.className="objectBox-element"; + closeElement.innerHTML='</'+parentNode.nodeName.toLowerCase()+">"; + treeParent.insertBefore(closeElement,treeNext) + },removeTreeChildren:function(treeNode){var children=treeNode.nextSibling; + var closeTag=children.nextSibling; + var isIE=false; + var control=isIE?treeNode.previousSibling:treeNode.firstChild; + control.className="nodeControl"; + children.parentNode.removeChild(children); + closeTag.parentNode.removeChild(closeTag) + },isTreeNodeVisible:function(id){return $(id) + },select:function(el){var id=el&&ElementCache(el); + if(id){this.selectTreeNode(id) + }},selectTreeNode:function(id){id=""+id; + var node,stack=[]; + while(id&&!this.isTreeNodeVisible(id)){stack.push(id); + var node=ElementCache.get(id).parentNode; + if(node){id=ElementCache(node) + }else{break + }}stack.push(id); + while(stack.length>0){id=stack.pop(); + node=$(id); + if(stack.length>0&&ElementCache.get(id).childNodes.length>0){this.appendTreeChildren(node) + }}selectElement(node); + fbPanel1.scrollTop=Math.round(node.offsetTop-fbPanel1.clientHeight/2) + }}); + Firebug.registerModule(Firebug.HTML); + function HTMLPanel(){}HTMLPanel.prototype=extend(Firebug.Panel,{name:"HTML",title:"HTML",options:{hasSidePanel:true,isPreRendered:true,innerHTMLSync:true},create:function(){Firebug.Panel.create.apply(this,arguments); + this.panelNode.style.padding="4px 3px 1px 15px"; + this.panelNode.style.minWidth="500px"; + if(Env.Options.enablePersistent||Firebug.chrome.type!="popup"){this.createUI() + }if(!this.sidePanelBar.selectedPanel){this.sidePanelBar.selectPanel("css") + }},destroy:function(){selectedElement=null; + fbPanel1=null; + selectedSidePanelTS=null; + selectedSidePanelTimer=null; + Firebug.Panel.destroy.apply(this,arguments) + },createUI:function(){var rootNode=Firebug.browser.document.documentElement; + var html=[]; + Firebug.HTML.appendTreeNode(rootNode,html); + this.panelNode.innerHTML=html.join("") + },initialize:function(){Firebug.Panel.initialize.apply(this,arguments); + addEvent(this.panelNode,"click",Firebug.HTML.onTreeClick); + fbPanel1=$("fbPanel1"); + if(!selectedElement){Firebug.HTML.selectTreeNode(ElementCache(Firebug.browser.document.body)) + }addEvent(fbPanel1,"mousemove",Firebug.HTML.onListMouseMove); + addEvent($("fbContent"),"mouseout",Firebug.HTML.onListMouseMove); + addEvent(Firebug.chrome.node,"mouseout",Firebug.HTML.onListMouseMove) + },shutdown:function(){removeEvent(fbPanel1,"mousemove",Firebug.HTML.onListMouseMove); + removeEvent($("fbContent"),"mouseout",Firebug.HTML.onListMouseMove); + removeEvent(Firebug.chrome.node,"mouseout",Firebug.HTML.onListMouseMove); + removeEvent(this.panelNode,"click",Firebug.HTML.onTreeClick); + fbPanel1=null; + Firebug.Panel.shutdown.apply(this,arguments) + },reattach:function(){if(FirebugChrome.selectedHTMLElementId){Firebug.HTML.selectTreeNode(FirebugChrome.selectedHTMLElementId) + }},updateSelection:function(object){var id=ElementCache(object); + if(id){Firebug.HTML.selectTreeNode(id) + }}}); + Firebug.registerPanel(HTMLPanel); + var formatStyles=function(styles){return isIE?styles.replace(/([^\s]+)\s*:/g,function(m,g){return g.toLowerCase()+":" + }):styles + }; + var selectedElement=null; + var fbPanel1=null; + var selectedSidePanelTS,selectedSidePanelTimer; + var selectElement=function selectElement(e){if(e!=selectedElement){if(selectedElement){selectedElement.className="objectBox-element" + }e.className=e.className+" selectedElement"; + if(FBL.isFirefox){e.style.MozBorderRadius="2px" + }else{if(FBL.isSafari){e.style.WebkitBorderRadius="2px" + }}selectedElement=e; + FirebugChrome.selectedHTMLElementId=e.id; + var target=ElementCache.get(e.id); + var selectedSidePanel=Firebug.chrome.getPanel("HTML").sidePanelBar.selectedPanel; + var stack=FirebugChrome.htmlSelectionStack; + stack.unshift(target); + if(stack.length>2){stack.pop() + }var lazySelect=function(){selectedSidePanelTS=new Date().getTime(); + selectedSidePanel.select(target,true) + }; + if(selectedSidePanelTimer){clearTimeout(selectedSidePanelTimer); + selectedSidePanelTimer=null + }if(new Date().getTime()-selectedSidePanelTS>100){setTimeout(lazySelect,0) + }else{selectedSidePanelTimer=setTimeout(lazySelect,150) + }}}; + Firebug.HTML.onTreeClick=function(e){e=e||event; + var targ; + if(e.target){targ=e.target + }else{if(e.srcElement){targ=e.srcElement + }}if(targ.nodeType==3){targ=targ.parentNode + }if(targ.className.indexOf("nodeControl")!=-1||targ.className=="nodeTag"){var isIE=false; + if(targ.className=="nodeTag"){var control=isIE?(targ.parentNode.previousSibling||targ):(targ.parentNode.previousSibling||targ); + selectElement(targ.parentNode.parentNode); + if(control.className.indexOf("nodeControl")==-1){return + }}else{control=targ + }FBL.cancelEvent(e); + var treeNode=isIE?control.nextSibling:control.parentNode; + if(control.className.indexOf(" nodeMaximized")!=-1){FBL.Firebug.HTML.removeTreeChildren(treeNode) + }else{FBL.Firebug.HTML.appendTreeChildren(treeNode) + }}else{if(targ.className=="nodeValue"||targ.className=="nodeName"){}}}; + function onListMouseOut(e){e=e||event||window; + var targ; + if(e.target){targ=e.target + }else{if(e.srcElement){targ=e.srcElement + }}if(targ.nodeType==3){targ=targ.parentNode + }if(hasClass(targ,"fbPanel")){FBL.Firebug.Inspector.hideBoxModel(); + hoverElement=null + }}var hoverElement=null; + var hoverElementTS=0; + Firebug.HTML.onListMouseMove=function onListMouseMove(e){try{e=e||event||window; + var targ; + if(e.target){targ=e.target + }else{if(e.srcElement){targ=e.srcElement + }}if(targ.nodeType==3){targ=targ.parentNode + }var found=false; + while(targ&&!found){if(!/\snodeBox\s|\sobjectBox-selector\s/.test(" "+targ.className+" ")){targ=targ.parentNode + }else{found=true + }}if(!targ){FBL.Firebug.Inspector.hideBoxModel(); + hoverElement=null; + return + }if(typeof targ.attributes[cacheID]=="undefined"){return + }var uid=targ.attributes[cacheID]; + if(!uid){return + }var el=ElementCache.get(uid.value); + var nodeName=el.nodeName.toLowerCase(); + if(FBL.isIE&&" meta title script link ".indexOf(" "+nodeName+" ")!=-1){return + }if(!/\snodeBox\s|\sobjectBox-selector\s/.test(" "+targ.className+" ")){return + }if(el.id=="FirebugUI"||" html head body br script link iframe ".indexOf(" "+nodeName+" ")!=-1){FBL.Firebug.Inspector.hideBoxModel(); + hoverElement=null; + return + }if((new Date().getTime()-hoverElementTS>40)&&hoverElement!=el){hoverElementTS=new Date().getTime(); + hoverElement=el; + FBL.Firebug.Inspector.drawBoxModel(el) + }}catch(E){}}; + Firebug.Reps={appendText:function(object,html){html.push(escapeHTML(objectToString(object))) + },appendNull:function(object,html){html.push('',escapeHTML(objectToString(object)),"") + },appendString:function(object,html){html.push('"',escapeHTML(objectToString(object)),""") + },appendInteger:function(object,html){html.push('',escapeHTML(objectToString(object)),"") + },appendFloat:function(object,html){html.push('',escapeHTML(objectToString(object)),"") + },appendFunction:function(object,html){var reName=/function ?(.*?)\(/; + var m=reName.exec(objectToString(object)); + var name=m&&m[1]?m[1]:"function"; + html.push('',escapeHTML(name),"()") + },appendObject:function(object,html){try{if(object==undefined){this.appendNull("undefined",html) + }else{if(object==null){this.appendNull("null",html) + }else{if(typeof object=="string"){this.appendString(object,html) + }else{if(typeof object=="number"){this.appendInteger(object,html) + }else{if(typeof object=="boolean"){this.appendInteger(object,html) + }else{if(typeof object=="function"){this.appendFunction(object,html) + }else{if(object.nodeType==1){this.appendSelector(object,html) + }else{if(typeof object=="object"){if(typeof object.length!="undefined"){this.appendArray(object,html) + }else{this.appendObjectFormatted(object,html) + }}else{this.appendText(object,html) + }}}}}}}}}catch(exc){}},appendObjectFormatted:function(object,html){var text=objectToString(object); + var reObject=/\[object (.*?)\]/; + var m=reObject.exec(text); + html.push('',m?m[1]:text,"") + },appendSelector:function(object,html){var uid=ElementCache(object); + var uidString=uid?[cacheID,'="',uid,'"'].join(""):""; + html.push('"); + html.push('',escapeHTML(object.nodeName.toLowerCase()),""); + if(object.id){html.push('#',escapeHTML(object.id),"") + }if(object.className){html.push('.',escapeHTML(object.className),"") + }html.push("") + },appendNode:function(node,html){if(node.nodeType==1){var uid=ElementCache(node); + var uidString=uid?[cacheID,'="',uid,'"'].join(""):""; + html.push('
',"','<',node.nodeName.toLowerCase(),""); + for(var i=0; + i',name,'="',escapeHTML(value),""") + }if(node.firstChild){html.push('>
'); + for(var child=node.firstChild; + child; + child=child.nextSibling){this.appendNode(child,html) + }html.push('
</',node.nodeName.toLowerCase(),">
") + }else{html.push("/>") + }}else{if(node.nodeType==3){var value=trim(node.nodeValue); + if(value){html.push('
',escapeHTML(value),"
") + }}}},appendArray:function(object,html){html.push('[ '); + for(var i=0,l=object.length,obj; + i]") + }} + }}); + FBL.ns(function(){with(FBL){var maxWidth=100,maxHeight=80; + var infoTipMargin=10; + var infoTipWindowPadding=25; + Firebug.InfoTip=extend(Firebug.Module,{dispatchName:"infoTip",tags:domplate({infoTipTag:DIV({"class":"infoTip"}),colorTag:DIV({style:"background: $rgbValue; width: 100px; height: 40px"}," "),imgTag:DIV({"class":"infoTipImageBox infoTipLoading"},IMG({"class":"infoTipImage",src:"$urlValue",repeat:"$repeat",onload:"$onLoadImage"}),IMG({"class":"infoTipBgImage",collapsed:true,src:"blank.gif"}),DIV({"class":"infoTipCaption"})),onLoadImage:function(event){var img=event.currentTarget||event.srcElement; + var innerBox=img.parentNode; + var caption=getElementByClass(innerBox,"infoTipCaption"); + var bgImg=getElementByClass(innerBox,"infoTipBgImage"); + if(!bgImg){return + }if(isIE){removeClass(innerBox,"infoTipLoading") + }var updateInfoTip=function(){var w=img.naturalWidth||img.width||10,h=img.naturalHeight||img.height||10; + var repeat=img.getAttribute("repeat"); + if(repeat=="repeat-x"||(w==1&&h>1)){collapse(img,true); + collapse(bgImg,false); + bgImg.style.background="url("+img.src+") repeat-x"; + bgImg.style.width=maxWidth+"px"; + if(h>maxHeight){bgImg.style.height=maxHeight+"px" + }else{bgImg.style.height=h+"px" + }}else{if(repeat=="repeat-y"||(h==1&&w>1)){collapse(img,true); + collapse(bgImg,false); + bgImg.style.background="url("+img.src+") repeat-y"; + bgImg.style.height=maxHeight+"px"; + if(w>maxWidth){bgImg.style.width=maxWidth+"px" + }else{bgImg.style.width=w+"px" + }}else{if(repeat=="repeat"||(w==1&&h==1)){collapse(img,true); + collapse(bgImg,false); + bgImg.style.background="url("+img.src+") repeat"; + bgImg.style.width=maxWidth+"px"; + bgImg.style.height=maxHeight+"px" + }else{if(w>maxWidth||h>maxHeight){if(w>h){img.style.width=maxWidth+"px"; + img.style.height=Math.round((h/w)*maxWidth)+"px" + }else{img.style.width=Math.round((w/h)*maxHeight)+"px"; + img.style.height=maxHeight+"px" + }}}}}caption.innerHTML=$STRF(w+" x "+h) + }; + if(isIE){setTimeout(updateInfoTip,0) + }else{updateInfoTip(); + removeClass(innerBox,"infoTipLoading") + }}}),initializeBrowser:function(browser){browser.onInfoTipMouseOut=bind(this.onMouseOut,this,browser); + browser.onInfoTipMouseMove=bind(this.onMouseMove,this,browser); + var doc=browser.document; + if(!doc){return + }addEvent(doc,"mouseover",browser.onInfoTipMouseMove); + addEvent(doc,"mouseout",browser.onInfoTipMouseOut); + addEvent(doc,"mousemove",browser.onInfoTipMouseMove); + return browser.infoTip=this.tags.infoTipTag.append({},getBody(doc)) + },uninitializeBrowser:function(browser){if(browser.infoTip){var doc=browser.document; + removeEvent(doc,"mouseover",browser.onInfoTipMouseMove); + removeEvent(doc,"mouseout",browser.onInfoTipMouseOut); + removeEvent(doc,"mousemove",browser.onInfoTipMouseMove); + browser.infoTip.parentNode.removeChild(browser.infoTip); + delete browser.infoTip; + delete browser.onInfoTipMouseMove + }},showInfoTip:function(infoTip,panel,target,x,y,rangeParent,rangeOffset){if(!Firebug.showInfoTips){return + }var scrollParent=getOverflowParent(target); + var scrollX=x+(scrollParent?scrollParent.scrollLeft:0); + if(panel.showInfoTip(infoTip,target,scrollX,y,rangeParent,rangeOffset)){var htmlElt=infoTip.ownerDocument.documentElement; + var panelWidth=htmlElt.clientWidth; + var panelHeight=htmlElt.clientHeight; + if(x+infoTip.offsetWidth+infoTipMargin>panelWidth){infoTip.style.left=Math.max(0,panelWidth-(infoTip.offsetWidth+infoTipMargin))+"px"; + infoTip.style.right="auto" + }else{infoTip.style.left=(x+infoTipMargin)+"px"; + infoTip.style.right="auto" + }if(y+infoTip.offsetHeight+infoTipMargin>panelHeight){infoTip.style.top=Math.max(0,panelHeight-(infoTip.offsetHeight+infoTipMargin))+"px"; + infoTip.style.bottom="auto" + }else{infoTip.style.top=(y+infoTipMargin)+"px"; + infoTip.style.bottom="auto" + }if(FBTrace.DBG_INFOTIP){FBTrace.sysout("infotip.showInfoTip; top: "+infoTip.style.top+", left: "+infoTip.style.left+", bottom: "+infoTip.style.bottom+", right:"+infoTip.style.right+", offsetHeight: "+infoTip.offsetHeight+", offsetWidth: "+infoTip.offsetWidth+", x: "+x+", panelWidth: "+panelWidth+", y: "+y+", panelHeight: "+panelHeight) + }infoTip.setAttribute("active","true") + }else{this.hideInfoTip(infoTip) + }},hideInfoTip:function(infoTip){if(infoTip){infoTip.removeAttribute("active") + }},onMouseOut:function(event,browser){if(!event.relatedTarget){this.hideInfoTip(browser.infoTip) + }},onMouseMove:function(event,browser){if(getAncestorByClass(event.target,"infoTip")){return + }if(browser.currentPanel){var x=event.clientX,y=event.clientY,target=event.target||event.srcElement; + this.showInfoTip(browser.infoTip,browser.currentPanel,target,x,y,event.rangeParent,event.rangeOffset) + }else{this.hideInfoTip(browser.infoTip) + }},populateColorInfoTip:function(infoTip,color){this.tags.colorTag.replace({rgbValue:color},infoTip); + return true + },populateImageInfoTip:function(infoTip,url,repeat){if(!repeat){repeat="no-repeat" + }this.tags.imgTag.replace({urlValue:url,repeat:repeat},infoTip); + return true + },disable:function(){},showPanel:function(browser,panel){if(panel){var infoTip=panel.panelBrowser.infoTip; + if(!infoTip){infoTip=this.initializeBrowser(panel.panelBrowser) + }this.hideInfoTip(infoTip) + }},showSidePanel:function(browser,panel){this.showPanel(browser,panel) + }}); + Firebug.registerModule(Firebug.InfoTip) + }}); + (function(){this.getElementXPath=function(element){if(element&&element.id){return'//*[@id="'+element.id+'"]' + }else{return this.getElementTreeXPath(element) + }}; + this.getElementTreeXPath=function(element){var paths=[]; + for(; + element&&element.nodeType==1; + element=element.parentNode){var index=0; + for(var sibling=element.previousSibling; + sibling; + sibling=sibling.previousSibling){if(sibling.nodeName==element.nodeName){++index + }}var tagName=element.nodeName.toLowerCase(); + var pathIndex=(index?"["+(index+1)+"]":""); + paths.splice(0,0,tagName+pathIndex) + }return paths.length?"/"+paths.join("/"):null + }; + this.getElementsByXPath=function(doc,xpath){var nodes=[]; + try{var result=doc.evaluate(xpath,doc,null,XPathResult.ANY_TYPE,null); + for(var item=result.iterateNext(); + item; + item=result.iterateNext()){nodes.push(item) + }}catch(exc){}return nodes + }; + this.getRuleMatchingElements=function(rule,doc){var css=rule.selectorText; + var xpath=this.cssToXPath(css); + return this.getElementsByXPath(doc,xpath) + } + }).call(FBL); + FBL.ns(function(){with(FBL){var toCamelCase=function toCamelCase(s){return s.replace(reSelectorCase,toCamelCaseReplaceFn) + }; + var toSelectorCase=function toSelectorCase(s){return s.replace(reCamelCase,"-$1").toLowerCase() + }; + var reCamelCase=/([A-Z])/g; + var reSelectorCase=/\-(.)/g; + var toCamelCaseReplaceFn=function toCamelCaseReplaceFn(m,g){return g.toUpperCase() + }; + var ElementCache=Firebug.Lite.Cache.Element; + var StyleSheetCache=Firebug.Lite.Cache.StyleSheet; + var globalCSSRuleIndex; + var externalStyleSheetURLs=[]; + var externalStyleSheetWarning=domplate(Firebug.Rep,{tag:DIV({"class":"warning focusRow",style:"font-weight:normal;",role:"listitem"},SPAN("$object|STR"),A({href:"$href",target:"_blank"},"$link|STR"))}); + var processAllStyleSheetsTimeout=null; + var loadExternalStylesheet=function(doc,styleSheetIterator,styleSheet){var url=styleSheet.href; + styleSheet.firebugIgnore=true; + var source=Firebug.Lite.Proxy.load(url); + source=source.replace(/url\(([^\)]+)\)/g,function(a,name){var hasDomain=/\w+:\/\/./.test(name); + if(!hasDomain){name=name.replace(/^(["'])(.+)\1$/,"$2"); + var first=name.charAt(0); + if(first=="/"){var m=/^([^:]+:\/{1,3}[^\/]+)/.exec(url); + return m?"url("+m[1]+name+")":"url("+name+")" + }else{var path=url.replace(/[^\/]+\.[\w\d]+(\?.+|#.+)?$/g,""); + path=path+name; + var reBack=/[^\/]+\/\.\.\//; + while(reBack.test(path)){path=path.replace(reBack,"") + }return"url("+path+")" + }}return a + }); + var oldStyle=styleSheet.ownerNode; + if(!oldStyle){return + }if(!oldStyle.parentNode){return + }var style=createGlobalElement("style"); + style.setAttribute("charset","utf-8"); + style.setAttribute("type","text/css"); + style.innerHTML=source; + oldStyle.parentNode.insertBefore(style,oldStyle.nextSibling); + oldStyle.parentNode.removeChild(oldStyle); + doc.styleSheets[doc.styleSheets.length-1].externalURL=url; + console.log(url,"call "+externalStyleSheetURLs.length,source); + externalStyleSheetURLs.pop(); + if(processAllStyleSheetsTimeout){clearTimeout(processAllStyleSheetsTimeout) + }processAllStyleSheetsTimeout=setTimeout(function(){console.log("processing"); + FBL.processAllStyleSheets(doc,styleSheetIterator); + processAllStyleSheetsTimeout=null + },200) + }; + FBL.processAllStyleSheets=function(doc,styleSheetIterator){styleSheetIterator=styleSheetIterator||processStyleSheet; + globalCSSRuleIndex=-1; + var styleSheets=doc.styleSheets; + var importedStyleSheets=[]; + if(FBTrace.DBG_CSS){var start=new Date().getTime() + }for(var i=0,length=styleSheets.length; + imaxSpecificity){maxSpecificity=spec; + mostSpecificSelector=sel + }}}rule.specificity=maxSpecificity + }}rules.sort(sortElementRules); + return rules + }; + var sortElementRules=function(a,b){var ruleA=CSSRuleMap[a]; + var ruleB=CSSRuleMap[b]; + var specificityA=ruleA.specificity; + var specificityB=ruleB.specificity; + if(specificityA>specificityB){return 1 + }else{if(specificityAruleB.order?1:-1 + }}}; + var solveRulesTied=function(a,b){var ruleA=CSSRuleMap[a]; + var ruleB=CSSRuleMap[b]; + if(ruleA.specificity==ruleB.specificity){return ruleA.order>ruleB.order?1:-1 + }return null + }; + var reSelectorTag=/(^|\s)(?:\w+)/g; + var reSelectorClass=/\.[\w\d_-]+/g; + var reSelectorId=/#[\w\d_-]+/g; + var getCSSRuleSpecificity=function(selector){var match=selector.match(reSelectorTag); + var tagCount=match?match.length:0; + match=selector.match(reSelectorClass); + var classCount=match?match.length:0; + match=selector.match(reSelectorId); + var idCount=match?match.length:0; + return tagCount+10*classCount+100*idCount + }; + Firebug.SourceBoxPanel=Firebug.Panel; + var domUtils=null; + var textContent=isIE?"innerText":"textContent"; + var CSSDomplateBase={isEditable:function(rule){return !rule.isSystemSheet + },isSelectorEditable:function(rule){return rule.isSelectorEditable&&this.isEditable(rule) + }}; + var CSSPropTag=domplate(CSSDomplateBase,{tag:DIV({"class":"cssProp focusRow",$disabledStyle:"$prop.disabled",$editGroup:"$rule|isEditable",$cssOverridden:"$prop.overridden",role:"option"},A({"class":"cssPropDisable"},"  "),SPAN({"class":"cssPropName",$editable:"$rule|isEditable"},"$prop.name"),SPAN({"class":"cssColon"},":"),SPAN({"class":"cssPropValue",$editable:"$rule|isEditable"},"$prop.value$prop.important"),SPAN({"class":"cssSemi"},";"))}); + var CSSRuleTag=TAG("$rule.tag",{rule:"$rule"}); + var CSSImportRuleTag=domplate({tag:DIV({"class":"cssRule insertInto focusRow importRule",_repObject:"$rule.rule"},"@import "",A({"class":"objectLink",_repObject:"$rule.rule.styleSheet"},"$rule.rule.href"),"";")}); + var CSSStyleRuleTag=domplate(CSSDomplateBase,{tag:DIV({"class":"cssRule insertInto",$cssEditableRule:"$rule|isEditable",$editGroup:"$rule|isSelectorEditable",_repObject:"$rule.rule",ruleId:"$rule.id",role:"presentation"},DIV({"class":"cssHead focusRow",role:"listitem"},SPAN({"class":"cssSelector",$editable:"$rule|isSelectorEditable"},"$rule.selector")," {"),DIV({role:"group"},DIV({"class":"cssPropertyListBox",role:"listbox"},FOR("prop","$rule.props",TAG(CSSPropTag.tag,{rule:"$rule",prop:"$prop"})))),DIV({"class":"editable insertBefore",role:"presentation"},"}"))}); + var reSplitCSS=/(url\("?[^"\)]+?"?\))|(rgb\(.*?\))|(#[\dA-Fa-f]+)|(-?\d+(\.\d+)?(%|[a-z]{1,2})?)|([^,\s]+)|"(.*?)"/; + var reURL=/url\("?([^"\)]+)?"?\)/; + var reRepeat=/no-repeat|repeat-x|repeat-y|repeat/; + var sothinkInstalled=false; + var styleGroups={text:["font-family","font-size","font-weight","font-style","color","text-transform","text-decoration","letter-spacing","word-spacing","line-height","text-align","vertical-align","direction","column-count","column-gap","column-width"],background:["background-color","background-image","background-repeat","background-position","background-attachment","opacity"],box:["width","height","top","right","bottom","left","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","-moz-border-top-radius","-moz-border-right-radius","-moz-border-bottom-radius","-moz-border-left-radius","outline-top-width","outline-right-width","outline-bottom-width","outline-left-width","outline-top-color","outline-right-color","outline-bottom-color","outline-left-color","outline-top-style","outline-right-style","outline-bottom-style","outline-left-style"],layout:["position","display","visibility","z-index","overflow-x","overflow-y","overflow-clip","white-space","clip","float","clear","-moz-box-sizing"],other:["cursor","list-style-image","list-style-position","list-style-type","marker-offset","user-focus","user-select","user-modify","user-input"]}; + var styleGroupTitles={text:"Text",background:"Background",box:"Box Model",layout:"Layout",other:"Other"}; + Firebug.CSSModule=extend(Firebug.Module,{freeEdit:function(styleSheet,value){if(!styleSheet.editStyleSheet){var ownerNode=getStyleSheetOwnerNode(styleSheet); + styleSheet.disabled=true; + var url=CCSV("@mozilla.org/network/standard-url;1",Components.interfaces.nsIURL); + url.spec=styleSheet.href; + var editStyleSheet=ownerNode.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml","style"); + unwrapObject(editStyleSheet).firebugIgnore=true; + editStyleSheet.setAttribute("type","text/css"); + editStyleSheet.setAttributeNS("http://www.w3.org/XML/1998/namespace","base",url.directory); + if(ownerNode.hasAttribute("media")){editStyleSheet.setAttribute("media",ownerNode.getAttribute("media")) + }ownerNode.parentNode.insertBefore(editStyleSheet,ownerNode.nextSibling); + styleSheet.editStyleSheet=editStyleSheet + }styleSheet.editStyleSheet.innerHTML=value; + if(FBTrace.DBG_CSS){FBTrace.sysout("css.saveEdit styleSheet.href:"+styleSheet.href+" got innerHTML:"+value+"\n") + }dispatch(this.fbListeners,"onCSSFreeEdit",[styleSheet,value]) + },insertRule:function(styleSheet,cssText,ruleIndex){if(FBTrace.DBG_CSS){FBTrace.sysout("Insert: "+ruleIndex+" "+cssText) + }var insertIndex=styleSheet.insertRule(cssText,ruleIndex); + dispatch(this.fbListeners,"onCSSInsertRule",[styleSheet,cssText,ruleIndex]); + return insertIndex + },deleteRule:function(styleSheet,ruleIndex){if(FBTrace.DBG_CSS){FBTrace.sysout("deleteRule: "+ruleIndex+" "+styleSheet.cssRules.length,styleSheet.cssRules) + }dispatch(this.fbListeners,"onCSSDeleteRule",[styleSheet,ruleIndex]); + styleSheet.deleteRule(ruleIndex) + },setProperty:function(rule,propName,propValue,propPriority){var style=rule.style||rule; + var baseText=style.cssText; + if(style.getPropertyValue){var prevValue=style.getPropertyValue(propName); + var prevPriority=style.getPropertyPriority(propName); + style.removeProperty(propName); + style.setProperty(propName,propValue,propPriority) + }else{style[toCamelCase(propName)]=propValue + }if(propName){dispatch(this.fbListeners,"onCSSSetProperty",[style,propName,propValue,propPriority,prevValue,prevPriority,rule,baseText]) + }},removeProperty:function(rule,propName,parent){var style=rule.style||rule; + var baseText=style.cssText; + if(style.getPropertyValue){var prevValue=style.getPropertyValue(propName); + var prevPriority=style.getPropertyPriority(propName); + style.removeProperty(propName) + }else{style[toCamelCase(propName)]="" + }if(propName){dispatch(this.fbListeners,"onCSSRemoveProperty",[style,propName,prevValue,prevPriority,rule,baseText]) + }}}); + Firebug.CSSStyleSheetPanel=function(){}; + Firebug.CSSStyleSheetPanel.prototype=extend(Firebug.SourceBoxPanel,{template:domplate({tag:DIV({"class":"cssSheet insertInto a11yCSSView"},FOR("rule","$rules",CSSRuleTag),DIV({"class":"cssSheet editable insertBefore"},""))}),refresh:function(){if(this.location){this.updateLocation(this.location) + }else{if(this.selection){this.updateSelection(this.selection) + }}},toggleEditing:function(){if(!this.stylesheetEditor){this.stylesheetEditor=new StyleSheetEditor(this.document) + }if(this.editing){Firebug.Editor.stopEditing() + }else{if(!this.location){return + }var styleSheet=this.location.editStyleSheet?this.location.editStyleSheet.sheet:this.location; + var css=getStyleSheetCSS(styleSheet,this.context); + this.stylesheetEditor.styleSheet=this.location; + Firebug.Editor.startEditing(this.panelNode,css,this.stylesheetEditor) + }},getStylesheetURL:function(rule){if(this.location.href){return this.location.href + }else{return this.context.window.location.href + }},getRuleByLine:function(styleSheet,line){if(!domUtils){return null + }var cssRules=styleSheet.cssRules; + for(var i=0; + i=line){return rule + }}}},highlightRule:function(rule){var ruleElement=Firebug.getElementByRepObject(this.panelNode.firstChild,rule); + if(ruleElement){scrollIntoCenterView(ruleElement,this.panelNode); + setClassTimed(ruleElement,"jumpHighlight",this.context) + }},getStyleSheetRules:function(context,styleSheet){var isSystemSheet=isSystemStyleSheet(styleSheet); + function appendRules(cssRules){for(var i=0; + i20){return + }var target=event.target||event.srcElement; + if(hasClass(target,"textEditor")){return + }var row=getAncestorByClass(target,"cssProp"); + if(row&&hasClass(row,"editGroup")){this.disablePropertyRow(row); + cancelEvent(event) + }},onDoubleClick:function(event){var offset=event.clientX-this.panelNode.parentNode.offsetLeft; + if(!isLeftClick(event)||offset<=20){return + }var target=event.target||event.srcElement; + if(hasClass(target,"textEditorInner")){return + }var row=getAncestorByClass(target,"cssRule"); + if(row&&!getAncestorByClass(target,"cssPropName")&&!getAncestorByClass(target,"cssPropValue")){this.insertPropertyRow(row); + cancelEvent(event) + }},name:"stylesheet",title:"CSS",parentPanel:null,searchable:true,dependents:["css","stylesheet","dom","domSide","layout"],options:{hasToolButtons:true},create:function(){Firebug.Panel.create.apply(this,arguments); + this.onMouseDown=bind(this.onMouseDown,this); + this.onDoubleClick=bind(this.onDoubleClick,this); + if(this.name=="stylesheet"){this.onChangeSelect=bind(this.onChangeSelect,this); + var doc=Firebug.browser.document; + var selectNode=this.selectNode=createElement("select"); + processAllStyleSheets(doc,function(doc,styleSheet){var key=StyleSheetCache.key(styleSheet); + var fileName=getFileName(styleSheet.href)||getFileName(doc.location.href); + var option=createElement("option",{value:key}); + option.appendChild(Firebug.chrome.document.createTextNode(fileName)); + selectNode.appendChild(option) + }); + this.toolButtonsNode.appendChild(selectNode) + }},onChangeSelect:function(event){event=event||window.event; + var target=event.srcElement||event.currentTarget; + var key=target.value; + var styleSheet=StyleSheetCache.get(key); + this.updateLocation(styleSheet) + },initialize:function(){Firebug.Panel.initialize.apply(this,arguments); + this.context=Firebug.chrome; + this.document=Firebug.chrome.document; + this.initializeNode(); + if(this.name=="stylesheet"){var styleSheets=Firebug.browser.document.styleSheets; + if(styleSheets.length>0){addEvent(this.selectNode,"change",this.onChangeSelect); + this.updateLocation(styleSheets[0]) + }}},shutdown:function(){Firebug.Editor.stopEditing(); + if(this.name=="stylesheet"){removeEvent(this.selectNode,"change",this.onChangeSelect) + }this.destroyNode(); + Firebug.Panel.shutdown.apply(this,arguments) + },destroy:function(state){Firebug.Panel.destroy.apply(this,arguments) + },initializeNode:function(oldPanelNode){addEvent(this.panelNode,"mousedown",this.onMouseDown); + addEvent(this.panelNode,"dblclick",this.onDoubleClick) + },destroyNode:function(){removeEvent(this.panelNode,"mousedown",this.onMouseDown); + removeEvent(this.panelNode,"dblclick",this.onDoubleClick) + },ishow:function(state){Firebug.Inspector.stopInspecting(true); + this.showToolbarButtons("fbCSSButtons",true); + if(this.context.loaded&&!this.location){restoreObjects(this,state); + if(!this.location){this.location=this.getDefaultLocation() + }if(state&&state.scrollTop){this.panelNode.scrollTop=state.scrollTop + }}},ihide:function(){this.showToolbarButtons("fbCSSButtons",false); + this.lastScrollTop=this.panelNode.scrollTop + },supportsObject:function(object){if(object instanceof CSSStyleSheet){return 1 + }else{if(object instanceof CSSStyleRule){return 2 + }else{if(object instanceof CSSStyleDeclaration){return 2 + }else{if(object instanceof SourceLink&&object.type=="css"&&reCSS.test(object.href)){return 2 + }else{return 0 + }}}}},updateLocation:function(styleSheet){if(!styleSheet){return + }if(styleSheet.editStyleSheet){styleSheet=styleSheet.editStyleSheet.sheet + }if(styleSheet.restricted){FirebugReps.Warning.tag.replace({object:"AccessRestricted"},this.panelNode); + externalStyleSheetWarning.tag.append({object:"The stylesheet could not be loaded due to access restrictions. ",link:"more...",href:"http://getfirebug.com/wiki/index.php/Firebug_Lite_FAQ#I_keep_seeing_.22Access_to_restricted_URI_denied.22"},this.panelNode); + return + }var rules=this.getStyleSheetRules(this.context,styleSheet); + var result; + if(rules.length){result=this.template.tag.replace({rules:rules},this.panelNode) + }else{result=FirebugReps.Warning.tag.replace({object:"EmptyStyleSheet"},this.panelNode) + }},updateSelection:function(object){this.selection=null; + if(object instanceof CSSStyleDeclaration){object=object.parentRule + }if(object instanceof CSSStyleRule){this.navigate(object.parentStyleSheet); + this.highlightRule(object) + }else{if(object instanceof CSSStyleSheet){this.navigate(object) + }else{if(object instanceof SourceLink){try{var sourceLink=object; + var sourceFile=getSourceFileByHref(sourceLink.href,this.context); + if(sourceFile){clearNode(this.panelNode); + this.showSourceFile(sourceFile); + var lineNo=object.line; + if(lineNo){this.scrollToLine(lineNo,this.jumpHighlightFactory(lineNo,this.context)) + }}else{var stylesheet=getStyleSheetByHref(sourceLink.href,this.context); + if(stylesheet){this.navigate(stylesheet) + }else{if(FBTrace.DBG_CSS){FBTrace.sysout("css.updateSelection no sourceFile for "+sourceLink.href,sourceLink) + }}}}catch(exc){if(FBTrace.DBG_CSS){FBTrace.sysout("css.upDateSelection FAILS "+exc,exc) + }}}}}},updateOption:function(name,value){if(name=="expandShorthandProps"){this.refresh() + }},getLocationList:function(){var styleSheets=getAllStyleSheets(this.context); + return styleSheets + },getOptionsMenuItems:function(){return[{label:"Expand Shorthand Properties",type:"checkbox",checked:Firebug.expandShorthandProps,command:bindFixed(Firebug.togglePref,Firebug,"expandShorthandProps")},"-",{label:"Refresh",command:bind(this.refresh,this)}] + },getContextMenuItems:function(style,target){var items=[]; + if(this.infoTipType=="color"){items.push({label:"CopyColor",command:bindFixed(copyToClipboard,FBL,this.infoTipObject)}) + }else{if(this.infoTipType=="image"){items.push({label:"CopyImageLocation",command:bindFixed(copyToClipboard,FBL,this.infoTipObject)},{label:"OpenImageInNewTab",command:bindFixed(openNewTab,FBL,this.infoTipObject)}) + }}if(isElement(this.selection)){items.push({label:"EditStyle",command:bindFixed(this.editElementStyle,this)}) + }else{if(!isSystemStyleSheet(this.selection)){items.push({label:"NewRule",command:bindFixed(this.insertRule,this,target)}) + }}var cssRule=getAncestorByClass(target,"cssRule"); + if(cssRule&&hasClass(cssRule,"cssEditableRule")){items.push("-",{label:"NewProp",command:bindFixed(this.insertPropertyRow,this,target)}); + var propRow=getAncestorByClass(target,"cssProp"); + if(propRow){var propName=getChildByClass(propRow,"cssPropName")[textContent]; + var isDisabled=hasClass(propRow,"disabledStyle"); + items.push({label:$STRF("EditProp",[propName]),nol10n:true,command:bindFixed(this.editPropertyRow,this,propRow)},{label:$STRF("DeleteProp",[propName]),nol10n:true,command:bindFixed(this.deletePropertyRow,this,propRow)},{label:$STRF("DisableProp",[propName]),nol10n:true,type:"checkbox",checked:isDisabled,command:bindFixed(this.disablePropertyRow,this,propRow)}) + }}items.push("-",{label:"Refresh",command:bind(this.refresh,this)}); + return items + },browseObject:function(object){if(this.infoTipType=="image"){openNewTab(this.infoTipObject); + return true + }},showInfoTip:function(infoTip,target,x,y){var propValue=getAncestorByClass(target,"cssPropValue"); + if(propValue){var offset=getClientOffset(propValue); + var offsetX=x-offset.x; + var text=propValue[textContent]; + var charWidth=propValue.offsetWidth/text.length; + var charOffset=Math.floor(offsetX/charWidth); + var cssValue=parseCSSValue(text,charOffset); + if(cssValue){if(cssValue.value==this.infoTipValue){return true + }this.infoTipValue=cssValue.value; + if(cssValue.type=="rgb"||(!cssValue.type&&isColorKeyword(cssValue.value))){this.infoTipType="color"; + this.infoTipObject=cssValue.value; + return Firebug.InfoTip.populateColorInfoTip(infoTip,cssValue.value) + }else{if(cssValue.type=="url"){var propNameNode=getElementByClass(target.parentNode,"cssPropName"); + if(propNameNode&&isImageRule(propNameNode[textContent])){var rule=Firebug.getRepObject(target); + var baseURL=this.getStylesheetURL(rule); + var relURL=parseURLValue(cssValue.value); + var absURL=isDataURL(relURL)?relURL:absoluteURL(relURL,baseURL); + var repeat=parseRepeatValue(text); + this.infoTipType="image"; + this.infoTipObject=absURL; + return Firebug.InfoTip.populateImageInfoTip(infoTip,absURL,repeat) + }}}}}delete this.infoTipType; + delete this.infoTipValue; + delete this.infoTipObject + },getEditor:function(target,value){if(target==this.panelNode||hasClass(target,"cssSelector")||hasClass(target,"cssRule")||hasClass(target,"cssSheet")){if(!this.ruleEditor){this.ruleEditor=new CSSRuleEditor(this.document) + }return this.ruleEditor + }else{if(!this.editor){this.editor=new CSSEditor(this.document) + }return this.editor + }},getDefaultLocation:function(){try{var styleSheets=this.context.window.document.styleSheets; + if(styleSheets.length){var sheet=styleSheets[0]; + return(Firebug.filterSystemURLs&&isSystemURL(getURLForStyleSheet(sheet)))?null:sheet + }}catch(exc){if(FBTrace.DBG_LOCATIONS){FBTrace.sysout("css.getDefaultLocation FAILS "+exc,exc) + }}},getObjectDescription:function(styleSheet){var url=getURLForStyleSheet(styleSheet); + var instance=getInstanceForStyleSheet(styleSheet); + var baseDescription=splitURLBase(url); + if(instance){baseDescription.name=baseDescription.name+" #"+(instance+1) + }return baseDescription + },search:function(text,reverse){var curDoc=this.searchCurrentDoc(!Firebug.searchGlobal,text,reverse); + if(!curDoc&&Firebug.searchGlobal){return this.searchOtherDocs(text,reverse) + }return curDoc + },searchOtherDocs:function(text,reverse){var scanRE=Firebug.Search.getTestingRegex(text); + function scanDoc(styleSheet){for(var i=0; + i0){externalStyleSheetWarning.tag.append({object:"The results here may be inaccurate because some stylesheets could not be loaded due to access restrictions. ",link:"more...",href:"http://getfirebug.com/wiki/index.php/Firebug_Lite_FAQ#I_keep_seeing_.22This_element_has_no_style_rules.22"},this.panelNode) + }},getStylesheetURL:function(rule){if(rule&&rule.parentStyleSheet&&rule.parentStyleSheet.href){return rule.parentStyleSheet.href + }else{return this.selection.ownerDocument.location.href + }},getInheritedRules:function(element,sections,usedProps){var parent=element.parentNode; + if(parent&&parent.nodeType==1){this.getInheritedRules(parent,sections,usedProps); + var rules=[]; + this.getElementRules(parent,rules,usedProps,true); + if(rules.length){sections.splice(0,0,{element:parent,rules:rules}) + }}},getElementRules:function(element,rules,usedProps,inheritMode){var inspectedRules,displayedRules={}; + inspectedRules=getElementCSSRules(element); + if(inspectedRules){for(var i=0,length=inspectedRules.length; + i"+value+" = "+propValue+"\n") + }if(previousValue){Firebug.CSSModule.removeProperty(rule,previousValue) + }Firebug.CSSModule.setProperty(rule,value,parsedValue.value,parsedValue.priority) + }}else{if(!value){Firebug.CSSModule.removeProperty(rule,previousValue) + }}}else{if(getAncestorByClass(target,"cssPropValue")){var propName=getChildByClass(row,"cssPropName")[textContent]; + var propValue=getChildByClass(row,"cssPropValue")[textContent]; + if(FBTrace.DBG_CSS){FBTrace.sysout("CSSEditor.saveEdit propName=propValue: "+propName+" = "+propValue+"\n") + }if(value&&value!="null"){var parsedValue=parsePriority(value); + Firebug.CSSModule.setProperty(rule,propName,parsedValue.value,parsedValue.priority) + }else{if(previousValue&&previousValue!="null"){Firebug.CSSModule.removeProperty(rule,propName) + }}}}this.panel.markChange(this.panel.name=="stylesheet") + },advanceToNext:function(target,charCode){if(charCode==58&&hasClass(target,"cssPropName")){return true + }},getAutoCompleteRange:function(value,offset){if(hasClass(this.target,"cssPropName")){return{start:0,end:value.length-1} + }else{return parseCSSValue(value,offset) + }},getAutoCompleteList:function(preExpr,expr,postExpr){if(hasClass(this.target,"cssPropName")){return getCSSPropertyNames() + }else{var row=getAncestorByClass(this.target,"cssProp"); + var propName=getChildByClass(row,"cssPropName")[textContent]; + return getCSSKeywordsByProperty(propName) + }}}); + function CSSRuleEditor(doc){this.initializeInline(doc); + this.completeAsYouType=false + }CSSRuleEditor.uniquifier=0; + CSSRuleEditor.prototype=domplate(Firebug.InlineEditor.prototype,{insertNewRow:function(target,insertWhere){var emptyRule={selector:"",id:"",props:[],isSelectorEditable:true}; + if(insertWhere=="before"){return CSSStyleRuleTag.tag.insertBefore({rule:emptyRule},target) + }else{return CSSStyleRuleTag.tag.insertAfter({rule:emptyRule},target) + }},saveEdit:function(target,value,previousValue){if(FBTrace.DBG_CSS){FBTrace.sysout("CSSRuleEditor.saveEdit: '"+value+"' '"+previousValue+"'",target) + }target.innerHTML=escapeForCss(value); + if(value===previousValue){return + }var row=getAncestorByClass(target,"cssRule"); + var styleSheet=this.panel.location; + styleSheet=styleSheet.editStyleSheet?styleSheet.editStyleSheet.sheet:styleSheet; + var cssRules=styleSheet.cssRules; + var rule=Firebug.getRepObject(target),oldRule=rule; + var ruleIndex=cssRules.length; + if(rule||Firebug.getRepObject(row.nextSibling)){var searchRule=rule||Firebug.getRepObject(row.nextSibling); + for(ruleIndex=0; + ruleIndexb.name?1:-1 + }) + }function getTopmostRuleLine(panelNode){for(var child=panelNode.firstChild; + child; + child=child.nextSibling){if(child.offsetTop+child.offsetHeight>panelNode.scrollTop){var rule=child.repObject; + if(rule){return{line:domUtils.getRuleLine(rule),offset:panelNode.scrollTop-child.offsetTop} + }}}return 0 + }function getStyleSheetCSS(sheet,context){if(sheet.ownerNode instanceof HTMLStyleElement){return sheet.ownerNode.innerHTML + }else{return context.sourceCache.load(sheet.href).join("") + }}function getStyleSheetOwnerNode(sheet){for(; + sheet&&!sheet.ownerNode; + sheet=sheet.parentStyleSheet){}return sheet.ownerNode + }function scrollSelectionIntoView(panel){var selCon=getSelectionController(panel); + selCon.scrollSelectionIntoView(nsISelectionController.SELECTION_NORMAL,nsISelectionController.SELECTION_FOCUS_REGION,true) + }function getSelectionController(panel){var browser=Firebug.chrome.getPanelBrowser(panel); + return browser.docShell.QueryInterface(nsIInterfaceRequestor).getInterface(nsISelectionDisplay).QueryInterface(nsISelectionController) + }Firebug.registerModule(Firebug.CSSModule); + Firebug.registerPanel(Firebug.CSSStyleSheetPanel); + Firebug.registerPanel(CSSElementPanel); + Firebug.registerPanel(CSSComputedElementPanel) + }}); + FBL.ns(function(){with(FBL){Firebug.SourceCache=function(context){this.context=context; + this.cache={} + }; + Firebug.SourceCache.prototype=extend(new Firebug.Listener(),{isCached:function(url){return(this.cache[url]?true:false) + },loadText:function(url,method,file){var lines=this.load(url,method,file); + return lines?lines.join(""):null + },load:function(url,method,file){if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache.load: "+url); + if(!this.cache.hasOwnProperty(url)&&this.cache[url]){FBTrace.sysout("sourceCache.load; ERROR - hasOwnProperty returns false, but the URL is cached: "+url,this.cache[url]) + }}var response=this.cache[this.removeAnchor(url)]; + if(response){return response + }if(FBTrace.DBG_CACHE){var urls=[]; + for(var prop in this.cache){urls.push(prop) + }FBTrace.sysout("sourceCache.load: Not in the Firebug internal cache",urls) + }var d=FBL.splitDataURL(url); + if(d){var src=d.encodedContent; + var data=decodeURIComponent(src); + var lines=splitLines(data); + this.cache[url]=lines; + return lines + }var j=FBL.reJavascript.exec(url); + if(j){var src=url.substring(FBL.reJavascript.lastIndex); + var lines=splitLines(src); + this.cache[url]=lines; + return lines + }var c=FBL.reChrome.test(url); + if(c){if(Firebug.filterSystemURLs){return["Filtered chrome url "+url] + }var reWrapperMunge=/(\S*)\s*->\s*(\S*)/; + var m=reWrapperMunge.exec(url); + if(m){url=m[2]; + if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache found munged xpcnativewrapper url and set it to "+url+" m "+m+" m[0]:"+m[0]+" [1]"+m[1],m) + }}var chromeURI=makeURI(url); + if(!chromeURI){if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache.load failed to convert chrome to local: "+url) + }return["sourceCache failed to make URI from "+url] + }var localURI=chromeReg.convertChromeURL(chromeURI); + if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache.load converting chrome to local: "+url," -> "+localURI.spec) + }return this.loadFromLocal(localURI.spec) + }c=FBL.reFile.test(url); + if(c){return this.loadFromLocal(url) + }return this.loadFromCache(url,method,file) + },store:function(url,text){var tempURL=this.removeAnchor(url); + if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache for "+this.context.getName()+" store url="+url+((tempURL!=url)?" -> "+tempURL:""),text) + }var lines=splitLines(text); + return this.storeSplitLines(tempURL,lines) + },removeAnchor:function(url){var index=url.indexOf("#"); + if(index<0){return url + }return url.substr(0,index) + },loadFromLocal:function(url){var src=getResource(url); + if(src){var lines=splitLines(src); + this.cache[url]=lines; + return lines + }},loadFromCache:function(url,method,file){if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache.loadFromCache url:"+url) + }var doc=this.context.window.document; + if(doc){var charset=doc.characterSet + }else{var charset="UTF-8" + }try{var data=Firebug.Lite.Proxy.load(url); + var lines=splitLines(data); + this.cache[url]=lines; + return lines + }catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("sourceCache.load FAILS, url="+url,exc) + }return["sourceCache.load FAILS for url="+url,exc.toString()] + }finally{}},storeSplitLines:function(url,lines){if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache for window="+this.context.getName()+" store url="+url+"\n") + }return this.cache[url]=lines + },invalidate:function(url){url=this.removeAnchor(url); + if(FBTrace.DBG_CACHE){FBTrace.sysout("sourceCache.invalidate; "+url) + }delete this.cache[url] + },getLine:function(url,lineNo){var lines=this.load(url); + if(lines){if(lineNo<=lines.length){return lines[lineNo-1] + }else{return(lines.length==1)?lines[0]:"("+lineNo+" out of range "+lines.length+")" + }}else{return"(no source for "+url+")" + }}}); + var readWithXHR=function(url){Ajax.request({url:url,async:false}); + return Ajax.transport.responseText + } + }}); + FBL.ns(function(){with(FBL){var PCMAP_SOURCETEXT=-1; + var PCMAP_PRETTYPRINT=-2; + Firebug.SourceFile=function(compilation_unit_type){this.compilation_unit_type=compilation_unit_type + }; + Firebug.SourceFile.prototype={getBaseLineOffset:function(){return 0 + },toString:function(){var str=(this.compilation_unit_type?this.compilation_unit_type+" ":"")+this.href+" script.tags( "; + if(this.outerScript){str+=(this.outerScript.isValid?this.outerScript.tag:"X")+"| " + }if(this.innerScripts){var numberInvalid=0; + for(var p in this.innerScripts){var script=this.innerScripts[p]; + if(script.isValid){str+=p+" " + }else{numberInvalid++ + }}}str+=")"+(numberInvalid?"("+numberInvalid+" invalid)":""); + return str + },isExecutableLine:function(lineNo){return false; + if(this.hasScriptAtLineNumber(lineNo,true)){return true + }if(this.outerScriptLineMap&&(this.outerScriptLineMap.indexOf(lineNo)!=-1)){return true + }return false + },loadScriptLines:function(context){if(this.source){return this.source + }else{return context.sourceCache.load(this.href) + }}}; + Firebug.SourceFile.summarizeSourceLineArray=function(sourceLines,size){var buf=""; + for(var i=0; + isize||aLine.length>240){break + }}return buf.substr(0,size) + }; + Firebug.SourceFile.NestedScriptAnalyzer=function(sourceFile){this.sourceFile=sourceFile + }; + Firebug.SourceFile.NestedScriptAnalyzer.prototype={getSourceLineFromFrame:function(context,frame){if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("NestedScriptAnalyzer in "+this.sourceFile.compilation_unit_type+": frame.line - this.sourceFile.getBaseLineOffset()",frame.line+" - "+this.sourceFile.getBaseLineOffset()) + }return frame.line-(this.sourceFile.getBaseLineOffset()) + },getFunctionDescription:function(script,context,frame){if(frame){var name=frame.name; + var args=FBL.getFunctionArgValues(frame) + }else{var name=script.functionName; + var args=[] + }if(name=="anonymous"){name=FBL.guessFunctionName(this.sourceFile.href,this.getBaseLineNumberByScript(script),context) + }return{name:name,args:args} + },getSourceLinkForScript:function(script){var line=this.getBaseLineNumberByScript(script); + return new FBL.SourceLink(this.sourceFile.href,line,"js") + },getBaseLineNumberByScript:function(script){return script.baseLineNumber-(this.sourceFile.getBaseLineOffset()-1) + }}; + Firebug.SourceFile.addScriptsToSourceFile=function(sourceFile,outerScript,innerScripts){if(!sourceFile.innerScripts){sourceFile.innerScripts={} + }var total=0; + while(innerScripts.hasMoreElements()){var script=innerScripts.getNext(); + if(!script){if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("addScriptsToSourceFile innerScripts.getNext FAILS "+sourceFile,script) + }continue + }sourceFile.innerScripts[script.tag]=script; + if(FBTrace.DBG_SOURCEFILES){total++ + }}if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("addScriptsToSourceFile "+total+" scripts, sourcefile="+sourceFile.toString(),sourceFile) + }}; + Firebug.ScriptTagSourceFile=function(context,url,scriptTagNumber){this.context=context; + this.href=url; + this.scriptTagNumber=scriptTagNumber; + this.innerScripts={}; + this.pcmap_type=PCMAP_SOURCETEXT + }; + Firebug.ScriptTagSourceFile.prototype=descend(new Firebug.SourceFile("scriptTag"),Firebug.SourceFile.CommonBase); + Firebug.SourceFile.getSourceFileByScript=function(context,script){if(!context.sourceFileMap){return null + }var lucky=context.sourceFileMap[script.fileName]; + if(FBTrace.DBG_SOURCEFILES&&lucky){FBTrace.sysout("getSourceFileByScript trying to be lucky for "+script.tag+" in "+lucky,script) + }if(lucky&&lucky.hasScript(script)){return lucky + }if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("getSourceFileByScript looking for "+script.tag+"@"+script.fileName+" in "+context.getName()+": ",context.sourceFileMap) + }for(var url in context.sourceFileMap){var sourceFile=context.sourceFileMap[url]; + if(sourceFile.hasScript(script)){return sourceFile + }}}; + Firebug.SourceFile.getScriptAnalyzer=function(context,script){var sourceFile=Firebug.SourceFile.getSourceFileByScript(context,script); + if(FBTrace.DBG_STACK){FBTrace.sysout("getScriptAnalyzer "+(sourceFile?"finds sourceFile: ":"FAILS to find sourceFile"),sourceFile) + }if(sourceFile){var analyzer=sourceFile.getScriptAnalyzer(script); + if(FBTrace.DBG_STACK){FBTrace.sysout("getScriptAnalyzer finds analyzer: ",analyzer) + }return analyzer + }return undefined + }; + Firebug.SourceFile.getSourceFileAndLineByScript=function(context,script,frame){var sourceFile=Firebug.SourceFile.getSourceFileByScript(context,script); + if(sourceFile){if(sourceFile.pcmap_type){var line=script.pcToLine(1,sourceFile.pcmap_type) + }else{var line=1 + }return{sourceFile:sourceFile,lineNo:line} + }}; + Firebug.SourceFile.guessEnclosingFunctionName=function(url,line,context){var sourceFile=context.sourceFileMap[url]; + if(sourceFile){var scripts=sourceFile.getScriptsAtLineNumber(line); + if(scripts){var script=scripts[0]; + var analyzer=sourceFile.getScriptAnalyzer(script); + line=analyzer.getBaseLineNumberByScript(script) + }}return FBL.guessFunctionName(url,line-1,context) + } + }}); + FBL.ns(function(){with(FBL){Firebug.ActivableModule=Firebug.Module; + Firebug.registerActivableModule=Firebug.registerModule; + Firebug.Panel.isEnabled=function(){return true + }; + Firebug.ActivablePanel=Firebug.Panel; + Firebug.SourceBoxDecorator=function(sourceBox){}; + Firebug.SourceBoxDecorator.sourceBoxCounter=0; + Firebug.SourceBoxDecorator.prototype={onSourceBoxCreation:function(sourceBox){sourceBox.uniqueId=++Firebug.SourceBoxDecorator.sourceBoxCounter + },decorate:function(sourceBox,sourceFile){return + },getUserVisibleLineNumber:function(sourceBox,lineNo){return lineNo + },getLineHTML:function(sourceBox,lineNo){var html=escapeForSourceLine(sourceBox.lines[lineNo-1]); + if(Firebug.replaceTabs>0){var space=new Array(Firebug.replaceTabs+1).join(" "); + html=html.replace(/\t/g,space) + }return html + },getLineId:function(sourceBox,lineNo){return"sb"+sourceBox.uniqueId+"-L"+lineNo + }}; + Firebug.SourceBoxPanel=function(){}; + var SourceBoxPanelBase=extend(Firebug.MeasureBox,Firebug.ActivablePanel); + Firebug.SourceBoxPanel=extend(SourceBoxPanelBase,{create:function(){this.onResize=bind(this.resizer,this); + this.sourceBoxes={}; + this.decorator=this.getDecorator(); + Firebug.ActivablePanel.create.apply(this,arguments); + this.scrollingElement=this.containerNode + },initialize:function(context,doc){Firebug.ActivablePanel.initialize.apply(this,arguments) + },initializeNode:function(panelNode){this.resizeEventTarget=Firebug.chrome.window; + addEvent(this.resizeEventTarget,"resize",this.onResize); + this.attachToCache(); + Firebug.ActivablePanel.initializeNode.apply(this,arguments) + },reattach:function(doc){var oldEventTarget=this.resizeEventTarget; + oldEventTarget.removeEventListener("resize",this.onResize,true); + Firebug.Panel.reattach.apply(this,arguments); + this.resizeEventTarget=Firebug.chrome.window; + addEvent(this.resizeEventTarget,"resize",this.onResize); + this.attachToCache() + },destroyNode:function(){Firebug.ActivablePanel.destroyNode.apply(this,arguments); + removeEvent(this.resizeEventTarget,"resize",this.onResize); + this.detachFromCache() + },attachToCache:function(){this.context.sourceCache.addListener(this) + },detachFromCache:function(){this.context.sourceCache.removeListener(this) + },onTextSizeChange:function(zoom){this.removeAllSourceBoxes() + },removeAllSourceBoxes:function(){this.sourceBoxes={} + },onStartRequest:function(context,request){},onStopRequest:function(context,request,responseText){if(context===this.context){var url=request.URI.spec; + var sourceFile=getSourceFileByHref(url,context); + if(sourceFile){this.removeSourceBoxBySourceFile(sourceFile) + }}},updateSourceBox:function(sourceBox){},getDecorator:function(){return new Firebug.SourceBoxDecorator() + },getSourceType:function(){throw"SourceBox.getSourceType: Need to override in extender " + },disablePanel:function(module){this.sourceBoxes={}; + Firebug.ActivablePanel.disablePanel.apply(this,arguments) + },getSourceLinesFrom:function(selection){if(selection.isCollapsed){return"" + }var anchorSourceRow=getAncestorByClass(selection.anchorNode,"sourceRow"); + var focusSourceRow=getAncestorByClass(selection.focusNode,"sourceRow"); + if(anchorSourceRow==focusSourceRow){return selection.toString() + }var buf=this.getSourceLine(anchorSourceRow,selection.anchorOffset); + var currentSourceRow=anchorSourceRow.nextSibling; + while(currentSourceRow&&(currentSourceRow!=focusSourceRow)&&hasClass(currentSourceRow,"sourceRow")){buf+=this.getSourceLine(currentSourceRow); + currentSourceRow=currentSourceRow.nextSibling + }buf+=this.getSourceLine(focusSourceRow,0,selection.focusOffset); + return buf + },getSourceLine:function(sourceRow,beginOffset,endOffset){var source=getChildByClass(sourceRow,"sourceRowText").textContent; + if(endOffset){source=source.substring(beginOffset,endOffset) + }else{if(beginOffset){source=source.substring(beginOffset) + }else{source=source + }}return source + },getSourceBoxBySourceFile:function(sourceFile){if(sourceFile.href){var sourceBox=this.getSourceBoxByURL(sourceFile.href); + if(sourceBox&&sourceBox.repObject==sourceFile){return sourceBox + }else{return null + }}},getSourceBoxByURL:function(url){return url?this.sourceBoxes[url]:null + },removeSourceBoxBySourceFile:function(sourceFile){var sourceBox=this.getSourceBoxBySourceFile(sourceFile); + if(sourceBox){delete this.sourceBoxes[sourceFile.href]; + if(sourceBox.parentNode===this.panelNode){this.panelNode.removeChild(sourceBox) + }if(this.selectedSourceBox===sourceBox){delete this.selectedSourceBox; + delete this.location; + this.showSourceFile(sourceFile) + }}},renameSourceBox:function(oldURL,newURL){var sourceBox=this.sourceBoxes[oldURL]; + if(sourceBox){delete this.sourceBoxes[oldURL]; + this.sourceBoxes[newURL]=sourceBox + }},showSourceFile:function(sourceFile){var sourceBox=this.getSourceBoxBySourceFile(sourceFile); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("firebug.showSourceFile: "+sourceFile,sourceBox) + }if(!sourceBox){if(sourceFile.compilation_unit_type==="scriptTagAppend"&&!sourceFile.source){sourceFile.source=["script tag mutation event has not arrived"]; + return + }sourceBox=this.createSourceBox(sourceFile) + }this.showSourceBox(sourceBox) + },showSourceLink:function(sourceLink){var sourceFile=getSourceFileByHref(sourceLink.href,this.context); + if(sourceFile){this.navigate(sourceFile); + if(sourceLink.line){this.scrollToLine(sourceLink.href,sourceLink.line,this.jumpHighlightFactory(sourceLink.line,this.context)); + dispatch(this.fbListeners,"onShowSourceLink",[this,sourceLink.line]) + }if(sourceLink==this.selection){delete this.selection + }}},showSourceBox:function(sourceBox){if(this.selectedSourceBox){collapse(this.selectedSourceBox,true) + }this.selectedSourceBox=sourceBox; + delete this.currentSearch; + if(sourceBox){this.reView(sourceBox); + this.updateSourceBox(sourceBox); + collapse(sourceBox,false) + }},createSourceBox:function(sourceFile){var sourceBox=this.initializeSourceBox(sourceFile); + sourceBox.decorator=this.decorator; + sourceBox.decorator.onSourceBoxCreation(sourceBox); + this.sourceBoxes[sourceFile.href]=sourceBox; + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("firebug.createSourceBox with "+sourceBox.maximumLineNumber+" lines for "+sourceFile+(sourceFile.href?" sourceBoxes":" anon "),sourceBox) + }this.panelNode.appendChild(sourceBox); + this.setSourceBoxLineSizes(sourceBox); + return sourceBox + },getSourceFileBySourceBox:function(sourceBox){return sourceBox.repObject + },initializeSourceBox:function(sourceFile){var sourceBox=this.document.createElement("div"); + setClass(sourceBox,"sourceBox"); + collapse(sourceBox,true); + var lines=sourceFile.loadScriptLines(this.context); + if(!lines){lines=["Failed to load source for sourceFile "+sourceFile] + }sourceBox.lines=lines; + sourceBox.repObject=sourceFile; + sourceBox.maximumLineNumber=lines.length; + sourceBox.maxLineNoChars=(sourceBox.maximumLineNumber+"").length; + sourceBox.getLineNode=function(lineNo){return $(this.decorator.getLineId(this,lineNo),this.ownerDocument) + }; + var paddedSource="
"; + appendInnerHTML(sourceBox,paddedSource); + sourceBox.viewport=getChildByClass(sourceBox,"sourceViewport"); + return sourceBox + },setSourceBoxLineSizes:function(sourceBox){var view=sourceBox.viewport; + var lineNoCharsSpacer=""; + for(var i=0; + i3&&linesFromBot>3); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("SourceBoxPanel.scrollTimeout: skipScrolling: "+skipScrolling+" fromTop:"+linesFromTop+" fromBot:"+linesFromBot) + }}else{if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("SourceBoxPanel.scrollTimeout, no viewable lines",this.selectedSourceBox) + }}if(!skipScrolling){var viewRange=this.getViewRangeFromTargetLine(this.selectedSourceBox,lineNo); + this.selectedSourceBox.newScrollTop=this.getScrollTopFromViewRange(this.selectedSourceBox,viewRange); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("SourceBoxPanel.scrollTimeout: newScrollTop "+this.selectedSourceBox.newScrollTop+" vs old "+this.selectedSourceBox.scrollTop+" for "+this.selectedSourceBox.repObject.href) + }this.selectedSourceBox.scrollTop=this.selectedSourceBox.newScrollTop; + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("SourceBoxPanel.scrollTimeout: scrollTo "+lineNo+" scrollTop:"+this.selectedSourceBox.scrollTop+" lineHeight: "+this.selectedSourceBox.lineHeight) + }}if(this.selectedSourceBox.highlighter){this.applyDecorator(this.selectedSourceBox) + }},this)); + this.selectedSourceBox.highlighter=highlighter + },jumpHighlightFactory:function(lineNo,context){return function jumpHighlightIfInView(sourceBox){var lineNode=sourceBox.getLineNode(lineNo); + if(lineNode){setClassTimed(lineNode,"jumpHighlight",context); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("jumpHighlightFactory on line "+lineNo+" lineNode:"+lineNode.innerHTML+"\n") + }}else{if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("jumpHighlightFactory no node at line "+lineNo,sourceBox) + }}return false + } + },resizer:function(event){if(this.selectedSourceBox&&this.visible){if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("resizer event: "+event.type,event) + }this.reView(this.selectedSourceBox) + }},reView:function(sourceBox,clearCache){if(sourceBox.targetedLine){sourceBox.targetLineNumber=sourceBox.targetedLine; + var viewRange=this.getViewRangeFromTargetLine(sourceBox,sourceBox.targetedLine); + delete sourceBox.targetedLine + }else{var viewRange=this.getViewRangeFromScrollTop(sourceBox,this.scrollingElement.scrollTop) + }if(clearCache){this.clearSourceBox(sourceBox) + }else{if(this.scrollingElement.scrollTop===sourceBox.lastScrollTop&&sourceBox.clientHeight&&sourceBox.clientHeight===sourceBox.lastClientHeight){if(sourceBox.firstRenderedLine<=viewRange.firstLine&&sourceBox.lastRenderedLine>=viewRange.lastLine){if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("reView skipping sourceBox "+this.scrollingElement.scrollTop+"=scrollTop="+sourceBox.lastScrollTop+", "+sourceBox.clientHeight+"=clientHeight="+sourceBox.lastClientHeight,sourceBox) + }return + }}}dispatch(this.fbListeners,"onBeforeViewportChange",[this]); + this.buildViewAround(sourceBox,viewRange); + if(Firebug.uiListeners.length>0){var link=new SourceLink(sourceBox.repObject.href,sourceBox.centralLine,this.getSourceType()); + dispatch(Firebug.uiListeners,"onViewportChange",[link]) + }sourceBox.lastScrollTop=this.scrollingElement.scrollTop; + sourceBox.lastClientHeight=sourceBox.clientHeight + },buildViewAround:function(sourceBox,viewRange){try{this.updateViewportCache(sourceBox,viewRange) + }catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("buildViewAround updateViewportCache FAILS "+exc,exc) + }}this.setViewportPadding(sourceBox,viewRange); + sourceBox.centralLine=Math.floor((viewRange.lastLine+viewRange.firstLine)/2); + this.applyDecorator(sourceBox); + return + },updateViewportCache:function(sourceBox,viewRange){var cacheHit=this.insertedLinesOverlapCache(sourceBox,viewRange); + if(!cacheHit){this.clearSourceBox(sourceBox); + sourceBox.firstRenderedLine=viewRange.firstLine; + sourceBox.lastRenderedLine=viewRange.lastLine + }else{sourceBox.firstRenderedLine=Math.min(viewRange.firstLine,sourceBox.firstRenderedLine); + sourceBox.lastRenderedLine=Math.max(viewRange.lastLine,sourceBox.lastRenderedLine) + }sourceBox.firstViewableLine=viewRange.firstLine; + sourceBox.lastViewableLine=viewRange.lastLine; + sourceBox.numberOfRenderedLines=sourceBox.lastRenderedLine-sourceBox.firstRenderedLine+1; + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("buildViewAround viewRange: "+viewRange.firstLine+"-"+viewRange.lastLine+" rendered: "+sourceBox.firstRenderedLine+"-"+sourceBox.lastRenderedLine,sourceBox) + }},insertedLinesOverlapCache:function(sourceBox,viewRange){var cacheHit=false; + var linesBefore=[]; + var linesAfter=[]; + for(var line=viewRange.firstLine; + line<=viewRange.lastLine; + line++){if(line>=sourceBox.firstRenderedLine&&line<=sourceBox.lastRenderedLine){cacheHit=true; + continue + }var lineHTML=this.getSourceLineHTML(sourceBox,line); + if(line0){var topCacheLine=sourceBox.getLineNode(sourceBox.firstRenderedLine); + appendInnerHTML(sourceBox.viewport,linesBefore.join(""),topCacheLine) + }if(linesAfter.length>0){appendInnerHTML(sourceBox.viewport,linesAfter.join(""),null) + }return cacheHit + },old_insertedLinesOverlapCache:function(sourceBox,viewRange){var topCacheLine=null; + var cacheHit=false; + for(var line=viewRange.firstLine; + line<=viewRange.lastLine; + line++){if(line>=sourceBox.firstRenderedLine&&line<=sourceBox.lastRenderedLine){cacheHit=true; + continue + }var lineHTML=this.getSourceLineHTML(sourceBox,line); + var ref=null; + if(line
'+lineNoText+''+lineHTML+""; + return theHTML + },getTextForLineNo:function(lineNo,maxLineNoChars){var lineNoText=lineNo+""; + while(lineNoText.lengthsourceBox.maximumLineNumber){viewRange.lastLine=sourceBox.maximumLineNumber + }return viewRange + },getViewRangeFromScrollTop:function(sourceBox,scrollTop){var viewRange={}; + var averageLineHeight=this.getAverageLineHeight(sourceBox); + viewRange.firstLine=Math.floor(scrollTop/averageLineHeight+1); + var panelHeight=this.panelNode.parentNode.clientHeight; + var viewableLines=Math.ceil((panelHeight/averageLineHeight)+1); + viewRange.lastLine=viewRange.firstLine+viewableLines; + if(viewRange.lastLine>sourceBox.maximumLineNumber){viewRange.lastLine=sourceBox.maximumLineNumber + }viewRange.centralLine=Math.floor((viewRange.lastLine-viewRange.firstLine)/2); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("getViewRangeFromScrollTop scrollTop:"+scrollTop+" viewRange: "+viewRange.firstLine+"-"+viewRange.lastLine); + if(!this.noRecurse){this.noRecurse=true; + var testScrollTop=this.getScrollTopFromViewRange(sourceBox,viewRange); + delete this.noRecurse; + FBTrace.sysout("getViewRangeFromScrollTop "+((scrollTop==testScrollTop)?"checks":(scrollTop+"=!scrollTop!="+testScrollTop))) + }}return viewRange + },getScrollTopFromViewRange:function(sourceBox,viewRange){var averageLineHeight=this.getAverageLineHeight(sourceBox); + var scrollTop=Math.floor(averageLineHeight*(viewRange.firstLine-1)); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("getScrollTopFromViewRange viewRange:"+viewRange.firstLine+"-"+viewRange.lastLine+" averageLineHeight: "+averageLineHeight+" scrollTop "+scrollTop); + if(!this.noRecurse){this.noRecurse=true; + var testViewRange=this.getViewRangeFromScrollTop(sourceBox,scrollTop); + delete this.noRecurse; + var vrStr=viewRange.firstLine+"-"+viewRange.lastLine; + var tvrStr=testViewRange.firstLine+"-"+testViewRange.lastLine; + FBTrace.sysout("getScrollTopFromCenterLine "+((vrStr==tvrStr)?"checks":vrStr+"=!viewRange!="+tvrStr)) + }}return scrollTop + },getAverageLineHeight:function(sourceBox){var averageLineHeight=sourceBox.lineHeight; + var renderedViewportHeight=sourceBox.viewport.clientHeight; + var numberOfRenderedLines=sourceBox.numberOfRenderedLines; + if(renderedViewportHeight&&numberOfRenderedLines){averageLineHeight=renderedViewportHeight/numberOfRenderedLines + }return averageLineHeight + },getTotalPadding:function(sourceBox){var numberOfRenderedLines=sourceBox.numberOfRenderedLines; + if(!numberOfRenderedLines){return 0 + }var max=sourceBox.maximumLineNumber; + var averageLineHeight=this.getAverageLineHeight(sourceBox); + var virtualSourceBoxHeight=Math.floor(max*averageLineHeight); + if(virtualSourceBoxHeight0){dispatch(Firebug.uiListeners,"onApplyDecorator",[sourceBox]) + }if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("sourceBoxDecoratorTimeout "+sourceBox.repObject,sourceBox) + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("sourcebox applyDecorator FAILS "+exc,exc) + }}},asyncHighlighting:function(sourceBox){try{if(sourceBox.highlighter){var sticky=sourceBox.highlighter(sourceBox); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("asyncHighlighting highlighter sticky:"+sticky,sourceBox.highlighter) + }if(!sticky){delete sourceBox.highlighter + }}}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("sourcebox highlighter FAILS "+exc,exc) + }}}}) + }}); + FBL.ns(function(){with(FBL){var fbs={registerClient:function(){},unregisterClient:function(){},unregisterDebugger:function(){}}; + FBL.getUniqueId=function(){}; + FBL.persistObjects=function(){}; + FBL.sourceFilesAsArray=function(){return[] + }; + Firebug.ActivableModule.isAlwaysEnabled=function(){return true + }; + Firebug.ActivablePanel.destroyNode=function(){}; + var STEP_OVER=1; + var STEP_INTO=2; + var STEP_OUT=3; + var tooltipTimeout=300; + var reLineNumber=/^[^\\]?#(\d*)$/; + var reEval=/\s*eval\s*\(([^)]*)\)/m; + var reHTM=/\.[hH][tT][mM]/; + var reFunction=/\s*Function\s*\(([^)]*)\)/m; + var reTooMuchRecursion=/too\smuch\srecursion/; + Firebug.Debugger=extend(Firebug.ActivableModule,{dispatchName:"debugger",fbs:fbs,hasValidStack:function(context){return context.stopped&&context.currentFrame.isValid + },evaluate:function(js,context,scope){var frame=context.currentFrame; + if(!frame){return + }frame.scope.refresh(); + var result={}; + var scriptToEval=js; + var ok=frame.eval(scriptToEval,"",1,result); + var value=unwrapIValue(result.value); + if(ok){return value + }else{throw value + }},evaluateInCallingFrame:function(js,fileName,lineNo){return this.halt(function evalInFrame(frame){window.dump("evaluateInCallingFrame "+frame.script.fileName+" stack: "+getJSDStackDump(frame)+"\n"); + var result={}; + var ok=frame.eval(js,fileName,lineNo,result); + var value=unwrapIValue(result.value); + if(ok){return value + }else{throw value + }}) + },getCurrentFrameKeys:function(context){var globals=keys(context.getGlobalScope().wrappedJSObject); + if(context.currentFrame){return this.getFrameKeys(context.currentFrame,globals) + }return globals + },getFrameKeys:function(frame,names){var listValue={value:null},lengthValue={value:0}; + frame.scope.getProperties(listValue,lengthValue); + for(var i=0; + i=0){delete context.stopped; + delete context.stoppedFrame; + delete context.currentFrame; + if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.stop extension vetoed stop with hookReturn "+hookReturn) + }return hookReturn + }try{this.freeze(context); + var depth=fbs.enterNestedEventLoop({onNest:bindFixed(this.startDebugging,this,context)}); + if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.stop, depth:"+depth+" context:"+context.getName()) + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("debugger exception in nested event loop: "+exc,exc) + }else{ERROR("debugger exception in nested event loop: "+exc+"\n") + }}finally{this.thaw(context) + }this.stopDebugging(context); + dispatch(this.fbListeners,"onResume",[context]); + if(context.aborted){delete context.aborted; + return RETURN_ABORT + }else{if(Firebug.rerun){setTimeout(function reExecute(){var rerun=context.savedRerun=Firebug.rerun; + delete Firebug.rerun; + if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("Firebug.debugger.reExecute ",{rerun:rerun}) + }function successConsoleFunction(result,context){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("Firebug.debugger.reExecute success",result) + }dispatch(Firebug.Debugger.fbListeners,"onRerunComplete",[true,result]) + }function exceptionFunction(result,context){if(FBTrace.DBG_ERRORS){FBTrace.sysout("Firebug.debugger.reExecute FAILED "+result,result) + }dispatch(Firebug.Debugger.fbListeners,"onRerunComplete",[failed,result]) + }Firebug.CommandLine.evaluate("window._firebug.rerunFunction()",context,null,context.window,successConsoleFunction,exceptionFunction) + }); + if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("Firebug.debugger.reExecute return "+RETURN_HOOK_ERROR) + }return RETURN_HOOK_ERROR + }else{return RETURN_CONTINUE + }}},rerun:function(context){if(!context.stopped){FBTrace.sysout("debugger.rerun FAILS: not stopped"); + return + }if(Firebug.rerun){FBTrace.sysout("debugger.rerun FAILS: Firebug.rerun in progress"); + return + }Firebug.rerun=this.getRerun(context); + this.resume(context) + },getRerun:function(context){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.rerun for "+context.getName()) + }try{var frame=context.stoppedFrame; + while(frame.callingFrame&&frame.callingFrame.script.functionName){frame=frame.callingFrame; + if(frame.script.functionName=="_firebugRerun"){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("getRerun re-rerun ",context.savedRerun) + }return context.savedRerun + }}function getStoreRerunInfoScript(fnName){var str="if (!window._firebug)window._firebug={};\n"; + str+="window._firebug.rerunThis = this;\n"; + str+="window._firebug.rerunArgs = [];\n"; + str+="if (arguments && arguments.length) for (var i = 0; i < arguments.length; i++) window._firebug.rerunArgs.push(arguments[i]);\n"; + str+="window._firebug.rerunFunctionName = "+fnName+";\n"; + str+="window._firebug.rerunFunction = function _firebugRerun() { "+fnName+".apply(window._firebug.rerunThis, window._firebug.rerunArgs); }"; + return str + }var rerun={}; + var fnName=getFunctionName(frame.script,context,frame,true); + rerun.script=getStoreRerunInfoScript(fnName); + var jsdFunctionName=frame.script.functionName; + var result={}; + var ok=frame.eval(rerun.script,context.window.location+"/RerunScript",1,result); + if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.rerun "+ok+" and result: "+result+" for "+context.getName(),{result:result,rerun:rerun,functionName:jsdFunctionName}) + }}catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("debugger.rerun FAILS for "+context.getName()+" because "+exc,{exc:exc,rerun:rerun}) + }}return rerun + },resume:function(context){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.resume, context.stopped:"+context.stopped+"\n") + }var depth=fbs.exitNestedEventLoop(); + if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.resume, depth:"+depth+"\n") + }},abort:function(context){if(context.stopped){context.aborted=true; + this.thaw(context); + this.resume(context); + fbs.unPause(true) + }},stepOver:function(context){if(!context.stoppedFrame||!context.stoppedFrame.isValid){return + }fbs.step(STEP_OVER,context.stoppedFrame,this); + this.resume(context) + },stepInto:function(context){if(!context.stoppedFrame||!context.stoppedFrame.isValid){return + }fbs.step(STEP_INTO,context.stoppedFrame,this); + this.resume(context) + },stepOut:function(context){if(!context.stoppedFrame||!context.stoppedFrame.isValid){return + }fbs.step(STEP_OUT,context.stoppedFrame); + this.resume(context) + },suspend:function(context){if(context.stopped){return + }fbs.suspend(this,context) + },unSuspend:function(context){fbs.stopStepping() + },runUntil:function(context,sourceFile,lineNo){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("runUntil "+lineNo+" @"+sourceFile) + }if(!context.stoppedFrame||!context.stoppedFrame.isValid){return + }fbs.runUntil(sourceFile,lineNo,context.stoppedFrame,this); + this.resume(context) + },freeze:function(context){var executionContext=context.stoppedFrame.executionContext; + try{executionContext.scriptsEnabled=false; + this.suppressEventHandling(context); + context.isFrozen=true; + if(context.window.document.commandDispatcher){context.saveFocus=context.window.document.commandDispatcher.focusedElement; + if(context.saveFocus){context.discardBlurEvents=function(event){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.freeze discard blur event "+context.discardOneMore+" while focus is "+context.window.document.commandDispatcher.focusedElement,event) + }event.preventDefault(); + event.stopPropagation(); + if(context.discardOneMore){context.window.removeEventListener("blur",context.discardBlurEvents,true); + delete context.discardOneMore; + delete context.saveFocus + }},context.window.addEventListener("blur",context.discardBlurEvents,true) + }}if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.freeze context.saveFocus "+context.saveFocus,context.saveFocus); + FBTrace.sysout("debugger.freeze try to disable scripts "+(context.eventSuppressor?"and events":"but not events")+" in "+context.getName()+" executionContext.tag "+executionContext.tag+".scriptsEnabled: "+executionContext.scriptsEnabled) + }}catch(exc){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.freeze, freeze exception "+exc+" in "+context.getName(),exc) + }}},suppressEventHandling:function(context){if(context.window instanceof Ci.nsIInterfaceRequestor){context.eventSuppressor=context.window.getInterface(Ci.nsIDOMWindowUtils); + if(context.eventSuppressor){context.eventSuppressor.suppressEventHandling(true) + }}},thaw:function(context){try{if(context.isFrozen){delete context.isFrozen + }else{return + }var executionContext=context.stoppedFrame.executionContext; + if(executionContext.isValid){this.unsuppressEventHandling(context); + if(context.saveFocus){context.window.focus(); + context.saveFocus.focus(); + context.discardOneMore=true + }if(FBTrace.DBG_UI_LOOP){var nowFocused=context.window.document.commandDispatcher?context.window.document.commandDispatcher.focusedElement:null; + FBTrace.sysout("debugger.thaw context.saveFocus "+context.saveFocus+" vs "+nowFocused,context.saveFocus) + }executionContext.scriptsEnabled=true + }else{if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.thaw "+executionContext.tag+" executionContext is not valid") + }}if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.thaw try to enable scripts "+(context.eventSuppressor?"with events suppressed":"events enabled")+" in "+context.getName()+" executionContext.tag "+executionContext.tag+".scriptsEnabled: "+executionContext.scriptsEnabled) + }}catch(exc){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.stop, scriptsEnabled = true exception:",exc) + }}},unsuppressEventHandling:function(context){if(context.eventSuppressor){context.eventSuppressor.suppressEventHandling(false); + delete context.eventSuppressor + }},toggleFreezeWindow:function(context){if(!context.stopped){Firebug.Debugger.halt(function grabContext(frame){context.stoppedFrame=frame; + Firebug.Debugger.doToggleFreezeWindow(context); + delete context.stoppedFrame + }); + Firebug.Debugger.toggleReportTopLevel(context); + Firebug.Debugger.suspend(context) + }else{Firebug.Debugger.doToggleFreezeWindow(context) + }},doToggleFreezeWindow:function(context){if(context.isFrozen){Firebug.Debugger.unsuppressEventHandling(context) + }else{Firebug.Debugger.suppressEventHandling(context) + }},toggleReportTopLevel:function(context){if(context.reportTopLevel){fbs.setTopLevelHook(null) + }else{fbs.setTopLevelHook(Firebug.Debugger,function reportTopLevel(frame){Firebug.Console.logFormatted(["Javascript entered",frame.script.fileName,frame.line],context,"info") + }) + }},setBreakOnNextCause:function(context,frame){var sourceFile=Firebug.SourceFile.getSourceFileByScript(context,frame.script); + var analyzer=sourceFile.getScriptAnalyzer(frame.script); + var lineNo=analyzer.getSourceLineFromFrame(context,frame); + context.breakingCause={title:$STR("Break On Next"),message:$STR("Disable converts pause to disabled breakpoint"),skipAction:function addSkipperAndGo(){var bp=fbs.setBreakpoint(sourceFile,lineNo,null,Firebug.Debugger); + fbs.disableBreakpoint(sourceFile.href,lineNo); + if(FBTrace.DBG_BP){FBTrace.sysout("debugger.setBreakOnNextCause converted to disabled bp "+sourceFile.href+"@"+lineNo+" tag: "+frame.script.tag,bp) + }Firebug.Debugger.resume(context) + },okAction:function justGo(){Firebug.Debugger.resume(context) + }} + },setBreakpoint:function(sourceFile,lineNo){fbs.setBreakpoint(sourceFile,lineNo,null,Firebug.Debugger) + },clearBreakpoint:function(sourceFile,lineNo){fbs.clearBreakpoint(sourceFile.href,lineNo) + },setErrorBreakpoint:function(sourceFile,line){fbs.setErrorBreakpoint(sourceFile,line,Firebug.Debugger) + },clearErrorBreakpoint:function(sourceFile,line){fbs.clearErrorBreakpoint(sourceFile.href,line,Firebug.Debugger) + },clearAllBreakpoints:function(context){if(context){var sourceFiles=sourceFilesAsArray(context.sourceFileMap); + fbs.clearAllBreakpoints(sourceFiles,Firebug.Debugger) + }else{fbs.enumerateBreakpoints(null,{call:function(url,lineNo,bp){if(bp.debuggerName!==Firebug.Debugger.debuggerName){return + }if(Firebug.filterSystemURLs){fbs.clearBreakpoint(url,lineNo) + }else{if(!isSystemURL(url)){fbs.clearBreakpoint(url,lineNo) + }}}}) + }},enableAllBreakpoints:function(context){if(FBTrace.DBG_BP){FBTrace.sysout("enableAllBreakpoints sourceFileMap:",context.sourceFileMap) + }for(var url in context.sourceFileMap){fbs.enumerateBreakpoints(url,{call:function(url,lineNo){fbs.enableBreakpoint(url,lineNo) + }}) + }},disableAllBreakpoints:function(context){for(var url in context.sourceFileMap){fbs.enumerateBreakpoints(url,{call:function(url,lineNo){fbs.disableBreakpoint(url,lineNo) + }}) + }},getBreakpointCount:function(context){var count=0; + for(var url in context.sourceFileMap){fbs.enumerateBreakpoints(url,{call:function(url,lineNo){++count + }}); + fbs.enumerateErrorBreakpoints(url,{call:function(url,lineNo){++count + }}) + }return count + },traceAll:function(context){fbs.traceAll(sourceURLsAsArray(context),this) + },untraceAll:function(context){fbs.untraceAll(this) + },monitorFunction:function(fn,mode){if(typeof(fn)=="function"||fn instanceof Function){var script=findScriptForFunctionInContext(Firebug.currentContext,fn); + if(script){this.monitorScript(fn,script,mode) + }else{Firebug.Console.logFormatted(["Firebug unable to locate jsdIScript for function",fn],Firebug.currentContext,"info") + }}else{Firebug.Console.logFormatted(["Firebug.Debugger.monitorFunction requires a function",fn],Firebug.currentContext,"info") + }},unmonitorFunction:function(fn,mode){if(typeof(fn)=="function"||fn instanceof Function){var script=findScriptForFunctionInContext(Firebug.currentContext,fn); + if(script){this.unmonitorScript(fn,script,mode) + }}},monitorScript:function(fn,script,mode){var scriptInfo=Firebug.SourceFile.getSourceFileAndLineByScript(Firebug.currentContext,script); + if(scriptInfo){if(mode=="debug"){this.setBreakpoint(scriptInfo.sourceFile,scriptInfo.lineNo) + }else{if(mode=="monitor"){fbs.monitor(scriptInfo.sourceFile,scriptInfo.lineNo,Firebug.Debugger) + }}}},unmonitorScript:function(fn,script,mode){var scriptInfo=Firebug.SourceFile.getSourceFileAndLineByScript(Firebug.currentContext,script); + if(scriptInfo){if(mode=="debug"){this.clearBreakpoint(scriptInfo.sourceFile,scriptInfo.lineNo) + }else{if(mode=="monitor"){fbs.unmonitor(scriptInfo.sourceFile.href,scriptInfo.lineNo) + }}}},traceCalls:function(context,fn){if(typeof(fn)=="function"||fn instanceof Function){var script=findScriptForFunctionInContext(context,fn); + if(script){this.traceScriptCalls(context,script) + }else{if(FBTrace.DBG_ERRORS){FBTrace.sysout("debugger.traceCalls no script found for "+fn,fn) + }}}},untraceCalls:function(context,fn){if(typeof(fn)=="function"||fn instanceof Function){var script=findScriptForFunctionInContext(context,fn); + if(script){this.untraceScriptCalls(context,script) + }}},traceScriptCalls:function(context,script){var scriptInfo=Firebug.SourceFile.getSourceFileAndLineByScript(context,script); + if(scriptInfo){fbs.traceCalls(scriptInfo.sourceFile,scriptInfo.lineNo,Firebug.Debugger) + }},untraceScriptCalls:function(context,script){var scriptInfo=Firebug.SourceFile.getSourceFileAndLineByScript(context,script); + if(scriptInfo){fbs.untraceCalls(scriptInfo.sourceFile,scriptInfo.lineNo,Firebug.Debugger) + }},startDebugging:function(context){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("startDebugging enter context.stopped:"+context.stopped+" for context: "+context.getName()+"\n") + }try{fbs.lockDebugger(); + context.executingSourceFile=Firebug.SourceFile.getSourceFileByScript(context,context.stoppedFrame.script); + if(!context.executingSourceFile){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("startDebugging resuming, no sourceFile for "+context.stoppedFrame.script.fileName,context.stoppedFrame.script.functionSource) + }this.resume(context); + return + }var currentBreakable=Firebug.chrome.getGlobalAttribute("cmd_breakOnNext","breakable"); + if(FBTrace.DBG_BP){FBTrace.sysout("debugger.startDebugging; currentBreakable "+currentBreakable+" in "+context.getName()) + }if(currentBreakable=="false"){Firebug.chrome.setGlobalAttribute("cmd_breakOnNext","breakable","true") + }if(context!=Firebug.currentContext||Firebug.isDetached()){Firebug.selectContext(context) + }if(Firebug.isMinimized()){Firebug.unMinimize() + }this.syncCommands(context); + this.syncListeners(context); + var panel=context.getPanel("script",true); + Firebug.Breakpoint.updatePanelTab(panel,false); + Firebug.chrome.syncPanel("script"); + Firebug.chrome.select(context.stoppedFrame,"script",null,true); + Firebug.chrome.focus() + }catch(exc){if(FBTrace.DBG_ERRORS){FBTrace.sysout("Resuming debugger: error during debugging loop: "+exc,exc) + }Firebug.Console.log("Resuming debugger: error during debugging loop: "+exc); + this.resume(context) + }dispatch(this.fbListeners,"onStartDebugging",[context]); + if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("startDebugging exit context.stopped:"+context.stopped+" for context: "+context.getName()+"\n") + }},stopDebugging:function(context){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("stopDebugging enter context: "+context.getName()+"\n") + }try{fbs.unlockDebugger(); + if(context&&context.window&&!context.aborted){delete context.stopped; + delete context.stoppedFrame; + delete context.currentFrame; + context.executingSourceFile=null; + delete context.breakLineNumber; + var chrome=Firebug.chrome; + this.syncCommands(context); + this.syncListeners(context); + var panel=context.getPanel("script",true); + if(panel&&panel==Firebug.chrome.getSelectedPanel()){panel.showNoStackFrame() + }if(panel){panel.highlight(false) + }chrome.syncSidePanels() + }else{if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.stopDebugging else "+context.getName()+" "+safeGetWindowLocation(context.window)) + }}}catch(exc){if(FBTrace.DBG_UI_LOOP){FBTrace.sysout("debugger.stopDebugging FAILS",exc) + }ERROR(exc) + }},syncCommands:function(context){var chrome=Firebug.chrome; + if(!chrome){if(FBTrace.DBG_ERRORS){FBTrace.sysout("debugger.syncCommand, context with no chrome: "+context.getGlobalScope()) + }return + }if(context.stopped){chrome.setGlobalAttribute("fbDebuggerButtons","stopped","true"); + chrome.setGlobalAttribute("cmd_rerun","disabled","false"); + chrome.setGlobalAttribute("cmd_resumeExecution","disabled","false"); + chrome.setGlobalAttribute("cmd_stepOver","disabled","false"); + chrome.setGlobalAttribute("cmd_stepInto","disabled","false"); + chrome.setGlobalAttribute("cmd_stepOut","disabled","false") + }else{chrome.setGlobalAttribute("fbDebuggerButtons","stopped","false"); + chrome.setGlobalAttribute("cmd_rerun","disabled","true"); + chrome.setGlobalAttribute("cmd_stepOver","disabled","true"); + chrome.setGlobalAttribute("cmd_stepInto","disabled","true"); + chrome.setGlobalAttribute("cmd_stepOut","disabled","true"); + chrome.setGlobalAttribute("cmd_resumeExecution","disabled","true") + }},syncListeners:function(context){var chrome=Firebug.chrome; + if(context.stopped){this.attachListeners(context,chrome) + }else{this.detachListeners(context,chrome) + }},attachListeners:function(context,chrome){this.keyListeners=[chrome.keyCodeListen("F8",null,bind(this.resume,this,context),true),chrome.keyListen("/",isControl,bind(this.resume,this,context)),chrome.keyCodeListen("F10",null,bind(this.stepOver,this,context),true),chrome.keyListen("'",isControl,bind(this.stepOver,this,context)),chrome.keyCodeListen("F11",null,bind(this.stepInto,this,context)),chrome.keyListen(";",isControl,bind(this.stepInto,this,context)),chrome.keyCodeListen("F11",isShift,bind(this.stepOut,this,context)),chrome.keyListen(",",isControlShift,bind(this.stepOut,this,context))] + },detachListeners:function(context,chrome){if(this.keyListeners){for(var i=0; + i1){var curFrame=frame; + var curFrameSig=curFrame.script.tag+"."+curFrame.pc; + for(var i=1; + i "+context.getName()+" ("+context.uid+")\n") + }Firebug.SourceFile.addScriptsToSourceFile(sourceFile,null,innerScriptEnumerator) + }else{sourceFile=new Firebug.XULSourceFile(outerScript.fileName,outerScript,innerScriptEnumerator); + this.watchSourceFile(context,sourceFile) + }if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("debugger.onXULScriptCreated script.fileName="+outerScript.fileName+" in "+context.getName()+" "+sourceFile) + }dispatch(this.fbListeners,"onXULScriptCreated",[context,frame,sourceFile.href]); + return sourceFile + }catch(e){if(FBTrace.DBG_TOPLEVEL||FBTrace.DBG_ERRORS){FBTrace.sysout("onXULScriptCreated FaILS "+e,e) + }}},onEvalScriptCreated:function(frame,outerScript,innerScripts){try{if(FBTrace.DBG_EVAL){FBTrace.sysout("debugger.onEvalLevelScript script.fileName="+outerScript.fileName+"\n") + }var context=this.breakContext; + delete this.breakContext; + var sourceFile=this.getEvalLevelSourceFile(frame,context,innerScripts); + if(FBTrace.DBG_EVAL){FBTrace.sysout("debugger.onEvalScriptCreated url="+sourceFile.href,FBL.getCorrectedStackTrace(frame,context)) + }dispatch(this.fbListeners,"onEvalScriptCreated",[context,frame,sourceFile.href]); + return sourceFile + }catch(e){if(FBTrace.DBG_EVAL||FBTrace.DBG_ERRORS){FBTrace.sysout("onEvalScriptCreated FaILS ",e) + }}},onEventScriptCreated:function(frame,outerScript,innerScripts){if(FBTrace.DBG_EVENTS){FBTrace.sysout("debugger.onEventScriptCreated script.fileName="+outerScript.fileName+"\n") + }var context=this.breakContext; + delete this.breakContext; + var script=frame.script; + var creatorURL=normalizeURL(frame.script.fileName); + var innerScriptArray=[]; + try{var source=script.functionSource; + while(innerScripts.hasMoreElements()){var inner=innerScripts.getNext(); + source+="\n"+inner.functionSource; + innerScriptArray.push(inner) + }}catch(exc){var source=creatorURL+"/"+getUniqueId() + }var lines=splitLines(source); + var urlDescribed=this.getDynamicURL(context,normalizeURL(frame.script.fileName),lines,"event"); + var url=urlDescribed.href; + context.sourceCache.invalidate(url); + context.sourceCache.storeSplitLines(url,lines); + var sourceFile=new Firebug.EventSourceFile(url,frame.script,"event:"+script.functionName+"."+script.tag,lines,new ArrayEnumerator(innerScriptArray)); + this.watchSourceFile(context,sourceFile); + if(FBTrace.DBG_EVENTS){FBTrace.sysout("debugger.onEventScriptCreated url="+sourceFile.href+"\n") + }if(FBTrace.DBG_EVENTS){FBTrace.sysout("debugger.onEventScriptCreated sourceFileMap:",context.sourceFileMap) + }if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("debugger.onEventScriptCreated sourcefile="+sourceFile.toString()+" -> "+context.getName()+"\n") + }dispatch(this.fbListeners,"onEventScriptCreated",[context,frame,url]); + return sourceFile + },onTopLevelScriptCreated:function(frame,outerScript,innerScripts){if(FBTrace.DBG_TOPLEVEL){FBTrace.sysout("debugger("+this.debuggerName+").onTopLevelScriptCreated script.fileName="+outerScript.fileName+"\n") + }var context=this.breakContext; + delete this.breakContext; + var script=frame.script; + var url=normalizeURL(script.fileName); + if(FBTrace.DBG_TOPLEVEL){FBTrace.sysout("debugger.onTopLevelScriptCreated frame.script.tag="+frame.script.tag+" has url="+url) + }var isInline=false; + if(FBTrace.DBG_TOPLEVEL){FBTrace.sysout("debugger.onTopLevelScriptCreated has inLine:"+isInline+" url="+url) + }if(isInline){var href=url+"/"+context.dynamicURLIndex++; + sourceFile=new Firebug.ScriptTagAppendSourceFile(href,script,script.lineExtent,innerScripts); + this.watchSourceFile(context,sourceFile); + context.pendingScriptTagSourceFile=sourceFile + }else{var sourceFile=context.sourceFileMap[url]; + if(sourceFile&&(sourceFile instanceof Firebug.TopLevelSourceFile)){if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("debugger.onTopLevelScriptCreated reuse sourcefile="+sourceFile.toString()+" -> "+context.getName()+" ("+context.uid+")\n") + }if(!sourceFile.outerScript||!sourceFile.outerScript.isValid){sourceFile.outerScript=outerScript + }Firebug.SourceFile.addScriptsToSourceFile(sourceFile,outerScript,innerScripts) + }else{sourceFile=new Firebug.TopLevelSourceFile(url,script,script.lineExtent,innerScripts); + this.watchSourceFile(context,sourceFile); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("debugger.onTopLevelScriptCreated create sourcefile="+sourceFile.toString()+" -> "+context.getName()+" ("+context.uid+")\n") + }}}dispatch(this.fbListeners,"onTopLevelScriptCreated",[context,frame,sourceFile.href]); + return sourceFile + },getContextByFrame:function(frame){if(FBTrace.DBG_BP){FBTrace.sysout("debugger.getContextByFrame") + }var win=fbs.getOutermostScope(frame); + return win?TabWatcher.getContextByWindow(win):null + },watchSourceFile:function(context,sourceFile){context.addSourceFile(sourceFile) + },unwatchSourceFile:function(context,sourceFile){context.removeSourceFile(sourceFile) + },onToggleBreakpoint:function(url,lineNo,isSet,props){if(props.debuggerName!=this.debuggerName){if(FBTrace.DBG_BP){FBTrace.sysout("debugger("+this.debuggerName+").onToggleBreakpoint ignoring toggle for "+props.debuggerName+" target "+lineNo+"@"+url+"\n") + }return + }var found=false; + for(var i=0; + i "+context.getName()+"\n") + }return sourceFile + },getConstructorExpression:function(caller_frame,context){var decompiled_lineno=getLineAtPC(caller_frame,context); + if(FBTrace.DBG_EVAL){FBTrace.sysout("debugger.getConstructoreExpression decompiled_lineno:"+decompiled_lineno+"\n") + }var decompiled_lines=splitLines(caller_frame.script.functionSource); + if(FBTrace.DBG_EVAL){FBTrace.sysout("debugger.getConstructoreExpression decompiled_lines:",decompiled_lines) + }var candidate_line=decompiled_lines[decompiled_lineno-1]; + if(FBTrace.DBG_EVAL){FBTrace.sysout("debugger.getConstructoreExpression candidate_line:"+candidate_line+"\n") + }if(candidate_line&&candidate_line!=null){var m=reFunction.exec(candidate_line); + if(m){var arguments=m[1] + }}if(FBTrace.DBG_EVAL){FBTrace.sysout("debugger.getConstructoreExpression arguments:"+arguments+"\n") + }if(arguments){var lastComma=arguments.lastIndexOf(","); + return arguments.substring(lastComma+1) + }return null + },getEvalLevelSourceFile:function(frame,context,innerScripts){var eval_expr=this.getEvalExpression(frame,context); + if(FBTrace.DBG_EVAL){FBTrace.sysout("getEvalLevelSourceFile eval_expr:"+eval_expr+"\n") + }if(eval_expr&&!Firebug.decompileEvals){var source=this.getEvalBody(frame,"lib.getEvalLevelSourceFile.getEvalBody",1,eval_expr); + var mapType=PCMAP_SOURCETEXT + }else{var source=frame.script.functionSource; + var mapType=PCMAP_PRETTYPRINT + }var lines=splitLines(source); + if(FBTrace.DBG_EVAL){FBTrace.sysout("getEvalLevelSourceFile "+lines.length+"lines, mapType:"+((mapType==PCMAP_SOURCETEXT)?"SOURCE":"PRETTY")+" source:"+source+"\n") + }var url=this.getDynamicURL(context,normalizeURL(frame.script.fileName),lines,"eval"); + context.sourceCache.invalidate(url.href); + context.sourceCache.storeSplitLines(url.href,lines); + var sourceFile=new Firebug.EvalLevelSourceFile(url,frame.script,eval_expr,lines,mapType,innerScripts); + this.watchSourceFile(context,sourceFile); + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("debugger.getEvalLevelSourceFile sourcefile="+sourceFile.toString()+" -> "+context.getName()+"\n") + }return sourceFile + },getDynamicURL:function(context,callerURL,lines,kind){var url=this.getURLFromLastLine(context,lines); + if(url){return url + }var url=this.getSequentialURL(context,callerURL,kind); + if(url){return url + }var url=this.getURLFromMD5(callerURL,lines,kind); + if(url){return url + }var url=this.getDataURLForScript(callerURL,lines); + if(url){return url + }return url + },getURLFromLastLine:function(context,lines){var url=null; + var reURIinComment=/\/\/@\ssourceURL=\s*(\S*?)\s*$/m; + var m=reURIinComment.exec(lines[lines.length-1]); + if(m){if(m[1]&&m[1].indexOf("://")==-1){var loc=context.window.location; + if(m[1].charAt(0)!="/"){m[1]="/"+m[1] + }m[1]=loc.protocol+"//"+loc.host+m[1] + }var href=new String(m[1]); + url={href:href,kind:"source"}; + if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("debugger.getURLFromLastLine "+url.href,url) + }}else{if(FBTrace.DBG_SOURCEFILES){FBTrace.sysout("debugger.getURLFromLastLine no match"+lines[lines.length-1]) + }}return url + },getSequentialURL:function(context,callerURL,kind){var url=null; + if(!context.dynamicURLhasBP){var href=new String(callerURL+(kind?"/"+kind+"/":"/nokind/")+"seq/"+(context.dynamicURLIndex++)); + url={href:href,kind:"seq"}; + if(FBTrace.DBG_SOURCEFILES||isNaN(context.dynamicURLIndex)){FBTrace.sysout("debugger.getSequentialURL context:"+context.getName()+" url:"+url.href+" index: "+context.dynamicURLIndex,url) + }}return url + },getURLFromMD5:function(callerURL,lines,kind){this.hash_service.init(this.nsICryptoHash.MD5); + var source=lines.join("\n"); + byteArray=[]; + for(var j=0; + j0){context.invalidatePanels("script") + }},destroyContext:function(context,persistedState){Firebug.ActivableModule.destroyContext.apply(this,arguments); + context.window.document.removeEventListener("DOMNodeInserted",context.watchScriptAdditions,false); + if(context.stopped){this.abort(context) + }if(persistedState){if(context.dynamicURLhasBP){persistedState.dynamicURLhasBP=context.dynamicURLhasBP + }else{delete persistedState.dynamicURLhasBP + }}},updateOption:function(name,value){if(name=="breakOnErrors"){$("cmd_breakOnErrors").setAttribute("checked",value) + }else{if(name=="decompileEvals"){$("cmd_decompileEvals").setAttribute("checked",value) + }}},getObjectByURL:function(context,url){var sourceFile=getSourceFileByHref(url,context); + if(sourceFile){return new SourceLink(sourceFile.href,0,"js") + }},shutdown:function(){this.unregisterClient(Firebug); + fbs.unregisterDebugger(this) + },registerDebugger:function(){if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("registerDebugger this.registered: "+this.registered) + }if(this.registered){return + }this.registered=true; + var check=fbs.registerDebugger(this); + if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("debugger.registerDebugger "+check+" debuggers") + }},unregisterDebugger:function(){if(FBTrace.DBG_INITIALIZE){FBTrace.sysout("debugger.unregisterDebugger this.registered: "+this.registered) + }if(!this.registered){return + }if(Firebug.Profiler.isProfiling()){return + }var check=fbs.unregisterDebugger(this); + this.registered=false; + if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("debugger.unregisterDebugger: "+check+" debuggers") + }},onSourceFileCreated:function(context,sourceFile){context.invalidatePanels("script","breakpoints") + },onObserverChange:function(observer){if(this.hasObservers()){this.activateDebugger() + }else{this.deactivateDebugger() + }},activateDebugger:function(){this.registerDebugger(); + if(Firebug.currentContext&&!fbs.isJSDActive()){fbs.unPause() + }if(FBTrace.DBG_PANELS||FBTrace.DBG_ACTIVATION){FBTrace.sysout("debugger.activate;") + }},deactivateDebugger:function(){if(this.dependents&&this.dependents.length>0){for(var i=0; + i0){if(!this.isAlwaysEnabled()){this.activateDebugger(); + if(Firebug.currentContext){Firebug.Console.log("enabling javascript debugger to support "+dependentAddedOrRemoved.dispatchName,Firebug.currentContext) + }}}},onSuspendingFirebug:function(){var anyStopped=TabWatcher.iterateContexts(function isAnyStopped(context){return context.stopped + }); + return anyStopped + },onSuspendFirebug:function(){if(!Firebug.Debugger.isAlwaysEnabled()){return + }var paused=fbs.pause(); + if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("debugger.onSuspendFirebug paused: "+paused+" isAlwaysEnabled "+Firebug.Debugger.isAlwaysEnabled()+"\n") + }if(!paused){return true + }return false + },onResumeFirebug:function(){if(!Firebug.Debugger.isAlwaysEnabled()){return + }var unpaused=fbs.unPause(); + if(FBTrace.DBG_ACTIVATION){FBTrace.sysout("debugger.onResumeFirebug unpaused: "+unpaused+" isAlwaysEnabled "+Firebug.Debugger.isAlwaysEnabled()) + }if(FBTrace.DBG_ERRORS&&!this.registered&&Firebug.Debugger.isAlwaysEnabled()){FBTrace.sysout("debugger.onResumeFirebug but debugger "+Firebug.Debugger.debuggerName+" not registered! *** ") + }},ableWatchSidePanel:function(context){if(Firebug.Console.isAlwaysEnabled()){var watchPanel=context.getPanel("watches",true); + if(watchPanel){return watchPanel + }}return null + },onScriptFilterMenuTooltipShowing:function(tooltip,context){if(FBTrace.DBG_OPTIONS){FBTrace.sysout("onScriptFilterMenuTooltipShowing not implemented") + }},onScriptFilterMenuCommand:function(event,context){var menu=event.target; + Firebug.setPref(Firebug.servicePrefDomain,"scriptsFilter",menu.value); + Firebug.Debugger.filterMenuUpdate() + },menuFullLabel:{"static":$STR("ScriptsFilterStatic"),evals:$STR("ScriptsFilterEval"),events:$STR("ScriptsFilterEvent"),all:$STR("ScriptsFilterAll")},menuShortLabel:{"static":$STR("ScriptsFilterStaticShort"),evals:$STR("ScriptsFilterEvalShort"),events:$STR("ScriptsFilterEventShort"),all:$STR("ScriptsFilterAllShort")},onScriptFilterMenuPopupShowing:function(menu,context){if(this.menuTooltip){this.menuTooltip.fbEnabled=false + }var items=menu.getElementsByTagName("menuitem"); + var value=this.filterButton.value; + for(var i=0; + isourceBox.lastViewableLine){break + }lineNo++ + }if(FBTrace.DBG_BP||FBTrace.DBG_LINETABLE){FBTrace.sysout("debugger.markExecutableLines DONE: "+sourceFile.toString()+"\n") + }},setLineBreakpoints:function(sourceFile,sourceBox){return; + fbs.enumerateBreakpoints(sourceFile.href,{call:function(url,line,props,scripts){var scriptRow=sourceBox.getLineNode(line); + if(scriptRow){scriptRow.setAttribute("breakpoint","true"); + if(props.disabled){scriptRow.setAttribute("disabledBreakpoint","true") + }if(props.condition){scriptRow.setAttribute("condition","true") + }}if(FBTrace.DBG_LINETABLE){FBTrace.sysout("debugger.setLineBreakpoints found "+scriptRow+" for "+line+"@"+sourceFile.href+"\n") + }}}) + }}); + Firebug.ScriptPanel.prototype=extend(Firebug.SourceBoxPanel,{updateSourceBox:function(sourceBox){if(this.scrollInfo&&(this.scrollInfo.location==this.location)){this.scrollToLine(this.location,this.scrollInfo.previousCenterLine) + }delete this.scrollInfo + },getSourceType:function(){return"js" + },getDecorator:function(sourceBox){return Firebug.ScriptPanel.decorator + },create:function(){var doc=Firebug.chrome.document; + var styleSheet=createStyleSheet(doc,Env.Location.skinDir+"debugger.css"); + addStyleSheet(doc,styleSheet); + var tempContext=new Firebug.TabContext(window,Firebug.browser,Firebug.chrome,{}); + this.context=extend(Firebug.browser,tempContext); + this.context.setTimeout=Firebug.browser.setTimeout; + this.context.clearTimeout=Firebug.browser.clearTimeout; + this.context.setInterval=Firebug.browser.setInterval; + this.context.clearInterval=Firebug.browser.clearInterval; + Firebug.SourceBoxPanel.create.apply(this,arguments) + },initialize:function(context,doc){this.location=null; + Firebug.SourceBoxPanel.initialize.apply(this,arguments) + },showFunction:function(fn){var sourceLink=findSourceForFunction(fn,this.context); + if(sourceLink){this.showSourceLink(sourceLink) + }else{if(FBTrace.DBG_ERRORS){FBTrace.sysout("no sourcelink for function") + }}},showSourceLink:function(sourceLink){var sourceFile=getSourceFileByHref(sourceLink.href,this.context); + if(sourceFile){this.navigate(sourceFile); + if(sourceLink.line){this.scrollToLine(sourceLink.href,sourceLink.line,this.jumpHighlightFactory(sourceLink.line,this.context)); + dispatch(this.fbListeners,"onShowSourceLink",[this,sourceLink.line]) + }if(sourceLink==this.selection){delete this.selection + }}},highlightExecutionLine:function(){var highlightingAttribute="exe_line"; + if(this.executionLine){this.executionLine.removeAttribute(highlightingAttribute) + }var sourceBox=this.selectedSourceBox; + var lineNode=sourceBox.getLineNode(this.executionLineNo); + this.executionLine=lineNode; + if(sourceBox.breakCauseBox){sourceBox.breakCauseBox.hide(); + delete sourceBox.breakCauseBox + }if(this.executionLine){lineNode.setAttribute(highlightingAttribute,"true"); + if(this.context.breakingCause&&!this.context.breakingCause.shown){this.context.breakingCause.shown=true; + var cause=this.context.breakingCause; + if(cause){var sourceLine=getChildByClass(lineNode,"sourceLine"); + sourceBox.breakCauseBox=new Firebug.Breakpoint.BreakNotification(this.document,cause); + sourceBox.breakCauseBox.show(sourceLine,this,"not an editor, yet?") + }}}if(FBTrace.DBG_BP||FBTrace.DBG_STACK||FBTrace.DBG_SOURCEFILES){FBTrace.sysout("sourceBox.highlightExecutionLine lineNo: "+this.executionLineNo+" lineNode="+lineNode+" in "+sourceBox.repObject.href) + }return(this.executionLineNo>0) + },showStackFrameXB:function(frameXB){if(this.context.stopped){this.setCurrentStackFrame(frameXB); + this.showExecutingSourceFile(frameXB.sourceFile,frameXB) + }else{this.showNoStackFrame() + }},showStackFrame:function(frame){if(!frame||(frame&&!frame.isValid)){if(FBTrace.DBG_STACK){FBTrace.sysout("showStackFrame no valid frame\n") + }this.showNoStackFrame(); + return + }var sourceFile=Firebug.SourceFile.getSourceFileByScript(this.context,frame.script); + if(!sourceFile){if(FBTrace.DBG_STACK){FBTrace.sysout("showStackFrame no sourceFile in context "+this.context.getName()+"for frame.script: "+frame.script.fileName) + }this.showNoStackFrame(); + return + }this.setCurrentStackFrame(frame); + this.showExecutingSourceFile(sourceFile,frame) + },showExecutingSourceFile:function(sourceFile,frame){this.context.executingSourceFile=sourceFile; + this.executionFile=sourceFile; + if(this.executionFile){var url=this.executionFile.href; + var analyzer=this.executionFile.getScriptAnalyzer(frame.script); + this.executionLineNo=analyzer.getSourceLineFromFrame(this.context,frame); + if(FBTrace.DBG_STACK){FBTrace.sysout("showStackFrame executionFile:"+this.executionFile+"@"+this.executionLineNo+"\n") + }if(this.context.breakingCause){this.context.breakingCause.lineNo=this.executionLineNo + }this.scrollToLine(url,this.executionLineNo,bind(this.highlightExecutionLine,this)); + this.context.throttle(this.updateInfoTip,this); + return + }else{if(FBTrace.DBG_STACK){FBTrace.sysout("showStackFrame no getSourceFileByScript for tag="+frame.script.tag+"\n") + }this.showNoStackFrame() + }},showNoStackFrame:function(){this.executionFile=null; + this.executionLineNo=-1; + if(this.selectedSourceBox){this.highlightExecutionLine() + }var panelStatus=Firebug.chrome.getPanelStatusElements(); + panelStatus.clear(); + this.updateInfoTip(); + var watchPanel=this.context.getPanel("watches",true); + if(watchPanel){watchPanel.showEmptyMembers() + }},setCurrentStackFrame:function(frame){if(frame instanceof Ci.jsdIStackFrame){this.context.currentFrame=frame + }else{if(frame instanceof StackFrame){this.context.currentFrame=frame.getNativeFrame() + }}},toggleBreakpoint:function(lineNo){var sourceFile=this.getSourceFileBySourceBox(this.selectedSourceBox); + var lineNode=this.selectedSourceBox.getLineNode(lineNo); + if(!sourceFile&&FBTrace.DBG_ERRORS){FBTrace.sysout("toggleBreakpoint no sourceFile! ",this) + }if(FBTrace.DBG_BP){FBTrace.sysout("debugger.toggleBreakpoint lineNo="+lineNo+" sourceFile.href:"+sourceFile.href+" lineNode.breakpoint:"+(lineNode?lineNode.getAttribute("breakpoint"):"(no lineNode)")+"\n",this.selectedSourceBox) + }if(lineNode.getAttribute("breakpoint")=="true"){fbs.clearBreakpoint(sourceFile.href,lineNo) + }else{fbs.setBreakpoint(sourceFile,lineNo,null,Firebug.Debugger) + }},toggleDisableBreakpoint:function(lineNo){var sourceFile=this.getSourceFileBySourceBox(this.selectedSourceBox); + var lineNode=this.selectedSourceBox.getLineNode(lineNo); + if(lineNode.getAttribute("disabledBreakpoint")=="true"){fbs.enableBreakpoint(sourceFile.href,lineNo) + }else{fbs.disableBreakpoint(sourceFile.href,lineNo) + }},editBreakpointCondition:function(lineNo){var sourceRow=this.selectedSourceBox.getLineNode(lineNo); + var sourceLine=getChildByClass(sourceRow,"sourceLine"); + var condition=fbs.getBreakpointCondition(this.location.href,lineNo); + if(condition){var watchPanel=this.context.getPanel("watches",true); + watchPanel.removeWatch(condition); + watchPanel.rebuild() + }Firebug.Editor.startEditing(sourceLine,condition) + },addSelectionWatch:function(){var watchPanel=this.context.getPanel("watches",true); + if(watchPanel){var selection=this.document.defaultView.getSelection(); + var source=this.getSourceLinesFrom(selection); + watchPanel.addWatch(source) + }},copySource:function(){var selection=this.document.defaultView.getSelection(); + var source=this.getSourceLinesFrom(selection); + copyToClipboard(source) + },updateInfoTip:function(){var infoTip=this.panelBrowser.infoTip; + if(infoTip&&this.infoTipExpr){this.populateInfoTip(infoTip,this.infoTipExpr) + }},populateInfoTip:function(infoTip,expr){if(!expr||isJavaScriptKeyword(expr)){return false + }var self=this; + Firebug.CommandLine.evaluate(expr,this.context,null,this.context.getGlobalScope(),function success(result,context){var rep=Firebug.getRep(result,context); + var tag=rep.shortTag?rep.shortTag:rep.tag; + if(FBTrace.DBG_STACK){FBTrace.sysout("populateInfoTip result is "+result,result) + }tag.replace({object:result},infoTip); + Firebug.chrome.contextMenuObject=result; + self.infoTipExpr=expr + },function failed(result,context){self.infoTipExpr="" + }); + return(self.infoTipExpr==expr) + },onMouseDown:function(event){var target=event.target||event.srcElement; + if(getAncestorByClass(target,"breakNotification")){return + }var sourceLine=getAncestorByClass(target,"sourceLine"); + if(!sourceLine){return + }var sourceRow=sourceLine.parentNode; + var sourceFile=sourceRow.parentNode.repObject; + var lineNo=parseInt(sourceLine.textContent); + if(isLeftClick(event)){this.toggleBreakpoint(lineNo) + }else{if(isShiftClick(event)){this.toggleDisableBreakpoint(lineNo) + }else{if(isControlClick(event)||isMiddleClick(event)){Firebug.Debugger.runUntil(this.context,sourceFile,lineNo,Firebug.Debugger); + cancelEvent(event) + }}}},onContextMenu:function(event){var sourceLine=getAncestorByClass(event.target||event.srcElement,"sourceLine"); + if(!sourceLine){return + }var lineNo=parseInt(sourceLine.textContent); + this.editBreakpointCondition(lineNo); + cancelEvent(event) + },onMouseOver:function(event){var sourceLine=getAncestorByClass(event.target||event.srcElement,"sourceLine"); + if(sourceLine){if(this.hoveredLine){removeClass(this.hoveredLine.parentNode,"hovered") + }this.hoveredLine=sourceLine; + if(sourceLine){setClass(sourceLine.parentNode,"hovered") + }}},onMouseOut:function(event){var sourceLine=getAncestorByClass(event.relatedTarget,"sourceLine"); + if(!sourceLine){if(this.hoveredLine){removeClass(this.hoveredLine.parentNode,"hovered") + }delete this.hoveredLine + }},onScroll:function(event){this.reView(this.selectedSourceBox) + },name:"script2",title:"New Script",searchable:true,breakable:true,enableA11y:true,order:40,initialize:function(context,doc){this.onMouseDown=bind(this.onMouseDown,this); + this.onContextMenu=bind(this.onContextMenu,this); + this.onMouseOver=bind(this.onMouseOver,this); + this.onMouseOut=bind(this.onMouseOut,this); + this.onScroll=bind(this.onScroll,this); + this.panelSplitter=$("fbPanelSplitter"); + this.sidePanelDeck=$("fbSidePanelDeck"); + Firebug.SourceBoxPanel.initialize.apply(this,arguments); + this.panelNode.style.fontFamily="monospace"; + Firebug.chrome.$=function(id){return $(id,Firebug.chrome.document) + }; + Firebug.uiListeners=Firebug.uiListeners||[]; + Firebug.ActivablePanel.initializeNode=function(){}; + Firebug.Panel.initializeNode=function(){}; + this.document=Firebug.chrome.document; + this.initializeNode(); + var url=Env.Location.app; + var source=new Firebug.ScriptTagSourceFile(this.context,url,0); + this.showSourceFile(source) + },shutdown:function(){if(this.selectedSourceBox){this.clearSourceBox(this.selectedSourceBox) + }this.destroyNode(); + Firebug.SourceBoxPanel.shutdown.apply(this,arguments) + },destroy:function(state){state=state||{}; + delete this.selection; + persistObjects(this,state); + var sourceBox=this.selectedSourceBox; + if(sourceBox){state.previousCenterLine=sourceBox.centerLine; + delete this.selectedSourceBox + }Firebug.SourceBoxPanel.destroy.apply(this,arguments) + },detach:function(oldChrome,newChrome){if(this.selectedSourceBox){this.lastSourceScrollTop=this.selectedSourceBox.scrollTop + }if(this.context.stopped){Firebug.Debugger.detachListeners(this.context,oldChrome); + Firebug.Debugger.attachListeners(this.context,newChrome) + }Firebug.Debugger.syncCommands(this.context); + Firebug.SourceBoxPanel.detach.apply(this,arguments) + },reattach:function(doc){Firebug.SourceBoxPanel.reattach.apply(this,arguments); + setTimeout(bind(function delayScrollToLastTop(){if(this.lastSourceScrollTop){this.selectedSourceBox.scrollTop=this.lastSourceScrollTop; + delete this.lastSourceScrollTop + }},this)) + },initializeNode:function(oldPanelNode){this.tooltip=this.document.createElement("div"); + setClass(this.tooltip,"scriptTooltip"); + this.tooltip.setAttribute("aria-live","polite"); + obscure(this.tooltip,true); + this.panelNode.appendChild(this.tooltip); + addEvent(this.panelNode,"mousedown",this.onMouseDown); + addEvent(this.panelNode,"contextmenu",this.onContextMenu); + addEvent(this.panelNode,"mouseover",this.onMouseOver); + addEvent(this.panelNode,"mouseout",this.onMouseOut); + addEvent(this.scrollingElement,"scroll",this.onScroll,true); + Firebug.SourceBoxPanel.initializeNode.apply(this,arguments) + },destroyNode:function(){if(this.tooltipTimeout){clearTimeout(this.tooltipTimeout) + }removeEvent(this.panelNode,"mousedown",this.onMouseDown); + removeEvent(this.panelNode,"contextmenu",this.onContextMenu); + removeEvent(this.panelNode,"mouseover",this.onMouseOver); + removeEvent(this.panelNode,"mouseout",this.onMouseOut); + removeEvent(this.scrollingElement,"scroll",this.onScroll,true); + Firebug.SourceBoxPanel.destroyNode.apply(this,arguments) + },clear:function(){clearNode(this.panelNode) + },showWarning:function(){var aLocation=this.getDefaultLocation(); + var jsEnabled=Firebug.getPref("javascript","enabled"); + if(FBL.fbs.activitySuspended&&!this.context.stopped){this.restored=false; + this.activeWarningTag=WarningRep.showActivitySuspended(this.panelNode) + }else{if(!jsEnabled){this.activeWarningTag=WarningRep.showNotEnabled(this.panelNode) + }else{if(this.context.allScriptsWereFiltered){this.activeWarningTag=WarningRep.showFiltered(this.panelNode) + }else{if(aLocation&&!this.context.jsDebuggerActive){this.activeWarningTag=WarningRep.showInactive(this.panelNode) + }else{if(!aLocation){this.activeWarningTag=WarningRep.showNoScript(this.panelNode) + }else{return false + }}}}}return true + },ishow:function(state){var enabled=Firebug.Debugger.isAlwaysEnabled(); + if(!enabled){return + }var active=!this.showWarning(); + if(active){this.location=this.getDefaultLocation(); + if(this.context.loaded){if(!this.restored){delete this.location; + restoreLocation(this,state); + this.restored=true + }else{if(!this.selectedSourceBox){this.navigate(this.location) + }else{this.location=this.selectedSourceBox.repObject + }}if(state&&this.location){this.scrollInfo={location:this.location,previousCenterLine:state.previousCenterLine} + }}else{this.navigate(this.location) + }this.highlight(this.context.stopped); + var breakpointPanel=this.context.getPanel("breakpoints",true); + if(breakpointPanel){breakpointPanel.refresh() + }}collapse(Firebug.chrome.$("fbToolbar"),!active); + this.showToolbarButtons("fbLocationSeparator",active); + this.showToolbarButtons("fbDebuggerButtons",active); + this.showToolbarButtons("fbLocationButtons",active); + this.showToolbarButtons("fbScriptButtons",active); + this.showToolbarButtons("fbStatusButtons",active); + this.panelSplitter.collapsed=!active; + this.sidePanelDeck.collapsed=!active + },ihide:function(state){this.highlight(this.context.stopped); + var panelStatus=Firebug.chrome.getPanelStatusElements(); + FBL.hide(panelStatus,false); + delete this.infoTipExpr + },search:function(text,reverse){var sourceBox=this.selectedSourceBox; + if(!text||!sourceBox){delete this.currentSearch; + return false + }var m=reLineNumber.exec(text); + if(m){if(!m[1]){return true + }var lineNo=parseInt(m[1]); + if(!isNaN(lineNo)&&(lineNo>0)&&(lineNo=priorScrollTop){panelNode.scrollTop=priorScrollTop + }},delay)); + delay+=insertInterval + }}if(offscreen){timeouts.push(this.context.setTimeout(function(){if(panelNode.firstChild){panelNode.replaceChild(table,panelNode.firstChild) + }else{panelNode.appendChild(table) + }panelNode.scrollTop=priorScrollTop + },delay)) + }else{timeouts.push(this.context.setTimeout(function(){panelNode.scrollTop=scrollTop==undefined?0:scrollTop + },delay)) + }this.timeouts=timeouts + },showEmptyMembers:function(){FirebugReps.Warning.tag.replace({object:"NoMembersWarning"},this.panelNode) + },findPathObject:function(object){var pathIndex=-1; + for(var i=0; + i1){for(var i=1; + i"); + r.push(i==0?"window":path[i]||"Object"); + r.push(""); + if(i>') + }}panel.statusBarNode.innerHTML=r.join("") + }; + var DOMMainPanel=Firebug.DOMPanel=function(){}; + Firebug.DOMPanel.DirTable=DirTablePlate; + DOMMainPanel.prototype=extend(Firebug.DOMBasePanel.prototype,{onClickStatusBar:function(event){var target=event.srcElement||event.target; + var element=getAncestorByClass(target,"fbHover"); + if(element){var pathIndex=element.getAttribute("pathIndex"); + if(pathIndex){this.select(this.getPathObject(pathIndex)) + }}},selectRow:function(row,target){if(!target){target=row.lastChild.firstChild + }if(!target||!target.repObject){return + }this.pathToAppend=getPath(row); + var valueBox=row.lastChild.firstChild; + if(hasClass(valueBox,"objectBox-array")){var arrayIndex=FirebugReps.Arr.getItemIndex(target); + this.pathToAppend.push(arrayIndex) + }this.select(target.repObject,true) + },onClick:function(event){var target=event.srcElement||event.target; + var repNode=Firebug.getRepNode(target); + if(repNode){var row=getAncestorByClass(target,"memberRow"); + if(row){this.selectRow(row,repNode); + cancelEvent(event) + }}},name:"DOM",title:"DOM",searchable:true,statusSeparator:">",options:{hasToolButtons:true,hasStatusBar:true},create:function(){Firebug.DOMBasePanel.prototype.create.apply(this,arguments); + this.onClick=bind(this.onClick,this); + this.onClickStatusBar=bind(this.onClickStatusBar,this); + this.panelNode.style.padding="0 1px" + },initialize:function(oldPanelNode){Firebug.DOMBasePanel.prototype.initialize.apply(this,arguments); + addEvent(this.panelNode,"click",this.onClick); + this.ishow(); + addEvent(this.statusBarNode,"click",this.onClickStatusBar) + },shutdown:function(){removeEvent(this.panelNode,"click",this.onClick); + Firebug.DOMBasePanel.prototype.shutdown.apply(this,arguments) + }}); + Firebug.registerPanel(DOMMainPanel); + var getMembers=function getMembers(object,level){if(!level){level=0 + }var ordinals=[],userProps=[],userClasses=[],userFuncs=[],domProps=[],domFuncs=[],domConstants=[]; + try{var domMembers=getDOMMembers(object); + if(object.wrappedJSObject){var insecureObject=object.wrappedJSObject + }else{var insecureObject=object + }if(isIE&&isFunction(object)){addMember("user",userProps,"prototype",object.prototype,level) + }for(var name in insecureObject){if(ignoreVars[name]==1){continue + }var val; + try{val=insecureObject[name] + }catch(exc){if(FBTrace.DBG_ERRORS&&FBTrace.DBG_DOM){FBTrace.sysout("dom.getMembers cannot access "+name,exc) + }}var ordinal=parseInt(name); + if(ordinal||ordinal==0){addMember("ordinal",ordinals,name,val,level) + }else{if(isFunction(val)){if(isClassFunction(val)&&!(name in domMembers)){addMember("userClass",userClasses,name,val,level) + }else{if(name in domMembers){addMember("domFunction",domFuncs,name,val,level,domMembers[name]) + }else{addMember("userFunction",userFuncs,name,val,level) + }}}else{var prefix=""; + if(name in domMembers&&!(name in domConstantMap)){addMember("dom",domProps,(prefix+name),val,level,domMembers[name]) + }else{if(name in domConstantMap){addMember("dom",domConstants,(prefix+name),val,level) + }else{addMember("user",userProps,(prefix+name),val,level) + }}}}}}catch(exc){throw exc; + if(FBTrace.DBG_ERRORS&&FBTrace.DBG_DOM){FBTrace.sysout("dom.getMembers FAILS: ",exc) + }}function sortName(a,b){return a.name>b.name?1:-1 + }function sortOrder(a,b){return a.order>b.order?1:-1 + }var members=[]; + members.push.apply(members,ordinals); + Firebug.showUserProps=true; + Firebug.showUserFuncs=true; + Firebug.showDOMProps=true; + Firebug.showDOMFuncs=true; + Firebug.showDOMConstants=true; + if(Firebug.showUserProps){userProps.sort(sortName); + members.push.apply(members,userProps) + }if(Firebug.showUserFuncs){userClasses.sort(sortName); + members.push.apply(members,userClasses); + userFuncs.sort(sortName); + members.push.apply(members,userFuncs) + }if(Firebug.showDOMProps){domProps.sort(sortName); + members.push.apply(members,domProps) + }if(Firebug.showDOMFuncs){domFuncs.sort(sortName); + members.push.apply(members,domFuncs) + }if(Firebug.showDOMConstants){members.push.apply(members,domConstants) + }return members + }; + function expandMembers(members,toggles,offset,level){var expanded=0; + for(var i=offset; + ilevel){break + }if(toggles.hasOwnProperty(member.name)){member.open="opened"; + var newMembers=getMembers(member.value,level+1); + var args=[i+1,0]; + args.push.apply(args,newMembers); + members.splice.apply(members,args); + expanded+=newMembers.length; + i+=newMembers.length+expandMembers(members,toggles[member.name],i+1,level+1) + }}return expanded + }function isClassFunction(fn){try{for(var name in fn.prototype){return true + }}catch(exc){}return false + }var hasProperties=function hasProperties(ob){try{for(var name in ob){return true + }}catch(exc){}if(isFunction(ob)){return true + }return false + }; + FBL.ErrorCopy=function(message){this.message=message + }; + var addMember=function addMember(type,props,name,value,level,order){var rep=Firebug.getRep(value); + var tag=rep.shortTag?rep.shortTag:rep.tag; + var ErrorCopy=function(){}; + var valueType=typeof(value); + var hasChildren=hasProperties(value)&&!(value instanceof ErrorCopy)&&(isFunction(value)||(valueType=="object"&&value!=null)||(valueType=="string"&&value.length>Firebug.stringCropLength)); + props.push({name:name,value:value,type:type,rowClass:"memberRow-"+type,open:"",order:order,level:level,indent:level*16,hasChildren:hasChildren,tag:tag}) + }; + var getWatchRowIndex=function getWatchRowIndex(row){var index=-1; + for(; + row&&hasClass(row,"watchRow"); + row=row.previousSibling){++index + }return index + }; + var getRowName=function getRowName(row){var node=row.firstChild; + return node.textContent?node.textContent:node.innerText + }; + var getRowValue=function getRowValue(row){return row.lastChild.firstChild.repObject + }; + var getRowOwnerObject=function getRowOwnerObject(row){var parentRow=getParentRow(row); + if(parentRow){return getRowValue(parentRow) + }}; + var getParentRow=function getParentRow(row){var level=parseInt(row.getAttribute("level"))-1; + for(row=row.previousSibling; + row; + row=row.previousSibling){if(parseInt(row.getAttribute("level"))==level){return row + }}}; + var getPath=function getPath(row){var name=getRowName(row); + var path=[name]; + var level=parseInt(row.getAttribute("level"))-1; + for(row=row.previousSibling; + row; + row=row.previousSibling){if(parseInt(row.getAttribute("level"))==level){var name=getRowName(row); + path.splice(0,0,name); + --level + }}return path + }; + Firebug.DOM=extend(Firebug.Module,{getPanel:function(){return Firebug.chrome?Firebug.chrome.getPanel("DOM"):null + }}); + Firebug.registerModule(Firebug.DOM); + var lastHighlightedObject; + function DOMSidePanel(){}DOMSidePanel.prototype=extend(Firebug.DOMBasePanel.prototype,{selectRow:function(row,target){if(!target){target=row.lastChild.firstChild + }if(!target||!target.repObject){return + }this.pathToAppend=getPath(row); + var valueBox=row.lastChild.firstChild; + if(hasClass(valueBox,"objectBox-array")){var arrayIndex=FirebugReps.Arr.getItemIndex(target); + this.pathToAppend.push(arrayIndex) + }var object=target.repObject; + if(instanceOf(object,"Element")){Firebug.HTML.selectTreeNode(ElementCache(object)) + }else{Firebug.chrome.selectPanel("DOM"); + Firebug.chrome.getPanel("DOM").select(object,true) + }},onClick:function(event){var target=event.srcElement||event.target; + var repNode=Firebug.getRepNode(target); + if(repNode){var row=getAncestorByClass(target,"memberRow"); + if(row){this.selectRow(row,repNode); + cancelEvent(event) + }}},name:"DOMSidePanel",parentPanel:"HTML",title:"DOM",options:{hasToolButtons:true},isInitialized:false,create:function(){Firebug.DOMBasePanel.prototype.create.apply(this,arguments); + this.onClick=bind(this.onClick,this) + },initialize:function(){Firebug.DOMBasePanel.prototype.initialize.apply(this,arguments); + addEvent(this.panelNode,"click",this.onClick); + var selection=ElementCache.get(FirebugChrome.selectedHTMLElementId); + if(selection){this.select(selection,true) + }},shutdown:function(){removeEvent(this.panelNode,"click",this.onClick); + Firebug.DOMBasePanel.prototype.shutdown.apply(this,arguments) + },reattach:function(oldChrome){this.toggles=oldChrome.getPanel("DOMSidePanel").toggles + }}); + Firebug.registerPanel(DOMSidePanel) + }}); + FBL.FBTrace={}; + (function(){var traceOptions={DBG_TIMESTAMP:1,DBG_INITIALIZE:1,DBG_CHROME:1,DBG_ERRORS:1,DBG_DISPATCH:1,DBG_CSS:1}; + this.module=null; + this.initialize=function(){if(!this.messageQueue){this.messageQueue=[] + }for(var name in traceOptions){this[name]=traceOptions[name] + }}; + this.sysout=function(){return this.logFormatted(arguments,"") + }; + this.dumpProperties=function(title,object){return this.logFormatted("dumpProperties() not supported.","warning") + }; + this.dumpStack=function(){return this.logFormatted("dumpStack() not supported.","warning") + }; + this.flush=function(module){this.module=module; + var queue=this.messageQueue; + this.messageQueue=[]; + for(var i=0; + i"); + appendText(object,html); + html.push("") + }else{appendText(object,html) + }}return this.logRow(html,className) + }; + this.logRow=function(message,className){var panel=this.getPanel(); + if(panel&&panel.panelNode){this.writeMessage(message,className) + }else{this.messageQueue.push([message,className]) + }return this.LOG_COMMAND + }; + this.writeMessage=function(message,className){var container=this.getPanel().containerNode; + var isScrolledToBottom=container.scrollTop+container.offsetHeight>=container.scrollHeight; + this.writeRow.call(this,message,className); + if(isScrolledToBottom){container.scrollTop=container.scrollHeight-container.offsetHeight + }}; + this.appendRow=function(row){var container=this.getPanel().panelNode; + container.appendChild(row) + }; + this.writeRow=function(message,className){var row=this.getPanel().panelNode.ownerDocument.createElement("div"); + row.className="logRow"+(className?" logRow-"+className:""); + row.innerHTML=message.join(""); + this.appendRow(row) + }; + function appendText(object,html){html.push(escapeHTML(objectToString(object))) + }function getTimestamp(){var now=new Date(); + var ms=""+(now.getMilliseconds()/1000).toFixed(3); + ms=ms.substr(2); + return now.toLocaleTimeString()+"."+ms + }var HTMLtoEntity={"<":"<",">":">","&":"&","'":"'",'"':"""}; + function replaceChars(ch){return HTMLtoEntity[ch] + }function escapeHTML(value){return(value+"").replace(/[<>&"']/g,replaceChars) + }function objectToString(object){try{return object+"" + }catch(exc){return null + }}}).apply(FBL.FBTrace); + FBL.ns(function(){with(FBL){if(!Env.Options.enableTrace){return + }Firebug.Trace=extend(Firebug.Module,{getPanel:function(){return Firebug.chrome?Firebug.chrome.getPanel("Trace"):null + },clear:function(){this.getPanel().panelNode.innerHTML="" + }}); + Firebug.registerModule(Firebug.Trace); + function TracePanel(){}TracePanel.prototype=extend(Firebug.Panel,{name:"Trace",title:"Trace",options:{hasToolButtons:true,innerHTMLSync:true},create:function(){Firebug.Panel.create.apply(this,arguments); + this.clearButton=new Button({caption:"Clear",title:"Clear FBTrace logs",owner:Firebug.Trace,onClick:Firebug.Trace.clear}) + },initialize:function(){Firebug.Panel.initialize.apply(this,arguments); + this.clearButton.initialize() + }}); + Firebug.registerPanel(TracePanel) + }}); + var codemirror=(function(){var Editor={}; + var indentUnit=2; + var window=this; + function method(obj,name){return function(){obj[name].apply(obj,arguments) + } + }this.StopIteration={toString:function(){return"StopIteration" + }}; + this.forEach=function(iter,f){if(iter.next){try{while(true){f(iter.next()) + }}catch(e){if(e!=StopIteration){throw e + }}}else{for(var i=0; + i!?|]/; + var isHexDigit=/[0-9A-Fa-f]/; + var isWordChar=/[\w\$_]/; + function jsTokenState(inside,regexp){return function(source,setState){var newInside=inside; + var type=jsToken(inside,regexp,source,function(c){newInside=c + }); + var newRegexp=type.type=="operator"||type.type=="keyword c"||type.type.match(/^[\[{}\(,;:]$/); + if(newRegexp!=regexp||newInside!=inside){setState(jsTokenState(newInside,newRegexp)) + }return type + } + }function jsToken(inside,regexp,source,setInside){function readHexNumber(){source.next(); + source.nextWhileMatches(isHexDigit); + return{type:"number",style:"js-atom"} + }function readNumber(){source.nextWhileMatches(/[0-9]/); + if(source.equals(".")){source.next(); + source.nextWhileMatches(/[0-9]/) + }if(source.equals("e")||source.equals("E")){source.next(); + if(source.equals("-")){source.next() + }source.nextWhileMatches(/[0-9]/) + }return{type:"number",style:"js-atom"} + }function readWord(){source.nextWhileMatches(isWordChar); + var word=source.get(); + var known=keywords.hasOwnProperty(word)&&keywords.propertyIsEnumerable(word)&&keywords[word]; + return known?{type:known.type,style:known.style,content:word}:{type:"variable",style:"js-variable",content:word} + }function readRegexp(){nextUntilUnescaped(source,"/"); + source.nextWhileMatches(/[gi]/); + return{type:"regexp",style:"js-string"} + }function readMultilineComment(start){var newInside="/*"; + var maybeEnd=(start=="*"); + while(true){if(source.endOfLine()){break + }var next=source.next(); + if(next=="/"&&maybeEnd){newInside=null; + break + }maybeEnd=(next=="*") + }setInside(newInside); + return{type:"comment",style:"js-comment"} + }function readOperator(){source.nextWhileMatches(isOperatorChar); + return{type:"operator",style:"js-operator"} + }function readString(quote){var endBackSlash=nextUntilUnescaped(source,quote); + setInside(endBackSlash?quote:null); + return{type:"string",style:"js-string"} + }if(inside=='"'||inside=="'"){return readString(inside) + }var ch=source.next(); + if(inside=="/*"){return readMultilineComment(ch) + }else{if(ch=='"'||ch=="'"){return readString(ch) + }else{if(/[\[\]{}\(\),;\:\.]/.test(ch)){return{type:ch,style:"js-punctuation"} + }else{if(ch=="0"&&(source.equals("x")||source.equals("X"))){return readHexNumber() + }else{if(/[0-9]/.test(ch)){return readNumber() + }else{if(ch=="/"){if(source.equals("*")){source.next(); + return readMultilineComment(ch) + }else{if(source.equals("/")){nextUntilUnescaped(source,null); + return{type:"comment",style:"js-comment"} + }else{if(regexp){return readRegexp() + }else{return readOperator() + }}}}else{if(isOperatorChar.test(ch)){return readOperator() + }else{return readWord() + }}}}}}}}return function(source,startState){return tokenizer(source,startState||jsTokenState(false,true)) + } + })(); + this.JSParser=Editor.Parser=(function(){var atomicTypes={atom:true,number:true,variable:true,string:true,regexp:true}; + var json=false; + function JSLexical(indented,column,type,align,prev,info){this.indented=indented; + this.column=column; + this.type=type; + if(align!=null){this.align=align + }this.prev=prev; + this.info=info + }function indentJS(lexical){return function(firstChars){var firstChar=firstChars&&firstChars.charAt(0),type=lexical.type; + var closing=firstChar==type; + if(type=="vardef"){return lexical.indented+4 + }else{if(type=="form"&&firstChar=="{"){return lexical.indented + }else{if(type=="stat"||type=="form"){return lexical.indented+indentUnit + }else{if(lexical.info=="switch"&&!closing){return lexical.indented+(/^(?:case|default)\b/.test(firstChars)?indentUnit:2*indentUnit) + }else{if(lexical.align){return lexical.column-(closing?1:0) + }else{return lexical.indented+(closing?0:indentUnit) + }}}}}} + }function parseJS(input,basecolumn){var tokens=tokenizeJavaScript(input); + var cc=[json?expressions:statements]; + var context=null; + var lexical=new JSLexical((basecolumn||0)-indentUnit,0,"block",false); + var column=0; + var indented=0; + var consume,marked; + var parser={next:next,copy:copy}; + function next(){while(cc[cc.length-1].lex){cc.pop()() + }var token=tokens.next(); + if(token.type=="whitespace"&&column==0){indented=token.value.length + }column+=token.value.length; + if(token.content=="\n"){indented=column=0; + if(!("align" in lexical)){lexical.align=false + }token.indentation=indentJS(lexical) + }if(token.type=="whitespace"||token.type=="comment"){return token + }if(!("align" in lexical)){lexical.align=true + }while(true){consume=marked=false; + cc.pop()(token.type,token.content); + if(consume){if(marked){token.style=marked + }else{if(token.type=="variable"&&inScope(token.content)){token.style="js-localvariable" + }}return token + }}}function copy(){var _context=context,_lexical=lexical,_cc=cc.concat([]),_tokenState=tokens.state; + return function copyParser(input){context=_context; + lexical=_lexical; + cc=_cc.concat([]); + column=indented=0; + tokens=tokenizeJavaScript(input,_tokenState); + return parser + } + }function push(fs){for(var i=fs.length-1; + i>=0; + i--){cc.push(fs[i]) + }}function cont(){push(arguments); + consume=true + }function pass(){push(arguments); + consume=false + }function mark(style){marked=style + }function pushcontext(){context={prev:context,vars:{"this":true,"arguments":true}} + }function popcontext(){context=context.prev + }function register(varname){if(context){mark("js-variabledef"); + context.vars[varname]=true + }}function inScope(varname){var cursor=context; + while(cursor){if(cursor.vars[varname]){return true + }cursor=cursor.prev + }return false + }function pushlex(type,info){var result=function(){lexical=new JSLexical(indented,column,type,null,lexical,info) + }; + result.lex=true; + return result + }function poplex(){if(lexical.type==")"){indented=lexical.indented + }lexical=lexical.prev + }poplex.lex=true; + function expect(wanted){return function expecting(type){if(type==wanted){cont() + }else{if(wanted==";"){pass() + }else{cont(arguments.callee) + }}} + }function statements(type){return pass(statement,statements) + }function expressions(type){return pass(expression,expressions) + }function statement(type){if(type=="var"){cont(pushlex("vardef"),vardef1,expect(";"),poplex) + }else{if(type=="keyword a"){cont(pushlex("form"),expression,statement,poplex) + }else{if(type=="keyword b"){cont(pushlex("form"),statement,poplex) + }else{if(type=="{"){cont(pushlex("}"),block,poplex) + }else{if(type==";"){cont() + }else{if(type=="function"){cont(functiondef) + }else{if(type=="for"){cont(pushlex("form"),expect("("),pushlex(")"),forspec1,expect(")"),poplex,statement,poplex) + }else{if(type=="variable"){cont(pushlex("stat"),maybelabel) + }else{if(type=="switch"){cont(pushlex("form"),expression,pushlex("}","switch"),expect("{"),block,poplex,poplex) + }else{if(type=="case"){cont(expression,expect(":")) + }else{if(type=="default"){cont(expect(":")) + }else{if(type=="catch"){cont(pushlex("form"),pushcontext,expect("("),funarg,expect(")"),statement,poplex,popcontext) + }else{pass(pushlex("stat"),expression,expect(";"),poplex) + }}}}}}}}}}}}}function expression(type){if(atomicTypes.hasOwnProperty(type)){cont(maybeoperator) + }else{if(type=="function"){cont(functiondef) + }else{if(type=="keyword c"){cont(expression) + }else{if(type=="("){cont(pushlex(")"),expression,expect(")"),poplex,maybeoperator) + }else{if(type=="operator"){cont(expression) + }else{if(type=="["){cont(pushlex("]"),commasep(expression,"]"),poplex,maybeoperator) + }else{if(type=="{"){cont(pushlex("}"),commasep(objprop,"}"),poplex,maybeoperator) + }else{cont() + }}}}}}}}function maybeoperator(type,value){if(type=="operator"&&/\+\+|--/.test(value)){cont(maybeoperator) + }else{if(type=="operator"){cont(expression) + }else{if(type==";"){pass() + }else{if(type=="("){cont(pushlex(")"),commasep(expression,")"),poplex,maybeoperator) + }else{if(type=="."){cont(property,maybeoperator) + }else{if(type=="["){cont(pushlex("]"),expression,expect("]"),poplex,maybeoperator) + }}}}}}}function maybelabel(type){if(type==":"){cont(poplex,statement) + }else{pass(maybeoperator,expect(";"),poplex) + }}function property(type){if(type=="variable"){mark("js-property"); + cont() + }}function objprop(type){if(type=="variable"){mark("js-property") + }if(atomicTypes.hasOwnProperty(type)){cont(expect(":"),expression) + }}function commasep(what,end){function proceed(type){if(type==","){cont(what,proceed) + }else{if(type==end){cont() + }else{cont(expect(end)) + }}}return function commaSeparated(type){if(type==end){cont() + }else{pass(what,proceed) + }} + }function block(type){if(type=="}"){cont() + }else{pass(statement,block) + }}function vardef1(type,value){if(type=="variable"){register(value); + cont(vardef2) + }else{cont() + }}function vardef2(type,value){if(value=="="){cont(expression,vardef2) + }else{if(type==","){cont(vardef1) + }}}function forspec1(type){if(type=="var"){cont(vardef1,forspec2) + }else{if(type==";"){pass(forspec2) + }else{if(type=="variable"){cont(formaybein) + }else{pass(forspec2) + }}}}function formaybein(type,value){if(value=="in"){cont(expression) + }else{cont(maybeoperator,forspec2) + }}function forspec2(type,value){if(type==";"){cont(forspec3) + }else{if(value=="in"){cont(expression) + }else{cont(expression,expect(";"),forspec3) + }}}function forspec3(type){if(type==")"){pass() + }else{cont(expression) + }}function functiondef(type,value){if(type=="variable"){register(value); + cont(functiondef) + }else{if(type=="("){cont(pushcontext,commasep(funarg,")"),statement,popcontext) + }}}function funarg(type,value){if(type=="variable"){register(value); + cont() + }}return parser + }return{make:parseJS,electricChars:"{}:",configure:function(obj){if(obj.json!=null){json=obj.json + }}} + })(); + this.CSSParser=Editor.Parser=(function(){var tokenizeCSS=(function(){function normal(source,setState){var ch=source.next(); + if(ch=="@"){source.nextWhileMatches(/\w/); + return"css-at" + }else{if(ch=="/"&&source.equals("*")){setState(inCComment); + return null + }else{if(ch=="<"&&source.equals("!")){setState(inSGMLComment); + return null + }else{if(ch=="="){return"css-compare" + }else{if(source.equals("=")&&(ch=="~"||ch=="|")){source.next(); + return"css-compare" + }else{if(ch=='"'||ch=="'"){setState(inString(ch)); + return null + }else{if(ch=="#"){source.nextWhileMatches(/\w/); + return"css-hash" + }else{if(ch=="!"){source.nextWhileMatches(/[ \t]/); + source.nextWhileMatches(/\w/); + return"css-important" + }else{if(/\d/.test(ch)){source.nextWhileMatches(/[\w.%]/); + return"css-unit" + }else{if(/[,.+>*\/]/.test(ch)){return"css-select-op" + }else{if(/[;{}:\[\]]/.test(ch)){return"css-punctuation" + }else{source.nextWhileMatches(/[\w\\\-_]/); + return"css-identifier" + }}}}}}}}}}}}function inCComment(source,setState){var maybeEnd=false; + while(!source.endOfLine()){var ch=source.next(); + if(maybeEnd&&ch=="/"){setState(normal); + break + }maybeEnd=(ch=="*") + }return"css-comment" + }function inSGMLComment(source,setState){var dashes=0; + while(!source.endOfLine()){var ch=source.next(); + if(dashes>=2&&ch==">"){setState(normal); + break + }dashes=(ch=="-")?dashes+1:0 + }return"css-comment" + }function inString(quote){return function(source,setState){var escaped=false; + while(!source.endOfLine()){var ch=source.next(); + if(ch==quote&&!escaped){break + }escaped=!escaped&&ch=="\\" + }if(!escaped){setState(normal) + }return"css-string" + } + }return function(source,startState){return tokenizer(source,startState||normal) + } + })(); + function indentCSS(inBraces,inRule,base){return function(nextChars){if(!inBraces||/^\}/.test(nextChars)){return base + }else{if(inRule){return base+indentUnit*2 + }else{return base+indentUnit + }}} + }function parseCSS(source,basecolumn){basecolumn=basecolumn||0; + var tokens=tokenizeCSS(source); + var inBraces=false,inRule=false,inDecl=false; + var iter={next:function(){var token=tokens.next(),style=token.style,content=token.content; + if(style=="css-hash"){style=token.style=inRule?"css-colorcode":"css-identifier" + }if(style=="css-identifier"){if(inRule){token.style="css-value" + }else{if(!inBraces&&!inDecl){token.style="css-selector" + }}}if(content=="\n"){token.indentation=indentCSS(inBraces,inRule,basecolumn) + }if(content=="{"&&inDecl=="@media"){inDecl=false + }else{if(content=="{"){inBraces=true + }else{if(content=="}"){inBraces=inRule=inDecl=false + }else{if(content==";"){inRule=inDecl=false + }else{if(inBraces&&style!="css-comment"&&style!="whitespace"){inRule=true + }else{if(!inBraces&&style=="css-at"){inDecl=content + }}}}}}return token + },copy:function(){var _inBraces=inBraces,_inRule=inRule,_tokenState=tokens.state; + return function(source){tokens=tokenizeCSS(source,_tokenState); + inBraces=_inBraces; + inRule=_inRule; + return iter + } + }}; + return iter + }return{make:parseCSS,electricChars:"}"} + })(); + this.XMLParser=Editor.Parser=(function(){var Kludges={autoSelfClosers:{br:true,img:true,hr:true,link:true,input:true,meta:true,col:true,frame:true,base:true,area:true},doNotIndent:{pre:true,"!cdata":true}}; + var NoKludges={autoSelfClosers:{},doNotIndent:{"!cdata":true}}; + var UseKludges=Kludges; + var alignCDATA=false; + var tokenizeXML=(function(){function inText(source,setState){var ch=source.next(); + if(ch=="<"){if(source.equals("!")){source.next(); + if(source.equals("[")){if(source.lookAhead("[CDATA[",true)){setState(inBlock("xml-cdata","]]>")); + return null + }else{return"xml-text" + }}else{if(source.lookAhead("--",true)){setState(inBlock("xml-comment","-->")); + return null + }else{if(source.lookAhead("DOCTYPE",true)){source.nextWhileMatches(/[\w\._\-]/); + setState(inBlock("xml-doctype",">")); + return"xml-doctype" + }else{return"xml-text" + }}}}else{if(source.equals("?")){source.next(); + source.nextWhileMatches(/[\w\._\-]/); + setState(inBlock("xml-processing","?>")); + return"xml-processing" + }else{if(source.equals("/")){source.next() + }setState(inTag); + return"xml-punctuation" + }}}else{if(ch=="&"){while(!source.endOfLine()){if(source.next()==";"){break + }}return"xml-entity" + }else{source.nextWhileMatches(/[^&<\n]/); + return"xml-text" + }}}function inTag(source,setState){var ch=source.next(); + if(ch==">"){setState(inText); + return"xml-punctuation" + }else{if(/[?\/]/.test(ch)&&source.equals(">")){source.next(); + setState(inText); + return"xml-punctuation" + }else{if(ch=="="){return"xml-punctuation" + }else{if(/[\'\"]/.test(ch)){setState(inAttribute(ch)); + return null + }else{source.nextWhileMatches(/[^\s\u00a0=<>\"\'\/?]/); + return"xml-name" + }}}}}function inAttribute(quote){return function(source,setState){while(!source.endOfLine()){if(source.next()==quote){setState(inTag); + break + }}return"xml-attribute" + } + }function inBlock(style,terminator){return function(source,setState){while(!source.endOfLine()){if(source.lookAhead(terminator,true)){setState(inText); + break + }source.next() + }return style + } + }return function(source,startState){return tokenizer(source,startState||inText) + } + })(); + function parseXML(source){var tokens=tokenizeXML(source),token; + var cc=[base]; + var tokenNr=0,indented=0; + var currentTag=null,context=null; + var consume; + function push(fs){for(var i=fs.length-1; + i>=0; + i--){cc.push(fs[i]) + }}function cont(){push(arguments); + consume=true + }function pass(){push(arguments); + consume=false + }function markErr(){token.style+=" xml-error" + }function expect(text){return function(style,content){if(content==text){cont() + }else{markErr(); + cont(arguments.callee) + }} + }function pushContext(tagname,startOfLine){var noIndent=UseKludges.doNotIndent.hasOwnProperty(tagname)||(context&&context.noIndent); + context={prev:context,name:tagname,indent:indented,startOfLine:startOfLine,noIndent:noIndent} + }function popContext(){context=context.prev + }function computeIndentation(baseContext){return function(nextChars,current){var context=baseContext; + if(context&&context.noIndent){return current + }if(alignCDATA&&/")) + }else{if(style=="xml-cdata"){if(!context||context.name!="!cdata"){pushContext("!cdata") + }if(/\]\]>$/.test(content)){popContext() + }cont() + }else{if(harmlessTokens.hasOwnProperty(style)){cont() + }else{markErr(); + cont() + }}}}}function tagname(style,content){if(style=="xml-name"){currentTag=content.toLowerCase(); + token.style="xml-tagname"; + cont() + }else{currentTag=null; + pass() + }}function closetagname(style,content){if(style=="xml-name"){token.style="xml-tagname"; + if(context&&content.toLowerCase()==context.name){popContext() + }else{markErr() + }}cont() + }function endtag(startOfLine){return function(style,content){if(content=="/>"||(content==">"&&UseKludges.autoSelfClosers.hasOwnProperty(currentTag))){cont() + }else{if(content==">"){pushContext(currentTag,startOfLine); + cont() + }else{markErr(); + cont(arguments.callee) + }}} + }function attributes(style){if(style=="xml-name"){token.style="xml-attname"; + cont(attribute,attributes) + }else{pass() + }}function attribute(style,content){if(content=="="){cont(value) + }else{if(content==">"||content=="/>"){pass(endtag) + }else{pass() + }}}function value(style){if(style=="xml-attribute"){cont(value) + }else{pass() + }}return{indentation:function(){return indented + },next:function(){token=tokens.next(); + if(token.style=="whitespace"&&tokenNr==0){indented=token.value.length + }else{tokenNr++ + }if(token.content=="\n"){indented=tokenNr=0; + token.indentation=computeIndentation(context) + }if(token.style=="whitespace"||token.type=="xml-comment"){return token + }while(true){consume=false; + cc.pop()(token.style,token.content); + if(consume){return token + }}},copy:function(){var _cc=cc.concat([]),_tokenState=tokens.state,_context=context; + var parser=this; + return function(input){cc=_cc.concat([]); + tokenNr=indented=0; + context=_context; + tokens=tokenizeXML(input,_tokenState); + return parser + } + }} + }return{make:parseXML,electricChars:"/",configure:function(config){if(config.useHTMLKludges!=null){UseKludges=config.useHTMLKludges?Kludges:NoKludges + }if(config.alignCDATA){alignCDATA=config.alignCDATA + }}} + })(); + this.HTMLMixedParser=Editor.Parser=(function(){var triggers={script:"JSParser",style:"CSSParser"}; + function checkDependencies(){var parsers=["XMLParser"]; + for(var p in triggers){parsers.push(triggers[p]) + }for(var i in parsers){if(!window[parsers[i]]){throw new Error(parsers[i]+" parser must be loaded for HTML mixed mode to work.") + }}XMLParser.configure({useHTMLKludges:true}) + }function parseMixed(stream){checkDependencies(); + var htmlParser=XMLParser.make(stream),localParser=null,inTag=false; + var iter={next:top,copy:copy}; + function top(){var token=htmlParser.next(); + if(token.content=="<"){inTag=true + }else{if(token.style=="xml-tagname"&&inTag===true){inTag=token.content.toLowerCase() + }else{if(token.content==">"){if(triggers[inTag]){var parser=window[triggers[inTag]]; + iter.next=local(parser,"0){throw"End of stringstream reached without emptying buffer ('"+accum+"')." + }else{throw StopIteration + }}return current.charAt(pos++) + },get:function(){var temp=accum; + accum=""; + if(pos>0){temp+=current.slice(0,pos); + current=current.slice(pos); + pos=0 + }return temp + },push:function(str){current=current.slice(0,pos)+str+current.slice(pos) + },lookAhead:function(str,consume,skipSpaces,caseInsensitive){function cased(str){return caseInsensitive?str.toLowerCase():str + }str=cased(str); + var found=false; + var _accum=accum,_pos=pos; + if(skipSpaces){this.nextWhileMatches(/[\s\u00a0]/) + }while(true){var end=pos+str.length,left=current.length-pos; + if(end<=current.length){found=str==cased(current.slice(pos,end)); + pos=end; + break + }else{if(str.slice(0,left)==cased(current.slice(pos))){accum+=current; + current=""; + try{current=source.next() + }catch(e){break + }pos=0; + str=str.slice(left) + }else{break + }}}if(!(found&&consume)){current=accum.slice(_accum.length)+current; + pos=_pos; + accum=_accum + }return found + },more:function(){return this.peek()!==null + },applies:function(test){var next=this.peek(); + return(next!==null&&test(next)) + },nextWhile:function(test){var next; + while((next=this.peek())!==null&&test(next)){this.next() + }},matches:function(re){var next=this.peek(); + return(next!==null&&re.test(next)) + },nextWhileMatches:function(re){var next; + while((next=this.peek())!==null&&re.test(next)){this.next() + }},equals:function(ch){return ch===this.peek() + },endOfLine:function(){var next=this.peek(); + return next==null||next=="\n" + }} + }; + return this + })(); + FBL.ns(function(){with(FBL){Firebug.uiListeners=[]; + var extensions=[]; + append(Firebug,{registerExtension:function(){extensions.push.apply(extensions,arguments); + for(var i=0; + i'+escapeForSourceLine(val)+"" + }; + var processTokenStream=function(stream){var pieces=[]; + for(var i=0; + i0){var space=new Array(Firebug.replaceTabs+1).join(" "); + output=output.replace(/\t/g,space) + }return output + }; + Firebug.FireRainbowExtension=extend(Firebug.Extension,{onApplyDecorator:function(sourceBox){if(!sourceBox.rainbowPatched){sourceBox.rainbowPatched=true; + if(sourceBox.getLineAsHTML){if(!sourceBox._rainbowOriginalGetLineAsHTML){sourceBox._rainbowOriginalGetLineAsHTML=sourceBox.getLineAsHTML; + sourceBox.getLineAsHTML=function(lineNo){if(this.colorizedLines){var line=this.colorizedLines[lineNo]; + if(line!==undefined){return line + }}return this._rainbowOriginalGetLineAsHTML(lineNo) + } + }}if(sourceBox.decorator){if(!sourceBox.decorator._rainbowOriginalGetLineHTML){sourceBox.decorator._rainbowOriginalGetLineHTML=sourceBox.decorator.getLineHTML; + sourceBox.decorator.getLineHTML=function(sourceBox,lineNo){if(sourceBox.colorizedLines){var line=sourceBox.colorizedLines[lineNo-1]; + if(line!==undefined){return line + }}return this._rainbowOriginalGetLineHTML(sourceBox,lineNo) + } + }}}if(sourceBox.preventRainbowRecursion){sourceBox.preventRainbowRecursion=undefined; + return + }Firebug.FireRainbowModule.colorizeSourceBox(sourceBox) + }}); + Firebug.FireRainbowModule=extend(Firebug.Module,{valid:false,pings:0,styleLibrary:{},defaultTheme:'.panelNode-script{background-color:#FFFFFF;color:black;font-family:Monaco,Monospace,Courier New !important;font-size:11px;} .sourceRow.hovered{background-color:#EEEEEE;} .sourceLine{background:#EEEEEE none no-repeat scroll 2px 0;border-bottom:1px solid #EEEEEE;border-right:1px solid #CCCCCC;color:#888888;} .sourceLine:hover{text-decoration:none;} .scriptTooltip{background:LightYellow none repeat scroll 0 0;border:1px solid #CBE087;color:#000000;} .sourceRow[exeline="true"]{background-color:lightgoldenrodyellow;outline-color:#D9D9B6;outline-style:solid;outline-width:1px;} .xml-text{color:black;} .whitespace{color:black;} .xml-punctuation{color:gray;} .xml-tagname{color:blue;} .xml-attname{color:darkred;} .xml-attribute{color:darkgreen;} .css-at{color:darkred;} .css-string{color:red;} .css-punctuation{color:midnightblue;} .js-keyword{color:blue;} .js-variable{color:black;} .js-operator{color:black;} .js-punctuation{color:darkBlue;} .js-variabledef{color:darkslategray;} .js-localvariable{color:darkslateBlue;} .js-property{color:teal;} .js-string{color:darkgreen;} .js-atom{color:saddleBrown;} .xml-comment{color:gray;} .css-identifier{color:midnightBlue;} .css-select-op{color:cadetblue;} .css-unit{color:orangered;} .css-value{color:black;} .css-colorcode{color:magenta;} .js-comment{color:gray;} .js-regexp{color:magenta;} .xml-entity{color:darkgoldenrod;} .xml-error{color:orangered;} .css-comment{color:gray;}',initialize:function(){this.actualScriptPanel=Firebug.chrome.getPanel("script2"); + var doc=Firebug.chrome.document; + var style=createElement("style"); + var rules=document.createTextNode(this.defaultTheme); + style.type="text/css"; + if(style.styleSheet){style.styleSheet.cssText=rules.nodeValue + }else{style.appendChild(rules) + }addStyleSheet(doc,style); + return Firebug.Module.initialize.apply(this,arguments) + },showPanel:function(browser,panel){if(!this.valid){return + }dbg("Rainbow: showPanel",panel); + var isScriptPanel=panel&&panel.name=="script"; + this.actualScriptPanel=isScriptPanel?panel:undefined + },initContext:function(context){dbg("Rainbow: initContext",context); + Firebug.Module.initContext.apply(this,arguments); + this.hookPanel(context); + this.valid=true + },reattachContext:function(browser,context){Firebug.Module.reattachContext.apply(this,arguments); + this.hookPanel(context) + },convertOldCode:function(code,version){switch(version){case 1:return code.replace(/\.(\w+)\s*\{/g,".js-$1 {") + }return code + },getCodeVersion:function(code){var vc=code.match(/\/\* version:(.*) \*\//); + if(!vc){return 1 + }return parseInt(vc[1],10) + },colorizeSourceBox:function(sourceBox){dbg("Rainbow: colorizeSourceBox",sourceBox); + this.pingDaemon(sourceBox) + },hookPanel:function(context){dbg("Rainbow: hookPanel",context); + var chrome=context?context.chrome:FirebugChrome; + var code=this.getPref("coloring"); + var version=this.getCodeVersion(code); + if(version=sourceBox.lines.length){return finish() + }nextLine=sourceBox.lines[sourceBox.lineToBeColorized]+"\n"; + sourceBox.parsedLine=[]; + sourceBox.hasLine=true + }codemirror.forEach(sourceBox.parser,function(token){var val=token.value; + sourceBox.parsedLine.push([token.style,val]); + that.styleLibrary[token.style]=true; + if(--tokenQuota==0){throw StopIteration + }}); + if(!tokenQuota){return + }sourceBox.colorizedLines.push(processTokenStream(sourceBox.parsedLine)); + if(sourceBox.lineToBeColorized==sourceBox.lastViewableLine){refresh(); + startLine=null + }sourceBox.lineToBeColorized++; + sourceBox.hasLine=false + }}catch(ex){dbg("Rainbow: exception",ex); + that.stopDaemon(); + sourceBox.colorized=true; + sourceBox.colorizationFailed=true; + sourceBox.parser=undefined; + return + }},daemonInterval) + },pingDaemon:function(sourceBox){this.valid=true; + if(!this.valid){return + }this.pings++; + var pingMarker=this.pings; + var that=this; + setTimeout(function(){if(that.pings!=pingMarker){return + }that.startDaemon(sourceBox) + },200) + },initSyntaxColoring:function(panelBar){if(this.lookupStyleElement(panelBar)){return + }var browser=panelBar.browser; + var doc=browser.contentDocument; + var styleElement=doc.createElement("style"); + styleElement.setAttribute("id","rainbow-style-sheet"); + styleElement.setAttribute("type","text/css"); + styleElement.appendChild(doc.createTextNode("/* Syntax coloring */")); + var headElement; + var headElementList=doc.getElementsByTagName("head"); + if(headElementList.length){headElement=headElementList[0] + }else{headElement=doc.documentElement + }headElement.appendChild(styleElement) + },lookupStyleElement:function(panelBar){var browser=panelBar.browser; + var doc=browser.contentDocument; + var styleElement=doc.getElementById("rainbow-style-sheet"); + return styleElement + },applySyntaxColoring:function(code,panelBar){var styleElement=this.lookupStyleElement(panelBar); + if(!styleElement){return + }styleElement.innerHTML=""; + var browser=panelBar.browser; + var doc=browser.contentDocument; + styleElement.appendChild(doc.createTextNode(code)) + },saveSyntaxColoring:function(rules){var code=rules; + if(typeof code!="string"){var s=[]; + for(var i=0; + i .infoTipImage,.infoTipLoading > .infoTipCaption{display:none;}h1.groupHeader{padding:2px 4px;margin:0 0 4px 0;border-top:1px solid #CCCCCC;border-bottom:1px solid #CCCCCC;background:#eee url(https://getfirebug.com/releases/lite/latest/skin/xp/group.gif) repeat-x;font-size:11px;font-weight:bold;_position:relative;}.inlineEditor,.fixedWidthEditor{z-index:2147483647;position:absolute;display:none;}.inlineEditor{margin-left:-6px;margin-top:-3px;}.textEditorInner,.fixedWidthEditor{margin:0 0 0 0 !important;padding:0;border:none !important;font:inherit;text-decoration:inherit;background-color:#FFFFFF;}.fixedWidthEditor{border-top:1px solid #888888 !important;border-bottom:1px solid #888888 !important;}.textEditorInner{position:relative;top:-7px;left:-5px;outline:none;resize:none;}.textEditorInner1{padding-left:11px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorBorders.png) repeat-y;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorBorders.gif) repeat-y;_overflow:hidden;}.textEditorInner2{position:relative;padding-right:2px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorBorders.png) repeat-y 100% 0;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorBorders.gif) repeat-y 100% 0;_position:fixed;}.textEditorTop1{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.png) no-repeat 100% 0;margin-left:11px;height:10px;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.gif) no-repeat 100% 0;_overflow:hidden;}.textEditorTop2{position:relative;left:-11px;width:11px;height:10px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.png) no-repeat;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.gif) no-repeat;}.textEditorBottom1{position:relative;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.png) no-repeat 100% 100%;margin-left:11px;height:12px;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.gif) no-repeat 100% 100%;}.textEditorBottom2{position:relative;left:-11px;width:11px;height:12px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.png) no-repeat 0 100%;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/textEditorCorners.gif) no-repeat 0 100%;}.panelNode-css{overflow-x:hidden;}.cssSheet > .insertBefore{height:1.5em;}.cssRule{position:relative;margin:0;padding:1em 0 0 6px;font-family:Monaco,monospace;color:#000000;}.cssRule:first-child{padding-top:6px;}.cssElementRuleContainer{position:relative;}.cssHead{padding-right:150px;}.cssProp{}.cssPropName{color:DarkGreen;}.cssPropValue{margin-left:8px;color:DarkBlue;}.cssOverridden span{text-decoration:line-through;}.cssInheritedRule{}.cssInheritLabel{margin-right:0.5em;font-weight:bold;}.cssRule .objectLink-sourceLink{top:0;}.cssProp.editGroup:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/disable.png) no-repeat 2px 1px;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/disable.gif) no-repeat 2px 1px;}.cssProp.editGroup.editing{background:none;}.cssProp.disabledStyle{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/disableHover.png) no-repeat 2px 1px;_background:url(https://getfirebug.com/releases/lite/latest/skin/xp/disableHover.gif) no-repeat 2px 1px;opacity:1;color:#CCCCCC;}.disabledStyle .cssPropName,.disabledStyle .cssPropValue{color:#CCCCCC;}.cssPropValue.editing + .cssSemi,.inlineExpander + .cssSemi{display:none;}.cssPropValue.editing{white-space:nowrap;}.stylePropName{font-weight:bold;padding:0 4px 4px 4px;width:50%;}.stylePropValue{width:50%;}.panelNode-net{overflow-x:hidden;}.netTable{width:100%;}.hideCategory-undefined .category-undefined,.hideCategory-html .category-html,.hideCategory-css .category-css,.hideCategory-js .category-js,.hideCategory-image .category-image,.hideCategory-xhr .category-xhr,.hideCategory-flash .category-flash,.hideCategory-txt .category-txt,.hideCategory-bin .category-bin{display:none;}.netHeadRow{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/group.gif) repeat-x #FFFFFF;}.netHeadCol{border-bottom:1px solid #CCCCCC;padding:2px 4px 2px 18px;font-weight:bold;}.netHeadLabel{white-space:nowrap;overflow:hidden;}.netHeaderRow{height:16px;}.netHeaderCell{cursor:pointer;-moz-user-select:none;border-bottom:1px solid #9C9C9C;padding:0 !important;font-weight:bold;background:#BBBBBB url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/tableHeader.gif) repeat-x;white-space:nowrap;}.netHeaderRow > .netHeaderCell:first-child > .netHeaderCellBox{padding:2px 14px 2px 18px;}.netHeaderCellBox{padding:2px 14px 2px 10px;border-left:1px solid #D9D9D9;border-right:1px solid #9C9C9C;}.netHeaderCell:hover:active{background:#959595 url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/tableHeaderActive.gif) repeat-x;}.netHeaderSorted{background:#7D93B2 url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/tableHeaderSorted.gif) repeat-x;}.netHeaderSorted > .netHeaderCellBox{border-right-color:#6B7C93;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/arrowDown.png) no-repeat right;}.netHeaderSorted.sortedAscending > .netHeaderCellBox{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/arrowUp.png);}.netHeaderSorted:hover:active{background:#536B90 url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/tableHeaderSortedActive.gif) repeat-x;}.panelNode-net .netRowHeader{display:block;}.netRowHeader{cursor:pointer;display:none;height:15px;margin-right:0 !important;}.netRow .netRowHeader{background-position:5px 1px;}.netRow[breakpoint="true"] .netRowHeader{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/breakpoint.png);}.netRow[breakpoint="true"][disabledBreakpoint="true"] .netRowHeader{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/breakpointDisabled.png);}.netRow.category-xhr:hover .netRowHeader{background-color:#F6F6F6;}#netBreakpointBar{max-width:38px;}#netHrefCol > .netHeaderCellBox{border-left:0px;}.netRow .netRowHeader{width:3px;}.netInfoRow .netRowHeader{display:table-cell;}.netTable[hiddenCols~=netHrefCol] TD[id="netHrefCol"],.netTable[hiddenCols~=netHrefCol] TD.netHrefCol,.netTable[hiddenCols~=netStatusCol] TD[id="netStatusCol"],.netTable[hiddenCols~=netStatusCol] TD.netStatusCol,.netTable[hiddenCols~=netDomainCol] TD[id="netDomainCol"],.netTable[hiddenCols~=netDomainCol] TD.netDomainCol,.netTable[hiddenCols~=netSizeCol] TD[id="netSizeCol"],.netTable[hiddenCols~=netSizeCol] TD.netSizeCol,.netTable[hiddenCols~=netTimeCol] TD[id="netTimeCol"],.netTable[hiddenCols~=netTimeCol] TD.netTimeCol{display:none;}.netRow{background:LightYellow;}.netRow.loaded{background:#FFFFFF;}.netRow.loaded:hover{background:#EFEFEF;}.netCol{padding:0;vertical-align:top;border-bottom:1px solid #EFEFEF;white-space:nowrap;height:17px;}.netLabel{width:100%;}.netStatusCol{padding-left:10px;color:rgb(128,128,128);}.responseError > .netStatusCol{color:red;}.netDomainCol{padding-left:5px;}.netSizeCol{text-align:right;padding-right:10px;}.netHrefLabel{-moz-box-sizing:padding-box;overflow:hidden;z-index:10;position:absolute;padding-left:18px;padding-top:1px;max-width:15%;font-weight:bold;}.netFullHrefLabel{display:none;-moz-user-select:none;padding-right:10px;padding-bottom:3px;max-width:100%;background:#FFFFFF;z-index:200;}.netHrefCol:hover > .netFullHrefLabel{display:block;}.netRow.loaded:hover .netCol > .netFullHrefLabel{background-color:#EFEFEF;}.useA11y .a11yShowFullLabel{display:block;background-image:none !important;border:1px solid #CBE087;background-color:LightYellow;font-family:Monaco,monospace;color:#000000;font-size:10px;z-index:2147483647;}.netSizeLabel{padding-left:6px;}.netStatusLabel,.netDomainLabel,.netSizeLabel,.netBar{padding:1px 0 2px 0 !important;}.responseError{color:red;}.hasHeaders .netHrefLabel:hover{cursor:pointer;color:blue;text-decoration:underline;}.netLoadingIcon{position:absolute;border:0;margin-left:14px;width:16px;height:16px;background:transparent no-repeat 0 0;background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/loading_16.gif);display:inline-block;}.loaded .netLoadingIcon{display:none;}.netBar,.netSummaryBar{position:relative;border-right:50px solid transparent;}.netResolvingBar{position:absolute;left:0;top:0;bottom:0;background:#FFFFFF url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarResolving.gif) repeat-x;z-index:60;}.netConnectingBar{position:absolute;left:0;top:0;bottom:0;background:#FFFFFF url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarConnecting.gif) repeat-x;z-index:50;}.netBlockingBar{position:absolute;left:0;top:0;bottom:0;background:#FFFFFF url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarWaiting.gif) repeat-x;z-index:40;}.netSendingBar{position:absolute;left:0;top:0;bottom:0;background:#FFFFFF url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarSending.gif) repeat-x;z-index:30;}.netWaitingBar{position:absolute;left:0;top:0;bottom:0;background:#FFFFFF url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarResponded.gif) repeat-x;z-index:20;min-width:1px;}.netReceivingBar{position:absolute;left:0;top:0;bottom:0;background:#38D63B url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarLoading.gif) repeat-x;z-index:10;}.netWindowLoadBar,.netContentLoadBar{position:absolute;left:0;top:0;bottom:0;width:1px;background-color:red;z-index:70;opacity:0.5;display:none;margin-bottom:-1px;}.netContentLoadBar{background-color:Blue;}.netTimeLabel{-moz-box-sizing:padding-box;position:absolute;top:1px;left:100%;padding-left:6px;color:#444444;min-width:16px;}.loaded .netReceivingBar,.loaded.netReceivingBar{background:#B6B6B6 url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarLoaded.gif) repeat-x;border-color:#B6B6B6;}.fromCache .netReceivingBar,.fromCache.netReceivingBar{background:#D6D6D6 url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/netBarCached.gif) repeat-x;border-color:#D6D6D6;}.netSummaryRow .netTimeLabel,.loaded .netTimeLabel{background:transparent;}.timeInfoTip{width:150px; height:40px}.timeInfoTipBar,.timeInfoTipEventBar{position:relative;display:block;margin:0;opacity:1;height:15px;width:4px;}.timeInfoTipEventBar{width:1px !important;}.timeInfoTipCell.startTime{padding-right:8px;}.timeInfoTipCell.elapsedTime{text-align:right;padding-right:8px;}.sizeInfoLabelCol{font-weight:bold;padding-right:10px;font-family:Lucida Grande,Tahoma,sans-serif;font-size:11px;}.sizeInfoSizeCol{font-weight:bold;}.sizeInfoDetailCol{color:gray;text-align:right;}.sizeInfoDescCol{font-style:italic;}.netSummaryRow .netReceivingBar{background:#BBBBBB;border:none;}.netSummaryLabel{color:#222222;}.netSummaryRow{background:#BBBBBB !important;font-weight:bold;}.netSummaryRow .netBar{border-right-color:#BBBBBB;}.netSummaryRow > .netCol{border-top:1px solid #999999;border-bottom:2px solid;-moz-border-bottom-colors:#EFEFEF #999999;padding-top:1px;padding-bottom:2px;}.netSummaryRow > .netHrefCol:hover{background:transparent !important;}.netCountLabel{padding-left:18px;}.netTotalSizeCol{text-align:right;padding-right:10px;}.netTotalTimeCol{text-align:right;}.netCacheSizeLabel{position:absolute;z-index:1000;left:0;top:0;}.netLimitRow{background:rgb(255,255,225) !important;font-weight:normal;color:black;font-weight:normal;}.netLimitLabel{padding-left:18px;}.netLimitRow > .netCol{border-bottom:2px solid;-moz-border-bottom-colors:#EFEFEF #999999;vertical-align:middle !important;padding-top:2px;padding-bottom:2px;}.netLimitButton{font-size:11px;padding-top:1px;padding-bottom:1px;}.netInfoCol{border-top:1px solid #EEEEEE;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/group.gif) repeat-x #FFFFFF;}.netInfoBody{margin:10px 0 4px 10px;}.netInfoTabs{position:relative;padding-left:17px;}.netInfoTab{position:relative;top:-3px;margin-top:10px;padding:4px 6px;border:1px solid transparent;border-bottom:none;_border:none;font-weight:bold;color:#565656;cursor:pointer;}.netInfoTabSelected{cursor:default !important;border:1px solid #D7D7D7 !important;border-bottom:none !important;-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background-color:#FFFFFF;}.logRow-netInfo.error .netInfoTitle{color:red;}.logRow-netInfo.loading .netInfoResponseText{font-style:italic;color:#888888;}.loading .netInfoResponseHeadersTitle{display:none;}.netInfoResponseSizeLimit{font-family:Lucida Grande,Tahoma,sans-serif;padding-top:10px;font-size:11px;}.netInfoText{display:none;margin:0;border:1px solid #D7D7D7;border-right:none;padding:8px;background-color:#FFFFFF;font-family:Monaco,monospace;white-space:pre-wrap;}.netInfoTextSelected{display:block;}.netInfoParamName{padding-right:10px;font-family:Lucida Grande,Tahoma,sans-serif;font-weight:bold;vertical-align:top;text-align:right;white-space:nowrap;}.netInfoPostText .netInfoParamName{width:1px;}.netInfoParamValue{width:100%;}.netInfoHeadersText,.netInfoPostText,.netInfoPutText{padding-top:0;}.netInfoHeadersGroup,.netInfoPostParams,.netInfoPostSource{margin-bottom:4px;border-bottom:1px solid #D7D7D7;padding-top:8px;padding-bottom:2px;font-family:Lucida Grande,Tahoma,sans-serif;font-weight:bold;color:#565656;}.netInfoPostParamsTable,.netInfoPostPartsTable,.netInfoPostJSONTable,.netInfoPostXMLTable,.netInfoPostSourceTable{margin-bottom:10px;width:100%;}.netInfoPostContentType{color:#bdbdbd;padding-left:50px;font-weight:normal;}.netInfoHtmlPreview{border:0;width:100%;height:100%;}.netHeadersViewSource{color:#bdbdbd;margin-left:200px;font-weight:normal;}.netHeadersViewSource:hover{color:blue;cursor:pointer;}.netActivationRow,.netPageSeparatorRow{background:rgb(229,229,229) !important;font-weight:normal;color:black;}.netActivationLabel{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/chrome://firebug/skin/infoIcon.png) no-repeat 3px 2px;padding-left:22px;}.netPageSeparatorRow{height:5px !important;}.netPageSeparatorLabel{padding-left:22px;height:5px !important;}.netPageRow{background-color:rgb(255,255,255);}.netPageRow:hover{background:#EFEFEF;}.netPageLabel{padding:1px 0 2px 18px !important;font-weight:bold;}.netActivationRow > .netCol{border-bottom:2px solid;-moz-border-bottom-colors:#EFEFEF #999999;padding-top:2px;padding-bottom:3px;}.twisty,.logRow-errorMessage > .hasTwisty > .errorTitle,.logRow-log > .objectBox-array.hasTwisty,.logRow-spy .spyHead .spyTitle,.logGroup > .logRow,.memberRow.hasChildren > .memberLabelCell > .memberLabel,.hasHeaders .netHrefLabel,.netPageRow > .netCol > .netPageTitle{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/tree_open.gif);background-repeat:no-repeat;background-position:2px 2px;min-height:12px;}.logRow-errorMessage > .hasTwisty.opened > .errorTitle,.logRow-log > .objectBox-array.hasTwisty.opened,.logRow-spy.opened .spyHead .spyTitle,.logGroup.opened > .logRow,.memberRow.hasChildren.opened > .memberLabelCell > .memberLabel,.nodeBox.highlightOpen > .nodeLabel > .twisty,.nodeBox.open > .nodeLabel > .twisty,.netRow.opened > .netCol > .netHrefLabel,.netPageRow.opened > .netCol > .netPageTitle{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/tree_close.gif);}.twisty{background-position:4px 4px;}* html .logRow-spy .spyHead .spyTitle,* html .logGroup .logGroupLabel,* html .hasChildren .memberLabelCell .memberLabel,* html .hasHeaders .netHrefLabel{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/tree_open.gif);background-repeat:no-repeat;background-position:2px 2px;}* html .opened .spyHead .spyTitle,* html .opened .logGroupLabel,* html .opened .memberLabelCell .memberLabel{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/tree_close.gif);background-repeat:no-repeat;background-position:2px 2px;}.panelNode-console{overflow-x:hidden;}.objectLink{text-decoration:none;}.objectLink:hover{cursor:pointer;text-decoration:underline;}.logRow{position:relative;margin:0;border-bottom:1px solid #D7D7D7;padding:2px 4px 1px 6px;background-color:#FFFFFF;overflow:hidden !important;}.useA11y .logRow:focus{border-bottom:1px solid #000000 !important;outline:none !important;background-color:#FFFFAD !important;}.useA11y .logRow:focus a.objectLink-sourceLink{background-color:#FFFFAD;}.useA11y .a11yFocus:focus,.useA11y .objectBox:focus{outline:2px solid #FF9933;background-color:#FFFFAD;}.useA11y .objectBox-null:focus,.useA11y .objectBox-undefined:focus{background-color:#888888 !important;}.useA11y .logGroup.opened > .logRow{border-bottom:1px solid #ffffff;}.logGroup{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/group.gif) repeat-x #FFFFFF;padding:0 !important;border:none !important;}.logGroupBody{display:none;margin-left:16px;border-left:1px solid #D7D7D7;border-top:1px solid #D7D7D7;background:#FFFFFF;}.logGroup > .logRow{background-color:transparent !important;font-weight:bold;}.logGroup.opened > .logRow{border-bottom:none;}.logGroup.opened > .logGroupBody{display:block;}.logRow-command > .objectBox-text{font-family:Monaco,monospace;color:#0000FF;white-space:pre-wrap;}.logRow-info,.logRow-warn,.logRow-error,.logRow-assert,.logRow-warningMessage,.logRow-errorMessage{padding-left:22px;background-repeat:no-repeat;background-position:4px 2px;}.logRow-assert,.logRow-warningMessage,.logRow-errorMessage{padding-top:0;padding-bottom:0;}.logRow-info,.logRow-info .objectLink-sourceLink{background-color:#FFFFFF;}.logRow-warn,.logRow-warningMessage,.logRow-warn .objectLink-sourceLink,.logRow-warningMessage .objectLink-sourceLink{background-color:cyan;}.logRow-error,.logRow-assert,.logRow-errorMessage,.logRow-error .objectLink-sourceLink,.logRow-errorMessage .objectLink-sourceLink{background-color:LightYellow;}.logRow-error,.logRow-assert,.logRow-errorMessage{color:#FF0000;}.logRow-info{}.logRow-warn,.logRow-warningMessage{}.logRow-error,.logRow-assert,.logRow-errorMessage{}.objectBox-string,.objectBox-text,.objectBox-number,.objectLink-element,.objectLink-textNode,.objectLink-function,.objectBox-stackTrace,.objectLink-profile{font-family:Monaco,monospace;}.objectBox-string,.objectBox-text,.objectLink-textNode{white-space:pre-wrap;}.objectBox-number,.objectLink-styleRule,.objectLink-element,.objectLink-textNode{color:#000088;}.objectBox-string{color:#FF0000;}.objectLink-function,.objectBox-stackTrace,.objectLink-profile{color:DarkGreen;}.objectBox-null,.objectBox-undefined{padding:0 2px;border:1px solid #666666;background-color:#888888;color:#FFFFFF;}.objectBox-exception{padding:0 2px 0 18px;color:red;}.objectLink-sourceLink{position:absolute;right:4px;top:2px;padding-left:8px;font-family:Lucida Grande,sans-serif;font-weight:bold;color:#0000FF;}.errorTitle{margin-top:0px;margin-bottom:1px;padding-top:2px;padding-bottom:2px;}.errorTrace{margin-left:17px;}.errorSourceBox{margin:2px 0;}.errorSource-none{display:none;}.errorSource-syntax > .errorBreak{visibility:hidden;}.errorSource{cursor:pointer;font-family:Monaco,monospace;color:DarkGreen;}.errorSource:hover{text-decoration:underline;}.errorBreak{cursor:pointer;display:none;margin:0 6px 0 0;width:13px;height:14px;vertical-align:bottom;opacity:0.1;}.hasBreakSwitch .errorBreak{display:inline;}.breakForError .errorBreak{opacity:1;}.assertDescription{margin:0;}.logRow-profile > .logRow > .objectBox-text{font-family:Lucida Grande,Tahoma,sans-serif;color:#000000;}.logRow-profile > .logRow > .objectBox-text:last-child{color:#555555;font-style:italic;}.logRow-profile.opened > .logRow{padding-bottom:4px;}.profilerRunning > .logRow{padding-left:22px !important;}.profileSizer{width:100%;overflow-x:auto;overflow-y:scroll;}.profileTable{border-bottom:1px solid #D7D7D7;padding:0 0 4px 0;}.profileTable tr[odd="1"]{background-color:#F5F5F5;vertical-align:middle;}.profileTable a{vertical-align:middle;}.profileTable td{padding:1px 4px 0 4px;}.headerCell{cursor:pointer;-moz-user-select:none;border-bottom:1px solid #9C9C9C;padding:0 !important;font-weight:bold;}.headerCellBox{padding:2px 4px;border-left:1px solid #D9D9D9;border-right:1px solid #9C9C9C;}.headerCell:hover:active{}.headerSorted{}.headerSorted > .headerCellBox{border-right-color:#6B7C93;}.headerSorted.sortedAscending > .headerCellBox{}.headerSorted:hover:active{}.linkCell{text-align:right;}.linkCell > .objectLink-sourceLink{position:static;}.logRow-stackTrace{padding-top:0;background:#f8f8f8;}.logRow-stackTrace > .objectBox-stackFrame{position:relative;padding-top:2px;}.objectLink-object{font-family:Lucida Grande,sans-serif;font-weight:bold;color:DarkGreen;white-space:pre-wrap;}.objectProp-object{color:DarkGreen;}.objectProps{color:#000;font-weight:normal;}.objectPropName{color:#777;}.objectProps .objectProp-string{color:#f55;}.objectProps .objectProp-number{color:#55a;}.objectProps .objectProp-object{color:#585;}.selectorTag,.selectorId,.selectorClass{font-family:Monaco,monospace;font-weight:normal;}.selectorTag{color:#0000FF;}.selectorId{color:DarkBlue;}.selectorClass{color:red;}.selectorHidden > .selectorTag{color:#5F82D9;}.selectorHidden > .selectorId{color:#888888;}.selectorHidden > .selectorClass{color:#D86060;}.selectorValue{font-family:Lucida Grande,sans-serif;font-style:italic;color:#555555;}.panelNode.searching .logRow{display:none;}.logRow.matched{display:block !important;}.logRow.matching{position:absolute;left:-1000px;top:-1000px;max-width:0;max-height:0;overflow:hidden;}.objectLeftBrace,.objectRightBrace,.objectEqual,.objectComma,.arrayLeftBracket,.arrayRightBracket,.arrayComma{font-family:Monaco,monospace;}.objectLeftBrace,.objectRightBrace,.arrayLeftBracket,.arrayRightBracket{font-weight:bold;}.objectLeftBrace,.arrayLeftBracket{margin-right:4px;}.objectRightBrace,.arrayRightBracket{margin-left:4px;}.logRow-dir{padding:0;}.logRow-errorMessage .hasTwisty .errorTitle,.logRow-spy .spyHead .spyTitle,.logGroup .logRow{cursor:pointer;padding-left:18px;background-repeat:no-repeat;background-position:3px 3px;}.logRow-errorMessage > .hasTwisty > .errorTitle{background-position:2px 3px;}.logRow-errorMessage > .hasTwisty > .errorTitle:hover,.logRow-spy .spyHead .spyTitle:hover,.logGroup > .logRow:hover{text-decoration:underline;}.logRow-spy{padding:0 !important;}.logRow-spy,.logRow-spy .objectLink-sourceLink{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/group.gif) repeat-x #FFFFFF;padding-right:4px;right:0;}.logRow-spy.opened{padding-bottom:4px;border-bottom:none;}.spyTitle{color:#000000;font-weight:bold;-moz-box-sizing:padding-box;overflow:hidden;z-index:100;padding-left:18px;}.spyCol{padding:0;white-space:nowrap;height:16px;}.spyTitleCol:hover > .objectLink-sourceLink,.spyTitleCol:hover > .spyTime,.spyTitleCol:hover > .spyStatus,.spyTitleCol:hover > .spyTitle{display:none;}.spyFullTitle{display:none;-moz-user-select:none;max-width:100%;background-color:Transparent;}.spyTitleCol:hover > .spyFullTitle{display:block;}.spyStatus{padding-left:10px;color:rgb(128,128,128);}.spyTime{margin-left:4px;margin-right:4px;color:rgb(128,128,128);}.spyIcon{margin-right:4px;margin-left:4px;width:16px;height:16px;vertical-align:middle;background:transparent no-repeat 0 0;display:none;}.loading .spyHead .spyRow .spyIcon{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/loading_16.gif);display:block;}.logRow-spy.loaded:not(.error) .spyHead .spyRow .spyIcon{width:0;margin:0;}.logRow-spy.error .spyHead .spyRow .spyIcon{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/errorIcon-sm.png);display:block;background-position:2px 2px;}.logRow-spy .spyHead .netInfoBody{display:none;}.logRow-spy.opened .spyHead .netInfoBody{margin-top:10px;display:block;}.logRow-spy.error .spyTitle,.logRow-spy.error .spyStatus,.logRow-spy.error .spyTime{color:red;}.logRow-spy.loading .spyResponseText{font-style:italic;color:#888888;}.caption{font-family:Lucida Grande,Tahoma,sans-serif;font-weight:bold;color:#444444;}.warning{padding:10px;font-family:Lucida Grande,Tahoma,sans-serif;font-weight:bold;color:#888888;}.panelNode-dom{overflow-x:hidden !important;}.domTable{font-size:1em;width:100%;table-layout:fixed;background:#fff;}.domTableIE{width:auto;}.memberLabelCell{padding:2px 0 2px 0;vertical-align:top;}.memberValueCell{padding:1px 0 1px 5px;display:block;overflow:hidden;}.memberLabel{display:block;cursor:default;-moz-user-select:none;overflow:hidden;padding-left:18px;background-color:#FFFFFF;text-decoration:none;}.memberRow.hasChildren .memberLabelCell .memberLabel:hover{cursor:pointer;color:blue;text-decoration:underline;}.userLabel{color:#000000;font-weight:bold;}.userClassLabel{color:#E90000;font-weight:bold;}.userFunctionLabel{color:#025E2A;font-weight:bold;}.domLabel{color:#000000;}.domFunctionLabel{color:#025E2A;}.ordinalLabel{color:SlateBlue;font-weight:bold;}.scopesRow{padding:2px 18px;background-color:LightYellow;border-bottom:5px solid #BEBEBE;color:#666666;}.scopesLabel{background-color:LightYellow;}.watchEditCell{padding:2px 18px;background-color:LightYellow;border-bottom:1px solid #BEBEBE;color:#666666;}.editor-watchNewRow,.editor-memberRow{font-family:Monaco,monospace !important;}.editor-memberRow{padding:1px 0 !important;}.editor-watchRow{padding-bottom:0 !important;}.watchRow > .memberLabelCell{font-family:Monaco,monospace;padding-top:1px;padding-bottom:1px;}.watchRow > .memberLabelCell > .memberLabel{background-color:transparent;}.watchRow > .memberValueCell{padding-top:2px;padding-bottom:2px;}.watchRow > .memberLabelCell,.watchRow > .memberValueCell{background-color:#F5F5F5;border-bottom:1px solid #BEBEBE;}.watchToolbox{z-index:2147483647;position:absolute;right:0;padding:1px 2px;}#fbConsole{overflow-x:hidden !important;}#fbCSS{font:1em Monaco,monospace;padding:0 7px;}#fbstylesheetButtons select,#fbScriptButtons select{font:11px Lucida Grande,Tahoma,sans-serif;margin-top:1px;padding-left:3px;background:#fafafa;border:1px inset #fff;width:220px;outline:none;}.Selector{margin-top:10px}.CSSItem{margin-left:4%}.CSSText{padding-left:20px;}.CSSProperty{color:#005500;}.CSSValue{padding-left:5px; color:#000088;}#fbHTMLStatusBar{display:inline;}.fbToolbarButtons{display:none;}.fbStatusSeparator{display:block;float:left;padding-top:4px;}#fbStatusBarBox{display:none;}#fbToolbarContent{display:block;position:absolute;_position:absolute;top:0;padding-top:4px;height:23px;clip:rect(0,2048px,27px,0);}.fbTabMenuTarget{display:none !important;float:left;width:10px;height:10px;margin-top:6px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuTarget.png);}.fbTabMenuTarget:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuTargetHover.png);}.fbShadow{float:left;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/shadowAlpha.png) no-repeat bottom right !important;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/shadow2.gif) no-repeat bottom right;margin:10px 0 0 10px !important;margin:10px 0 0 5px;}.fbShadowContent{display:block;position:relative;background-color:#fff;border:1px solid #a9a9a9;top:-6px;left:-6px;}.fbMenu{display:none;position:absolute;font-size:11px;z-index:2147483647;}.fbMenuContent{padding:2px;}.fbMenuSeparator{display:block;position:relative;padding:1px 18px 0;text-decoration:none;color:#000;cursor:default;background:#ACA899;margin:4px 0;}.fbMenuOption{display:block;position:relative;padding:2px 18px;text-decoration:none;color:#000;cursor:default;}.fbMenuOption:hover{color:#fff;background:#316AC5;}.fbMenuGroup{background:transparent url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuPin.png) no-repeat right 0;}.fbMenuGroup:hover{background:#316AC5 url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuPin.png) no-repeat right -17px;}.fbMenuGroupSelected{color:#fff;background:#316AC5 url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuPin.png) no-repeat right -17px;}.fbMenuChecked{background:transparent url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuCheckbox.png) no-repeat 4px 0;}.fbMenuChecked:hover{background:#316AC5 url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuCheckbox.png) no-repeat 4px -17px;}.fbMenuRadioSelected{background:transparent url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuRadio.png) no-repeat 4px 0;}.fbMenuRadioSelected:hover{background:#316AC5 url(https://getfirebug.com/releases/lite/latest/skin/xp/tabMenuRadio.png) no-repeat 4px -17px;}.fbMenuShortcut{padding-right:85px;}.fbMenuShortcutKey{position:absolute;right:0;top:2px;width:77px;}#fbFirebugMenu{top:22px;left:0;}.fbMenuDisabled{color:#ACA899 !important;}#fbFirebugSettingsMenu{left:245px;top:99px;}#fbConsoleMenu{top:42px;left:48px;}.fbIconButton{display:block;}.fbIconButton{display:block;}.fbIconButton{display:block;float:left;height:20px;width:20px;color:#000;margin-right:2px;text-decoration:none;cursor:default;}.fbIconButton:hover{position:relative;top:-1px;left:-1px;margin-right:0;_margin-right:1px;color:#333;border:1px solid #fff;border-bottom:1px solid #bbb;border-right:1px solid #bbb;}.fbIconPressed{position:relative;margin-right:0;_margin-right:1px;top:0 !important;left:0 !important;height:19px;color:#333 !important;border:1px solid #bbb !important;border-bottom:1px solid #cfcfcf !important;border-right:1px solid #ddd !important;}#fbErrorPopup{position:absolute;right:0;bottom:0;height:19px;width:75px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #f1f2ee 0 0;z-index:999;}#fbErrorPopupContent{position:absolute;right:0;top:1px;height:18px;width:75px;_width:74px;border-left:1px solid #aca899;}#fbErrorIndicator{position:absolute;top:2px;right:5px;}.fbBtnInspectActive{background:#aaa;color:#fff !important;}.fbBody{margin:0;padding:0;overflow:hidden;font-family:Lucida Grande,Tahoma,sans-serif;font-size:11px;background:#fff;}.clear{clear:both;}#fbMiniChrome{display:none;right:0;height:27px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #f1f2ee 0 0;margin-left:1px;}#fbMiniContent{display:block;position:relative;left:-1px;right:0;top:1px;height:25px;border-left:1px solid #aca899;}#fbToolbarSearch{float:right;border:1px solid #ccc;margin:0 5px 0 0;background:#fff url(https://getfirebug.com/releases/lite/latest/skin/xp/search.png) no-repeat 4px 2px !important;background:#fff url(https://getfirebug.com/releases/lite/latest/skin/xp/search.gif) no-repeat 4px 2px;padding-left:20px;font-size:11px;}#fbToolbarErrors{float:right;margin:1px 4px 0 0;font-size:11px;}#fbLeftToolbarErrors{float:left;margin:7px 0px 0 5px;font-size:11px;}.fbErrors{padding-left:20px;height:14px;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/errorIcon.png) no-repeat !important;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/errorIcon.gif) no-repeat;color:#f00;font-weight:bold;}#fbMiniErrors{display:inline;display:none;float:right;margin:5px 2px 0 5px;}#fbMiniIcon{float:right;margin:3px 4px 0;height:20px;width:20px;float:right;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) 0 -135px;cursor:pointer;}#fbChrome{font-family:Lucida Grande,Tahoma,sans-serif;font-size:11px;position:absolute;_position:static;top:0;left:0;height:100%;width:100%;border-collapse:collapse;border-spacing:0;background:#fff;overflow:hidden;}#fbChrome > tbody > tr > td{padding:0;}#fbTop{height:49px;}#fbToolbar{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #f1f2ee 0 0;height:27px;font-size:11px;}#fbPanelBarBox{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #dbd9c9 0 -27px;height:22px;}#fbContent{height:100%;vertical-align:top;}#fbBottom{height:18px;background:#fff;}#fbToolbarIcon{float:left;padding:0 5px 0;}#fbToolbarIcon a{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) 0 -135px;}#fbToolbarButtons{padding:0 2px 0 5px;}#fbToolbarButtons{padding:0 2px 0 5px;}.fbButton{text-decoration:none;display:block;float:left;color:#000;padding:4px 6px 4px 7px;cursor:default;}.fbButton:hover{color:#333;background:#f5f5ef url(https://getfirebug.com/releases/lite/latest/skin/xp/buttonBg.png);padding:3px 5px 3px 6px;border:1px solid #fff;border-bottom:1px solid #bbb;border-right:1px solid #bbb;}.fbBtnPressed{background:#e3e3db url(https://getfirebug.com/releases/lite/latest/skin/xp/buttonBgHover.png) !important;padding:3px 4px 2px 6px !important;margin:1px 0 0 1px !important;border:1px solid #ACA899 !important;border-color:#ACA899 #ECEBE3 #ECEBE3 #ACA899 !important;}#fbStatusBarBox{top:4px;cursor:default;}.fbToolbarSeparator{overflow:hidden;border:1px solid;border-color:transparent #fff transparent #777;_border-color:#eee #fff #eee #777;height:7px;margin:6px 3px;float:left;}.fbBtnSelected{font-weight:bold;}.fbStatusBar{color:#aca899;}.fbStatusBar a{text-decoration:none;color:black;}.fbStatusBar a:hover{color:blue;cursor:pointer;}#fbWindowButtons{position:absolute;white-space:nowrap;right:0;top:0;height:17px;width:48px;padding:5px;z-index:6;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #f1f2ee 0 0;}#fbPanelBar1{width:1024px; z-index:8;left:0;white-space:nowrap;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #dbd9c9 0 -27px;position:absolute;left:4px;}#fbPanelBar2Box{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #dbd9c9 0 -27px;position:absolute;height:22px;width:300px; z-index:9;right:0;}#fbPanelBar2{position:absolute;width:290px; height:22px;padding-left:4px;}.fbPanel{display:none;}#fbPanelBox1,#fbPanelBox2{max-height:inherit;height:100%;font-size:1em;}#fbPanelBox2{background:#fff;}#fbPanelBox2{width:300px;background:#fff;}#fbPanel2{margin-left:6px;background:#fff;}#fbLargeCommandLine{display:none;position:absolute;z-index:9;top:27px;right:0;width:294px;height:201px;border-width:0;margin:0;padding:2px 0 0 2px;resize:none;outline:none;font-size:11px;overflow:auto;border-top:1px solid #B9B7AF;_right:-1px;_border-left:1px solid #fff;}#fbLargeCommandButtons{display:none;background:#ECE9D8;bottom:0;right:0;width:294px;height:21px;padding-top:1px;position:fixed;border-top:1px solid #ACA899;z-index:9;}#fbSmallCommandLineIcon{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/down.png) no-repeat;position:absolute;right:2px;bottom:3px;z-index:99;}#fbSmallCommandLineIcon:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/downHover.png) no-repeat;}.hide{overflow:hidden !important;position:fixed !important;display:none !important;visibility:hidden !important;}#fbCommand{height:18px;}#fbCommandBox{position:fixed;_position:absolute;width:100%;height:18px;bottom:0;overflow:hidden;z-index:9;background:#fff;border:0;border-top:1px solid #ccc;}#fbCommandIcon{position:absolute;color:#00f;top:2px;left:6px;display:inline;font:11px Monaco,monospace;z-index:10;}#fbCommandLine{position:absolute;width:100%;top:0;left:0;border:0;margin:0;padding:2px 0 2px 32px;font:11px Monaco,monospace;z-index:9;outline:none;}#fbLargeCommandLineIcon{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/up.png) no-repeat;position:absolute;right:1px;bottom:1px;z-index:10;}#fbLargeCommandLineIcon:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/upHover.png) no-repeat;}div.fbFitHeight{overflow:auto;position:relative;}.fbSmallButton{overflow:hidden;width:16px;height:16px;display:block;text-decoration:none;cursor:default;}#fbWindowButtons .fbSmallButton{float:right;}#fbWindow_btClose{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/min.png);}#fbWindow_btClose:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/minHover.png);}#fbWindow_btDetach{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/detach.png);}#fbWindow_btDetach:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/detachHover.png);}#fbWindow_btDeactivate{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/off.png);}#fbWindow_btDeactivate:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/offHover.png);}.fbTab{text-decoration:none;display:none;float:left;width:auto;float:left;cursor:default;font-family:Lucida Grande,Tahoma,sans-serif;font-size:11px;font-weight:bold;height:22px;color:#565656;}.fbPanelBar span{float:left;}.fbPanelBar .fbTabL,.fbPanelBar .fbTabR{height:22px;width:8px;}.fbPanelBar .fbTabText{padding:4px 1px 0;}a.fbTab:hover{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) 0 -73px;}a.fbTab:hover .fbTabL{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) -16px -96px;}a.fbTab:hover .fbTabR{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) -24px -96px;}.fbSelectedTab{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) #f1f2ee 0 -50px !important;color:#000;}.fbSelectedTab .fbTabL{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) 0 -96px !important;}.fbSelectedTab .fbTabR{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/sprite.png) -8px -96px !important;}#fbHSplitter{position:fixed;_position:absolute;left:0;top:0;width:100%;height:5px;overflow:hidden;cursor:n-resize !important;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/pixel_transparent.gif);z-index:9;}#fbHSplitter.fbOnMovingHSplitter{height:100%;z-index:100;}.fbVSplitter{background:#ece9d8;color:#000;border:1px solid #716f64;border-width:0 1px;border-left-color:#aca899;width:4px;cursor:e-resize;overflow:hidden;right:294px;text-decoration:none;z-index:10;position:absolute;height:100%;top:27px;}div.lineNo{font:1em Monaco,monospace;position:relative;float:left;top:0;left:0;margin:0 5px 0 0;padding:0 5px 0 10px;background:#eee;color:#888;border-right:1px solid #ccc;text-align:right;}.sourceBox{position:absolute;}.sourceCode{font:1em Monaco,monospace;overflow:hidden;white-space:pre;display:inline;}.nodeControl{margin-top:3px;margin-left:-14px;float:left;width:9px;height:9px;overflow:hidden;cursor:default;background:url(https://getfirebug.com/releases/lite/latest/skin/xp/tree_open.gif);_float:none;_display:inline;_position:absolute;}div.nodeMaximized{background:url(https://getfirebug.com/releases/lite/latest/skin/xp/tree_close.gif);}div.objectBox-element{padding:1px 3px;}.objectBox-selector{cursor:default;}.selectedElement{background:highlight;color:#fff !important;}.selectedElement span{color:#fff !important;}* html .selectedElement{position:relative;}@media screen and (-webkit-min-device-pixel-ratio:0){.selectedElement{background:#316AC5;color:#fff !important;}}.logRow *{font-size:1em;}.logRow{position:relative;border-bottom:1px solid #D7D7D7;padding:2px 4px 1px 6px;zbackground-color:#FFFFFF;}.logRow-command{font-family:Monaco,monospace;color:blue;}.objectBox-string,.objectBox-text,.objectBox-number,.objectBox-function,.objectLink-element,.objectLink-textNode,.objectLink-function,.objectBox-stackTrace,.objectLink-profile{font-family:Monaco,monospace;}.objectBox-null{padding:0 2px;border:1px solid #666666;background-color:#888888;color:#FFFFFF;}.objectBox-string{color:red;}.objectBox-number{color:#000088;}.objectBox-function{color:DarkGreen;}.objectBox-object{color:DarkGreen;font-weight:bold;font-family:Lucida Grande,sans-serif;}.objectBox-array{color:#000;}.logRow-info,.logRow-error,.logRow-warn{background:#fff no-repeat 2px 2px;padding-left:20px;padding-bottom:3px;}.logRow-info{background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/infoIcon.png) !important;background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/infoIcon.gif);}.logRow-warn{background-color:cyan;background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/warningIcon.png) !important;background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/warningIcon.gif);}.logRow-error{background-color:LightYellow;background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/errorIcon.png) !important;background-image:url(https://getfirebug.com/releases/lite/latest/skin/xp/errorIcon.gif);color:#f00;}.errorMessage{vertical-align:top;color:#f00;}.objectBox-sourceLink{position:absolute;right:4px;top:2px;padding-left:8px;font-family:Lucida Grande,sans-serif;font-weight:bold;color:#0000FF;}.selectorTag,.selectorId,.selectorClass{font-family:Monaco,monospace;font-weight:normal;}.selectorTag{color:#0000FF;}.selectorId{color:DarkBlue;}.selectorClass{color:red;}.objectBox-element{font-family:Monaco,monospace;color:#000088;}.nodeChildren{padding-left:26px;}.nodeTag{color:blue;cursor:pointer;}.nodeValue{color:#FF0000;font-weight:normal;}.nodeText,.nodeComment{margin:0 2px;vertical-align:top;}.nodeText{color:#333333;font-family:Monaco,monospace;}.nodeComment{color:DarkGreen;}.nodeHidden,.nodeHidden *{color:#888888;}.nodeHidden .nodeTag{color:#5F82D9;}.nodeHidden .nodeValue{color:#D86060;}.selectedElement .nodeHidden,.selectedElement .nodeHidden *{color:SkyBlue !important;}.log-object{}.property{position:relative;clear:both;height:15px;}.propertyNameCell{vertical-align:top;float:left;width:28%;position:absolute;left:0;z-index:0;}.propertyValueCell{float:right;width:68%;background:#fff;position:absolute;padding-left:5px;display:table-cell;right:0;z-index:1;}.propertyName{font-weight:bold;}.FirebugPopup{height:100% !important;}.FirebugPopup #fbWindowButtons{display:none !important;}.FirebugPopup #fbHSplitter{display:none !important;}',HTML:"undefined"} + }}); + FBL.initialize() + })(); \ No newline at end of file diff --git a/runtime/assets/injectFirebug.js b/runtime/assets/injectFirebug.js new file mode 100644 index 00000000..32ad6844 --- /dev/null +++ b/runtime/assets/injectFirebug.js @@ -0,0 +1 @@ +(function(){console.log=function(message){document.body.innerHTML=document.body.innerHTML+'

'+message+'

';};var script=document.createElement('script');script.src="https://raw.githubusercontent.com/firebug/firebug-lite/master/build/firebug-lite-debug.js#startOpened=true";document.body.appendChild(script);})(); diff --git a/runtime/assets/wails.js b/runtime/assets/wails.js index a486cf5a..6c83d9a0 100644 --- a/runtime/assets/wails.js +++ b/runtime/assets/wails.js @@ -1 +1 @@ -!function(n){var t={};function e(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return n[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}e.m=n,e.c=t,e.d=function(n,t,r){e.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:r})},e.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},e.t=function(n,t){if(1&t&&(n=e(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var o in n)e.d(r,o,function(t){return n[t]}.bind(null,o));return r},e.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(t,"a",t),t},e.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},e.p="",e(e.s=0)}([function(n,t,e){"use strict";e.r(t);var r={};e.r(r),e.d(r,"Debug",function(){return c}),e.d(r,"Info",function(){return u}),e.d(r,"Warning",function(){return l}),e.d(r,"Error",function(){return f}),e.d(r,"Fatal",function(){return d});var o={};function i(n,t,e){var r={type:n,callbackID:e,payload:t};!function(n){window.external.invoke(n)}(JSON.stringify(r))}function a(n,t){i("log",{level:n,message:t})}function c(n){a("debug",n)}function u(n){a("info",n)}function l(n){a("warning",n)}function f(n){a("error",n)}function d(n){a("fatal",n)}e.r(o),e.d(o,"OpenURL",function(){return y}),e.d(o,"OpenFile",function(){return g});var s,p={};function v(n,t,e){return null!=e&&null!=e||(e=0),new Promise(function(r,o){var a;do{a=n+"-"+s()}while(p[a]);if(e>0)var c=setTimeout(function(){o(Error("Call to "+n+" timed out. Request ID: "+a))},e);p[a]={timeoutHandle:c,reject:o,resolve:r};try{i("call",{bindingName:n,data:JSON.stringify(t)},a)}catch(n){console.error(n)}})}function w(n,t){return v(".wails."+n,t)}function y(n){return w("Browser.OpenURL",n)}function g(n){return w("Browser.OpenFile",n)}s=window.crypto?function(){var n=new Uint32Array(1);return window.crypto.getRandomValues(n)[0]}:function(){return 9007199254740991*Math.random()};var m=function n(t,e){!function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),e=e||-1,this.Callback=function(n){return t.apply(null,n),-1!==e&&0===(e-=1)}},b={};function h(n,t,e){b[n]=b[n]||[];var r=new m(t,e);b[n].push(r)}function O(n){i("event",{name:n,data:JSON.stringify([].slice.apply(arguments).slice(1))})}var S={};function j(n){try{return new Function("var "+n),!0}catch(n){return!1}}function k(){return(k=Object.assign||function(n){for(var t=1;t1)for(var r=0;r0?o(e(t),9007199254740991):0}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,r){var e=r(5);t.exports=function(t){if(!e(t))throw TypeError(String(t)+" is not an object");return t}},function(t,n,r){var e=r(10),o=r(12),i=r(20);t.exports=e?function(t,n,r){return o.f(t,n,i(1,r))}:function(t,n,r){return t[n]=r,t}},function(t,n,r){var e=r(21);t.exports=function(t){return Object(e(t))}},function(t,n,r){var e=r(1),o=r(25).f,i=r(7),u=r(19),c=r(36),a=r(86),f=r(58);t.exports=function(t,n){var r,s,l,p,v,h=t.target,d=t.global,y=t.stat;if(r=d?e:y?e[h]||c(h,{}):(e[h]||{}).prototype)for(s in n){if(p=n[s],l=t.noTargetGet?(v=o(r,s))&&v.value:r[s],!f(d?s:h+(y?".":"#")+s,t.forced)&&void 0!==l){if(typeof p==typeof l)continue;a(p,l)}(t.sham||l&&l.sham)&&i(p,"sham",!0),u(r,s,p,t)}}},function(t,n,r){var e=r(2);t.exports=!e((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},function(t,n,r){var e=r(10),o=r(53),i=r(6),u=r(27),c=Object.defineProperty;n.f=e?c:function(t,n,r){if(i(t),n=u(n,!0),i(r),o)try{return c(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[n]=r.value),t}},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n,r){var e=r(33),o=r(26),i=r(8),u=r(4),c=r(45),a=[].push,f=function(t){var n=1==t,r=2==t,f=3==t,s=4==t,l=6==t,p=5==t||l;return function(v,h,d,y){for(var g,x,w=i(v),b=o(w),m=e(h,d,3),A=u(b.length),E=0,T=y||c,O=n?T(v,A):r?T(v,0):void 0;A>E;E++)if((p||E in b)&&(x=m(g=b[E],E,w),t))if(n)O[E]=x;else if(x)switch(t){case 3:return!0;case 5:return g;case 6:return E;case 2:a.call(O,g)}else if(s)return!1;return l?-1:f||s?s:O}};t.exports={forEach:f(0),map:f(1),filter:f(2),some:f(3),every:f(4),find:f(5),findIndex:f(6)}},function(t,n,r){var e=r(13),o=Math.max,i=Math.min;t.exports=function(t,n){var r=e(t);return r<0?o(r+n,0):i(r,n)}},function(t,n,r){var e=r(6),o=r(24),i=r(3)("species");t.exports=function(t,n){var r,u=e(t).constructor;return void 0===u||null==(r=e(u)[i])?n:o(r)}},function(t,n,r){var e=r(26),o=r(21);t.exports=function(t){return e(o(t))}},function(t,n,r){var e=r(1),o=r(28),i=r(7),u=r(11),c=r(36),a=r(54),f=r(22),s=f.get,l=f.enforce,p=String(a).split("toString");o("inspectSource",(function(t){return a.call(t)})),(t.exports=function(t,n,r,o){var a=!!o&&!!o.unsafe,f=!!o&&!!o.enumerable,s=!!o&&!!o.noTargetGet;"function"==typeof r&&("string"!=typeof n||u(r,"name")||i(r,"name",n),l(r).source=p.join("string"==typeof n?n:"")),t!==e?(a?!s&&t[n]&&(f=!0):delete t[n],f?t[n]=r:i(t,n,r)):f?t[n]=r:c(n,r)})(Function.prototype,"toString",(function(){return"function"==typeof this&&s(this).source||a.call(this)}))},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,r){var e,o,i,u=r(85),c=r(1),a=r(5),f=r(7),s=r(11),l=r(37),p=r(39),v=c.WeakMap;if(u){var h=new v,d=h.get,y=h.has,g=h.set;e=function(t,n){return g.call(h,t,n),n},o=function(t){return d.call(h,t)||{}},i=function(t){return y.call(h,t)}}else{var x=l("state");p[x]=!0,e=function(t,n){return f(t,x,n),n},o=function(t){return s(t,x)?t[x]:{}},i=function(t){return s(t,x)}}t.exports={set:e,get:o,has:i,enforce:function(t){return i(t)?o(t):e(t,{})},getterFor:function(t){return function(n){var r;if(!a(n)||(r=o(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}}},function(t,n){t.exports={}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,n,r){var e=r(10),o=r(52),i=r(20),u=r(18),c=r(27),a=r(11),f=r(53),s=Object.getOwnPropertyDescriptor;n.f=e?s:function(t,n){if(t=u(t),n=c(n,!0),f)try{return s(t,n)}catch(t){}if(a(t,n))return i(!o.f.call(t,n),t[n])}},function(t,n,r){var e=r(2),o=r(14),i="".split;t.exports=e((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,n,r){var e=r(5);t.exports=function(t,n){if(!e(t))return t;var r,o;if(n&&"function"==typeof(r=t.toString)&&!e(o=r.call(t)))return o;if("function"==typeof(r=t.valueOf)&&!e(o=r.call(t)))return o;if(!n&&"function"==typeof(r=t.toString)&&!e(o=r.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,n,r){var e=r(1),o=r(36),i=r(29),u=e["__core-js_shared__"]||o("__core-js_shared__",{});(t.exports=function(t,n){return u[t]||(u[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.1.3",mode:i?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,n){t.exports=!1},function(t,n,r){var e=r(55),o=r(1),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,n){return arguments.length<2?i(e[t])||i(o[t]):e[t]&&e[t][n]||o[t]&&o[t][n]}},function(t,n,r){var e=r(12).f,o=r(11),i=r(3)("toStringTag");t.exports=function(t,n,r){t&&!o(t=r?t:t.prototype,i)&&e(t,i,{configurable:!0,value:n})}},function(t,n,r){var e=r(14),o=r(3)("toStringTag"),i="Arguments"==e(function(){return arguments}());t.exports=function(t){var n,r,u;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),o))?r:i?e(n):"Object"==(u=e(n))&&"function"==typeof n.callee?"Arguments":u}},function(t,n,r){var e=r(24);t.exports=function(t,n,r){if(e(t),void 0===n)return t;switch(r){case 0:return function(){return t.call(n)};case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,o){return t.call(n,r,e,o)}}return function(){return t.apply(n,arguments)}}},function(t,n,r){"use strict";var e,o,i=r(106),u=RegExp.prototype.exec,c=String.prototype.replace,a=u,f=(e=/a/,o=/b*/g,u.call(e,"a"),u.call(o,"a"),0!==e.lastIndex||0!==o.lastIndex),s=void 0!==/()??/.exec("")[1];(f||s)&&(a=function(t){var n,r,e,o,a=this;return s&&(r=new RegExp("^"+a.source+"$(?!\\s)",i.call(a))),f&&(n=a.lastIndex),e=u.call(a,t),f&&e&&(a.lastIndex=a.global?e.index+e[0].length:n),s&&e&&e.length>1&&c.call(e[0],r,(function(){for(o=1;os;)if((c=a[s++])!=c)return!0}else for(;f>s;s++)if((t||s in a)&&a[s]===r)return t||s||0;return!t&&-1}};t.exports={includes:u(!0),indexOf:u(!1)}},function(t,n){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,n,r){var e=r(14);t.exports=Array.isArray||function(t){return"Array"==e(t)}},function(t,n,r){"use strict";var e=r(27),o=r(12),i=r(20);t.exports=function(t,n,r){var u=e(n);u in t?o.f(t,u,i(0,r)):t[u]=r}},function(t,n,r){var e=r(5),o=r(43),i=r(3)("species");t.exports=function(t,n){var r;return o(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!o(r.prototype)?e(r)&&null===(r=r[i])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===n?0:n)}},function(t,n,r){var e=r(2),o=r(3)("species");t.exports=function(t){return!e((function(){var n=[];return(n.constructor={})[o]=function(){return{foo:1}},1!==n[t](Boolean).foo}))}},function(t,n,r){var e=r(6),o=r(91),i=r(42),u=r(39),c=r(62),a=r(35),f=r(37)("IE_PROTO"),s=function(){},l=function(){var t,n=a("iframe"),r=i.length;for(n.style.display="none",c.appendChild(n),n.src=String("javascript:"),(t=n.contentWindow.document).open(),t.write("