This commit is contained in:
Nick Beckley 2026-06-01 09:55:34 +01:00
parent 0496c4d242
commit 39c72c3b38
94 changed files with 1448 additions and 135 deletions

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUTW/cRgyG/4owZ4083x+6GXaLum7qRbxIi95GQ8oWopUWo9GmgbH/PRjtBol7600g9JKchy/5RqZwQNKS2+PxlxNOeSE1ycMWEkwYygxlfM9cy03LXCO5lU7rf0hNhkf8SlpiVYw8eqQSDVIFTNNO9pECoOeMAxNalZzhZSHtGwlDA3gaIjbz8gnTMswTaclfwwTzl1I7DE0c5xWaNI/4MC05TLE08+fD3SP943a3f9pd/lpwKeJmANISMJYzNI468JYqxYB2PQiqteLIHWoX4kU2TBnTFMZmgc8/6sOcJ8yxFY2QDaPCk3NNIORQWu7Cgvuvx9LFhui+xOstvH22b+SEibSi/g7zku4mjsNNno8jnnA8hrRguonz4RAmIDU5pvmIKQ+4YdleOo4hD/NUXYvdjQNOmdTk6bnajSH3czq8Y/V8QfDwPwicMHWkJZJpaaxFJaUM3nSCIVgTjRFdDMz2nUAekWmvrOeWcekF81Ib6ywE5kuml3Huwvj7svHzgnUOmBVGoEIvlDE+MpQOe22RQTCmMy56kM4K5cDJ4EPgvkMbvYnFIB9CfB0mrB7uSUsYRwHSIe0FN1Q5CDRo6akx0vTIo7eCk5rczVMepnVel+phyviSNn6kJb+GccELudsUX4eMMa+pQP3blGK7NMMac/XDAZw1rJGMFdGaj2uuPiIMCWPGgnef1mu+/0iEEZvobk0Jp1ztQn6tfgvLa6ESXOTBl6eaGHvUDHsGLBhmAQ0YBCXAgvIKjPIsGhU6riBo3vUlQmqCxXDV5nEThWGscxSl7qgCkNQF7ymXDHqhe+fxPcfqaSy6EB1TCJJ67IEqzwP1SkoKUgcrTG+t6H9CcjUfZwUw4OmyrZcOAByC4VQorqnynlPntaWddZ3vjEMdS8+PmCYcfwL1YYhpXuY+V1fvVu/QfVyncnGqzcdfhon+u83ofo6fMVVlxmGYyoJdx3quyQHDsiY8bAerfSO7sl3VfrtbQjTKS1WT5xxSXo/XsJaN0uZ8Pp+/AQAA//8DAL7aIIL0BAAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUTW/bOBD9KwLPpkJKFEUK2IPhtFgjTWMk7u5ibxQ5jInIokFRToMi/31BWa6dooe9CaP5ePPeG/5AvdoDatDycPh0hD4OaIGim0IFKTgmHBO6JaKhvCEirymVRFT/ogVyd/CGGlQzramWgEvggJkhFW5Lq7ExICmhhhQVSz3V84CaH0i53MDRacj98BeEwfkeNehv1xv/mmYrl+vOjyYPvoN1P0TV6wTm63p1h78sN9uHzSlrgCEV586gBhleUwJcYGFkjRkjBrfWFLiqGAUqoBJKn8pcHyH0qssH83KZb3zsIeqmyIsyJ7iQ6H2BjIoqQW7VANu3Q0IxUXSb4ospPH02P9ARAmqKxZnMU7sb3bmb/dCOrjM3UYVniDaoPbz68AJH1aEFOgR/gBAdTNw8PGUXSJTkJC94QQhaoHuld66HbH2bPXRpYaUFYWBKLMEazCRVWLKyxKasVF1wW9eFRQt0B6GH7qrrvdPBD97GbKY8+zBn5fvo+tGPQ7buIzwHFU91n1U3AFqgzdh2btg9gjJvW/84pn/92KVdVmMI0Mdso+Iu+1MNO9QgqYSmSiqpFNfaQkXAEkMUJ7UBbjgYVpjaMMkMZ5JozlRLmVEVbW2KoAV6GONhjGf+v1+B2Aa334O5INhOHG86Fa0P+7WBPjrrkjTnjMlQXTdtlc09V52DPn4gGTWIUChMKQDbgnLMhFFYVaXEnJfcAtWyLuiJMOuex588EWsNK20lBG9lSwkUthaM1LYlRttSS1O1UBc1qQUIqQlpK0ZFKzUxQCtm0nbBm1HHX61QTgI9jn26zmyd1n51Pf7O2YWRTfDRa98lwVwHT29DhP3vVFv5/cEPLqb97SzttwHufZ/+zvc/czYXL328xCDdQTadHjChLVUMM2FrzLQlWIlS4lobLaTmrGUFWqBbr18gZMlgyvWTJmdPPTxly6B3LoKOY0iT/5mWOsn5+XwyFz7yr5+2Kx9geTgs5ugfx0TSqdnZAB/elW9DSt/5IW0Rw3jloyfo7BnXlZsMHE8vlUtBbowAwykuGK0wk5JiIasat7VoZcsFVPri1uwRjAug49Rve5o2E/s7Wy5DdFbpOKTb+eL15KbZnnPKryCvVPtZfRp+pdzspLkTJcmxT6d3czLQ/3o239/f3/8DAAD//wMAkF/C9ycGAAA=

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUT2/cNhDFv4rAsyjzP0XdDLtFF27qRbxog94ozigWoqUWFLVpYOx3L6jdInFvuQkDveHjb97wjUR/RNKR+9PplzPGvJCa5HErCSYMZYYyfmBtx03H2kZqYSQzf5OajE/4jXTEqhB4cEglGqQKmKa9HAIFQMcZBya0Kj3954V0b8SPDeB5DNjMy5+YlnGOpCN/jRHmr+VsPzZhmldo0jzhLi7Zx1DM/LF7eKK/3+8Pz/vrXwsuRdyMQDoCxnKGpqUtOEuVYkD7AQTVWnHkLerWh6tsjBlT9FOzwJfv58OcI+bQiUbIhlHhyKUm4LMvlnu/4OHbqbjYED2Wer2Vt8/ujZwxkU7U/8G8trsL03i3rP2EZ5xOPi2Y7sJ8PPoIpCanNJ8w5RE3LGdM/byMuRANwfq25Rxab5W20EotpAXJEFpmNThw3igziKD1AH3rrBoUCK7AoFK9JTXZwE2Tz+Mcq5v3h2nEmElNnl+q/eTzMKfjO/QvV6K7nwBabJOOSKalsRaVlNI70wuGYE0wRvTBMzv0AnlApp2yjlvGpRPMSW1sa8EzVzp98OF1jFjtHklHGEcBskU6CG6oasFTr6WjxkgzIA/OCk5q8jDHPMZ1XpdqFzN+Ttt9SUd+9dOC15vep/A6Zgx5TQXCJ1PCuE8zrCFX3wPAWcMayVgRrfm05uojwpgwZCw4Dmm99fufRBixiR7WlDDmau/za/WbX15JR5xvA/fOO+9NCANqhgMD5g2zgAYMghJgQTkFRjkWjPI9V+A174dSITXBkrdqi3gYQLlgy4oZSVWvgPa9GGiv0QYuuIbwnmP1PBWdDy1TCJI6HIAqxz11SkoKUnsrzGCtGH5AcgsLZwUw4Pm6rJsDA9AiGE6F4poq5zhtnba0t23vetOiDsXzE6aI0w+gPowhzcs85OqWteoduo9rLA9OteXu6xjpP9uMHufwBVNVZuzHWPbrNtZLTY7olzXhcXuvujeyL8tVHbZnS4hGOalq8pJ9yuvpVtayUdpcLpfLvwAAAP//AwCQDjtA8wQAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTTW/UMBD9K9Gc16ntOE6cW7UFsSrQFawAcXM8E2o1dVaOU0DV/nfk7CIoNy6WNfKbeR/jZwj2kaCD6+Px1ROFNMMGkl9LkkvNuGZcHHjbCd0JWbZtY5SSX2ED/pZ+QgeNck44Q6wiTUwhr1lfDY4hkhFcIJe1yj3ttxm6Z7C+RHryjspp/kRx9lOADj77gNP3PNv60o3TgmWcRtqFOdngMpn3u+0te3u9P9ztz69mmjO49AgdoG4EJ92yFk3DlOLI+gElq2slSLRUt9adYT4kisGO5YwPf+bjlAIl18lSViVn0sBpA2iTzZR7O9Ph5zGzWC26yfXNWl6v3TM8UYRObn6beW535UZ/9Tj3ix/x6nwmOz9klcc4HSkmT6snq8xxtMlPobhM2o6eQoIN3H0s9qNNwxQfXxj18ax/9x/yD3n6qx/klkS4nZaQoAOhBGzgnXX3PlCxu4EOuCCJVUtskEIz1aJltq4M07rSAwlnGpkx2ykkH5ZpmYtdSPQtrgKgg9d2nOlM/Tq6e5/IpSVmVV903oV9nHBxqfjjv+AlLyvOM2hJxyUVHwh9JJco6zvE5dLvH4jUcgVtlxgppGJv033xxs730IGxrRPWWGOtdm6gmtPAkVvNGySNmlBJbFAZhVoZ7rSyvVBoa9EPuQIboBx3sW6YrlBKRQ0joxumGj0w2/Ka1a6ukUvVV3J44WNxN2acdS1XhBUzNCBTRlhmVFUxrGrbSD00zYr7bcklfcGzwUhP579yZoDYEmrBpBI1U8YI1pq6YX3T9qbXLdUuc76lGGj8y6h33sVpnoZUXJaneGHdhyXk/16si/TdB/Zjzehmcg8Ui5yx9SGv9yXW0+l0+gUAAP//AwB3KvwmNgQAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRU0W7cKBT9Fes+GwcwxuC3aNJqR9luRu2oW/UNw3WD4uAR4LRRlH9f4ZlVmqfVviB0zbmce87BLxDMI8IA16fThycMOUEN2W8lTrkkVBLKjlQNTA6MN0p1fU/pd6jB3+IzDNALa5nVSFqUSISjHRnbyRLnUDPKHOWdKD3NjwTDCxjfOHzyFpslfcWY/BJggL99cMvPcrfxjZ2X1TVxmXEfUjbBFjJ/7Xe35M/rw/HucD6VMBVw4x0M4GTPKEpFlNM9EYI6Mk6Ok64TDJnCThl7hvmQMQYzN8k9vN3vlhww24E3vG0o4Rpea3Amm0J5NAmPz6fCYpPoptTrrbxthxd4wggDr/8V89zuys7+6jGNq5/d1XnNJj2kbZ2MzUt8hhpOcTlhzB43fa5Twsdxfj6a9PDxfKZs04dfaNeMbresIcMArFVQwybQPJvsl1BdOO5mjyFvH3P0IXn7X71aqOHuS3WYTZ6W+PjOjy9nmff/Q+VPxt77gNX+BgagDLlrFZKJM0mEcoaYrtVEylZOyKzuOYMadkvIPqzLmqp9yPgjbiPBAB/NnPDM7zrae5/R5jWWOb/JkqtDXNxqc/XmJaMNbVpKC2jNpzVXn9H5iDZjGeIY10u/r+8hXPINtFtjxJCrg8n31R8m3cMA2ijLjDbaGGnthB3FiTpqJO0dSifRCe56J7RwUmhqpTAjE850bJxKBWrAEp1qS6swlis9dURaPRJh+o6M1o5komPPuFLj1BYibzpWd3PBGauoQNcSjZMjQjNDtGhb4trO9FxOfc+n3yS55IHRIrDDp/O72xhI5xQ6yQgXrCNCa0aU7noy9mrUo1TY2cL5FmPA+TehPnkbl7RMubokpHon3ec1lH9HtaXlpw/k1+bRzWIfMFbFY+NDeSoXW19fX1//AQAA//8DAIIp/ySCBAAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUTW/jNhD9KwKvFRWSoihSt9TJokaaxFgbbdHbiBzFbGTKoKhkF0H+eyE52XwsCvQiCEPOvMc3b+aJBDggacj58Xj5gCGNJCfJLyHBhKJMUcZ3TDdcNVwU2rBSK/E3yYm/wu+kIbW0lluDtESFVDpW0bbsLHUODWfcMVHJuSbcjaR5IuALhw/eYjGMf2Ac/RBIQ/70wQ2PMzb4wvbD5Io49LgOY4JgZzI369UV/f18s7vdnG6NOM7JhXekIU7VnKHSVDtTUymZo23nBK0qyZFrrDTYU5oPCWOAvhjd/Ru+G1LAZBtRiLJgVBjynBMHCWbKLYy4+36cWSwSXczxfAkvv80TecBIGpG/inkqd2Z7f3YY28n37mz5kpwc43DEmDwuatxuszcSnBWsEEowRnJyDXbvA2bri+y2n58IVjOJrqQGO0el4UCNLEvqygpqobq6Fh3JyRXGgP27qtfexmEcupS9iJx9wNmery4DtD3OGF+gH5HkZD1uEwQH/RDw8hvaKZ1q7eI0H6+GkHyYhmnM1iHhXYSX89f81RQjhpRtIO2z32Dck4YY0JaDAQOgrO2wYtgxx0Cx2qFyCp0UrnbSSKekYVZJaLl0UPG2myMkJ7/OGm4na3Ec39gsJun7hUP20qdV7zGkDzKShjCOwpUaaSe4olI7oFCVhipVqg65NbXgrzA7iHeYSEM63bYts7YV0nALwkDpOlY61Rkh6hpkV1a1FEpVrAbr6lpw6coaLZRdybQgOdnEwU02fW51uTRgE4d/0KZZKtIQxapKW2hboSTXYDRKrqRWBmsjO2CytC3wSkPbcgYVs0YLC1wZkK2ruh8qXYY7H/DCj8cevr/D1YUqyl8sgOYdyE/Xv0Q44OMQ729ONi5uLnckJ1+nMG+EbD1b5NEH+k3NE3099cnv9hHBobseHP7sI5zHJVsmlAkUlbSKMqcZlSUqCpZz2iFjqmSWt3bOuBjsPcZsdhj4ME/Vj2K32+w82r1PaNMUZ35/LTxut9mmh9QN8fBhk7x72GcBClFyNnfG4cNpGy0clXManeJUSF5RaQyn2lQ1bWvdmlZprOys2O2UjlPKvqLzEW1aXvzixQVztUd7/7MYry54sShns9e2py22SPu/lthzTg4I4xTxsGzr5omsQ8C4IF9Mp1Fch2vf935EOwQ3kkZWghVcK/XC8L/vKVMwWern5+fnfwEAAP//AwAzeLKQGwYAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTwY7cKBD9FYuz8QDGGHwb9ewqrUl2WskoWe0NU+U0igdaGE8SjfrfV7g7Sia33NCDV/XqveKFBPuEZCC3p9NfzxjyQmqS/QYJJhRlijL+yPTA1cBFo7XRSvL/SE38PX4nA+mlc9wZpC0qpBJYR8d2chQADWccmOhkqWk/L2R4IdY3gM/eYROXj5gWHwMZyCcfIH4tva1v3BxXaFKccR+WbIMrYv7Z7+7p29vD48Ph8mrBpZAbD2QgoHrOUGmqwfRUSgZ0nEDQrpMcucZOW3eh+ZAxBTs3C3z52R9iDpjdIBrRNowKQ841AZttkTzaBR+/n4qKzaK7gtcbvB2HF/KMiQyi/mHmpdyNm/2Ni09PNsDN5INfjqQmpxRPmLLHzY5twnm22cdQXZvsZo8hk5o8fKgOs81TTE+vPPpwGX3/B5O/s+7oA1b7OzIQxlFAq5FOgisqNVhqu9ZQpVo1IXemF5zUZBdD9mGN61LtQ8bPaVNJBvK3nRe86LtN7ugzurymIv1fVbLGbz7vIhSAkZocUoTV5eqn3Zw1rGlZuXxY82nN1XsEn9BlLDM9pvVa/jeKUGIj7daUMOTqYPOxemOXIxmIsdpxa6yxVjk3YcdwYsCsYj2gAoUgBfQgjQQlDXNK2pFLsB0fp4IU3SXdaluo3ox25I5RbSZDpQSguuOacrBWt1b0QohXtlYPc+FZp5lEaKnBCag03FIj25ZC29leqKnvxfSLJdfEOSt+Az5fvsamQAFoBMWpkLyj0hhOtel6OvZ6NKPS2Lmi+R5TwPkXo955l+ISp1xdF6Z6Zd37NZTvXW3L89UH+m2L7C66L5iqErn1oWzzNeXz+Xz+HwAA//8DAFXn8oElBAAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUTW/cNhCG/4rAsyjzS6Som2G3qOumXsSLtOhtxBnZQrTSgqI2DYz97wG1GyTurTdhoHdm+Mw788YmOBBr2e3x+MuJprSwkqVhCymhLBeWC7kXTStda1RVW1tL3/zDSjY80lfWMmdCkMET12SJGxQ173QfOCJ5KSQKVZucE14W1r4xGCqk0xCompdPFJdhnljL/homnL/k2jBUYZxXrOI80sO0JJhCbubPh7tH/sftbv+0u/y10JLF1YCsZYRW9p0Q3AVCbpoOOGCN3IL2tledsK67yIYpUZxgrBb8/KM+zmmiFFpVKV0Jrjw7lwwhQW65g4X2X4+5iw3RfY6XW3j7bN/YiSJrVfkd5iXdTRiHmzQfRzrReIS4ULwJ8+EAE7KSHeN8pJgG2rBsLx1HSMM8Fddid+NAU2Ile3oudiOkfo6Hd6yeLwge/geBE8WOtUyLWlvnyGitwdtOCUJng7WqCyBc3ymSgUTtjfPSCam9El7X1jUOQfjASvYyzh2Mvy8bP69E16Bwyioy5JWx1gdBuqG+diQQrO1sEzzqxinTYKPBA0jfkQvehmyQDxBeh4mKh3vWMiFJoW6I90pabhoEDrX23Fpte5LBOyVZye7mKQ3TOq9L8TAleokbP9ayX2Fc6ELuNobXIVFIa8xQ/7a52C7OuIZU/HCAFJWotBBZtKbjmoqPhEOkkCjj3cf1mu8/EmXVJrpbY6QpFTtIr8VvsLxmKtAECT4/1YbQUy2oFyjACodk0RIahQ6NN2iNF8Ea6KRBqGXX5wgrGWXDFZvHmxCEbJTg2iJcF42k4gGdlb3uAIJ/x7F4GrMOQiMMoeaeeuTGS+DeaM1R1+CU7Z1T/U9IruaTIgNGOl22devAIjbZZ1wZWXPjveSNrx3vXNP5zjZUbx08Upxo/AnUhyHEeZn7VFy9W7xD93Gd8sUpNh9/GSb+7zaj+zl8pljkGcMw5QW7jvVcsgPBskY6bAerfWO7vF3Ffrtbqq5qqWTJnhPEtB6vYV1XWtTyfD6fvwEAAP//AwB9Sf0i9QQAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUT2/cNhDFv4rAsyjzP0XdDLtFDTfNIjbaorcRZxQL0UoLito0MPzdC2q3SNxbb8JAb/j4mzd8ZTMciXXs9nT66UxzXlnN8riXlFCOC8eFfBZtJ31nVOOEFcGqv1jNxkf6xjrmTYwyBuKaHHGDwvJeD5EjUpBColDWlJ7weWXdK4OxQTqPkZpl/Z3SOi4z69gf44zL13I2jE2clg2btEz0MK8Z5ljM/PZw98h/vT08fzxc/lppLeJmRNYxQieHXgjuIyE3bQ8c0CJ3oIMbVC+c7y+ycc6UZpiaFb98Px+XPFOOnWqUbgRXgb3VDCFDsdzDSs/fTsXFjui+1Ou9vH92r+xMiXWq/hfmpd1NnMabdesnOtN0grRSuonL8Qgzspqd0nKilEfasZwp9cs65kI0Rg9tKyW24I312GqrtEctCFvhLQYM4IwbVLR2wL4N3gwGlTToyJjes5rt4KYJ8rjM1dX73TTSnFnNPj5VhwnysKTjO/RPF6IP/wNosc06poXVznsyWmsIrleC0LvonOojCD/0imQkYYPxQXohdVAiaOt86xFEiKxmHyC+jDNVD/esY0KSQt0SH5R03LQIHKwO3DntBpIxeCVZze6WOY/ztmxr9TBn+pz2+7KO/QzTSpeb3qb4MmaKeUsFwp+uhPGQFtxirr4HQIpGNFqIItryacvVJ8IxUcxUcDyn7drvPxLl1C6621KiOVcHyC/VL7C+sI4FaKOEAAHAxTiQFTQIFOCER3LoCI1CjyYYdCaI6Az00iBY2Q+lwmpGJW/VHvFBOhVBIxcGFDfDQLwV0vAgWgAysoc+vONYfZyKDmIrDKHmgQbkJkjgwWjNUVvwyg3eq+EHJNewSFEAI50vy7o7cIhtyQVXRlpuQpC8Ddbz3rd96F1LNhYHj5Rmmn4A9WGMaVmXIVfXrFXv0H3a5vLgVHvuvo4z/3uf0f0Sv1CqyoxhnMt+Xcf6VrMjwbolOu7vVffKDmW5quf92VK2sVLJmj1lSHk7XcvaNlpY+fb29vYPAAAA//8DAGVfs2P0BAAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUTW/jNhCG/4rAs6iQFEV93FKnixrZbIyNuy16G5Ejh4hMGhSVbRD4vy8oO4izix56E0Z85+OZl3wlDvZIOnJ9OPz+jC5OJCfRLiHBhKJMUca3rOl43UlRqFJWrOH/kJzYW3whHaml1ly3SEtUSKVhFe3LQVNjsOWMGyYqmXLCbiLdKwFbGHy2Ggs/fcMwWe9IR/6yzvjvqTbYQo9+NkXwI67dFMHp1MyX9eqWfr7ebO83p1MTTklcWEM6gkbxoWeM1hoNlU0PFExlqIKyVYPomar7k8y6iMHBWEzm6b2+8dFh1J0oRFkwKlpyzImBCKnlHibcvhxSFwuimxTPl/Dy2b2SZwykE/kbzFO6Kz3aq/3Uz3Y0V6Pf7azbrbwb7G4OEFPhnByCP2CIFhc4v1kH4eWz3+1SPvIJxglJTrYY9tbBePpxgwPMY3zwc1jITObpv86QjsAcPcnJQnIcl7LZeZjVaNHFX7QXhe8fss0IcfBh/2FJDyf26/+B/g70o3WYrW9IRxhHYcoG6SC4orIxQKEqW6pUqQbkuq0FJzlZeRetm/08ZWsXcXem9qG/66AfbUQd55Bm+lsls22CN7OO2fuCOStYUTKWRHM8zDH7isYG1BHTENswn/P9JBFKLKJPdsRf8KzmENDFbAPxMfsDpkfSkRYazaGFFkBpPWDFcGCGgWK1QWUUGilMbWQrjZIt00pCz6WBivdDipCcYDJZtvi6VVojlDWtS5HgNoL2VWOo4IzLpi4la4YPcLP7MelAN0yiKWmLg6Gy5UBbWZbUlBXUQg11LYYLTmdDcJaoX5rwzwnN2UtfTtZ+m93g8+keL30qY5pkBCokr6hsW06btqppXzd926sGK50mW3k3+TeQ3zD0frIxPSJ31tk9jD8fed/MLQaH48V27qwOfvJDzM62zD7s6+vs0iuWLRb9bh39dzHGjddPGLJkLLDuYpnH4/H4AwAA//8DAPdjXrgMBQAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUwW7bOBD9FYFnUSElihIF7MFwWqyRpjESd3exN4ocxkRk0aAop0GRf19Qkmun6GFvwogz8+a9N/MD9fIAqEGr4/HTCfowoBQFO4VyknNMOCZ0R+qGVg0rMkIKQqv6X5QiewdvqEEVU4oqAbgADphpUuK2MAprDYISqkleslhTPg+o+YGkzTScrILMDX+BH6zrUYP+tr12r7G3tJnq3Kgz7zrY9EOQvYpgvm7Wd/jLart72M6vBhhicmY1ahBoTk1LCK4UaMzqVmKpS425LAQ3eUt41c5ptg/ge9llg3659Ncu9BBUk2d5kRGcC/SeIi2DjJBbOcDu7RhRTBTdxng6hafP5gc6gUdNnp7JnMvdqM7eHIZ2tJ2+CdI/QzBeHuDV+Rc4yQ6l6OjdEXywMHHz8JRcIFGSkSznOSEoRfdS7W0PyeY2eejiwFLVhIEusACjMRNUYsGKAuuilFXOTVXlBqXoDnwP3VXVe6u8G5wJyUJ58qHP2vXB9qMbh2TTB3j2Msx5n2U3AErRdmw7O+wfQeq3nXsc479+7OIs69F76EOylWGf/CmHPWqQkLWiUkghJVfKQEnAEE0kJ5UGrjlolutKM8E0Z4IozmRLmZYlbU2MoBQ9jOE4hjP/369A7Lw9HEBfEOwmjredDMb5w0ZDH6yxUZrzi8lQXTdNlSw1152FPnwgGTWIUMh1UQM2OeWY1VpiWRYCc15wA1SJKqczYcY+jz95IsZoVpiyrnkrWkogN1XNSGVaopUplNBlC1VekaqGWihC2pLRuhWKaKAl03E67/Sowq9WKCaBHsc+bmeyiWO/2h5/5+zCyNa74JTromC2g6e3IcDhd6qt3eHoBhvi/GaR9tsA966Pf5f9XzhbklcuXGIQ9yCZVq+VUAsiWqyKimHGCo5bCQTzStVEVXmeG4VSdOvUC/gkGkzaftLk7KmHp2Tl1d4GUGH0sfM/01CznJ/PK3PhI/v6abd2HlbHY7pE/zhFkuZiZwN8uCvfhvh874Y4RfDjlY+eoDNnXFdu0nCaL5WNQa51Ha8MzhktMROC4lqUFW6ruhUtr6FUF7cmj6CtBxWmeru520Ls72y58sEaqcIQd+eLU5ObFnsuT34FeaXaz+y5+ZVyi5OWSpRExz7Nd3My0P86m+/v7+//AQAA//8DACUyB6cnBgAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTTW/cNhD9KwLPS5mkKFLUzVin6MJNvUgWbdHbiDOKCcvUgqKcBIb/e0HtFk5664UgBnwz72P4yiI8E+vZ7fn84YViXtiO5bCVlFCGC8OFPImul7bXtm6dUMq6v9mOhXv6znpmtffSO+INGeIaRcuHZvQckZwUEoVqdekJXxbWvzIINdJL8FTPyx+UljBH1rM/Q8T5a5kNofbTvGKd5okOcckQfSHz+2F/z3+7PZ4ejpdXCy0FXAdkPSM0chyE4NYTct0NwAFb5AYaZ0Y1CGOHCyzETCnCVC/49D4f5xwp+17VqqkFV4697RhChkJ5gIVO38+FxWbRXanvtvJ27V/ZCyXWq92/Zl7a3fgp3DwvwxomvLmcGZanovKc5jOlHGjzZJM5TZDDHKvrpP0UKGa2Yw+fq+MEeZzT809Gfb7oP/wP+acy/cM38msm3M9rzKxnUku2Yx/BP4ZI1eGO9UxIUth0xEclDdcdAoe2cdyYxowkvbOqYPZzzCGu87pUh5jpS9oEsJ79AtNCF+q3yT+GTD6vqaj6y5RdOKYZV5+rd/+lqEXdCFFAaz6vufpEGBL5TEXfKa3Xfv+BKKM20H5NiWKujpAfq19heWQ9c9B5CQ4cgPF+pFbQKFCAERbJoCHUCi1qp9FoJ7zRMEiN0MphLBW2Y1TirrYNE9ZJbTvLSUnHNYLlTg3ArTWeCIVzWIi8+1g9TAUHvhOasOGORuTaSeBONw3HpgWrzGitGn+w5Jq+FMVgpJfLX9kYGMSuBM2Vli3XzkneudbywXaDG0xHrS+c7ylFmn4w6mPwaV7mMVfX5al+su7TGst/r7ZF+hoi/7ZldDf7J0pVyRhCLOt9jfXt7e3tHwAAAP//AwDJ0IwBNgQAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTwW7bOBD9FYFnUSEpihJ1C5xd1Ei7MdqgXextxBnVRBXKoKi0ReB/X1B20aa33ohHvpk37w1fWIAnYj27PZ3+eqaQFlay5DdICWW4MFzIR9H1su11WzVWdVqJ/1jJ/D19Zz1rtXPSWeI1GeIaRcOHenQckawUEoVqdK4JnxfWvzDwFdKzd1TNy0eKi58D69knH3D+mnuDr9w0r1jFeaJ9WBIEl8X8s9/d87e3h8eHw+XVQksmVx5ZzwiNHAcheOsIue4G4IANcgO1NaMahGmHC82HRDHAVC345Wd/nFOg5HpVqboSXFl2LhlCgix5gIUev5+yis2iu4yXG7wd+xf2TJH1qvxh5qXcjZv8jZufniDgzeiDX46sZKc4nygmT5sd24TTBMnPobg22U2eQmIle/hQHCZI4xyfXnn04TL6/g8mfwfu6AMV+zvWMyFJYd0RH5U0XHcIHJracmNqM5J0tlWSlWw3h+TDOq9LsQ+JPsdNJevZ3zAtdNF3G93RJ3JpjVn6vyZnTd982s2YAcFKdogzri4VP+2WohJVLfLlw5pOayreE/pILlGe6TGu1/K/UZRRG2m3xkghFQdIx+INLEfWMwudk2DBAhjnRmoEjQIFGNEiGTSEWmGL2mo02gpnNAxSIzRyGDOSded0i22hwOihHYThjRuA604PHFqpuTbWNZ3WtZXqla3Fw7TxXCc0Yc0tjci1lcCtrmuOdQOtMmPbqvEXS66JS5H9Rnq+fI1NgUHscrhcadlwba3knW1aPrTdYAfTUeOy5nuKgaZfjHrnXZyXeUzFdWGKV9a9X0P+3sW2PF994N+2yO5m94VikSMHH/I2X1M+n8/n/wEAAP//AwA4KzhMJQQAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRUwW7cNhD9FYFnUSYlihJ1M9YJunBTL5JFGuQ24oxiwjK1ICknhuF/L6jdwvGp6IUgRnzDN+896oV5eCQ2sOvT6cMT+RRZyZLbSrWoNReaC3kU/SC7QXVV23ddI8V3VjJ3S89sYJ2yVlpDvCFNXKFo+dhMliOSkUKiqFuVe8KPyIYXBq5CenKWqiV+pRDd4tnA/nYel5/5bnCVnZcVq7DMtPcxgbeZzF/73S3/8/pwvDucT0WKGVw5ZAMj1HIaheCdJeSqH4EDtsg1NEZP9Sh0N55hzicKHuYq4sPb/bgkT8kOdVU3leC1Ya8lQ0iQKY8Q6fh8yiw2iW5yvdzK23Z4YU8U2FCX/4p5bndlZ3f1GMfVzXh1XhPEh7itE9i0hGdWslNYThSSo02f6xjpcZyfjxAfPp7P5G388Ivsmgh3y+oTG5hselayTaB5huQWX1w47mZHPm0fU3A+OvtfvRpWsrsvxWGGNC3h8Z0fX84y7/+Hyp/A3jtPxf6GDUxIqrHpiU+11Fz1CBzaxnCtGz2RtKarJSvZbvHJ+XVZY7H3iX6EbSQ2sI8wRzrzuw723iWyaQ15zm865+oQFlxtKt68lKISVSNEBq3ptKbiM6ELZBPlIY5hvfT7+h5S63oD7dYQyKfiAOm++APiPRuYgd5KMGAAtLUTtYImgQK06JA0akJVY4fKKNTKCKsVjFIhtHKccoWVjHJ0ii2tPUHb2ElzM0rJVYcNH7EGjgCd0FMPasyjvelY3M0ZB7YXirDhhibkykjgRjUNx6aFrtZT19XTb5Jc8iBFFhjp6fzuNgYasc9u8lrJlitjJO9N2/Gx60cz6p5amznfUvA0/ybUJ2fDEpcpFZeEFO+k+7z6/O8otrT8dJ7/2jy6WewDhSJ7DM7np3Kx9fX19fUfAAAA//8DALXdmSSCBAAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUTW/cNhCG/4rAsyjzS/zQzbBb1HVTL+JFWvQ2JEe2EK20oKhNA2P/e0DtBol7600YaGZePvPOvJEJDkg6cns8/nLCKS+kJnnYQoIJTZmmjO+Z7bjtmGu4MIIr8Q+pyfCIX0lHjAqBB4dUokaqImupl32gMaLjjEcmWlVqwstCujcCQxPxNARs5uUTpmWYJ9KRv4Ypzl9KbxiaMM5rbNI84sO0ZJhCEfPnw90j/eN2t3/aXf5acCnJzRCLVO0db7mngclNRE8dj0CjaNtoZKtAi0vaMGVME4zNEj//6B/nPGEOnWiEbBgVjpxrEiFDkexhwf3XY1GxIbov8XoLb5/dGzlhIp2ov8O8lLsJ43CT5+OIJxyPkBZMN2E+HGCKpCbHNB8x5QE3LNtLxxHyME/VtdndOOCUSU2enqvdCLmf0+Edq+cLgof/QeCEyZOOSNZKbQwqKSU47QXDaHTQWvgAzPReIA/IWqeM44Zx6QRzstXGmgjMBVKTl3H2MP6+bPycYN5GZoQWqNAJpbULDKXFvjXIImjttQ0uSmuEstFKcADceTTB6VAM8gHC6zBh9XBPOsI4iigt0l5wTZWNQKGVjmotdY88OCM4qcndPOVhWud1qR6mjC9p40c68iuMC17I3abwOmQMeU0F6t+6NNulOa4hVz8cwFnDGslYSVrzcc3VR4xDwpCx4N2n9VrvPylCiy3pbk0Jp1ztIL9Wv8HyWqiADRxceaoOoceWYc8iA81MRB01RiWiicqpqJVjQSvwXEVoue9LhNQEi+GqzeMWTBDSSSrAOKo0s9QLj9RLq4D3HgK851g9jSUPgmUKo6QO+0iV40CdkpJG2YIRujdG9D8huZqPswI44umyrZsCHaPFqDkVirdUOcepda2h3ljvvLbYhqL5EdOE40+gPgwhzcvc5+rq3eoduo/rVC5Otfn4yzDRf7cZ3c/hM6aqzBiGqSzYdaznmhwQljXhYTtY3RvZle2q9tvdErwxzLqaPGdIeT1ew1I0znB1Pp/P3wAAAP//AwCSsevS9QQAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUTW/bOBD9KwLPokJS1AcF7MFwWqyRpjESd3exN4ocxkRk0aAop0GR/76gJNdO0cPehNF8vHnvDX+gXh4ANWh1PH46QR8GlKJgpxAjrMSkxITuSN3QuiEiK6goRFX/i1Jk7+ANNajiSlElAOdQAuaaFLjNjcJag6CEasIKHnvK5wE1P5C0mYaTVZC54S/wg3U9atDfttfuNc6WNlOdG3XmXQebfgiyVxHM1836Dn9ZbXcP2zlrgCEWZ1ZHqGUraEFbrEg+gTBYUC2xZkWhq7zgsmRzme0D+F522aBfLvO1Cz0E1bCM5RnBTKD3FGkZZITcygF2b8eIYqLoNsbTKTx9Nj/QCTxqWHomc253ozp7cxja0Xb6Jkj/DMF4eYBX51/gJDuUoqN3R/DBwsTNw1NygURJRjJWMkJQiu6l2tseks1t8tDFhaWqCQedYwFGYy6oxILnOdZ5IStWmqpiBqXoDnwP3VXXe6u8G5wJyUJ58mHO2vXB9qMbh2TTB3j2Msx1n2U3AErRdmw7O+wfQeq3nXsc479+7OIu69F76EOylWGf/CmHPWqQkLWiUkghZamUgYKAIZrIklQaSl2C5kxXmguuSy6IKrlsKdeyoK2JEZSihzEcx3Dm//sViJ23hwPoC4LdxPG2k8E4f9ho6IM1NkpzzpgM1XXTVsnSc91Z6MMHklGDCAWm8xqwYbTEvNYSyyIXuCzz0gBVomJ0JszY5/EnT8QYzXNT1HXZipYSYKaqOalMS7QyuRK6aKFiFalqqIUipC04rVuhiAZacB23806PKvxqhXwS6HHs43Umm7j2q+3x95JfGNl6F5xyXRTMdvD0NgQ4/E61tTsc3WBD3N8s0n4b4N718e9y/wtnS/HKhUsM4h0k0+mpvFVVWzGsas4xb3OBhWoZrkUlWKFl3kK8llunXsAn0WDS9pMmZ089PCUrr/Y2gAqjj5P/mZaa5fx8PpkLH9nXT7u187A6HtMl+scpkjQ3Oxvgw7vybYjpezfELYIfr3z0BJ0547pyk4bT/FLZGCy1rkGXFDNOC8yFoLgWRYXbqm5FW9ZQqItbk0fQ1oMKU7/dPG0h9ne2XPlgjVRhiLfzxanJTYs9l5RfQV6p9rN6Hn6l3OKkpRMl0bFP87s5Geh/PZvv7+/v/wEAAP//AwB74N4kJwYAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRUwW7jNhD9FYFnUSEpiRJ1S50uamSzMTbutuiN4owcIjJpUFS2QeB/X1B2EGcXPfQmjPhm3rz3yFfi9B5JR64Ph9+f0cWJ5CTapSSYkJRJyviWtR1vO6YK3taKSf4PyYm9xRfSkaYyhhuFtESJtAJW074cDAVAxRkHJuoq9dS7iXSvRNsC8NkaLPz0DcNkvSMd+cs68N/TbG0LM/oZiuBHXLspamcSmS/r1S39fL3Z3m9OpyacEriwkKjKXvGa99SwciExUMVBUxB1DU1ZV1qKE8y6iMHpsZjg6X0++Ogwmk4UoiwYFYoccwI66kS51xNuXw6JxSLRTarnS3n57F7JMwbSifxNzFO7KzPaq/3Uz3aEq9HvdtbtVt4NdjcHHdPgnByCP2CIFhdxfrNOh5fPfrdL/cgnPU5IcrLFsLdOj6cfNzjoeYwPfg6LMhM8/dcZ0hE9R09ysig5jsvY7LzMarTo4i/Yi8H3D9lm1HHwYf/BpIeT9uv/If2dNo/WYba+IR1hHAWULdJBcEmrFjTVdamolKUckBvVCE5ysvIuWjf7ecrWLuLurNoHftfBPNqIJs4h7fS3TGHbBA+zidm7wZwVrCgZS6A5HuaYfUWwAU3EtMQ2zOd+P0GEFAvokx3xF3lWcwjoYrbR8TH7Q0+PpCNKt4ZrpZXW0pgBa4YDA6YlawAlSIRKQAOVqkBWihlZ6Z5XoGveD6lCcoIpZNmS6x5kDQicctn0tBJoaN8C0KrhopRSaibhg7jZ/Zhw2rSsQiipwgFopbimqipLCmWtGyGHphHDhU7nQHCWVL8M4Z8TwjlLX07Rftsd8Pl0jxeeEqBFkJyKite0UorTVtUN7Zu2V71ssTZps5V3k38T8huG3k82pkfkzjq71+PPR96ducXgcLxw586a4Cc/xOwcy+yDX19nl16xbInod+vov0swbrx5wpClYGnrLsw8Ho/HHwAAAP//AwAfRIPiDAUAAA==

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUT2/cNhDFv4rAsyjzP0XdDLtFDTfNIjbaorcRZxQL0UoLito0MPzdC2q3SNxbb8JAb/j4mzd8ZTMciXXs9nT66UxzXlnN8riXlFCOC8eFfBZtJ9tOhEY65Vtl/2I1Gx/pG+uYNzHKGIhrcsQNCst7PUSOSEEKiUJZU3rC55V1rwzGBuk8RmqW9XdK67jMrGN/jDMuX8vZMDZxWjZs0jLRw7xmmGMx89vD3SP/9fbw/PFw+WultYibEYtV1wdpZc+j0LuJgQeJwFFZi15bA05dZOOcKc0wNSt++X4+LnmmHDvVKN0IrgJ7qxlChmK5h5Wev52Kix3RfanXe3n/7F7ZmRLrVP0vzEu7mziNN+vWT3Sm6QRppXQTl+MRZmQ1O6XlRCmPtGM5U+qXdcyFaIwe2lZKbMEb67HVVmmPWhC2wlsMGMAZN6ho7YB9G7wZDCpp0JExvWc128FNE+Rxmaur97tppDmzmn18qg4T5GFJx3fony5EH/4H0GKbdUwLq533ZLTWEFyvBKF30TnVRxB+6BXJSMIG44P0QuqgRNDW+dYjiBBZzT5AfBlnqh7uWceEJIW6JT4o6bhpEThYHbhz2g0kY/BKsprdLXMe523Z1uphzvQ57fdlHfsZppUuN71N8WXMFPOWCoQ/XQnjIS24xVx9D4AUjWi0EEW05dOWq0+EY6KYqeB4Ttu1338kyqlddLelRHOuDpBfql9gfWEdC9BGCQECgItxICtoECjACY/k0BEahR5NMOhMENEZ6KVBsLIfSoXVjEreqj3iAFZI0Ja3WgE3PiIPLbW8d857EBCGIN5xrD5Ouy62whBqHmhAboIEHozWHLUFr9zgvRp+QHINixQFMNL5sqy7A4fYEjrJlZGWmxAkb4P1vPdtH3rXko3F8yOlmaYfQH0YY1rWZcjVNWvVO3Sftrk8ONWeu6/jzP/eZ3S/xC+UqjJjGOeyX9exvtXsSLBuiY77e9W9skNZrup5f7aUbLxoQ82eMqS8na5lrZrgpXl7e3v7BwAA//8DAEKX/830BAAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRUTW/cNhT8KwLPoswvUaJuxjpBF27qRbJIi94ovqeYsEwtSMqJYex/L6jdIvGp6IUgnjiP82aGeiPBPiMZyO3p9OEFQ06kJtlvJcGEpkxTxo+sH3g/cNVwKbTu+d+kJv4eX8lAOuUcdwapRI1UAWvpKCdHAdBwxoGJVpWe9lsiwxuxvgF88Q6bJX3FmPwSyED+9AGW7+Vu6xs3Lys0cZlxH1K2wRUyf+x39/T328Px4XA5lTAVcOOhUNWj4S0fqWNyIzFRw8FSEG0LnWyV1eIC8yFjDHZuEjz9vB+WHDC7QTRCNowKQ841AZttoTzahMfXU2GxSXRX6vVW3rbDG3nBSAZR/yvmpd2Nm/3NcxpXP8PNZc02PaVtnazLS3wlNTnF5YQxe9z0uU0Jn8f59WjT08fLmbJNH36gWzPCbllDJgPhsic12QSaZ5v9Eqorx93sMeTtY44+JO/+q5ckNXn4Uh1mm6clPr/z48tF5v3/UPmTdY8+YLW/IwNhHAXIHukkuKaqB0ttKw3VWuoJuTOd4KQmuyVkH9ZlTdU+ZPwWt5HIQD7aOeGF3210jz6jy2ssc/6lS64OcYHV5eqnl5w1rJGMFdCaT2uuPiP4iC5jGeIY12u/r+8hQosNtFtjxJCrg82P1W82PZKBGNs7bo011mrnJmwZTgyY1awD1KARlIAOlFGglWFOKztyBbbl41QqpCZYolNtaUXrWsU6R+XYS6qMsrR3XNBOShBGtcClfqdj9TAXnHU9UwiSGpyAKsMtNUpKCrK1ndBT14npF0mueeCsCAz4cnl3GwMN0CNoToXiLVXGcNqbtqNj149m1D22rnC+xxhw/kWoT97FJS1Trq4Jqd5J93kN5d9RbWn57gP9sXl0t7gnjFXx2PpQnsrV1vP5fP4HAAD//wMAGpaA+4IEAAA=

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUTW/cNhD9KwKvXcr8Einq5toOunAdG9lFW/Q2Ikc2a5laUJSTwPB/L6i1EztBgV4EYUjOe/PmzTyRCA9IOnJ6OFw8Yswz2ZAc1pBgQlOmKeN71na87biquWwbpfTfZEPCJX4lHTHKOe4sUokaqfKsob0cHPUeLWfcM9GokhNuZ9I9EQi1x8fgsJ7mPzDNYYqkI3+G6KfPBRtC7cZp8XWaRtzGOUN0hczH7dkl/f30Zn99c7w141we18EXqrq3vOE9dUyuJAZquQfqRdN4IxsFWhyfhZgxRRjr2d9/x/dTjphdJ2oha0aFJc8b4iFDodzDjPuvh8Jilei8xDdreP3tnsgjJtKJzauYx3QnbgwnD3O/hNGfrF+yIYc0HTDlgKsa17vqOwnOalYLLRgjG3IF7i5ErLbn1fVYSgTXMoVeUouDp8pyoFZJSb1swAg9GCMGsiGXmCKOb7JeBZemeRpy9SJy9Q5nd3p2EaEfsWB8gHFGsiHbeZchehiniBdf0C35mGuflnJ8NsUc4jItc7WNGW8TvJy/vj9bUsKYqxvId9VvMN+RjlhoHQcLFkA7N2DDcGCegWbGo/YavRLeeGWV18oypxX0XHloeD+UCNmQX4uGu8U5nOfvbFaTjOPKoXrp09kYMOZ3MpKOMI7CyxbpILimqvVAoZGWai31gNxZI/grzB7SLWbSkaHt+5451wtluQNhQfqBSa8HK4QxoAbZGCW0bpgB540RXHlp0IEcJGuL7W7S5BeXf2y1XBtwk6Z/0OUiFemIZk3TOuh7oRVvwbaouFattmisGoAp6XrgTQt9zxk0zNlWOODagup9M3xT6SLehojnYT6M8PUNblvrWv7iAFo+gPrh+ocED/h5SvcfjzauP17syYZ8WmLZCNW2WORziPSLLhN9tYw57O8Sgkd/NXn82UdYxqVaJ9QraZVhjlpjkCrrOO0lADUWemNK0UMZqvPJ3WOqisMgxDJV35Jd76rT5O5CRpeXVPj9tfK43lU3I+RhSg/vNsmbwn4UoBaSs9IZj4/HbbRy1N636DWnQvGGKms5bW1jaG/a3va6xcYVxa6XfFhy9Ql9SOjyWvGLF1fMszt09z+L8eqCF4tyVry2O26xVdr/tcSeN+QBYV4SPqzbunsi2xgxrcjny3EUt/EqjGOY0U3Rz6RTVrNaq0a+MPyvew1jpm6sFM/Pz8//AgAA//8DAJAvYc0bBgAA

View File

@ -1,5 +0,0 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTyW7bMBD9FYFnU+EmStQtcFrUSNsYidEWvVGcUU1EoQyKyoLA/15QdtCmt14IYsA385bhKwn2AUlLLg+HD48Y0kRWJPmlJJjQlGnK+I41LW9arkouK6mb6idZEX+NL6QltXKOO4NUokaqgFW0k72jAGg448BEpXJP+2si7SuxvgR89A7LcfqGcfJjIC357gOMT3m29aUbxhnKOA64CVOywWUyXzfra/r5cru72Z5eTThlcOkhU9Wd4RXvqGNyIdFTw8FSEFUFtayU1eIE8yFhDHYoJ7j/Mx/GFDC5VpRClowKQ44rAjbZTLmzE+5eDpnFYtFVrq+W8nJtX8kjRtKK1ZuZp3YXbvAXD1M3+wEuTmey031WeYjjAWPyuHiyyBwGm/wYivOk9eAxJLIiN3fFdrCpH+PDO6PuTvo3/yF/l6d/eEY3J4T1OIdEWsIVJyvyxbq9D1hsrkhLGEcBskHaC66pasBSW0lDtZa6R+5MLTJmPYbkwzzOU7EJCX/FRQBpyUc7THiifhnd3id0aY5Z1Q+dd2EbR5hdKv74z1nJSslYBs3pMKfiFsFHdAmzvl2cz/3+gQgtFtB6jhFDKrY27YtPdtqTlhjbOG6NNdZq53qsGPYMmNWsBtSgEZSAGpRRoJVhTivbcQW24l2fK2RFMMddLBumK5CubhzVtZNUMe5o5zpHXd9YxVhTC96/87G4GTLOuoYpBEkN9kCV4ZYaJSUFWdla6L6uRca9WXJOn7NsMODj6a+cGAA0CJpToXhFlTGcNqaqaVc3nel0g5XLnK8xBhz+MuqLd3Gcxj4V5+Up3ll3O4f834tlkZ58oM9LRleju8dY5IytD3m9z7Eej8fjbwAAAP//AwBleZTlNgQAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUT2/cNhDFv4rAsyjzP0XdDLtFF27qRbxog94ozigWoqUWFLVpYOx3L6jdInFvuQkDveHjb97wjUR/RNKR+9PplzPGvJCa5HErCSYMZYYyfmBtp3SnVaM1Z8aIv0lNxif8RjpiVQg8OKQSDVIFTNNeDoECoOOMAxNalZ7+80K6N+LHBvA8Bmzm5U9MyzhH0pG/xgjz13K2H5swzSs0aZ5wF5fsYyhm/tg9PNHf7/eH5/31rwWXIm5GIB1BUINzwdEh9J6qngvaKmkoE0y5oHpttbvKxpgxRT81C3z5fj7MOWIOnWiEbBgVjlxqAj77Yrn3Cx6+nYqLDdFjqddbefvs3sgZE+lE/R/Ma7u7MI13y9pPeMbp5NOC6S7Mx6OPQGpySvMJUx5xw3LG1M/LmAvREKxvW86h9VZpC63UQlqQDKFlVoMD540ygwhaD9C3zqpBgeAKDCrVW1KTDdw0+TzOsbp5f5hGjJnU5Pml2k8+D3M6vkP/ciW6+wmgxTbpiGRaGmtRSSm9M71gCNYEY0QfPLNDL5AHZNop67hlXDrBnNTGthY8c4HU5IMPr2PEavdIOsI4CpAt0kFwQ1ULnnotHTVGmgF5cFZwUpOHOeYxrvO6VLuY8XPa7ks68qufFrze9D6F1zFjyGsqED6ZEsZ9mmENufoeAM4a1kjGimjNpzVXHxHGhCFjwXFI663f/yTCiE30sKaEMVd7n1+r3/zySjrifBu4d955b0IYUDMcGDBvmAU0YBCUAAvKKTDKsWCU77kCr3k/lAqpCZa8VVvEpfZMDcFSBBRUSSGoM85Q21vVS66Z0/07jtXzVHQ+tEwhSOpwAKoc99QpKSlI7a0wg7Vi+AHJLSycFcCA5+uybg4MQItgOBWKa6qc47R12tLetr3rTYs6FM9PmCJOP4D6MIY0L/OQq1vWqnfoPq6xPDjVlruvY6T/bDN6nMMXTFWZsR9j2a/bWC81OaJf1oTH7b3q3si+LFd12J4toRvWaleTl+xTXk+3sjRNy5W6XC6XfwEAAP//AwBRE7MW9AQAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTTW/cNhD9K8KcRZmkKErUzVin6MJNvEgWadEbxRnFhGVqQVFOAmP/e0DtBk5664UgBnwz72P4CsE+E/Rwezq9e6GQFigh+a0kudSMa8bFkXe9avqmqVrdSNmZf6EEf0/foYdWOSecIVaTJqaQN2yoR8cQyQgukMtG5Z72ywL9K1hfIb14R9W8fKa4+DlAD3/7gPPXPNv6yk3zilWcJ9qHJdngMpkP+909++v2cHw4XF4ttGRw5RF6IFSjMc6w0Q2WqUFI1qlaMy65Mk4NTduYC8yHRDHYqVrw6W0+zilQcr2sZF1xJg2cS0CbbKY82IWO30+ZxWbRXa6XW3m79q/wQhF6Wf4089Luxk3+5nkZVj/hzeVMdnnKKk9xPlFMnjZPNpnTZJOfQ3GdtJs8hQQlPHwqDpNN4xyffzPq00X//n/IP+bp776RWxPhbl5Dgh6EqqGE99Y9+kDF/g564IIk1h2xUQrNVIeW2aY2TOtajyScaaWAEnZzSD6s87oU+5DoS9wEQA9/2GmhC/Xb6B59IpfWmFX9o/MuHOKMq0vFm/+CV7yqOc+gNZ3WVHwk9JFcoqzvGNdrv/9ApJYbaLfGSCEVB5seiz/t8gg9GNs5YY011mrnRmo4jRy51bxF0qgJlcQWlVGoleFOKzsIhbYRw5grUALluIttw4xsbK1oYLWqiSmjLRsai2xUynU06lFhpvjmY/EwZZx1HVeENTM0IlNGWGZUXTOsG9tKPbatHH+x5Jq+4NlgpJfLX9kYaMSOUAsmlWiYMkawzjQtG9puMIPuqHGZ8z3FQNMvRr33Ls7LPKbiujzFb9Z9XEP+78W2SF99YN+2jO5m90SxyBlbH/J6X2M9n8/nHwAAAP//AwCu1fIaNgQAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUUW/cKBDHv4o1z8YBDNj4Ldq0ulWul1W76lV9wzBuUBy8Apw2ivLdT3j3lObpdC8IjZnhP7/54xcI5hFhgOvT6cMThpyghuy3EKdcEaoIZUfaD0IOUjadarns6Heowd/iMwzQCWuZ1UhaVEiEo5KM7WSJc6gZZY5yKUpN8yPB8ALGNw6fvMVmSV8xJr8EGOBvH9zys9xtfGPnZXVNXGbch5RNsEXMX/vdLfnz+nC8O5xPJUwlufEOBkAnJq2tJpMdDREj46QXrSKUU6GtGGUn9TnNh4wxmLlJ7uHtfrfkgNkOvOFtQwnX8FqDM9kUyaNJeHw+FRUbopsSr7fwth1e4AkjDLz+F+a53JWd/dVjGlc/u6vzmk16SNs6GZuX+Aw1nOJywpg9bnyuU8LHcX4+mvTw8XymbNOHX2jXjG63rCHDAExQqGEDNM8m+yVUF4272WPI28ccfUje/letFmq4+1IdZpOnJT6+m8eXM+b9/6D8ydh7H7Da38AAlCF3bY9k4kwR0TtDjGw1UapVEzKrO86ght0Ssg/rsqZqHzL+iFtLMMBHMyc867uO9t5ntHmNpc9vqvjqEBe32ly9zZLRhjYtLXju1nxac/UZnY9oM5YmjnG91Pv6PoUrviXt1hgx5Opg8n31h0n3MIA2vWVGG22MsnZCSXGijhpFO4fKKXSCu84JLZwSmlolzMiEM5KNU4lADVisU13cagRDKoidOBIhu5b0rZBEIleCtd2IujB541jdzSXP2J4KdC3RODkiNDNEi7YlrpWm42rqOj79huTiB0ZLMYdP53e3KVDO9egUI1wwSYTWjPRadmTs+lGPqkdpi+ZbjAHn30B98jYuaZlydXFI9Q7d5zWUf0e1ueWnD+TXNqObxT5grMqMjQ/lqVzG+vr6+voPAAAA//8DAEU35m+CBAAA

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTwY7cKBD9FYuz8QDG2Pg26tlVWpPstJJREuWGqSKN4oEWxpNEo/73Fe6OJtnb3tCDV/XqveKFBPOEZCS3p9NfzxjyQmqS/QYJJhRlijL+yIZRdmPXNb3qpeT8C6mJv8efZCS9tJZbjbRFhVQC6+jUOksBUHPGgYlOlprm60LGF2J8A/jsLTZx+Yhp8TGQkXzyAeL30tv4xs5xhSbFGfdhySbYIuaf/e6evr09PD4cLq8WXAq58UBGgiCd1lZTZydD5cQFHWSrKBNMaiunru/0heZDxhTM3Czw7bU/xBww21E0om0YFZqcawImmyJ5Mgs+/jwVFZtFdwWvN3g7ji/kGRMZRf3LzEu5Gzv7GxufnkyAG+eDX46kJqcUT5iyx82ObcJ5NtnHUF2b7GaPIZOaPHyoDrPJLqanPzz6cBl9/z8mf2fs0Qes9ndkJIyjgHZA6gRXVA5gqOlaTZVqlUNudS84qckuhuzDGtel2oeMX9OmkozkbzMveNF3m+zRZ7R5TUX6Z1Wyxh8+7yIUgJGaHFKE1ebq1W7OGta0rFw+rPm05uo9gk9oM5aZHtN6Lf8filBiI+3WlDDk6mDysXpjliMZiTaD5UYbbYyy1mHH0DFgRrEeUIFCkAJ6kFqCkppZJc3EJZiOT64gRXdJt9oWSnVMOdVJ2pvWUolOUdNDT7mQEzrVT0wXi15trR7mwjN2YBKhpRodUKm5oVq2LYW2M71Qru+F+82Sa+KclWKAz5evcVEAMCAoToXkHZVaczrorqdTP0x6UgN2tmi+xxRw/s2od96muESXq+vCVH9Y934N5XtX2/J894H+2CK7i/YbpqpEbnwo23xN+Xw+n/8FAAD//wMAC1T6KCUEAAA=

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUTW/jNhD9KwKvFRWSoihRt9TJokaaxFgbbdHbiBzGbGTKoKhkF0H+eyE52XwsCvQiCENy3ps3b+aJBDggacn58Xj5gCGNJCfJLyHBhKJMUcZ3rGll1VZVUau6akr+N8mJv8LvpCW1NIYbjbREhVRaVtGudIZai5ozbpmo5JwT7kbSPhHwhcUHb7AYxj8wjn4IpCV/+mCHxxkbfGH6YbJFHHpchzFBMDOZm/Xqiv5+vtndbk63Rhznx4W3pCVopdPaaOpMB1R2XNBGlooywaQ2sqvqSp+e+ZAwBuiL0d6/4dshBUymFYUoC0aFJs85sZBgptzBiLvvx5nFItHFHM+X8PLbPpEHjKQV+auYp3Rnpvdnh7GbfG/Pli/JyTEOR4zJ46LG7TZ7I8FZwQqhBGMkJ9dg9j5gtr7Ibvu5RDANk2hLqtFZKjUHqmVZUltWUAvl6lo4kpMrjAH7d1mvvYnDOLiUvYicfcDZnq8uA3Q9zhhfoB+R5GQ9bhMEC/0Q8PIbmimdcu3iNB+vhpB8mIZpzNYh4V2El/PX96spRgwp20DaZ7/BuCct0dAYDho0gDLGYcXQMctAsdqisgqtFLa2UkurpGZGSei4tFDxzs0RkpNfZw23kzE4jm9sFpP0/cIhe+nTqvcY0gcZSUsYR2HLBqkTXFHZWKBQlZoqVSqH3Oha8FeYHcQ7TKQlrum6jhnTCam5AaGhtI6VVjktRF2DdGVVS6FUxWowtq4Fl7as0UDpStYIkpNNHOxk0udWl0sDNnH4B02apSItUayqGgNdJ5TkDegGJVeyURprLR0wWZoOeNVA13EGFTO6EQa40iA7W7kfKl2GOx/wwo/HHr6/w20KVZS/GICGO5Cfrn+JcMDHId7fnGxc3FzuSE6+TmHeCNl6tsijD/Sbmif6euqT3+0jgkV7PVj82Uc4j0u2TKjmtdVOM4qWSyqbzlGw3FEHElinWKNxtu/FYO4xZrPDwId5qn4ku91m59HsfUKTpjjz+2vhcbvNNj0kN8TDh03yrrDPAhSi5GzujMWH0zZaOCprG7SKUyF5RaXWnDa6qmlXN53uVIOVmRW7ndJxStlXtD6iSUvFL15cMFd7NPc/i/HqgheLcjZ7bXvaYou0/2uJPefkgDBOEQ/Ltm6fyDoEjAvyxXQaxXW49n3vRzRDsCNpOde8aGRdvjD8z3tClkWtuHh+fn7+FwAA//8DANjfCysbBgAA

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSU227jNhCGX0XgtanwJOpwlzpd1MhmE2zcbdG7ETlyiMikQVHZBoHffUHZQZJd9KJ3woj/HL75yRfiYY+kI5eHw+9P6NNEViS5JSSY0JRpyviWNZ2qOylKqWvesvofsiLuGp9JR2plDDctUokaqbKsor0cDLUWW864ZaJSOSfsJtK9EHClxSdnsAzTN4yTC5505C/nbfiea4MrzRhmW8Yw4sZPCbzJzXzZrK/p58u77e3d6dSEUxaXzpKONLW0gI2ifdNrqoSwFKpaUqWhByt4y8RwkjmfMHoYy8k+vtW3IXlMphOlkCWjoiXHFbGQILfcw4Tb50PuYkF0leOrJbx8di/kCSPpxOoV5indhRndxX7qZzfaizHsds7v1sEPbjdHSLnwihxiOGBMDhc4vzkP8flz2O1yPvIJxgnJimwx7p2H8fTjCgeYx3Qf5riQmezjf50hHYE5BbIiC8lxXMoW52HWo0OfftG+K3x7X9yNkIYQ9x+WdH9iv/kf6G/APDiPxeaKdIRxFFY2SAfBNVWNBQqVbKnWUg/ITVsLTlZkHXxyfg7zVGx8wt2Z2of+LqN5cAlNmmOe6W+dzXYXg51NKt4WzFnJSslYFs3pMKfiK1oX0STMQ2zjfM73k0RosYg+uRF/wbOeY0SfijtID8UfMD2QjrTQGA4ttADamAErhgOzDDSrLWqr0Spha6taZbVqmdEKeq4sVLwfcoSsCGaTFYuveyWlRcGoZBapQq5oLxqgrK4VykHLumo+wC1ux6wD0zCFVtIWB0tVy4G2SkpqZQW10ENdL0t55XQ2BGeZ+nsT/jmhPXvpy8nar7NbfDrd46VPbW2DVnMqFK+oaltOm7aqaV83fdvrBiuTJ1sHP4VXkN8w9mFyKT8iN867PYw/H3nbzDVGj+O77dw4E8MUhlScbVl82NfX2edXrFgs+t15+u9ijKtgHjEW2Vjg/LtlHo/H4w8AAAD//wMAtEuIEAwFAAA=

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUTW/bOBD9KwLPpkJSFCUK2IPhtFgjTWMk7u5ibxQ5jInIokFRToMi/31BWa6dooe9CaP5eO/NG/5AvdoDatDycPh0hD4OaIGim0KMMIGJwIRuSd3wqilYXknJKRH/ogVyd/CGGlRxramWgAsQgLkhJW4Lq7ExICmhhrCSp57qeUDND6RcbuDoNOR++AvC4HyPGvS3641/TbOVy3XnR5MH38G6H6LqdQLzdb26w1+Wm+3D5pQ1wJCKc2dQg+qqMApqjtu6FZgzZrAqqwJzoVplGJWE2VOZ6yOEXnX5YF4u842PPUTdsJwVOcFMovcFMiqqBLlVA2zfDgnFJNFtii+m8PTZ/EBHCKhhi7OYp3Y3unM3+6EdXWduogrPEG1Qe3j14QWOqkMLdAj+ACE6mLR5eMoukCjJSc4EIwQt0L3SO9dDtr7NHrpEWOmacDAFlmAN5pIqLHlRYFOUqmLCVtVE+A5CD91V13ungx+8jdksefZhzsr30fWjH4ds3Ud4Diqe6j6rbgC0QJux7dywewRl3rb+cUz/+rFLXFZjCNDHbKPiLvtTDTvUIKlqTZVUUimhtYWSgCWGKEEqA8IIMJyZynDJjeCSaMFVS7lRJW1tiqAFehjjYYxn/b9fgdgGt9+DuSDYThpvOhWtD/u1gT4669JqzhmTobpuYpXNPVedgz5+EBk1iFBgpqgBW0YF5rVRWJWFxEIUwgLVsmL0JJh1z+NPnYi1hhe2rGvRypYSYLaqOalsS4y2hZambKFiFalqqKUmpC05rVupiQFacpPYBW9GHX+1QjEt6HHs03Vm60T71fX4u+AXRTbBR699lxbmOnh6GyLsf7e1ld8f/OBi4m/n1X4b4N736e98/7Nmc/HSx0sM0h1k0+kVlNu2rUosJOeYU8lxq2uNZWEtr4RlYBLwW69fIGTJYMr1007Onnp4ypZB71wEHceQJv8zkTqt8/P5ZC565F8/bVc+wPJwWMzRP45JpFOzswE+vCvfhpS+80O8ojxTe4LOnoFd2cnA8fRUuRQUxtRgBMWM0xJzKSmuZVnhtqpb2YoaSn2xa/YIxgXQceq3DWOaNiv7O18uQ3RW6Tik4/ni9WSn2Z9zyq8gr9b2s/o0/Gp1s5XmTpQkyz6dHs7JQf/r3Xx/f3//DwAA//8DAMe2UmsoBgAA

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUTW/cNhCG/4rAsyjzS/zQzbBb1HVTL+JFWvRGcka2EK20oKhNA2P/e0DtBol7600Y6J0ZPvPOvJHJH5B05PZ4/OWEU15ITfKwhQQTmjJNGd8z2ynTSdEIyxxX5h9Sk+ERv5KOGBUjjw6pRI1UAWtpkH2kAOg448BEq0pO/7KQ7o34oQE8DRGbefmEaRnmiXTkr2GC+Uup7YcmjvMKTZpHfJiW7KdYmvnz4e6R/nG72z/tLn8tuBRxMwDpiDUSPFpFgw2aKiGA+tZIqrQPHgR3TPQX2TBlTJMfmwU+/6gPc54wx040QjaMCkfONQGffWk5+AX3X4+liw3RfYnXW3j77N7ICRPpRP0d5iXdTRyHmzwfRzzhePRpwXQT58PBT0BqckzzEVMecMOyvXQcfR7mqboWuxsHnDKpydNztRt97ud0eMfq+YLg4X8QOGEKpCOStVIbg0pK6Z0OgiEYHbUWIXpm+iCQR2StU8Zxw7h0gjnZamMNeOYiqcnLOAc//r5s/JxgwQIzQgtU6ITS2kWG0mLfGmTgtQ7aRgfSGqEsWOmd99wFNNHpWAzywcfXYcLq4Z50hHEUIC3SXnBNlQVPfSsd1VrqHnl0RnBSk7t5ysO0zutSPUwZX9LGj3TkVz8ueCF3m+LrkDHmNRWof+tSbJdmWGOufjiAs4Y1krEiWvNxzdVHhCFhzFjw7tN6zfcfidBiE92tKeGUq53Pr9VvfnktVLyN3LvyVB1jjy3DngHzmhlADRpBCTCgnAKtHIta+cAV+JaHvkRITbAYrto83sfohGWaKrSBKgOKBiE5FcJpw4NWCt5zrJ7GovPRMoUgqcMeqHLcU6ekpCBbb4Tujdmc8R3J1XycFcCAp8u2bh1oAIugORWKt1Q5x6l1raHB2OCCttjG0vMjpgnHn0B9GGKal7nP1dW71Tt0H9epXJxq8/GXYaL/bjO6n+NnTFWZsR+msmDXsZ5rckC/rAkP28Hq3siubFe13+6WMI2z2tXkOfuU1+M1zKVuTGvl+Xw+fwMAAP//AwDUFLHF9gQAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUW2/cNhCF/4rAZ1HmTbzozbBb1HDTLGKjLfo24oxiIVppQVGbBob/e0HtBqn71jdhoDM8/OYMX9kMR2Iduz2dfjrTnFdWszzuJSWU5cJyIZ+F74zrtGq08qG14i9Ws/GRvrGOOROjjIG4JkvcoGh5r4fIESlIIVGo1pSe8Hll3SuDsUE6j5GaZf2d0jouM+vYH+OMy9dyNoxNnJYNm7RM9DCvGeZYzPz2cPfIf709PH88XP5aaS3iZkTWMe80AnnDe99bbpRCDq3T3FjoAZUMQg0X2ThnSjNMzYpffpyPS54px041SjeCq8DeaoaQoVjuYaXnb6fiYkd0X+r1Xt4/u1d2psQ6VX+HeWl3E6fxZt36ic40nSCtlG7icjzCjKxmp7ScKOWRdixnSv2yjrkQjdGB91KiB2dah163SjvUgtAL12LAANbYQcW2HbD3wZnBoJIGLRnTO1azHdw0QR6Xubp6v5tGmjOr2cen6jBBHpZ0fIf+6UL04X8ALbZZx7RotXWOjNYagu2VIHQ2Wqv6CMINvSIZSbTBuCCdkDooEXRrnXcIIkRWsw8QX8aZqod71jEhSaH2xAclLTcegUOrA7dW24FkDE5JVrO7Zc7jvC3bWj3MmT6n/b6sYz/DtNLlprcpvoyZYt5SgfCnLWE8pAW3mKsfAZCiEY0Wooi2fNpy9YlwTBQzFRzPabv2+49EWbWL7raUaM7VAfJL9QusL6xjAXyUECAA2BgHagUNAgVY4ZAsWkKj0KEJBq0JIloDvTQIreyHUmE1o5K3ao+4HNpB+0FzFbXgBiJwsBi4UUbqqLXS5j3H6uNUdBC9MISaBxqQmyCBB6M1R92CU3Zwbp/kdyTXsEhRACOdL8u6O7CIntBKroxsuQlBch9ax3vn+9BbT20snh8pzTT9C9SHMaZlXYZcXbNWvUP3aZvLg1Ptufs6zvzvfUb3S/xCqSozhnEu+3Ud61vNjgTrlui4v1fdKzuU5aqe92dLuSZ4G2r2lCHl7XQtS20b13r99vb29g8AAAD//wMA0nzqzvUEAAA=

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTTW/cNhD9KwLPokxSFCXqZqxTdOEmXiSLtOhtxBnFhGVqQVFOAmP/e0DtBol764UgBnwz72P4ygI8E+vZ7en07oVCWljJkt9KSijDheFCHkXX67avu8p0VraN+JeVzN/Td9azVjsnnSVekyGuUTR8qEfHEclKIVGoRuee8GVh/SsDXyG9eEfVvHymuPg5sJ797QPOX/Ns8JWb5hWrOE+0D0uC4DKZD/vdPf/r9nB8OFxeLbRkcOWR9axrawTqNB+6wXCtFHJo2pprAwOgklao8QLzIVEMMFULPv2aj3MKlFyvKlVXgivLziVDSJApD7DQ8fsps9gsusv1citv1/6VvVBkvSp/mnlpd+Mmf/O8DKuf8OZyJliesspTnE8Uk6fNk03mNEHycyiuk3aTp5BYyR4+FYcJ0jjH5zdGfbro3/8P+cc8/d03cmsi3M1rSKxnsrasZO/BPfpAxf6O9UxIUlh3xEclDdcdAoemttyY2owknW2VZCXbzSH5sM7rUuxDoi9xE8B69gdMC12o30b36BO5tMas6h+Td+EQZ1xdKn75L0UlqlqIDFrTaU3FR0IfySXK+o5xvfb7D0QZtYF2a4wUUnGA9Fj8Ccsj65mFzkmwYAGMcyM1gkaBAoxokQwaQq2wRW01Gm2FMxoGqREaOYy5wkpGOe5i2zDCwSllJBdtbbkGZXmn5MiNpRFNI5ua8I2PxcOUceA6oQlrnt9xbSVwq+uaY91Aq8zYtls0Py25pi9FNhjp5fJXNgYGsSM0kistG66tlbyzTcuHthvsYDpqXOZ8TzHQ9JtR772L8zKPqbguT/HGuo9ryP+92Bbpqw/825bR3eyeKBY5Y/Ahr/c11vP5fP4BAAD//wMAgHCTeTYEAAA=

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUXU/sNhD9K5Ffuw7+imPnjS5cdUWB1d1VW/VtYk/AJTgrx4F7hfjvVbJw+biq1JcoGttzzpw5M08kwj2ShpweDucPGPNIViSHJSSY0JRpyviemUbVjTSltoLVdfU3WZFwgd9JQ2rlHHcWqUSNVHlW0VZ2jnqPljPumajUnBNuRtI8EQilx4fgsBzGPzCNYYikIX+G6IfHGRtC6fph8mUaetzEMUN0M5mrzfqC/n663V9vj7dGHOfHZfCkIaaWHtAo2ppWUyWEp1DVkioNLXjBLRPd8VmIGVOEvhz93Ru+H3LE7BpRClkyKix5XhEPGWbKLYy4/36YWSwSnc3x1RJefpsn8oCJNGL1KuYx3Ynrw8n92E6h9yfLl6zIIQ0HTDngosb1rngjwVnJSqEFY2RFLsHdhojF5qy47ucSwRmm0EtqsfNUWQ7UKimplxXUQnd1vZR4gSli/y7rZXBpGIcuFy8iFx9wdqfr8whtjzPGF+hHJCuyGXcZood+iHj+Dd2Uj7n2aZqP10PMIU7DNBabmPEmwcv56/v1lBLGXGwh3xa/wXhLGmLBOA4WLIB2rsOKYcc8A81qj9pr9Er42iurvFaWOa2g5cpDxdtujpAV+XXWcDc5h+P4xmYxSd8vHIqXPq37gDF/kJE0hHEUXhqkneCaKuOBQiUt1VrqDrmzteCvMHtIN5hJQzrTti1zrhXKcgfCgvQdk153Voi6BtXJqlZC64rV4HxdC668rNGB7CQzgqzINg1+cvlzq+XSgG0a/kGXZ6lIQzSrKuOgbYVW3IA1qLhWRlusreqAKela4JWBtuUMKuasEQ64tqBaX3U/VDqPNyHiWRgPPXx/h2tKXcpfHIDhHahP178kuMfHId1dHW1cXp3vyYp8neK8EYrNbJHHEOk3PU/05dTnsL9NCB795eDxZx/hPC7FMqHec88MdlR73lFVqZqCc5xK5ZWumKtaNrM5G9wdpmJ2GIQ4T9WPZNe74jS525DR5SnN/P5aeFzvim0PuRvS/YdN8q6wzwKUQnI2d8bjw3EbLRy19wa95lQoXlFlLafGVjVta9PaVhus3MzxesqHKRdf0YeELi8Vv3hxwVzforv7WYxXF7xYlLPZa7vjFluk/V9L7HlF7hHGKeH9sq2bJ7KJEdOCfDYdR3ETL0PfhxHdEP1IGi2lKYU19oXhf95TrCo1Y/L5+fn5XwAAAP//AwB4OEzzGwYAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUwW7cIBCGX8Was3EAY2x8izaNukrbrNpVW/WGYZygOHgFOG0U7btXeLdKc6p6QWjMP/zzzeAX8PoRoYfLw+HdE/oUoYTk1hCnXBIqCWV72vWi7euukp1kinc/oAR3g8/QQyuMYUYhqVEiEZY2ZKhHQ6xFxSizlDci59R3EfoX0K6y+OQMVnP8iiG62UMP35y38898t3aVmebFVmGecOtj0t5kM5+2mxvy4XK3v92dTkWMWVw5Cz10bW01doIM3SCJ4NwS3bQ1EVIP2nKmKB9PMucTBq+nKtqH1/vtnDwm0/OK1xUlXMGxBKuTzpYHHXH/fMguVkRXOV6u4XXbv8ATBuh5+QfmKd2FmdzFYxwWN9mL05p0fIjrOmqT5vAMJRzCfMCQHK58LmPEx2F63uv4cH06k7fx3S80S0K7mRefoAdWSyhhBTRNOrnZF2ePm8mhT+vHFJyPzvwrVw0l3H4pdpNO4xwe3/Tjywnz9j8of9Tm3nkstlfQA2XIbd0hGTmTRHRWE93UikhZyxGZUS1nUMJm9sn5ZV5isfUJ78JaEvRwraeIJ3+Xwdy7hCYtIdf5Xea52oXZLiYVr71ktKJVTWkWLemwpOIzWhfQJMxF7MNyzvf1rYRLvoo2SwjoU7HT6b54r+M99KB0Z5hWWmktjRmxoThSS7WkrUVpJVrBbWuFElYKRY0UemDC6oYNY45ACZhHp1inVXE6WCUGIoUQRDSjJB1THWGiHhEZVYxmxSvH4nbKOm06KtDWROFoiVBMEyXqmti60S2XY9uu/P8gOc8DoxmwxafTu1sdSGs7tJIRLlhDhFKMdKppydB2gxpkh43JDm4weJz+AvXRmTDHeUzFeUKKN+g+Lz7/O4p1Wn46T36tPbqazQOGIvdYO5+fyrmtx+Px+BsAAP//AwBa5USZggQAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTy27cOBD8FYFnUeZLlKibMd5FBk7Wg8RIFntrsVsZIjI1kCgngTH/vqBmAie55UYUWd3VVc0XFuGJWMduT6e/nimmhZUshQ1SQlkuLBfyUbSdaTrdVtZppZ3+j5Us3NN31rHGeC+9I67JEjcoat7rwXNEclJIFKo2uSZ8Xlj3wiBUSM/BUzUtH2lewhRZxz6FiNPX3BtC5cdpxWqeRtrHJUH0Wcw/+909f3t7eHw4XF4ttGRyFZB1rG00ArWG921vuVEKOdSN5sZCD6ikE2q40EJMNEcYqwW/vPbHKUVKvlOV0pXgyrFzyRASZMk9LPT4/ZRVbBbdZbzc4O3YvbBnmlmnyh9mXsrd+DHc+OnpCSLeDCGG5chKdpqnE80p0GbHNuE4QgpTLK5NdmOgmFjJHj4UhxHSMM1Pv3j04TL6/g8mfwf+GCIV+zvWMSFJoW6JD0pabloEDrV23FptB5LeNUqyku2mmEJcp3Up9jHR53lTyTr2N4wLXfTdzv4YEvm0zln6vzZnTd9C2k2YAcFKdpgnXH0qXu2WohKVFvnyYU2nNRXvCcNMPlGe6XFer+V/oyirNtJunWeKqThAOhZvYDmyjjlovQQHDsB6P1AtaBAowIoGyaIlNAobNM6gNU54a6CXBqGW/ZCRrDunW2wLVdey9uiBtxYUN60i3gogrrw33gDUtc478Gpr8TBmHvhWGELNHQ3IjZPAndGao66hUXZomi2OH5ZcE5ci+430fPkamwKL2BJayZWRNTfOSd66uuF90/auty3VPmu+pznS+JNR74Kfp2UaUnFdmOIX696vMX/vYlueryHyb1tkd5P/QnORI4cQ8zZfUz6fz+f/AQAA//8DALuBJ1glBAAA

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUTW/cNhCG/4rAsyjzS0NSN8NuUddNvYgXadEbRY5sIVpqQVGbBsb+94DaDRL31psw0DszfOadeSPRHZB05PZ4/OWEMS+kJnncQoIJoAwo43tmOmU6ZhojmTEA/5CajI/4lXREK++5t0glAlIVWEt7OXgaAlrOeGCiVSWne1lI90bc2AQ8jR6befmEaRnnSDry1xjD/KXUdmPjp3kNTZonfIhLdtGXZv58uHukf9zu9k+7y18LLkXcjIF0BCR6BIdUgjVU9RZpb3CgCMogWCXAm4tsjBlTdFOzhM8/6oc5R8y+E42QDaPCknNNgsuutNy7Bfdfj6WLDdF9iddbePvs3sgJE+lE/R3mJd2Nn8abPB8nPOF0dGnBdOPnw8HFQGpyTPMRUx5xw7K9dJpcHudYXYvdTSPGTGry9FztJpeHOR3esXq+IHj4HwROmHrSEclaCVqjklI6C71gGDR4ANF7x/TQC+QeWWuVtlwzLq1gVragjQ6OWU9q8jLNvZt+XzZ+VrDeBKYFCFRohQKwnqE0OLQaWXAAPRhvgzRaKBOMdNY5bnvU3oIvBvng/OsYsXq4Jx1hHEWQBukgOFBlgqOulZYCSBiQe6sFJzW5m2Me4zqvS/UQM76kjR/pyK9uWvBC7jb51zGjz2sqUP+GUmyX5rD6XP1wAGcNayRjRbTm45qrjxjGhD5jwbtP6zXffyQCxCa6W1PCmKudy6/Vb255LVSc8dzZ8lTwfsCW4cACc8B0QAiAQYmgg7IqgLLMg3I9V8G1vB9KhNQEi+GqzeMMhUERDDUDDFQZI2jfD5wysI4NA/Ss9e84Vk9T0TlvmMIgqcUhUGW5o1ZJSYNsnRYwaC2Gn5BczcdZARzwdNnWy5aFYDAAp0LxliprOTW21bTXprc9GGx96fkRU8TpJ1AfRp/mZR5ydfVu9Q7dxzWWi1NtPv4yRvrvNqP72X/GVJUZuzGWBbuO9VyTA7plTXjYDlb3RnZlu6r9dreEbUQrZE2es0t5PV7D0jRatOJ8Pp+/AQAA//8DAPPar0r1BAAA

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUW2/cNhCF/4rAZ1Hm/aI3w27RhZt6ES/aoG8UZxQL0UoLito0MPa/F9RukbhveRMGOsPDb87wjUzhiKQl96fTL2ec8kJqkoetJJgwlBnK+IG5VrmWucYZq7X0f5OaDE/4jbTEqhh59EglGqQKmKad7CMFQM8ZBya0Kj3D54W0byQMDeB5iNjMy5+YlmGeSEv+GiaYv5azw9DEcV6hSfOIu2nJYYrFzB+7hyf6+/3+8Ly//rXgUsTNAKQlRmJEE5BK4x1VnUfaOewpGuXQeCVMdFfZMGVMUxibBb58Px/mPGGOrWiEbBgVnlxqAiGHYrkLCx6+nYqLDdFjqddbefts38gZE2lF/R/Ma7u7OA53y9qNeMbxFNKC6S7Ox2OYgNTklOYTpjzghuWMqZuXIReiMdrgHOfgglXagpNaSAuSIThmNXjwwSjTi6h1D53zVvUKBFdgUKnOkpps4MYx5GGeqpv3h3HAKZOaPL9U+zHkfk7Hd+hfrkR3PwG02CYtkUxLYy0qKWXwphMMwZpojOhiYLbvBPKITHtlPbeMSy+Yl9pYZyEwH0lNPoT4OkxY7R5JSxhHAdIh7QU3VDkINGjpqTHS9Mijt4KTmjzMUx6mdV6Xajdl/Jy2+5KW/BrGBa83vU/xdcgY85oKhE+mhHGfZlhjrr4HgLOGNZKxIlrzac3VR4QhYcxYcBzSeuv3P4kwYhM9rCnhlKt9yK/Vb2F5JS3xwUUefPAhmBh71Ax7BiwYZgENGAQlwILyCozyLBoVOq4gaN71pUJqgiVv1RZx5rW3ogs09B1QZaKlwfaG9r3XiMxyY/Q7jtXzWHQhOqYQJPXYA1WeB+qVlBSkDlaY3lrR/4DkFhbOCmDA83VZr0sG4BAMp0JxTZX3nDqvLe2s63xnHOpYPD9hmnD8AdSHIaZ5mftc3bJWvUP3cZ3Kg1Ntufs6TPSfbUaPc/yCqSozDsNU9us21ktNjhiWNeFxe6/aN7Ivy1UdtmdL+EZoIWvykkPK6+lWlq6xQovL5XL5FwAA//8DALepIcv0BAAA

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUXW/jKBSG/4rFtXEBY2x81013tFGn02ianV3tHYbjFNWBCHBnqyr/fYSTqumM9mLvrGPe8/GcF16RU3tAPbo+HH5/BpciKlGyS4gRJjARmNAt6Xre9aSrOilY27b/oBLZW3hBPWq51lRLwDUIwNyQBg/1qLExICmhhrCG55xqF1H/ipStDDxbDZWP3yBE6x3q0V/WGf8911a20pOfTRX8BGsXk3I6N/NlvbrFn6832/vN6VSEmMWVNahHogYNQgGuhewwHyTgoYMRg+AdCMmZ0N1JZl2C4NRURfP0Xt/45CDpnlWsrghmEh1LZFRSueVBRdi+HHIXC6KbHC+X8PLZv6JnCKhn5RvMU7orPdmrfRxmO5mrye921u1W3o12NweVcuESHYI/QEgWFji/WafCy2e/2+V86JOaIqASbSHsrVPT6ccNjGqe0oOfw0Immqf/OoN6pObkUYkWktO0lC3Ow6wmCy79or0ofP9QbCaVRh/2H5b0cGK//h/o75R+tA6K9Q3qEaHATN0BHhkVmHdGYdXUEgtRixGoli2jqEQr75J1s59jsXYJdmdqH/q7DvrRJtBpDnmmv0U22yZ4M+tUvC+YkopUNSFZNKfDnIqvYGwAnSAPsQ3zOd9PEibYIvpkJ/gFz2oOAVwqNio9Fn+o+Ih6JFWnqZJKKiW0HqEhMBJDlCCtAWEEGM5Ma7jkRnBJtOBqoNyohg5jjqASQTZZsfi6rmvTMtZhI6TE3DSAVSM5HmsKvKEwDC18gFvcT1mndEc4mBpLGA3mkioseV1jUzeqZWJsWzZecDobgpJM/dKEf0YwZy99OVn7bXYDz6d7fLp/xnRgBMWM0wZzKSnuZNPioe0GOYgOGp0nW3kX/RvIbxAGH23Kj8iddXavpp+PvG/mFoKD6WI7d1YHH/2YirMtiw/7+jq7/IoVi0W/W4f/XYxx4/UThCIbS1l3sczj8Xj8AQAA//8DAM61a8IMBQAA

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxUS2/bOBD+KwLPpkJRFCUK2IPhtFgjTWMk7u5ib3wMYyKyaFCU06DIf19Qlmun6GFvwojz+B4zP1Av94BatDwcPh2hjwNaoOimECWUY8IxKbakaVnTEpHTpqzrsv4XLZC7gzfUopppXWgBuAQOmBlSYVVajY0BUZDCEFqxVFM+D6j9gaTLDRydhtwPf0EYnO9Ri/52vfGvqbd0ue78aPLgO1j3Q5S9TsN8Xa/u8JflZvuwOb0aYEjJuTOoRbwEDVwCLrloMFMCsGrAYuCsAS4Y5bo5pbk+Quhllw/m5dLf+NhD1C3NaZkTTAV6XyAjo0wjKznA9u2Qppgouk3xxRSePtsf6AgBtXRxJvNU7kZ37mY/qNF15ibK8AzRBrmHVx9e4Cg7tECH4A8QooOJm4en7DJSQXKSU04JQQt0L/XO9ZCtb7OHLgGWuiEMTIkFWIOZKCQWrCyxKStZU27rmlq0QHcQeuiuqt47HfzgbcxmyrMPfVa+j64f/Thk6z7Cc5DxlPdZdgOgBdqMqnPD7hGkedv6xzH968cuYVmNIUAfs42Mu+xPOexQi4RsdCGFFFJyrS1UBCwxRHJSG+CGg2HU1IYJZjgTRHMmVcGMrAplUwQt0MMYD2M88//9aohtcPs9mMsE24njTSej9WG/NtBHZ12S5vxiMlTXTaiyueaqc9DHDySjFpECqCkbwJYWHLPGSCyrUmDOS26h0KKmxYkw657HnzwRaw0rbdU0XAlVEKC2bhiprSJG21ILUymoaU3qBhqhCVEVKxolNDFQVMwkdMGbUcdfrVBOAj2OfdrObJ1gv7oef+fswsgm+Oi175JgroOntyHC/neqrfz+4AcXE347S/ttgHvfp7/z/s+czclLHy8xSHuQTasHypRKCoJtrRRmlCksjCkwK5iltZIGgKIFuvX6BUKWDCZdP2ly9tTDU7YMeuci6DiG1PmfCdRJzs/nlbnwkX/9tF35AMvDYTFH/zgmkk7Fzgb4cFe+Den5zg/xCvIM7Qk6ex7syk4GjqdT5aYTY0wDhheYsqLCTIgCN6KqsaobJRRvoNIXu2aPYFwAHad62zCmbjOzv/PlMkRnpY5DWp4vXk92mv05P/l1yCvZfmafml9JN1tprlSQZNmn0+GcHPS/7ub7+/v7fwAAAP//AwDjiSUTKAYAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACoxU227cNhD9FYGvFRXeRJF6c20HXaSOjeyiLfo2Ikc2a5laUJSTwPC/F9TauaJAXwRhSM45c+bMPJEID0h6cnY8Xj5izAupSQ5bSDChKdOU8QMzvTI9V41iQnSq+5vUJLzDz6QnnXKOO4tUokaqPGvpIEdHvUfLGfdMtKrkhNuF9E8EQuPxMThs5uUPTEuYI+nJnyH6+WPBhtC4aV59k+YJd3HJEF0h8353/o7+fnZzuL453VpwKY+b4ElPtESHGpBKbQ1Vg0U6GBwpamVQWyW0M6dnIWZMEaZm8fdf8f2cI2bXi0bIhlFhyXNNPGQolAdY8PD5WFhsEl2UeL2Ft9/+iTxiIr2oX8U8pXvjpvDmYRnWMPk325fU5JjmI6YccFPjel99JcFZwxqhBWOkJlfg7kLEandRXU+lRHCGKfSSWhw9VZYDtUpK6mULndBj14mR1OQdpojTN1mvgkvzMo+5ehG5+g5nf3Z+GWGYsGC8hWlBUpPdss8QPUxzxMtP6NZ8ynVIazk+n2MOcZ3XpdrFjLcJXs5f35+vKWHM1Q3ku+o3WO5ITywYx8GCBdDOjdgyHJlnoFnnUXuNXgnfeWWV18oypxUMXHlo+TCWCKnJr0XD/eocLstXNptJpmnjUL306XwKGPN3MpKeMI7CS4N0FFxTZTxQaKWlWks9Ine2E/wV5gDpFjPpyWiGYWDODUJZ7kBYkH5k0uvRCtF1oEbZdkpo3bIOnO86wZWXHTqQo2RGkJrcpNmvLv/Yark14CbN/6DLRapiZNa2xsEwCK24AWtQca2MtthZNQJT0g3AWwPDwBm0zFkjHHBtQQ2+Hb+odBlvQ8SLsBwn+PwNrml0I39xAIaPoH64/jbBA36c0/37k42b95cHUpMPaywbodoVi3wMkX7SZaKv1imHw11C8OivZo8/+wjLuFTbhHpmOyOdogqcoMp3lg6CMQrIJdqRd5IV+17M7h5TVRwGIZap+pLsel+dJXcXMrq8psLvr43H9b66mSCPc3r4bpN8U9iPAjRCclY64/HxtI1OW8R7g15zKhRvqbKWU2Pbjg6dGeygDbauKHa95uOaqw/oQ0KXt4pfvLhhnt+hu/9ZjFcXvFiUs+K1/WmLbdL+ryX2XJMHhGVN+LBt6/6J7GLEtCFfrKdR3MWrME1hQTdHv5C+bblolG35C8P/vqd5ww1Xz8/Pz/8CAAD//wMAYBpYrRsGAAA=

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRU0W7cKhD9FWuejQMYY+O3aNPqrnLbrNpVW/UNw7hBcfAKcNoo2n+vsLdK83R1XxAaOMOZM2d4Aa8fEXq4Pp3ePaFPEUpIbg1xyiWhklB2pF0vup6JqlZCNIx/hxLcLT5DD60whhmFpEaJRFjakKEeDbEWFaPMUt6InFP/iNC/gHaVxSdnsJrjFwzRzR56+Oq8nX/mt7WrzDQvtgrzhHsfk/Ymk/m4392Sf68Px7vDditizODKWehB1mhQaiS1VB0Rg0IydDgSlKJDqQSXpttgzicMXk9VtA+v79s5eUym5xWvK0q4gnMJViedKQ864vH5lFmsEt3keLmG123/Ak8YoOflHzG3dFdmclePcVjcZK+2Nen4ENd11CbN4RlKOIX5hCE5XPW5jhEfh+n5qOPD++1O3sZ3v9AsCe1uXnyCHlgtoYRVoGnSyc2+uHDcTQ59Wg9TcD4681+5aijh7nNxmHQa5/D4ph+fN5n3/0PlD9rcO4/F/gZ6oAy5rTskI2eSiM5qoptaESlrOSIzquUMStjNPjm/zEss9j7hj7CWBD2811PEjd91MPcuoUlLyHV+k9lXhzDbxaTitZeMVrSqKc2gJZ2WVHxC6wKahLmIY1gu+b68hXDJV9BuCQF9Kg463Rf/6HgPPSjdGaaVVlpLY0ZsKI7UUi1pa1FaiVZw21qhhJVCUSOFHpiwumHDmCNQAmbrFKtbkbNxGIUg3TAaIgZNiaaSEqEGbjVT2o65tFcdi7sp47TpqEBbE4WjJUIxTZSoa2LrRrdcjm3Lx78kufiB0Sywxadt7rZ5sbZDKxnhgjVEKMVIp5qWDG03qEF22JjM+RaDx+kvoT44E+Y4j6m4OKR4I92nxee/o1jd8tN58mvt0c1sHjAUucfa+Twql7aez+fzbwAAAP//AwD8UEJ2ggQAAA==

View File

@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRTwW7cNhD9FWHOokxSFCXqZqxTdOEmXiSLtOiN4oxiwjK1oCgngbH/HlC7gZPeeiGIAd/Me28eXyHYZ4Iebk+ndy8U0gIlJL+VJJeacc24OPKuV10vVFWbttFt9y+U4O/pO/TQKueEM8Rq0sQU8oYN9egYIhnBBXLZqNzTflmgfwXrK6QX76ial88UFz8H6OFvH3D+mmdbX7lpXrGK80T7sCQbXCbzYb+7Z3/dHo4Ph8urhZYMrjxCD7omR9oSq7XpmBoMsaGjkZFWHWmjpHbdBeZDohjsVC349DYf5xQouV5Wsq44kwbOJaBNNlMe7ELH76fMYrPoLtfLrbxd+1d4oQi9LH+aeWl34yZ/87wMq5/w5nImuzxllac4nygmT5snm8xpssnPobhO2k2eQoISHj4Vh8mmcY7Pvxn16aJ//z/kH/P0d9/IrYlwN68hQQ+iNlDCe+sefaBifwc9cEES647YKIVmqkPLbFMbpnWtRxLOtFJACbs5JB/WeV2KfUj0JW4CoIc/7LTQhfptdI8+kUtrzKr+0TkLhzjj6lLx5r/gFa9qzjNoTac1FR8JfSSXKOs7xvXa7z8QqeUG2q0xUkjFwabH4k+7PEIPxnZOWGONtdq5kRpOI0duNW+RNGpCJbFFZRRqZbjTyg5CoW3EMOYKlEB53cWWsMFRSzg2jHNjmRpQM4Pk2Fi3sh4bbQbKFN98LB6mjLOu44qwZoZGZMoIy4yqa4Z1Y1upx7aV4y+WXLcveDYY6eXyVy4ZR+wItWBSiYYpYwTrTNOyoe0GM+iOGpc531MMNP1i1Hvv4rzMYyqu4Sl+s+7jGvJ/L7YgffWBfdt2dDe7J4pF3rH1Icf7utbz+Xz+AQAA//8DAJKaUgc2BAAA

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,461 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {
"PlotLine/1.0.0": {
"dependencies": {
"Dapper": "2.1.66",
"Microsoft.Data.SqlClient": "6.1.3"
},
"runtime": {
"PlotLine.dll": {}
}
},
"Azure.Core/1.47.1": {
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "8.0.0",
"System.ClientModel": "1.5.1",
"System.Memory.Data": "8.0.1"
},
"runtime": {
"lib/net8.0/Azure.Core.dll": {
"assemblyVersion": "1.47.1.0",
"fileVersion": "1.4700.125.36505"
}
}
},
"Azure.Identity/1.14.2": {
"dependencies": {
"Azure.Core": "1.47.1",
"Microsoft.Identity.Client": "4.73.1",
"Microsoft.Identity.Client.Extensions.Msal": "4.73.1"
},
"runtime": {
"lib/net8.0/Azure.Identity.dll": {
"assemblyVersion": "1.14.2.0",
"fileVersion": "1.1400.225.36004"
}
}
},
"Dapper/2.1.66": {
"runtime": {
"lib/net8.0/Dapper.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.1.66.48463"
}
}
},
"Microsoft.Bcl.AsyncInterfaces/8.0.0": {
"runtime": {
"lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.23.53103"
}
}
},
"Microsoft.Bcl.Cryptography/9.0.4": {
"runtime": {
"lib/net9.0/Microsoft.Bcl.Cryptography.dll": {
"assemblyVersion": "9.0.0.4",
"fileVersion": "9.0.425.16305"
}
}
},
"Microsoft.Data.SqlClient/6.1.3": {
"dependencies": {
"Azure.Core": "1.47.1",
"Azure.Identity": "1.14.2",
"Microsoft.Bcl.Cryptography": "9.0.4",
"Microsoft.Data.SqlClient.SNI.runtime": "6.0.2",
"Microsoft.IdentityModel.JsonWebTokens": "7.7.1",
"Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.7.1",
"Microsoft.SqlServer.Server": "1.0.0",
"System.Configuration.ConfigurationManager": "9.0.4"
},
"runtime": {
"lib/net9.0/Microsoft.Data.SqlClient.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.13.25316.3"
}
},
"resources": {
"lib/net9.0/cs/Microsoft.Data.SqlClient.resources.dll": {
"locale": "cs"
},
"lib/net9.0/de/Microsoft.Data.SqlClient.resources.dll": {
"locale": "de"
},
"lib/net9.0/es/Microsoft.Data.SqlClient.resources.dll": {
"locale": "es"
},
"lib/net9.0/fr/Microsoft.Data.SqlClient.resources.dll": {
"locale": "fr"
},
"lib/net9.0/it/Microsoft.Data.SqlClient.resources.dll": {
"locale": "it"
},
"lib/net9.0/ja/Microsoft.Data.SqlClient.resources.dll": {
"locale": "ja"
},
"lib/net9.0/ko/Microsoft.Data.SqlClient.resources.dll": {
"locale": "ko"
},
"lib/net9.0/pl/Microsoft.Data.SqlClient.resources.dll": {
"locale": "pl"
},
"lib/net9.0/pt-BR/Microsoft.Data.SqlClient.resources.dll": {
"locale": "pt-BR"
},
"lib/net9.0/ru/Microsoft.Data.SqlClient.resources.dll": {
"locale": "ru"
},
"lib/net9.0/tr/Microsoft.Data.SqlClient.resources.dll": {
"locale": "tr"
},
"lib/net9.0/zh-Hans/Microsoft.Data.SqlClient.resources.dll": {
"locale": "zh-Hans"
},
"lib/net9.0/zh-Hant/Microsoft.Data.SqlClient.resources.dll": {
"locale": "zh-Hant"
}
},
"runtimeTargets": {
"runtimes/unix/lib/net9.0/Microsoft.Data.SqlClient.dll": {
"rid": "unix",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.13.25316.3"
},
"runtimes/win/lib/net9.0/Microsoft.Data.SqlClient.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.13.25316.3"
}
}
},
"Microsoft.Data.SqlClient.SNI.runtime/6.0.2": {
"runtimeTargets": {
"runtimes/win-arm64/native/Microsoft.Data.SqlClient.SNI.dll": {
"rid": "win-arm64",
"assetType": "native",
"fileVersion": "6.2.0.0"
},
"runtimes/win-x64/native/Microsoft.Data.SqlClient.SNI.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "6.2.0.0"
},
"runtimes/win-x86/native/Microsoft.Data.SqlClient.SNI.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "6.2.0.0"
}
}
},
"Microsoft.Identity.Client/4.73.1": {
"dependencies": {
"Microsoft.IdentityModel.Abstractions": "7.7.1"
},
"runtime": {
"lib/net8.0/Microsoft.Identity.Client.dll": {
"assemblyVersion": "4.73.1.0",
"fileVersion": "4.73.1.0"
}
}
},
"Microsoft.Identity.Client.Extensions.Msal/4.73.1": {
"dependencies": {
"Microsoft.Identity.Client": "4.73.1",
"System.Security.Cryptography.ProtectedData": "9.0.4"
},
"runtime": {
"lib/net8.0/Microsoft.Identity.Client.Extensions.Msal.dll": {
"assemblyVersion": "4.73.1.0",
"fileVersion": "4.73.1.0"
}
}
},
"Microsoft.IdentityModel.Abstractions/7.7.1": {
"runtime": {
"lib/net8.0/Microsoft.IdentityModel.Abstractions.dll": {
"assemblyVersion": "7.7.1.0",
"fileVersion": "7.7.1.50719"
}
}
},
"Microsoft.IdentityModel.JsonWebTokens/7.7.1": {
"dependencies": {
"Microsoft.IdentityModel.Tokens": "7.7.1"
},
"runtime": {
"lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll": {
"assemblyVersion": "7.7.1.0",
"fileVersion": "7.7.1.50719"
}
}
},
"Microsoft.IdentityModel.Logging/7.7.1": {
"dependencies": {
"Microsoft.IdentityModel.Abstractions": "7.7.1"
},
"runtime": {
"lib/net8.0/Microsoft.IdentityModel.Logging.dll": {
"assemblyVersion": "7.7.1.0",
"fileVersion": "7.7.1.50719"
}
}
},
"Microsoft.IdentityModel.Protocols/7.7.1": {
"dependencies": {
"Microsoft.IdentityModel.Tokens": "7.7.1"
},
"runtime": {
"lib/net8.0/Microsoft.IdentityModel.Protocols.dll": {
"assemblyVersion": "7.7.1.0",
"fileVersion": "7.7.1.50719"
}
}
},
"Microsoft.IdentityModel.Protocols.OpenIdConnect/7.7.1": {
"dependencies": {
"Microsoft.IdentityModel.Protocols": "7.7.1",
"System.IdentityModel.Tokens.Jwt": "7.7.1"
},
"runtime": {
"lib/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": {
"assemblyVersion": "7.7.1.0",
"fileVersion": "7.7.1.50719"
}
}
},
"Microsoft.IdentityModel.Tokens/7.7.1": {
"dependencies": {
"Microsoft.IdentityModel.Logging": "7.7.1"
},
"runtime": {
"lib/net8.0/Microsoft.IdentityModel.Tokens.dll": {
"assemblyVersion": "7.7.1.0",
"fileVersion": "7.7.1.50719"
}
}
},
"Microsoft.SqlServer.Server/1.0.0": {
"runtime": {
"lib/netstandard2.0/Microsoft.SqlServer.Server.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"System.ClientModel/1.5.1": {
"dependencies": {
"System.Memory.Data": "8.0.1"
},
"runtime": {
"lib/net8.0/System.ClientModel.dll": {
"assemblyVersion": "1.5.1.0",
"fileVersion": "1.500.125.36405"
}
}
},
"System.Configuration.ConfigurationManager/9.0.4": {
"dependencies": {
"System.Security.Cryptography.ProtectedData": "9.0.4"
},
"runtime": {
"lib/net9.0/System.Configuration.ConfigurationManager.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.425.16305"
}
}
},
"System.IdentityModel.Tokens.Jwt/7.7.1": {
"dependencies": {
"Microsoft.IdentityModel.JsonWebTokens": "7.7.1",
"Microsoft.IdentityModel.Tokens": "7.7.1"
},
"runtime": {
"lib/net8.0/System.IdentityModel.Tokens.Jwt.dll": {
"assemblyVersion": "7.7.1.0",
"fileVersion": "7.7.1.50719"
}
}
},
"System.Memory.Data/8.0.1": {
"runtime": {
"lib/net8.0/System.Memory.Data.dll": {
"assemblyVersion": "8.0.0.1",
"fileVersion": "8.0.1024.46610"
}
}
},
"System.Security.Cryptography.ProtectedData/9.0.4": {
"runtime": {
"lib/net9.0/System.Security.Cryptography.ProtectedData.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.425.16305"
}
}
}
}
},
"libraries": {
"PlotLine/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Azure.Core/1.47.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-oPcncSsDHuxB8SC522z47xbp2+ttkcKv2YZ90KXhRKN0YQd2+7l1UURT9EBzUNEXtkLZUOAB5xbByMTrYRh3yA==",
"path": "azure.core/1.47.1",
"hashPath": "azure.core.1.47.1.nupkg.sha512"
},
"Azure.Identity/1.14.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YhNMwOTwT+I2wIcJKSdP0ADyB2aK+JaYWZxO8LSRDm5w77LFr0ykR9xmt2ZV5T1gaI7xU6iNFIh/yW1dAlpddQ==",
"path": "azure.identity/1.14.2",
"hashPath": "azure.identity.1.14.2.nupkg.sha512"
},
"Dapper/2.1.66": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/q77jUgDOS+bzkmk3Vy9SiWMaetTw+NOoPAV0xPBsGVAyljd5S6P+4RUW7R3ZUGGr9lDRyPKgAMj2UAOwvqZYw==",
"path": "dapper/2.1.66",
"hashPath": "dapper.2.1.66.nupkg.sha512"
},
"Microsoft.Bcl.AsyncInterfaces/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==",
"path": "microsoft.bcl.asyncinterfaces/8.0.0",
"hashPath": "microsoft.bcl.asyncinterfaces.8.0.0.nupkg.sha512"
},
"Microsoft.Bcl.Cryptography/9.0.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YgZYAWzyNuPVtPq6WNm0bqOWNjYaWgl5mBWTGZyNoXitYBUYSp6iUB9AwK0V1mo793qRJUXz2t6UZrWITZSvuQ==",
"path": "microsoft.bcl.cryptography/9.0.4",
"hashPath": "microsoft.bcl.cryptography.9.0.4.nupkg.sha512"
},
"Microsoft.Data.SqlClient/6.1.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ys/z8Tx8074CDU20EilNvBRJuJdwKSthpHkzUpt3JghnjB6GjbZusoOcCtNbhPCCWsEJqN8bxaT7HnS3UZuUDQ==",
"path": "microsoft.data.sqlclient/6.1.3",
"hashPath": "microsoft.data.sqlclient.6.1.3.nupkg.sha512"
},
"Microsoft.Data.SqlClient.SNI.runtime/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==",
"path": "microsoft.data.sqlclient.sni.runtime/6.0.2",
"hashPath": "microsoft.data.sqlclient.sni.runtime.6.0.2.nupkg.sha512"
},
"Microsoft.Identity.Client/4.73.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NnDLS8QwYqO5ZZecL2oioi1LUqjh5Ewk4bMLzbgiXJbQmZhDLtKwLxL3DpGMlQAJ2G4KgEnvGPKa+OOgffeJbw==",
"path": "microsoft.identity.client/4.73.1",
"hashPath": "microsoft.identity.client.4.73.1.nupkg.sha512"
},
"Microsoft.Identity.Client.Extensions.Msal/4.73.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xDztAiV2F0wI0W8FLKv5cbaBefyLD6JVaAsvgSN7bjWNCzGYzHbcOEIP5s4TJXUpQzMfUyBsFl1mC6Zmgpz0PQ==",
"path": "microsoft.identity.client.extensions.msal/4.73.1",
"hashPath": "microsoft.identity.client.extensions.msal.4.73.1.nupkg.sha512"
},
"Microsoft.IdentityModel.Abstractions/7.7.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-S7sHg6gLg7oFqNGLwN1qSbJDI+QcRRj8SuJ1jHyCmKSipnF6ZQL+tFV2NzVfGj/xmGT9TykQdQiBN+p5Idl4TA==",
"path": "microsoft.identitymodel.abstractions/7.7.1",
"hashPath": "microsoft.identitymodel.abstractions.7.7.1.nupkg.sha512"
},
"Microsoft.IdentityModel.JsonWebTokens/7.7.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3Izi75UCUssvo8LPx3OVnEeZay58qaFicrtSnbtUt7q8qQi0gy46gh4V8VUTkMVMKXV6VMyjBVmeNNgeCUJuIw==",
"path": "microsoft.identitymodel.jsonwebtokens/7.7.1",
"hashPath": "microsoft.identitymodel.jsonwebtokens.7.7.1.nupkg.sha512"
},
"Microsoft.IdentityModel.Logging/7.7.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BZNgSq/o8gsKExdYoBKPR65fdsxW0cTF8PsdqB8y011AGUJJW300S/ZIsEUD0+sOmGc003Gwv3FYbjrVjvsLNQ==",
"path": "microsoft.identitymodel.logging/7.7.1",
"hashPath": "microsoft.identitymodel.logging.7.7.1.nupkg.sha512"
},
"Microsoft.IdentityModel.Protocols/7.7.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-h+fHHBGokepmCX+QZXJk4Ij8OApCb2n2ktoDkNX5CXteXsOxTHMNgjPGpAwdJMFvAL7TtGarUnk3o97NmBq2QQ==",
"path": "microsoft.identitymodel.protocols/7.7.1",
"hashPath": "microsoft.identitymodel.protocols.7.7.1.nupkg.sha512"
},
"Microsoft.IdentityModel.Protocols.OpenIdConnect/7.7.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-yT2Hdj8LpPbcT9C9KlLVxXl09C8zjFaVSaApdOwuecMuoV4s6Sof/mnTDz/+F/lILPIBvrWugR9CC7iRVZgbfQ==",
"path": "microsoft.identitymodel.protocols.openidconnect/7.7.1",
"hashPath": "microsoft.identitymodel.protocols.openidconnect.7.7.1.nupkg.sha512"
},
"Microsoft.IdentityModel.Tokens/7.7.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fQ0VVCba75lknUHGldi3iTKAYUQqbzp1Un8+d9cm9nON0Gs8NAkXddNg8iaUB0qi/ybtAmNWizTR4avdkCJ9pQ==",
"path": "microsoft.identitymodel.tokens/7.7.1",
"hashPath": "microsoft.identitymodel.tokens.7.7.1.nupkg.sha512"
},
"Microsoft.SqlServer.Server/1.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==",
"path": "microsoft.sqlserver.server/1.0.0",
"hashPath": "microsoft.sqlserver.server.1.0.0.nupkg.sha512"
},
"System.ClientModel/1.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-k2jKSO0X45IqhVOT9iQB4xralNN9foRQsRvXBTyRpAVxyzCJlG895T9qYrQWbcJ6OQXxOouJQ37x5nZH5XKK+A==",
"path": "system.clientmodel/1.5.1",
"hashPath": "system.clientmodel.1.5.1.nupkg.sha512"
},
"System.Configuration.ConfigurationManager/9.0.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dvjqKp+2LpGid6phzrdrS/2mmEPxFl3jE1+L7614q4ZChKbLJCpHXg6sBILlCCED1t//EE+un/UdAetzIMpqnw==",
"path": "system.configuration.configurationmanager/9.0.4",
"hashPath": "system.configuration.configurationmanager.9.0.4.nupkg.sha512"
},
"System.IdentityModel.Tokens.Jwt/7.7.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rQkO1YbAjLwnDJSMpRhRtrc6XwIcEOcUvoEcge+evurpzSZM3UNK+MZfD3sKyTlYsvknZ6eJjSBfnmXqwOsT9Q==",
"path": "system.identitymodel.tokens.jwt/7.7.1",
"hashPath": "system.identitymodel.tokens.jwt.7.7.1.nupkg.sha512"
},
"System.Memory.Data/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BVYuec3jV23EMRDeR7Dr1/qhx7369dZzJ9IWy2xylvb4YfXsrUxspWc4UWYid/tj4zZK58uGZqn2WQiaDMhmAg==",
"path": "system.memory.data/8.0.1",
"hashPath": "system.memory.data.8.0.1.nupkg.sha512"
},
"System.Security.Cryptography.ProtectedData/9.0.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-o94k2RKuAce3GeDMlUvIXlhVa1kWpJw95E6C9LwW0KlG0nj5+SgCiIxJ2Eroqb9sLtG1mEMbFttZIBZ13EJPvQ==",
"path": "system.security.cryptography.protecteddata/9.0.4",
"hashPath": "system.security.cryptography.protecteddata.9.0.4.nupkg.sha512"
}
}
}

Binary file not shown.

View File

@ -0,0 +1,19 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "10.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,12 @@
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=PlotLine;User Id=PlotLineApp;Password=t6eb1cvd9bNB27czde#h9r;MultipleActiveResultSets=true;Encrypt=false;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -177,8 +177,24 @@ public sealed class ScenesController(ISceneService scenes, IPlotService plots, I
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> AddSceneCharacter(SceneCharacterCreateViewModel model)
{
try
{
await characters.AddSceneCharacterAsync(model);
}
catch (InvalidOperationException ex)
{
TempData["SceneCharacterAddError"] = ex.Message;
}
return RedirectForScene(model.SceneID, model.ReturnProjectID, model.ReturnBookID);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UpdateSceneCharacter(SceneCharacterEditViewModel model)
{
await characters.UpdateSceneCharacterAsync(model);
return RedirectForScene(model.SceneID, model.ReturnProjectID, model.ReturnBookID);
}

View File

@ -118,6 +118,7 @@ public interface ICharacterService
Task<int> SaveCharacterAsync(CharacterEditViewModel model);
Task ArchiveCharacterAsync(int characterId);
Task<int> AddSceneCharacterAsync(SceneCharacterCreateViewModel model);
Task<int> UpdateSceneCharacterAsync(SceneCharacterEditViewModel model);
Task DeleteSceneCharacterAsync(int sceneCharacterId);
Task<int> AddAttributeEventAsync(CharacterAttributeEventCreateViewModel model);
Task<int> AddKnowledgeAsync(CharacterKnowledgeCreateViewModel model);
@ -791,6 +792,10 @@ public sealed class TimelineService(
var assetTimeline = await assets.GetTimelineAsync(projectId, bookId);
var characterTimeline = await characters.GetTimelineAsync(projectId, bookId);
var scenePovLabels = characterTimeline.Appearances
.Where(x => x.RoleInSceneTypeName?.Contains("POV", StringComparison.OrdinalIgnoreCase) == true)
.GroupBy(x => x.SceneID)
.ToDictionary(x => x.Key, x => x.First().CharacterName);
var matchingSceneIds = await BuildMatchingSceneIdsAsync(filter, orderedScenes, timeline.ThreadEvents, assetTimeline.Events, characterTimeline.Appearances, projectId, bookId);
var focusSceneIds = await BuildFocusSceneIdsAsync(filter, orderedScenes, timeline.ThreadEvents, assetTimeline.Events, characterTimeline.Appearances, projectId, bookId);
var focusLabel = BuildFocusLabel(filter, plotLines, plotThreads, allAssets, allCharacters, allLocations);
@ -851,6 +856,7 @@ public sealed class TimelineService(
CharacterLanes = BuildCharacterLanes(characterTimeline.Characters, characterTimeline.Appearances, orderedScenes),
MatchingSceneIDs = matchingSceneIds,
FocusSceneIDs = focusSceneIds,
ScenePovLabels = scenePovLabels,
FocusLabel = focusLabel
};
}
@ -1970,7 +1976,7 @@ public sealed class CharacterService(IProjectRepository projects, ICharacterRepo
{
if (!model.ReturnProjectID.HasValue || string.IsNullOrWhiteSpace(model.NewCharacterName))
{
throw new InvalidOperationException("Choose a character or enter a new character name.");
throw new InvalidOperationException("Select an existing character or enter a new character name.");
}
characterId = await characters.SaveCharacterAsync(new Character
@ -1997,6 +2003,23 @@ public sealed class CharacterService(IProjectRepository projects, ICharacterRepo
});
}
public Task<int> UpdateSceneCharacterAsync(SceneCharacterEditViewModel model) => characters.SaveSceneCharacterAsync(new SceneCharacter
{
SceneCharacterID = model.SceneCharacterID,
SceneID = model.SceneID,
CharacterID = model.CharacterID,
RoleInSceneTypeID = model.RoleInSceneTypeID,
PresenceTypeID = model.PresenceTypeID,
LocationID = model.LocationID,
EntryLocationID = model.EntryLocationID,
ExitLocationID = model.ExitLocationID,
AppearanceNotes = model.AppearanceNotes,
OutfitDescription = model.OutfitDescription,
PhysicalCondition = model.PhysicalCondition,
EmotionalState = model.EmotionalState,
KnowledgeNotes = model.KnowledgeNotes
});
public Task DeleteSceneCharacterAsync(int sceneCharacterId) => characters.DeleteSceneCharacterAsync(sceneCharacterId);
public Task<int> AddAttributeEventAsync(CharacterAttributeEventCreateViewModel model) => characters.SaveAttributeEventAsync(new CharacterAttributeEvent

View File

@ -0,0 +1,47 @@
CREATE OR ALTER PROCEDURE dbo.SceneCharacter_Save
@SceneCharacterID int = NULL, @SceneID int, @CharacterID int, @RoleInSceneTypeID int = NULL, @PresenceTypeID int = NULL,
@LocationID int = NULL, @EntryLocationID int = NULL, @ExitLocationID int = NULL,
@AppearanceNotes nvarchar(max) = NULL, @OutfitDescription nvarchar(max) = NULL, @PhysicalCondition nvarchar(max) = NULL,
@EmotionalState nvarchar(max) = NULL, @KnowledgeNotes nvarchar(max) = NULL
AS
BEGIN
SET NOCOUNT ON;
IF @SceneCharacterID IS NULL OR @SceneCharacterID = 0
BEGIN
SELECT @SceneCharacterID = SceneCharacterID
FROM dbo.SceneCharacters
WHERE SceneID = @SceneID AND CharacterID = @CharacterID;
END
IF @SceneCharacterID IS NULL OR @SceneCharacterID = 0
BEGIN
INSERT dbo.SceneCharacters (SceneID, CharacterID, RoleInSceneTypeID, PresenceTypeID, LocationID, EntryLocationID, ExitLocationID,
AppearanceNotes, OutfitDescription, PhysicalCondition, EmotionalState, KnowledgeNotes)
VALUES (@SceneID, @CharacterID, @RoleInSceneTypeID, @PresenceTypeID, @LocationID, @EntryLocationID, @ExitLocationID,
@AppearanceNotes, @OutfitDescription, @PhysicalCondition, @EmotionalState, @KnowledgeNotes);
SET @SceneCharacterID = CAST(SCOPE_IDENTITY() AS int);
END
ELSE
BEGIN
UPDATE dbo.SceneCharacters
SET SceneID = @SceneID,
CharacterID = @CharacterID,
RoleInSceneTypeID = @RoleInSceneTypeID,
PresenceTypeID = @PresenceTypeID,
LocationID = @LocationID,
EntryLocationID = @EntryLocationID,
ExitLocationID = @ExitLocationID,
AppearanceNotes = @AppearanceNotes,
OutfitDescription = @OutfitDescription,
PhysicalCondition = @PhysicalCondition,
EmotionalState = @EmotionalState,
KnowledgeNotes = @KnowledgeNotes,
UpdatedDate = SYSUTCDATETIME()
WHERE SceneCharacterID = @SceneCharacterID;
END
SELECT @SceneCharacterID;
END;
GO

View File

@ -218,6 +218,7 @@ public sealed class TimelineViewModel
public IReadOnlyList<CharacterLaneViewModel> CharacterLanes { get; set; } = [];
public IReadOnlySet<int> MatchingSceneIDs { get; set; } = new HashSet<int>();
public IReadOnlySet<int> FocusSceneIDs { get; set; } = new HashSet<int>();
public IReadOnlyDictionary<int, string> ScenePovLabels { get; set; } = new Dictionary<int, string>();
public string? FocusLabel { get; set; }
public ContinuityValidationSummary? LastValidationSummary { get; set; }
}
@ -600,6 +601,25 @@ public sealed class SceneCharacterCreateViewModel
public int? ReturnBookID { get; set; }
}
public sealed class SceneCharacterEditViewModel
{
public int SceneCharacterID { get; set; }
public int SceneID { get; set; }
public int CharacterID { get; set; }
public int? RoleInSceneTypeID { get; set; }
public int? PresenceTypeID { get; set; }
public int? LocationID { get; set; }
public int? EntryLocationID { get; set; }
public int? ExitLocationID { get; set; }
public string? AppearanceNotes { get; set; }
public string? OutfitDescription { get; set; }
public string? PhysicalCondition { get; set; }
public string? EmotionalState { get; set; }
public string? KnowledgeNotes { get; set; }
public int? ReturnProjectID { get; set; }
public int? ReturnBookID { get; set; }
}
public sealed class CharacterAttributeEventCreateViewModel
{
public int SceneID { get; set; }

View File

@ -689,20 +689,22 @@
<div class="asset-event-list">
@foreach (var character in Model.SceneCharacters)
{
<div class="asset-event-item character-item">
var editId = $"scene-character-edit-{character.SceneCharacterID}";
<article class="character-appearance-card">
<div class="character-appearance-summary">
<div>
<strong>@character.CharacterName</strong>
<span class="muted">@character.RoleInSceneTypeName / @character.PresenceTypeName</span>
@if (!string.IsNullOrWhiteSpace(character.LocationName))
<span class="muted">@((character.RoleInSceneTypeName ?? "Role not set")) • @((character.PresenceTypeName ?? "Presence not set"))</span>
<span class="muted" title="@character.LocationPath">Location: @(character.LocationName ?? "Not set")</span>
<span class="muted">Entry: @(character.EntryLocationName ?? "Not set")</span>
<span class="muted">Exit: @(character.ExitLocationName ?? "Not set")</span>
@if (!string.IsNullOrWhiteSpace(character.OutfitDescription) || !string.IsNullOrWhiteSpace(character.PhysicalCondition) || !string.IsNullOrWhiteSpace(character.EmotionalState))
{
<span class="muted" title="@character.LocationPath">Location: @character.LocationName</span>
}
@if (!string.IsNullOrWhiteSpace(character.EntryLocationName) || !string.IsNullOrWhiteSpace(character.ExitLocationName))
{
<span class="muted">In: @(character.EntryLocationName ?? "not set") / Out: @(character.ExitLocationName ?? "not set")</span>
}
<span class="muted">@character.OutfitDescription @character.PhysicalCondition @character.EmotionalState</span>
}
</div>
<div class="character-appearance-actions">
<button class="btn btn-outline-primary btn-sm" type="button" data-bs-toggle="collapse" data-bs-target="#@editId" aria-expanded="false" aria-controls="@editId">Edit</button>
<form asp-controller="Scenes" asp-action="DeleteSceneCharacter" method="post">
<input type="hidden" name="id" value="@character.SceneCharacterID" />
<input type="hidden" name="sceneId" value="@Model.SceneID" />
@ -711,6 +713,90 @@
<button class="btn btn-outline-secondary btn-sm" type="submit">Remove</button>
</form>
</div>
</div>
<div class="collapse character-appearance-edit" id="@editId">
<form asp-controller="Scenes" asp-action="UpdateSceneCharacter" method="post" class="asset-create-form">
<input type="hidden" name="SceneCharacterID" value="@character.SceneCharacterID" />
<input type="hidden" name="SceneID" value="@Model.SceneID" />
<input type="hidden" name="CharacterID" value="@character.CharacterID" />
<input type="hidden" name="ReturnProjectID" value="@Model.ReturnProjectID" />
<input type="hidden" name="ReturnBookID" value="@Model.ReturnBookID" />
<div class="row g-2">
<div class="col-6">
<label class="form-label" for="RoleInSceneTypeID-@character.SceneCharacterID">Role</label>
<select class="form-select form-select-sm" id="RoleInSceneTypeID-@character.SceneCharacterID" name="RoleInSceneTypeID">
<option value="">Not set</option>
@foreach (var option in Model.CharacterRoleOptions)
{
<option value="@option.Value" selected="@(option.Value == character.RoleInSceneTypeID?.ToString())">@option.Text</option>
}
</select>
</div>
<div class="col-6">
<label class="form-label" for="PresenceTypeID-@character.SceneCharacterID">Presence</label>
<select class="form-select form-select-sm" id="PresenceTypeID-@character.SceneCharacterID" name="PresenceTypeID">
<option value="">Not set</option>
@foreach (var option in Model.PresenceTypeOptions)
{
<option value="@option.Value" selected="@(option.Value == character.PresenceTypeID?.ToString())">@option.Text</option>
}
</select>
</div>
<div class="col-12">
<label class="form-label" for="CharacterLocationID-@character.SceneCharacterID">Current location</label>
<select class="form-select form-select-sm" id="CharacterLocationID-@character.SceneCharacterID" name="LocationID">
<option value="">Not set</option>
@foreach (var option in Model.LocationOptions)
{
<option value="@option.Value" selected="@(option.Value == character.LocationID?.ToString())">@option.Text</option>
}
</select>
</div>
<div class="col-6">
<label class="form-label" for="EntryLocationID-@character.SceneCharacterID">Enters from</label>
<select class="form-select form-select-sm" id="EntryLocationID-@character.SceneCharacterID" name="EntryLocationID">
<option value="">Not set</option>
@foreach (var option in Model.LocationOptions)
{
<option value="@option.Value" selected="@(option.Value == character.EntryLocationID?.ToString())">@option.Text</option>
}
</select>
</div>
<div class="col-6">
<label class="form-label" for="ExitLocationID-@character.SceneCharacterID">Exits to</label>
<select class="form-select form-select-sm" id="ExitLocationID-@character.SceneCharacterID" name="ExitLocationID">
<option value="">Not set</option>
@foreach (var option in Model.LocationOptions)
{
<option value="@option.Value" selected="@(option.Value == character.ExitLocationID?.ToString())">@option.Text</option>
}
</select>
</div>
<div class="col-12">
<label class="form-label" for="AppearanceNotes-@character.SceneCharacterID">Appearance notes</label>
<textarea class="form-control form-control-sm" id="AppearanceNotes-@character.SceneCharacterID" name="AppearanceNotes" rows="2">@character.AppearanceNotes</textarea>
</div>
<div class="col-12">
<label class="form-label" for="OutfitDescription-@character.SceneCharacterID">Outfit description</label>
<input class="form-control form-control-sm" id="OutfitDescription-@character.SceneCharacterID" name="OutfitDescription" value="@character.OutfitDescription" />
</div>
<div class="col-6">
<label class="form-label" for="PhysicalCondition-@character.SceneCharacterID">Physical condition</label>
<input class="form-control form-control-sm" id="PhysicalCondition-@character.SceneCharacterID" name="PhysicalCondition" value="@character.PhysicalCondition" />
</div>
<div class="col-6">
<label class="form-label" for="EmotionalState-@character.SceneCharacterID">Emotional state</label>
<input class="form-control form-control-sm" id="EmotionalState-@character.SceneCharacterID" name="EmotionalState" value="@character.EmotionalState" />
</div>
<div class="col-12">
<label class="form-label" for="KnowledgeNotes-@character.SceneCharacterID">Knowledge notes</label>
<textarea class="form-control form-control-sm" id="KnowledgeNotes-@character.SceneCharacterID" name="KnowledgeNotes" rows="2">@character.KnowledgeNotes</textarea>
</div>
</div>
<button class="btn btn-outline-primary btn-sm mt-2" type="submit">Save character</button>
</form>
</div>
</article>
}
</div>
}
@ -719,6 +805,11 @@
<input type="hidden" name="SceneID" value="@Model.SceneID" />
<input type="hidden" name="ReturnProjectID" value="@Model.ReturnProjectID" />
<input type="hidden" name="ReturnBookID" value="@Model.ReturnBookID" />
<h4 class="inspector-subheading">Add character to scene</h4>
@if (TempData["SceneCharacterAddError"] is string addCharacterError)
{
<p class="text-danger form-helper-message">@addCharacterError</p>
}
<div class="row g-2">
<div class="col-12">
<label class="form-label" for="CharacterID">Character</label>
@ -766,7 +857,7 @@
<div class="col-6"><input class="form-control form-control-sm" name="EmotionalState" placeholder="Emotional state" /></div>
<div class="col-12"><textarea class="form-control form-control-sm" name="KnowledgeNotes" rows="2" placeholder="Knowledge notes"></textarea></div>
</div>
<button class="btn btn-outline-primary btn-sm mt-2" type="submit">Add character</button>
<button class="btn btn-outline-primary btn-sm mt-2" type="submit">Add character to scene</button>
</form>
</section>

View File

@ -25,6 +25,7 @@
})
};
var hasActiveFilter = Model.MatchingSceneIDs.Count != Model.OrderedScenes.Count || !string.IsNullOrWhiteSpace(Model.FocusLabel);
var warningScenes = Model.OrderedScenes.Where(x => x.WarningCount > 0).ToList();
}
<section class="context-header">
@ -180,6 +181,20 @@
<div class="timeline-visibility-panel">
<span class="eyebrow">Visibility</span>
<label class="timeline-control-select">Density
<select class="form-select form-select-sm" data-timeline-density>
<option value="compact">Compact</option>
<option value="comfortable">Comfortable</option>
<option value="expanded">Expanded</option>
</select>
</label>
<label class="timeline-control-select">Zoom
<select class="form-select form-select-sm" data-timeline-zoom>
<option value="book">Book</option>
<option value="chapter">Chapter</option>
<option value="scene-detail">Scene Detail</option>
</select>
</label>
<label><input type="checkbox" data-timeline-toggle="scene-cards" checked /> Scene cards</label>
<label><input type="checkbox" data-timeline-toggle="plot-lines" checked /> Plot lines</label>
<label><input type="checkbox" data-timeline-toggle="assets" checked /> Story assets</label>
@ -189,6 +204,63 @@
<label><input type="checkbox" data-timeline-toggle="metrics" checked /> Metrics</label>
</div>
<div class="timeline-jump-panel">
<span class="eyebrow">Jump / search</span>
<input class="form-control form-control-sm" type="search" placeholder="Search timeline..." data-timeline-search />
<select class="form-select form-select-sm" data-timeline-jump>
<option value="">Jump to scene</option>
@foreach (var book in Model.Books)
{
@foreach (var chapter in book.Chapters)
{
@foreach (var scene in chapter.Scenes)
{
<option value="@scene.SceneID">Ch @chapter.Chapter.ChapterNumber / Scene @scene.SceneNumber: @scene.SceneTitle</option>
}
}
}
</select>
<select class="form-select form-select-sm" data-timeline-warning-jump>
<option value="">Jump to warning</option>
@foreach (var scene in warningScenes)
{
<option value="@scene.SceneID">@scene.WarningCount warning@(scene.WarningCount == 1 ? "" : "s") - Scene @scene.SceneNumber: @scene.SceneTitle</option>
}
</select>
<select class="form-select form-select-sm" data-timeline-entity-jump>
<option value="">Jump to lane item</option>
@foreach (var lane in Model.PlotLanes)
{
var firstScene = lane.SceneSlots.FirstOrDefault(x => x.Events.Any())?.Scene;
if (firstScene is not null)
{
<option value="@firstScene.SceneID">Plot line: @lane.PlotLine.PlotLineName</option>
}
}
@foreach (var lane in Model.AssetLanes)
{
var firstScene = lane.SceneSlots.FirstOrDefault(x => x.Events.Any())?.Scene;
if (firstScene is not null)
{
<option value="@firstScene.SceneID">Asset: @lane.Asset.AssetName</option>
}
}
@foreach (var lane in Model.CharacterLanes)
{
var firstScene = lane.SceneSlots.FirstOrDefault(x => x.Appearances.Any())?.Scene;
if (firstScene is not null)
{
<option value="@firstScene.SceneID">Character: @lane.Character.CharacterName</option>
}
}
@foreach (var locationScene in Model.OrderedScenes.Where(x => !string.IsNullOrWhiteSpace(x.PrimaryLocationName)).GroupBy(x => x.PrimaryLocationName).Select(x => x.First()))
{
<option value="@locationScene.SceneID">Location: @locationScene.PrimaryLocationName</option>
}
</select>
<span class="timeline-shortcut-hint">Shortcuts: arrows scroll, +/- zoom, Esc clears focus</span>
</div>
<div class="timeline-preset-panel">
<form asp-action="SavePreset" method="post" data-timeline-preset-form>
<input type="hidden" name="ProjectID" value="@Model.Project.ProjectID" />
@ -248,6 +320,25 @@
</section>
}
@if (Model.Books.Any())
{
<section class="timeline-minimap" data-timeline-minimap>
@foreach (var book in Model.Books)
{
@foreach (var chapter in book.Chapters)
{
var chapterWarnings = chapter.Scenes.Sum(x => x.WarningCount);
<button type="button"
data-jump-scene="@chapter.Scenes.FirstOrDefault()?.SceneID"
style="--chapter-scenes:@Math.Max(chapter.Scenes.Count, 1); --chapter-warnings:@Math.Min(chapterWarnings, 8)"
title="Chapter @chapter.Chapter.ChapterNumber: @chapter.Chapter.ChapterTitle (@chapter.Scenes.Count scenes, @chapterWarnings warnings)">
<span>Ch @chapter.Chapter.ChapterNumber</span>
</button>
}
}
</section>
}
@if (!Model.Books.Any())
{
<section class="empty-panel">
@ -260,6 +351,11 @@ else
<div class="workspace-layout timeline-filtered-root" data-timeline-root>
<main class="timeline-workspace">
<section class="timeline-shell workspace-timeline" data-timeline-section="scene-cards">
<div class="timeline-section-header" data-collapse-target="scene-cards">
<button type="button" data-collapse-toggle="scene-cards">Scene Cards</button>
<span>@Model.OrderedScenes.Count scene@(Model.OrderedScenes.Count == 1 ? "" : "s")</span>
</div>
<div data-collapse-body="scene-cards">
@foreach (var book in Model.Books)
{
<div class="timeline-book">
@ -285,17 +381,30 @@ else
var selectedClass = scene.SceneID == Model.SelectedSceneID ? "selected" : "";
var matchClass = Model.MatchingSceneIDs.Contains(scene.SceneID) ? "filter-match" : "filter-dim";
var focusClass = Model.FocusSceneIDs.Contains(scene.SceneID) ? "focus-match" : (Model.FocusSceneIDs.Any() ? "focus-dim" : "");
var povLabel = Model.ScenePovLabels.GetValueOrDefault(scene.SceneID, scene.POVCharacterID.HasValue ? "POV set" : "No POV");
var metricSummary = string.Join(" / ", Model.MetricGraphs.Take(2).Select(graph => $"{graph.MetricName}: {graph.Points.FirstOrDefault(x => x.SceneID == scene.SceneID)?.Value ?? 0}"));
var plotSearch = string.Join(' ', Model.PlotLanes
.SelectMany(x => x.SceneSlots.Where(slot => slot.Scene.SceneID == scene.SceneID).SelectMany(slot => slot.Events.Select(evt => $"{x.PlotLine.PlotLineName} {evt.ThreadTitle} {evt.EventTitle}"))));
var assetSearch = string.Join(' ', Model.AssetLanes
.SelectMany(x => x.SceneSlots.Where(slot => slot.Scene.SceneID == scene.SceneID).SelectMany(slot => slot.Events.Select(evt => $"{x.Asset.AssetName} {evt.EventTitle}"))));
var characterSearch = string.Join(' ', Model.CharacterLanes
.SelectMany(x => x.SceneSlots.Where(slot => slot.Scene.SceneID == scene.SceneID).SelectMany(slot => slot.Appearances.Select(appearance => $"{x.Character.CharacterName} {appearance.RoleInSceneTypeName} {appearance.PresenceTypeName}"))));
var warningSearch = scene.WarningCount > 0 ? "warning warnings continuity" : "";
var searchText = $"{scene.SceneNumber} {scene.SceneTitle} {scene.Summary} {povLabel} {scene.PrimaryLocationName} {string.Join(' ', scene.PurposeLabels.Select(x => x.PurposeName))} {plotSearch} {assetSearch} {characterSearch} {warningSearch}";
<a class="timeline-scene-card @selectedClass @matchClass @focusClass"
data-scene-id="@scene.SceneID"
data-timeline-search-text="@searchText"
asp-controller="Timeline"
asp-action="Index"
asp-route-ProjectID="@Model.Project.ProjectID"
asp-route-BookID="@Model.SelectedBookID"
asp-route-SelectedSceneID="@scene.SceneID"
asp-route-FocusType="scene"
asp-route-FocusID="@scene.SceneID">
asp-route-FocusID="@scene.SceneID"
title="Scene @scene.SceneNumber: @scene.SceneTitle&#10;POV: @povLabel&#10;Location: @(scene.PrimaryLocationName ?? "No location")&#10;@scene.Summary">
<span class="scene-number">Scene @scene.SceneNumber</span>
<strong>@scene.SceneTitle</strong>
<span class="scene-pov-label">@povLabel</span>
<div class="scene-badge-row">
<span class="status-pill">@scene.RevisionStatusName</span>
@if (scene.WarningCount > 0)
@ -316,6 +425,10 @@ else
{
<span class="location-pill" data-location-marker title="@scene.PrimaryLocationPath">@scene.PrimaryLocationName</span>
}
@if (!string.IsNullOrWhiteSpace(metricSummary))
{
<span class="metric-mini-summary">@metricSummary</span>
}
@if (scene.PurposeLabels.Any())
{
<div class="purpose-chip-row">
@ -336,15 +449,23 @@ else
</div>
</div>
}
</div>
@if (Model.PlotLanes.Any() && Model.OrderedScenes.Any())
{
<div class="plot-lane-board" data-timeline-section="plot-lines" style="--scene-count:@Model.OrderedScenes.Count">
<div class="plot-lane-board-heading">
<span>Plot line lanes</span>
<button type="button" data-collapse-toggle="plot-lines">Plot line lanes</button>
<small>Thread event markers by scene</small>
</div>
<div data-collapse-body="plot-lines">
@foreach (var group in Model.PlotLanes.GroupBy(x => x.PlotLine.PlotLineTypeName).OrderBy(x => x.Key))
{
<div class="lane-group">
<button type="button" class="lane-group-heading" data-collapse-toggle="plot-group-@group.Key.GetHashCode()">@group.Key</button>
<div data-collapse-body="plot-group-@group.Key.GetHashCode()">
@foreach (var lane in Model.PlotLanes)
{
if (lane.PlotLine.PlotLineTypeName != group.Key) { continue; }
var laneFocusClass = Model.Filter.FocusType == "plotline" && Model.Filter.FocusID.HasValue && Model.Filter.FocusID != lane.PlotLine.PlotLineID ? "lane-dim" : "";
<div class="plot-lane-row @laneFocusClass" style="--plot-colour:@lane.PlotLine.Colour">
<a class="plot-lane-label" asp-controller="PlotLines" asp-action="Edit" asp-route-id="@lane.PlotLine.PlotLineID">
@ -380,6 +501,10 @@ else
</div>
}
</div>
</div>
}
</div>
</div>
}
else
{
@ -391,11 +516,18 @@ else
{
<div class="asset-lane-board" data-timeline-section="assets" style="--scene-count:@Model.OrderedScenes.Count">
<div class="plot-lane-board-heading">
<span>Story asset lanes</span>
<button type="button" data-collapse-toggle="assets">Story asset lanes</button>
<small>Asset event markers by scene</small>
</div>
<div data-collapse-body="assets">
@foreach (var group in Model.AssetLanes.GroupBy(x => x.Asset.Importance >= 8 ? "High importance" : "Other assets"))
{
<div class="lane-group">
<button type="button" class="lane-group-heading" data-collapse-toggle="asset-group-@group.Key.GetHashCode()">@group.Key</button>
<div data-collapse-body="asset-group-@group.Key.GetHashCode()">
@foreach (var lane in Model.AssetLanes)
{
if ((lane.Asset.Importance >= 8 ? "High importance" : "Other assets") != group.Key) { continue; }
var assetFocusClass = Model.Filter.FocusType == "asset" && Model.Filter.FocusID.HasValue && Model.Filter.FocusID != lane.Asset.StoryAssetID ? "lane-dim" : "";
<div class="asset-lane-row @assetFocusClass">
<a class="asset-lane-label" asp-controller="StoryAssets" asp-action="Details" asp-route-id="@lane.Asset.StoryAssetID">
@ -426,6 +558,10 @@ else
</div>
}
</div>
</div>
}
</div>
</div>
}
else
{
@ -437,11 +573,18 @@ else
{
<div class="character-lane-board" data-timeline-section="characters" style="--scene-count:@Model.OrderedScenes.Count">
<div class="plot-lane-board-heading">
<span>Character appearances</span>
<button type="button" data-collapse-toggle="characters">Character appearances</button>
<small>First twelve project characters</small>
</div>
@foreach (var lane in Model.CharacterLanes)
<div data-collapse-body="characters">
@foreach (var group in Model.CharacterLanes.Select((lane, index) => new { lane, group = index < 6 ? "Major characters" : "Secondary characters" }).GroupBy(x => x.group))
{
<div class="lane-group">
<button type="button" class="lane-group-heading" data-collapse-toggle="character-group-@group.Key.GetHashCode()">@group.Key</button>
<div data-collapse-body="character-group-@group.Key.GetHashCode()">
@foreach (var laneItem in group)
{
var lane = laneItem.lane;
var characterFocusClass = Model.Filter.FocusType == "character" && Model.Filter.FocusID.HasValue && Model.Filter.FocusID != lane.Character.CharacterID ? "lane-dim" : "";
<div class="character-lane-row @characterFocusClass">
<a class="character-lane-label" asp-controller="Characters" asp-action="Details" asp-route-id="@lane.Character.CharacterID">
@ -472,6 +615,10 @@ else
</div>
}
</div>
</div>
}
</div>
</div>
}
else
{
@ -485,10 +632,11 @@ else
<div class="pacing-heading">
<div>
<p class="eyebrow">Pacing</p>
<h2>Metric shape</h2>
<h2><button type="button" data-collapse-toggle="metrics">Metric shape</button></h2>
</div>
<span class="muted">@Model.OrderedScenes.Count scene@(Model.OrderedScenes.Count == 1 ? "" : "s")</span>
</div>
<div data-collapse-body="metrics">
@if (!Model.MetricGraphs.Any() || !Model.OrderedScenes.Any())
{
<p class="muted">Add scenes to begin seeing emotional and pacing shape.</p>
@ -531,6 +679,7 @@ else
</div>
</details>
}
</div>
</section>
</main>

View File

@ -866,6 +866,46 @@ a {
border-left-color: #8a6f3d;
}
.character-appearance-card {
display: grid;
gap: 8px;
border: 1px solid #d7d4ce;
border-left: 4px solid #8a6f3d;
border-radius: 8px;
padding: 10px;
background: #fff;
}
.character-appearance-summary {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
}
.character-appearance-summary > div:first-child {
display: grid;
gap: 3px;
}
.character-appearance-actions {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 6px;
}
.character-appearance-edit .asset-create-form {
margin-top: 8px;
border-top: 1px solid var(--plotline-line);
}
.form-helper-message {
margin: 0 0 8px;
font-size: 0.86rem;
font-weight: 700;
}
.scene-number,
.time-label {
color: var(--plotline-muted);
@ -1622,6 +1662,249 @@ a {
display: none;
}
.timeline-control-panel {
position: sticky;
top: 56px;
z-index: 18;
}
.timeline-control-select {
padding-right: 6px;
}
.timeline-control-select .form-select {
width: auto;
min-width: 132px;
border: 0;
padding-top: 2px;
padding-bottom: 2px;
background-color: transparent;
color: var(--plotline-accent-dark);
font-weight: 800;
}
.timeline-jump-panel {
display: grid;
grid-template-columns: auto minmax(180px, 1.2fr) minmax(180px, 1fr) minmax(170px, 0.9fr) minmax(180px, 1fr) auto;
gap: 8px;
align-items: center;
width: 100%;
}
.timeline-shortcut-hint {
color: var(--plotline-muted);
font-size: 0.76rem;
font-weight: 700;
white-space: nowrap;
}
.timeline-minimap {
display: flex;
align-items: stretch;
gap: 4px;
margin: 0 0 12px;
padding: 8px;
border: 1px solid rgba(47, 111, 99, 0.18);
border-radius: 8px;
background: rgba(255, 255, 255, 0.72);
}
.timeline-minimap button {
position: relative;
flex: var(--chapter-scenes) 1 42px;
min-width: 42px;
min-height: 34px;
border: 1px solid rgba(47, 111, 99, 0.18);
border-radius: 7px;
color: var(--plotline-accent-dark);
background: linear-gradient(180deg, #f8fbf9 0%, #edf4f1 100%);
font-size: 0.72rem;
font-weight: 800;
}
.timeline-minimap button::after {
content: "";
position: absolute;
right: 5px;
bottom: 5px;
width: calc(var(--chapter-warnings) * 4px);
max-width: 28px;
height: 4px;
border-radius: 999px;
background: #b45c5c;
opacity: 0.75;
}
.timeline-section-header,
.plot-lane-board-heading,
.pacing-heading {
position: sticky;
left: 0;
z-index: 7;
}
.timeline-section-header,
.plot-lane-board-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
width: var(--timeline-label-width);
margin-bottom: 10px;
border-radius: 8px;
padding: 8px 10px;
background: rgba(255, 255, 255, 0.92);
box-shadow: 0 8px 16px rgba(30, 37, 43, 0.05);
}
.timeline-section-header button,
.plot-lane-board-heading button,
.pacing-heading button,
.lane-group-heading {
border: 0;
padding: 0;
color: var(--plotline-accent-dark);
background: transparent;
font: inherit;
font-weight: 900;
text-align: left;
}
.timeline-section-header button::before,
.plot-lane-board-heading button::before,
.pacing-heading button::before,
.lane-group-heading::before {
content: "v";
display: inline-block;
margin-right: 6px;
color: var(--plotline-muted);
font-size: 0.72rem;
}
.timeline-section-header button.is-collapsed::before,
.plot-lane-board-heading button.is-collapsed::before,
.pacing-heading button.is-collapsed::before,
.lane-group-heading.is-collapsed::before {
content: ">";
}
.lane-group {
display: grid;
gap: 7px;
}
.lane-group-heading {
position: sticky;
left: 0;
z-index: 6;
width: var(--timeline-label-width);
border-top: 1px solid rgba(47, 111, 99, 0.12);
padding: 7px 8px 2px;
color: var(--plotline-muted);
background: rgba(247, 250, 248, 0.96);
font-size: 0.78rem;
text-transform: uppercase;
}
.timeline-section-collapsed {
display: none !important;
}
.timeline-chapter-title {
position: sticky;
top: 0;
z-index: 5;
background: rgba(238, 245, 242, 0.96);
backdrop-filter: blur(6px);
}
.scene-pov-label,
.metric-mini-summary {
display: inline-flex;
width: fit-content;
border-radius: 999px;
padding: 2px 7px;
font-size: 0.72rem;
font-weight: 800;
}
.scene-pov-label {
color: #514018;
background: #fff3d3;
}
.metric-mini-summary {
color: var(--plotline-accent-dark);
background: rgba(47, 111, 99, 0.08);
}
.timeline-scene-card.search-hit,
.timeline-scene-card.keyboard-focus {
outline: 3px solid rgba(197, 139, 43, 0.34);
box-shadow: 0 12px 26px rgba(197, 139, 43, 0.16);
}
.timeline-scene-card.search-dim {
opacity: 0.28;
}
.thread-marker,
.asset-marker,
.character-marker {
transition: transform 0.12s ease, box-shadow 0.12s ease;
}
.thread-marker:hover,
.asset-marker:hover,
.character-marker:hover {
transform: translateY(-1px);
box-shadow: 0 6px 12px rgba(30, 37, 43, 0.12);
}
.timeline-filtered-root.density-compact {
--timeline-scene-width: 170px;
--timeline-grid-gap: 6px;
}
.timeline-filtered-root.density-expanded {
--timeline-scene-width: 280px;
--timeline-grid-gap: 14px;
}
.timeline-filtered-root.density-compact .timeline-scene-card,
.timeline-filtered-root.zoom-book .timeline-scene-card {
gap: 4px;
padding: 9px;
}
.timeline-filtered-root.density-compact .scene-summary,
.timeline-filtered-root.density-compact .purpose-chip-row,
.timeline-filtered-root.density-compact .metric-mini-summary,
.timeline-filtered-root.zoom-book .scene-summary,
.timeline-filtered-root.zoom-book .purpose-chip-row,
.timeline-filtered-root.zoom-book .metric-mini-summary,
.timeline-filtered-root.zoom-book .location-pill,
.timeline-filtered-root.zoom-book .scene-pov-label {
display: none;
}
.timeline-filtered-root.zoom-book {
--timeline-scene-width: 150px;
--timeline-grid-gap: 6px;
}
.timeline-filtered-root.zoom-scene-detail {
--timeline-scene-width: 300px;
}
.timeline-filtered-root.zoom-scene-detail .scene-summary {
-webkit-line-clamp: 7;
}
.timeline-filtered-root.density-expanded .timeline-scenes {
min-height: 230px;
}
.analytics-metric-row {
display: grid;
grid-template-columns: 170px minmax(560px, 1fr);

View File

@ -342,3 +342,190 @@
applyState(state);
})();
(() => {
const root = document.querySelector("[data-timeline-root]");
if (!root) {
return;
}
const workspace = root.querySelector(".timeline-workspace") || root;
const densitySelect = document.querySelector("[data-timeline-density]");
const zoomSelect = document.querySelector("[data-timeline-zoom]");
const searchInput = document.querySelector("[data-timeline-search]");
const jumpSelects = document.querySelectorAll("[data-timeline-jump], [data-timeline-warning-jump], [data-timeline-entity-jump]");
const sceneCards = [...root.querySelectorAll(".timeline-scene-card[data-scene-id]")];
const collapsedKey = "plotline.timeline.collapsed";
const densityKey = "plotline.timeline.density";
const zoomKey = "plotline.timeline.zoom";
const densityValues = ["compact", "comfortable", "expanded"];
const zoomValues = ["book", "chapter", "scene-detail"];
const readSet = (key) => {
try {
return new Set(JSON.parse(localStorage.getItem(key) || "[]"));
} catch {
return new Set();
}
};
const collapsed = readSet(collapsedKey);
const applyMode = (kind, value, values) => {
values.forEach((item) => root.classList.remove(`${kind}-${item}`));
root.classList.add(`${kind}-${value}`);
};
const applyDensity = (value) => {
const nextValue = densityValues.includes(value) ? value : "comfortable";
applyMode("density", nextValue, densityValues);
if (densitySelect) {
densitySelect.value = nextValue;
}
localStorage.setItem(densityKey, nextValue);
};
const applyZoom = (value) => {
const nextValue = zoomValues.includes(value) ? value : "chapter";
applyMode("zoom", nextValue, zoomValues);
if (zoomSelect) {
zoomSelect.value = nextValue;
}
localStorage.setItem(zoomKey, nextValue);
};
const getScene = (sceneId) => root.querySelector(`[data-scene-id='${CSS.escape(String(sceneId))}']`);
const scrollToScene = (sceneId, focus = true) => {
const target = getScene(sceneId);
if (!target) {
return;
}
target.classList.add("keyboard-focus");
target.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" });
if (focus) {
target.focus({ preventScroll: true });
}
window.setTimeout(() => target.classList.remove("keyboard-focus"), 1800);
};
const saveCollapsed = () => localStorage.setItem(collapsedKey, JSON.stringify([...collapsed]));
const setCollapsed = (id, shouldCollapse) => {
document.querySelectorAll(`[data-collapse-body='${CSS.escape(id)}']`).forEach((body) => {
body.classList.toggle("timeline-section-collapsed", shouldCollapse);
});
document.querySelectorAll(`[data-collapse-toggle='${CSS.escape(id)}']`).forEach((button) => {
button.classList.toggle("is-collapsed", shouldCollapse);
button.setAttribute("aria-expanded", String(!shouldCollapse));
});
};
document.querySelectorAll("[data-collapse-toggle]").forEach((button) => {
const id = button.dataset.collapseToggle;
const isCollapsed = collapsed.has(id);
setCollapsed(id, isCollapsed);
button.addEventListener("click", () => {
const nextCollapsed = !collapsed.has(id);
if (nextCollapsed) {
collapsed.add(id);
} else {
collapsed.delete(id);
}
setCollapsed(id, nextCollapsed);
saveCollapsed();
});
});
densitySelect?.addEventListener("change", () => applyDensity(densitySelect.value));
zoomSelect?.addEventListener("change", () => applyZoom(zoomSelect.value));
applyDensity(localStorage.getItem(densityKey) || "comfortable");
applyZoom(localStorage.getItem(zoomKey) || "chapter");
const runSearch = () => {
const query = searchInput?.value.trim().toLowerCase() || "";
let firstMatch = null;
sceneCards.forEach((card) => {
const matches = !query || (card.dataset.timelineSearchText || "").toLowerCase().includes(query);
card.classList.toggle("search-hit", Boolean(query && matches));
card.classList.toggle("search-dim", Boolean(query && !matches));
if (!firstMatch && query && matches) {
firstMatch = card;
}
});
return firstMatch;
};
searchInput?.addEventListener("input", runSearch);
searchInput?.addEventListener("keydown", (event) => {
if (event.key !== "Enter") {
return;
}
const firstMatch = runSearch();
if (firstMatch) {
event.preventDefault();
scrollToScene(firstMatch.dataset.sceneId);
}
});
jumpSelects.forEach((select) => {
select.addEventListener("change", () => {
if (select.value) {
scrollToScene(select.value);
}
});
});
document.querySelectorAll("[data-jump-scene]").forEach((button) => {
button.addEventListener("click", () => {
if (button.dataset.jumpScene) {
scrollToScene(button.dataset.jumpScene);
}
});
});
document.addEventListener("keydown", (event) => {
const activeTag = document.activeElement?.tagName?.toLowerCase();
const isTyping = ["input", "select", "textarea"].includes(activeTag) || document.activeElement?.isContentEditable;
if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "f" && searchInput) {
event.preventDefault();
searchInput.focus();
searchInput.select();
return;
}
if (event.key === "Escape") {
const url = new URL(window.location.href);
const hadFocus = url.searchParams.has("FocusType") || url.searchParams.has("FocusID");
url.searchParams.delete("FocusType");
url.searchParams.delete("FocusID");
if (hadFocus) {
window.location.href = url.toString();
} else if (searchInput?.value) {
searchInput.value = "";
runSearch();
}
return;
}
if (isTyping) {
return;
}
if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
event.preventDefault();
workspace.scrollBy({ left: event.key === "ArrowLeft" ? -260 : 260, behavior: "smooth" });
return;
}
if (event.key === "+" || event.key === "=" || event.key === "-") {
const currentIndex = zoomValues.indexOf(zoomSelect?.value || "chapter");
const direction = event.key === "-" ? -1 : 1;
const nextIndex = Math.min(zoomValues.length - 1, Math.max(0, currentIndex + direction));
applyZoom(zoomValues[nextIndex]);
}
});
})();