示例#1
0
        public Clue CreateProviderRoot()
        {
            var clue = this.Create(EntityType.Provider.Root, "ExchangeSharedMailbox");
            //??

            // TODO: Need to update?
            var data = clue.Data;

            data.EntityData.Name          = "Exchange Shared Mailbox";
            data.EntityData.Description   = "Exchange Shared Mailbox allows you to integrate shared Mailboxes.";
            data.EntityData.DisplayName   = "Exchange Shared Mailbox";
            data.EntityData.Uri           = new Uri("https://portal.office.com/Home");
            data.EntityData.LastChangedBy = new PersonReference(new EntityCode(EntityType.Infrastructure.User, "CluedIn", userId.ToString()));
            data.EntityData.Codes.Add(new EntityCode(EntityType.Product, "CluedIn", "ExchangeSharedMailbox"));
            var iconBytes = GetBytes(@"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAEBAQEBAQEBAQEBAQECAgMCAgICAgQDAwIDBQQFBQUEBAQFBgcGBQUHBgQEBgkGBwgICAgIBQYJCgkICgcICAj/2wBDAQEBAQICAgQCAgQIBQQFCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAj/wAARCAEAAQADAREAAhEBAxEB/8QAHwABAAIDAAIDAQAAAAAAAAAAAAgKBwkLBQYBAgME/8QAWBAAAAUDAgMCCAgHCQ0JAAAAAAECAwQFBgcIEQkSIQoxExQ4UXZ3tLUVIjdBYXGW1BkaMjZVWJUjQlJidYGys9MXGCQzU1dydIKRk7HBFkRUc5KhpNHV/8QAHQEBAAMBAQEBAQEAAAAAAAAAAAcICQYFBAECA//EAE4RAAECBAEHBA8FBQgBBQEAAAEAAgMEBREGBwgSITFBUTU2c7ITGCIyUmFxdIGRkqGxs9IUQlRiciM0k6LBFRYXJDNTY/DCQ0SC0+Oj/9oADAMBAAIRAxEAPwC/wCICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICLwFw3Jb1q0uRWrnr9HtujMlu7MnykR2Gi2M91OLMkl0Iz6n8w/3lJGNMRBCl2F7juAJPqGtfHOT0GXhmLHeGNG8kAes6lDnIvEn0H4rhOTbr1S4kkEkzSbNFqPwzI3/8iCTzn8/LsJLo2RLFtQdoy8hEHjcNAet+iPeoyrWXHCNPbpTFQhnxNd2Q+pmkfcoK3/2gLQ7arUhNn07MeT5hf4o4FEbisKP+MuU60tJd/UkKP6BKtIzP8VTBBmXQoI8bi4+poI94UUVjPFwpLgiWbFjHdZgaPW9zT7ioI5A7SLd8mFKj4s0vW3Ragf8AiJdwXE7NbSXnXHYaYM/qJ0hLdIzKJZrgZ+fc4bwxgafQXF3VURVnPfmXNLafT2tO4veXD0ta1vWUFb746fEJvFMhqj31YeNmnN0mmg21HUaCMtjJK5njCk9/eR7l8xiVaTmoYOlrdkhPikeG93wZoBRNVs7TGcyCIUZkEHwIbfi/TKgnfmtHVxk9uoR781KZsuOnyjV4xEduSUiK4R77p8XQsmyT1P4pJ2+gSvScmWHZAgykjCYW7CGNv6yL+m6iWr5T8RT+kJyeivDtoL3W9kG1vFay6I2GDUrD2JlKM1KO2qYZmZ9TPxVsY14n1VKY/W/rFbRYXN6ZL9GzqhZNHir3kBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBF9VKSkjUoyJJd5+YEUecmas9MGG5TtOynqCw9YlXQk1HAqNwxWpe3nKOa/Cn3fMkdfQ8ndeqTdOQk4sRvFrHFvtWt71xddyiUGlu0J+dhQncHPaHeze/uUFck8bzh6Y9Jxmm5SuPJ09B7LYtugyXSL6npCWWVF/orMStRM1rGM5riQGwRxe9o9zS53rCiSuZ1WDJLVDmHRncGMcfe4Nb6ioJ5P7R/jSnuFHw3ptva7W1dDlXJWWKWSD85MsIkmsvrWj/AKCWKDmUzrxepzzWeJjS/wB7iy3qKiavZ7cgw2pki9/je4M9zQ+/rCgnkrtCWsq62XolgWhhzFkde/JIYpz1Qlo/25Dpsn/whLFEzOsMy5DpyJFjHgXBrfU0aX8yiOu55OJ44LZOHCgDiGlzvW4lv8qgpk7iia+stM+KXTqfyRTYP+RoDrdESovMo4KGVLL6FGYleiZCMI046UvIMJ4vBidcut6FE1dy94wqQ0ZifeBwYRD6gbf03ULbovW8b3nHUbyu65buqO5n4xVJ7spzf/TcUoxJshTJaVboS0NrG8GgAe6yjCo1WZmnaczEdEdxcST7yV6sPvXloCICICICLpx4V+RzE/ozS/ZGxhlijlOY6R/WK3iwryXLdGzqhZNHiL3kBEBEBEBEBEBEBEBEBEBEBEBEBEBFHzUXqcwjpOsWJknPd6/9hbPk1JukRpXiEmWp+atp11DKW47bi9zRHeVuZEn4vUy3Lfq8F4EqmIZwyNHhdkiBpcRdrbNBAJu4gbXDx61xuNceUrDsoJ6sRexwi4NBs513EEgWaCdjTutqWny/u0SaTaE/OhWDizNt/ONGZNSXo8SnRZR/MaVLeW6ST86miP6BZClZmeIYoDpuYhQr7gXOI9TQPU70qtVYz0MPQXFsnLxYtt5DWg+txPrb6FBq/wDtHmap8hz+5Zp0xlacLuT8PVSVVXD+kzZ8VIvq2P6z7xK9GzK6Wxv+fnYjz+RrWD36aies57lUe7/ISMOGPzuc8+7QUD8h8aTiI5AmzXo+bY1gUt38mn27RIUZtgv4jy23JH+90xLNGzZMGSbADK9lcN73uJPlAIb6mqJKznQY0nHkib7E0/dYxoA8hILvW5QZyNqT1C5dkKfyhnHLV/nuZpRVrhlSW2voQ2tZpQX0JIiErUXBNGpwtISsOF+ljQfSQLn0qJ63jitVI3n5uJF/U9xHoBNh6FhJRmZmZme59TM/nHTrkl9QX4gIgIgIgIgIgIgIgIgIunHhX5HMT+jNL9kbGGWKOU5jpH9YreLCvJct0bOqFk0eIveQEQEQEQEQEQEQEQEQEQEQEQEQEQEWg3tFnkTYu9adN901YW1zMedEfzd3zISqDnqc1pfzhny4qpgjTNZeoCICICICICICICICICICICICICICLpx4V+RzE/ozS/ZGxhlijlOY6R/WK3iwryXLdGzqhZNHiL3kBEBEBEBEBEBEBEBEBEBEBEBEBEBFoN7RZ5E2LvWnTfdNWFtczHnRH83d8yEqg56nNaX84Z8uKqYI0zWXqAiAiAiAiAiAiAiAiAiAiAiAiAiAi6ceFfkcxP6M0v2RsYZYo5TmOkf1it4sK8ly3Rs6oWTR4i95ARARARARARARARARARARARARARARaDe0WeRNi71p033TVhbXMx50R/N3fMhKoOepzWl/OGfLiqmCNM1l6gIgIgIgIgIgIgIgIgIgIgIgIgIgIunHhX5HMT+jNL9kbGGWKOU5jpH9YreLCvJct0bOqFpQ4uXEx1EaH8uYvsfDdPxpLolYttdVlqrdMekuk+UpxrZCkPNkSeVCehkfXfqLO5uuQ2jYqpsxNVNzw6G/RGg4AW0Qdd2niqt5x2XSt4UqUvKUxsMtiM0jptJN9IjVZw1WC1L/AIwdru/Qen/7PyvvYsN2nuFPDje236FXPty8W+BB9h31p+MHa7v0Hp/+z8r72Hae4U8ON7bfoTty8W+BB9h31p+MHa7v0Hp/+z8r72Hae4U8ON7bfoTty8W+BB9h31p+MHa7v0Hp/wDs/K+9h2nuFPDje236E7cvFvgQfYd9afjB2u79B6f/ALPyvvYdp7hTw43tt+hO3Lxb4EH2HfWn4wdru/Qen/7PyvvYdp7hTw43tt+hO3Lxb4EH2HfWn4wdru/Qen/7PyvvYdp7hTw43tt+hO3Lxb4EH2HfWn4wdru/Qen/AOz8r72Hae4U8ON7bfoTty8W+BB9h31p+MHa7v0Hp/8As/K+9h2nuFPDje236E7cvFvgQfYd9a2CaKuPwnJWRaDjPVhYdl48aqz7cOFdVBddagQ5CjJKSmsSHHFNtKMy3fJwyQe3MnlM1ph/KfmifYZF89h6M6KWAkw32LiBt0S0C5Hg6Ovcb2BmTJdngfbp1kjiKCyEHkARGXDQTs0w4mwPhB2reLXIsvkZGW5HuQpCr1L5BEBEBFoN7RZ5E2LvWnTfdNWFtczHnRH83d8yEqg56nNaX84Z8uKqYI0zWXqAiAiAiAi/pjRpEt0mIsd+S6fUkNoNSj/mIfy97Wi7jYL/AGhw3ONmi5Xv1Kw/lqu8nwFi3I1Z5vyfFKJJd5u/u5UH5j/3Dx5nEdPh/wCrHY3yuaPiV7Ethuoxv9KXe7yMcfgFk2jaNdXlweCKh6WdRVXSoy5Vx7JqS0ddupqJnYi6l1M9uo8OZyl4cg37LPwW24xWfUvflsmeI41uxU+O6/CFE+lZttzhX8Qm6ibOm6VslxSUW5fCSWKf8xn18Zcb27vn/wCo5aey+YOl/wDUqDD+m7uqCupks3/GUx/p0+IP1Wb1iFlCDwWuJJP5d9PTcTf/AC9z0hG3/wAoeHFzm8Es/wDeX8kOJ9C92DmvY4f/AOyt5YkP61rUu+1a5Yl2XRZFzxEU+5aNUJNKqDCXUuEzJYdU04glpM0qIloUW5GZHtuRmJtp0/Cm5eHNQDdkRocDsuHC4Njr2FQfUqfFlJiJKxxZ8Nxa4bbFpsRcajrG5esj7l5iAiAiAi6ceFfkcxP6M0v2RsYZYo5TmOkf1it4sK8ly3Rs6oVUbtHPlG4D9CHPb3hf/Mu5Fm+lHUCzzz2+W5Poj13KuqLnKlKAiAiAiAiAiAiAiAi+SMyPcj2MEXSX0a3dWcgaR9MV63DKcl3FVLBoM2e+tXMqRIXAZNxwz86lcyv5xiZlMpsKTxFPy0AWYyNEAHAB5sPQNS3FyZ1GLOYckJqObvfBhkniSwXPpOtSYHFLu0BEBFoN7RZ5E2LvWnTfdNWFtczHnRH83d8yEqg56nNaX84Z8uKqYI0zWXqAiAiAi6DuiXTRpyLSrpeu08A4VXdc3H1vTJlUO1oJy5L7lPYcW64+bXOpal/GNRnuauveMecqeOa1/eCflvtkXsbY0UBvZH6IAe4AAXsABq8i2WyV4Fof93pCZ+xwuyOgwiXdjZpEljSSTa5JOvyqfFHoNEt+KUGhUelUSERERMxGEMoIiLYvipIi6F0ERzE3FjO04ri48SSfipglpSFBboQWho4AAfBebH+K+pARARARc0/Vb5U2pT0/uH3k+Nusn3IMj0MLqNWGOUPnBPdNF67lH8dcuNQEQEQEXTjwr8jmJ/Rml+yNjDLFHKcx0j+sVvFhXkuW6NnVCiPq74a+nDW1d9rXvmxN+nW6PTTpUP4IqiYrZMG6p0+dJtr3VzLPrv3CQcnWW6t4WlokrS9DRiO0jpNub2txG4KOcpGQ6h4pmYc3VdPTht0RousLXJ4HeVWR4nfCGuXSAiRmPCDlfv8A06qJCZ/jRpeqNqunsX+EmhKScjKPblfJJcpnyLIj5VuXoyFZxsDEZFNqtoU7utqbEH5bk2cN7b69rd4FEMvGbfHw2DUqTpRZLffW6GfzWAu07nW1bHbidIQtIqpICLJuIMR3/nfJVoYkxfb0u5r4rktMODEa6EZnuanHFdyGkJJS1rPolKVKPoQ8HEeI5OkyMSoz79CFDFyf6DiSdQG0k2C6LDWG5urz0Km09mnFiGwH9TwAGsnYACVbWw52e3TFQrBosTN955HvrJamycqcujVBEGntuH3tRmlNKWaE93Os+Ze3Nyo35CzyxJnjV2LNudSoTIcD7oc0udbi43AueAFhsudp0VwzmaUGFJsbVYr4sf7xa4Nbfg0aJNhxJudthsGVvwAOgbzZr+0aP7AeF23eLv8Ai9g/Uug7TvB//L7Y+lPwAOgbzZr+0aP7AO27xd/xewfqTtO8H/8AL7Y+lfzv8AHQW4y6229m6O4pJpJxFxtGpBmXeXNHMty7+pGX0D+mZ3uLRrPYj/8AA/Uvx2Z3hAiw7KP/AJj6VT/1KYg/uA5+zFhUqo5XGbYuGbRmZq0EhUtpp1SW3VJIzJKlIJKjIu4zMho5gjEn9sUiWqmjo9mY1xHAkax6Cs2Mc4b/ALHrE1StLSEF7mg8QDqPpCwcOqXILo4cP3yG9IHq4t/2BoYt5YudVR6eJ1yttsjfNOm9BC6gUwBHakpARARaDe0WeRNi71p033TVhbXMx50R/N3fMhKoOepzWl/OGfLiqmCNM1l6gIgIgIukhoi8jLSX6tbZ92RxihlT5z1Hp4vzHLcLJVzYp3QQvltUoBwy75Y1vjLmKMYOU5nJeTse49emJcVDTXK1GgHLJG3ObZPLTzknmTvtvtzFv3j1qVh2oT4cZGA+KG7dBrnWvsvYG114VWxJTpAtE9MMhF2zTe1t7bbXIvZelf32Gln9ZXAH2yp39sPY/wAPa/8AgY38J/0ryv8AEPD/AOOg/wAVn1J/fYaWf1lcAfbKnf2wf4e1/wDAxv4T/pT/ABDw/wDjoP8AFZ9Sf32Gln9ZXAH2yp39sH+Htf8AwMb+E/6U/wAQ8P8A46D/ABWfUueHqeqNPq+pTULVqTOh1SlSr5r0iNJjupcaktLnvKS42tJmSkqIyMlEexkZGQ2PwLBfDoknDiAhwhQwQdRBDBcEbiFjFjyM2JXJ2JDIc10WIQRrBBe6xB3grBQ6tccgIgIgIunHhX5HMT+jNL9kbGGWKOU5jpH9YreLCvJct0bOqFklbrbZkS3EIP6T2Hi6JOxe6XAbV42o06BWqdNpdUhQapSpTK48mPIaS6zIaWk0qQtCiNKkqIzIyMjIyMyMfsGM+G8RIZLXNNwRqII2EHcQv8I8BkVhhxAHNcLEHWCDtBG8FUx+MVwx7V0lS4OoTDNQhUvDtxVoqW9bbzhk9Q6i6268SYh/v4iksO7JMyU0ZJT8ZJly6Z5tuXOYxE11GqbS6ZhN0g8bHtBA7rg4EjXsdt1HbmJnLZCIGHHNrVMcBKxX6JYdrHEE9zxYQDq2t2axs0VQ4cupS4tPgRpE2e+6lppptBrW44o9kpSkupmZmRERd4tfEiNY0vebAayVUuFCc9wYwXJ1ADerzfCU4clP0aYrbyBkelR39SFzxErq61bLO3IajJSKa0ojMuYtkqdWn8pfxSNSW0qPKfOIy0vxNUPsck7/ACUE9z+d2wvPi3NB2DXqJIWsGbpkTZhin/bZ5v8Anow7r8jdoYPHvcRtOrWACdwi3ENkRrWhBfSewroATsVli4Davr4xH/y7P/qIOxngv57I3ivshxte/ItK9u/Y99gII2r+g4HYv0H4v1c7HiV+Xzqz9Naj/TGymRDmjT+ib8Fixl054VHpXfFQdEqKJl0cOH75DekD1cW/7A0MW8sXOqo9PE65W22RvmnTeghdQKYAjtSUgIgItBvaLPImxd606b7pqwtrmY86I/m7vmQlUHPU5rS/nDPlxVTBGmay9QEQEQEXSQ0ReRlpL9Wts+7I4xQyp856j08X5jluFkq5sU7oIXy2qUA4Zd8qofaTvzt0k/ydcP8AWwRoBmSfu9R/VC+D1npnxfvNN/TF+MNVixehUKQEQEQEQEQEQEQEXTjwr8jmJ/Rml+yNjDLFHKcx0j+sVvFhXkuW6NnVCqm9ozlSWNRuA0MyH2knZLhmSFmW/wDh73mF/sy9jTRZu4/9UdQLPbPXiObW5Oxt+yPXcopcMbioXrosuZFhZIdrN86c6pJJcyCSjdlW88rYjlwuY+qdiTzsb7KJO6dlfld/lzyBSuJ4H2ySAhzrBqOwPHgu/o7dvuNke5CMv81heY+yTpMSRedY2lh8Jv8AVu/dY7cS8TvXlVtc2d3a1RF1GnYTt4nIFoU14uVSmzMvCzXU7bk6+aEq5T/IQltHelRn0WQvJNDwpSRCi2M1FsYjhx3NHibf0m53i3P5ecrkTFlWMWFcSsK7YbTw3vPjdb0AAbjfaZwKeHkiuTIetrMFEJdMivLax9AkN7k/IQfK5VTLfubUS2miUXVZOObFyNqOA867LIYTThemv7pw/bEbgdYh+na626w3uCn/ADTMjPZXDFVSZ3LT+xad5GoxPRrDb77u3NKsV6n9T+JNIeJa/l/L9faplIjJU3CgtqScytzOUzbiRGzMud1fKfmSkiUtRpSlSipjgPAVRxHUWU6msu47T91jd7nHcB6ydQBJAV0se49puG6a+pVJ9mjYPvPdua0byfUBrJABKoW60tcGYtbOW5+R7+qcqi26yamLftqLKWqFQIn8BBdOd5WxKceMiUtXzJSlCE62ZMcltNwvThJSbdJ51veQNJ54ngB91uwDiSSci8p2VSp4pqTp6dcWsGpkME6LG8BxJ+861yeAAAh949P/APHyv+Mr/wCxJHYWcAoz7K7iVZ17NrMlv3Jq5aflSnmig24okrcMyI/CVDrsfzii2ewxogU4gb4vwhq+WY/FcY9SBN9UL4xFatFBFoMudjxK/L51Z+mtR/pjZTIhzRp/RN+CxYy6c8Kj0rvioOiVFEy6OHD98hvSB6uLf9gaGLeWLnVUenidcrbbI3zTpvQQuoFMAR2pKQEQEWg3tFnkTYu9adN901YW1zMedEfzd3zISqDnqc1pfzhny4qpgjTNZeoCICICLpIaIvIy0l+rW2fdkcYoZU+c9R6eL8xy3CyVc2Kd0EL5bVKAcMu+VUPtJ3526Sf5OuH+tgjQDMk/d6j+qF8HrPTPi/eab+mL8YarFi9CoUgIgIgIgIgIgIgIunHhX5HMT+jNL9kbGGWKOU5jpH9YreLCvJct0bOqFVG7Rz5RuA/Qhz294X/zLuRZvpR1As889vluT6I9dyrqi5ypSp88OXRhWNbmpG3MdONTYmNaaRVi7qg1zJ8WpqFkRsocItkvvKMmkfOW6l7GTahEWWnKdCwtRHzosY7+5ht4uI2keC3afQN4UyZFMl8XFdbZJaxAZ3UV3BgOwHwnbB6TuKvIZ8zzg7QxgFy+r1di2pjy3oLFJotFgIT4aYpDZIjU+CyZlzL5WyIi3JKEJUpRpSlSiytwjhGq4rrH2WV7uNFJc9x2C5u57zwufKSbC5IC1bxdi6k4So32qa7iBCAaxo2mws1jBxsPIALkgAlUP9bGtfLeuDLcvIuRpjlOtyKt1i2rcZcNUS3oalEfg0dC53lElBuPGRKcUkuiUpQhGsuS/JfTsLU4SUkLvNi95757uJ4Aa9FuwDiSScksqeVGo4rqRnZ02Y24hsB7ljeA4k6tJ20ngAAIbCSlFqAis89mv/OfV5/qFt/1k8UUz3P9CneWL8IavtmOfvFS/TC+MRWtxQJaFLnY8Svy+dWfprUf6Y2UyIc0af0TfgsWMunPCo9K74qDolRRMujhw/fIb0geri3/AGBoYt5YudVR6eJ1yttsjfNOm9BC6gUwBHakpARARaDe0WeRNi71p033TVhbXMx50R/N3fMhKoOepzWl/OGfLiqmCNM1l6gIgIgIukhoi8jLSX6tbZ92RxihlT5z1Hp4vzHLcLJVzYp3QQvltUoBwy75avOIdwzbX4gc3GFRr2Va/jSXa8edHj+KU1uYiSUlbClGslrQZcvi5EWx/vvoE55GsuEfB7I7IUuIwjFpN3FttHS2WB23UCZZ8hUvjJ0u+NMOgmCHAWaHX0tHbcjZorWU92bO0jNPi+rW4kl8/PZ7R/8AKWQnRme1Mfepw/iH6FBD8x2X3VF38IfWvEPdmvg8qvF9XspCt/i89kkZbfTtOIfU3Pbdvpv/APX/APNfO7MdZuqR/hf/AKLU5xJuHIrh71TEVPPLpZWRdbFReJZUP4OOCcVUcttvDvc/N4yX8Hbk+ffpYHIllp/vjDmX/Zuw9hLR3+lfS0vyttbR8e1V2y35E/7mvlmfaez9nDz3mhbR0fzOvfS8WxawROygJARARARARdOPCvyOYn9GaX7I2MMsUcpzHSP6xW8WFeS5bo2dUKqN2jnyjcB+hDnt7wv/AJl3Is30o6gWeee3y3J9Eeu5V1ySZmRERmZ9wucqVK7toqsHEvCY4f391zP8hFtXlXGWa9cpEyRVCVNdaNUSjR2lmk1vNt7p8GZkROHIWZpTzKLLbKfV6jlDxj/Z1HGnCh3YzX3IaD3cUkXs0nXfbbRAubBar5LaRTsnWDv7RrJ0IsWz4mrui4juIQBtdwGq2wO0ibC5VVzXDrjyxrmyy9f9/wAj4HtWD4SNbdtsOmcWhxDVvsXd4R9eyTceMt1mRERJQlCE36yWZK6fhSnCTkxpRHWL3na939Gj7rdg8ZJJz9yrZV6jiyomcmzow23ENg2Mb/Vx+87afEAAIVCT1FKAi8pSqTVK9VKbQ6HTp9ZrMx9uLDhxWVOvSnlqJKG220kalrUoyIkkRmZmREPnmJiHChuixXBrWgkkmwAG0knYBvK+yXl4kaI2FCaXOcQAALkk6gABtJ3BXiuDvoAujRdh+6LtyfIWzl6+SgyapSCSk0W9Hj+HNiMayM+d4/GVrcMtiIzSgt+TmVldnJ5XoGJ6nDlpAf5aW0g13hl1tJ1tw7kBu/ad9hq1m0ZHpjC9NiTE+bTMzolzfADdLRbfee6JduvYbrmZOtnWfi3RDh6oZOyHJOpV2QTka26Aysik1+eSN0tJ/gNJM0m48ZGTaT32Uo0IVG2S/JjP4pqQkZMWYLF7zsY2+3xk/dbvPAXIk3KnlQp+FaY6fnDd5uIbBte62zxAfeduHE2B58WYMoXHmvKuRcvXf4oi5rlrUutzkR0qS0y6+6pw0NpUZmSE83KkjMzIiLqY2Gw3QYFLkINOlr9jgta0X22aLXPjO0+NY24lr8eq1CPUZm3ZIznPNtl3G9h4hsHiWNR7i55dHDh++Q3pA9XFv+wNDFvLFzqqPTxOuVttkb5p03oIXUCmAI7UlICICLQb2izyJsXetOm+6asLa5mPOiP5u75kJVBz1Oa0v5wz5cVUwRpmsvUBEBEBF0kNEXkZaS/VrbPuyOMUMqfOeo9PF+Y5bhZKubFO6CF8tqlAOGXfICICICKqZ2lH85dIX+oXL/Tp4v7mR/6FR8sL4RFnrnyfvFM8kX4w1WCF61QlARARARARdOPCvyOYn9GaX7I2MMsUcpzHSP6xW8WFeS5bo2dUKvzx9NGmXcr0+xdT+OKad225aNEeptyUuMgzl0+J4Zb5T0p3/dWU86kuEkuZsiJexp51N27zQ8pdNpz4tBnXaD47g5jj3pNg3Q8RNu5vqOzUbA06zv8AJjUqiyDiCRbpsgMLXtHfBty7T8YF+6trG3WLkVKWH34r7UiM69HkNrJxt1tRpU2oj3JSTLqRkZb7jRB7A4FrhcFZ0seWkOabEKTGpLWLqK1bTbUm56yNPvX4DhFCpzHgW47DJdOd02WkpQby9i53TLmVsRb7ERFwuCcm1Fw6yIykQRD7IbuNySeAuSTYbhsHlK7vHOUut4jfDfWI5idjFmiwAHE2AA0jvO0+QBRgHeKPVZy4W0/h5aw9PtI0TZwwpYVvZspq5MmFUDJMeoXUajW4qVEqCOV4pTafirjmo0m20g0kpCVIaoxl7hYyw3V3YopU098q+wLdrYdrANcw3bok7HWBuSDYkF19MgMXBeJaO3C1WlWMmmXIdsdEvclzXiztIDUW3IsARcAhsdNbXAtzdglmpX3pvmVfPmM2iN12nEykrgpqCIzM1MIIkS0FsXxmSJe5/wCKIiNQ7LJdnXUurObKVoCWjn71/wBm70nWw+J2r819S4fKpmmVSkB05QyZqXG1tv2rfQNTx426/wAtta0t4zyRfGE8j2nk6wakdvX7b89E+nSXIzbvishB9DU06lSVbdSNKiMWdrlFlapJRJGcbpwYos4XIuD4wQfUVWGhVybpc7Dn5N2hGhG7TYGxHiII9YVs7AvaCMB17Dtdq2oO261YuaqVDNbdJo0J6VCul7Y+UobvxvFlGe3MmQpKUkfRxfcWemLcz6rwqkxlHiCJKvPfOIDoY/MNWl4iwEne0LRLCOePSI1MfErMMw5pg71oJbEP5Tr0fGHkAbnFVjtW2rHKusnMFby9lSokqQ7vHpdKYUrxShQiMzRGjpPuSW+6lH8ZajNR9TF6MnmT6n4apradT26hrc498929zv6DYBqCohlFyiVHE1SfUqg7WdTWjvWN3Nb/AFO0nWVF8d2o+QEXRw4fvkN6QPVxb/sDQxbyxc6qj08TrlbbZG+adN6CF1ApgCO1JSAiAi0G9os8ibF3rTpvumrC2uZjzoj+bu+ZCVQc9TmtL+cM+XFVMEaZrL1ARARARdJDRF5GWkv1a2z7sjjFDKnznqPTxfmOW4WSrmxTughfLapQDhl3ygJrM4iuBtC1TsGmZpp2RZztyMTJEBdCpzMpCEx1NJWTvhHmzSZ+HRtsRkex9S+eWcmWRer4rZGiUxzAIRaDpuI769rWaeBuogyn5aqPhN8GHVGvJjBxboNB72173cOIsol0/j46AZpxfGall+lE4ZEvxi2zPxff+H4N1e+38Xf6NxIUbNHxe2+i2G63B+31ge+yjqDnf4PdbSdFbfjD2eon3XXvdP44nDjmk4qRmG5aUaTIiKRaVTPn+rwbC+76du8eZHzVsat72Wa7yRIf9XBetBzr8EuvpTLm+WHE/o0rQ3xtdZmnPWDWdOUzT5frl9RaFFrTdVNVJmQjiqfXDNotpLTZq3Jlz8nfbl67bkLZZruTKtYbhzrKxB7GYhh6PdNdfR0796TxG1VFzp8p9ExLFkX0eN2QQhE0u5c22kWW74C+w7FonFrlUdARARARARdOPCvyOYn9GaX7I2MMsUcpzHSP6xW8WFeS5bo2dUL165s/4XtbLFuYIvC/7ct7JtcpqqlSaTUHPAnVo/hFNGlhayJtxzmSr9xJRrMiMySZEZl9EhhCpzFPfV5WC58CG7Rc5uvRNr6wNYH5rWvqvdfHPYwpcvUWUiZjNZMRG6TWu1aQvbUTqJv9297a7WVZ/i38IIrJTcOqDSbahnZpbybqsumRjP4GLYzXOgNJ/wC7fO4wkv3LqtP7nulq8mbtnHfatCg4hiftdkOK499wY8n73guPfbD3Vi6i2cbm2/ZdOv4dh/stsSE0d7xewD7vhNHe7R3Nw2s6LwqiSAi81Qa7WrXrdIuW26rUKFcECS3MgzYjqmnoj7aiUhxtadjSpKiIyMupGQ+ablIUeE6BHaHMcCCCLgg6iCN4K++Um4svFbHguLXtIIINiCNYIO4hXReFVxY6JquplHwXnSoQ6DqOhxSRGmqJLMe820Ee7jSS2S3LJKSUtotiV1W2RFzIRmRnAZvcXD8R1WpALpJx1jaYRO47yy+w7RsduJ1Azfc4iFiGG2k1ZwbPNGo7BFA3jcH21ubsO1uq4GVuIBwi8I6ymKtflnJgYg1BKQa01yJGIodbc2IiTUmElus9k8pPo2cTvufhCSSBz2R7OMqmGi2Umbx5PwCe6YPyE7P0nUd2jtXv5Ys3GlYnDpyVtAnfDA7l5/5ANv6hrG/StZUxdROmnNGlbIlQxjm2yqjaNxtbrjOrSa4tUY36SIkgviPtH3cyT+Ke6VElSVJLTPBuN6ZX5IT1Lih7Dt8Jp4OG1p8R27RcEFZiYzwPVMPzrpCqwjDeNnguHFp2OHjGw6jYghYEHXLjEBEBF0cOH75DekD1cW/7A0MW8sXOqo9PE65W22RvmnTeghdQKYAjtSUgIgItBvaLPImxd606b7pqwtrmY86I/m7vmQlUHPU5rS/nDPlxVTBGmay9QEQEQEXSQ0ReRlpL9Wts+7I4xQyp856j08X5jluFkq5sU7oIXy2qUA4Zd8qofaTvzt0k/wAnXD/WwRoBmSfu9R/VC+D1npnxfvNN/TF+MNVixehUKQEQEQEQEQEQEQEXTjwr8jmJ/Rml+yNjDLFHKcx0j+sVvFhXkuW6NnVCqk9o2WtvUfp+W24pt1NlOKSZHsaT8fe6kY0AzLgDRJwH/dHUCz2z2ritydv9o9cqPmj/AI3+qHTqxTrTymZ6jcaMkpCGa1OW3WIhGXxSaqRktS0kf715DnT4qVILbbsMpGazQa0XTMj/AJSOd7QCw+VmoA+NpbxIK43JrnU1+itbL1D/ADcAbnGzx5H6yR4nB3AELVZnDItOy7l/JGT6PZFBxxSq9WJNTYodLTtFpbbizUlpHQiPYj6mRJI1bmSUkZJKfcL0Z9OpsCQiRTFdDaGl7triBtP/AE6t52qv+Kqyyo1KPPw4TYTYri4MbsaCdg/6Ne4bFIfQxoWyvrnyqzY9jMPUOy4RofuS5345uRaJGM/rInJC+pNskojVsZnypSpSeMyq5VqfhSnmbmzpRXamQwdbz/Ro+861hs1kgHs8k+Seo4sqIlJQaMJuuJEI7lg913H7rb3O3UASMqcVTTRp60nal4mHtPtwXBV4cS3YT9wRKjLTJXTKk4az8H4UkpPdbPi7xoMj5Td6HsZJT4WQHG9ZxDQzUqwxrS57gwtFtJgtrtr2O0m33246z7+cFgWi4droplHe5waxpeHG+i831X1bW6Lrbr8NQ1xUasVa3avSrgoNSnUWtwZDcyHMiuKaeiPtqJSHG1pMjStKkkolEe5GRGJompaHGhugxmhzHAgg6wQdRBG8EbVCcrMxIMRsaC4te0ggg2II1gg7iDsVznhS8WmianabRMB5+qkGhai4zHgafUVmTUe8m0F0NPzImknbmaLo5sa0EXVCczc4DN4iUJ7qxR2l0kTdzdphE/FnA/d2HcTpzm95xUKvQ2UesuDZ0CzXbBFA+D+I+9tG8Da1qT0wYY1Y44n4wzZaMW5qC6ZuxJKdm5tIkbbFIiP7Gpp0vOXRRbpUSkmaTr9grHVTw9PCfpcQseNo+64cHDePhtFjrVhscYCpeIpEyNVhB7DsOxzTxadoPx2EEalSG4gvDMzHoTub4Ulk/f8AgyfINqjXXGZ5SbV0Mo05ojPxd/r0Mz5HCIzQozJaEal5HsuVNxZA7G39lNtHdQyf5mH7zeO9u8bCcq8seQqp4Rj9kd+1lHHuYgH8rx913Dc7cdoGtATgoHQEXRw4fvkN6QPVxb/sDQxbyxc6qj08TrlbbZG+adN6CF1ApgCO1JSAiAi0G9os8ibF3rTpvumrC2uZjzoj+bu+ZCVQc9TmtL+cM+XFVMEaZrL1ARARARdJDRF5GWkv1a2z7sjjFDKnznqPTxfmOW4WSrmxTughfLapQDhl3yqh9pO/O3ST/J1w/wBbBGgGZJ+71H9UL4PWemfF+8039MX4w1WLF6FQpARARARARARARARdOPCvyOYn9GaX7I2MMsUcpzHSP6xW8WFeS5bo2dUKqN2jnyjcB+hDnt7wv/mXcizfSjqBZ557fLcn0R67lXVFzlSlTT0QaIMr64ssxbAsGM5R7ThuNO3NcrrKlxKBEUZ/GV3Et9ZIWTbO5GtST6pSla0xhlUyp0/CtOM5OnSiOuGMB1vd/Ro1aTtw4kgGVslWSqo4rqIk5MaMNtjEiEdyxp+Ljr0W31ngASLotxL09cJfRPW51q0eJAte3YavFI77yUzbtrjqTJsnndt3H3nCLmURGTbSFcqSQ0SSzJkxWcoeKWsmHXfFOsgdzDhjbYbg0bPCcdZ0nXWn04aLk6ws98u0CHCGoE91EiHZc73OO3wWjUNFtlQlydka78v5DvXKV/VVyt3jX6jIqtSkr6eEfdWalcqS6JQW/KlJbElJERERERDW6h0WWp0nCkJRujChNDWjxAW9J4naTrKyHrtamalORahOO0osVxc4+Mm/oHAbANQXoI9deGvJUyqVKh1GDWKLUJtJq8V5EmLKiuqaejOoUSkuNrSZKSpJkRkojIyMiMh/hMQGRWGFFaHNcLEEXBB2gjeCvrgTESE9sWE4tc03BBsQRsII2EK8Jwctf13a0MSXhaOVmPGcuWN4ixPq7ZJSi4IkjwxMyFILblfScZ1LhEXKfxFF1WpKcsM5bJBLYZqMKap5tLzGkQ3wHNtceNvdAt3jWNwJ1ZzZcsMzienRZWoC8zLaILvDa6+ibbnDRIdu2HeQNsl+WHZuUbPuTH+QbdpV2WbV4q4dQp81onGpLKi6kZH3H3GSi2NJkRkZGRGK9UirTMhMsnJN5ZFYbtcNRBH/AHXxGoqxFWo8tPyr5KcYHwogs5p1gg/91cDrC5xmrDE1KwRqXzrh6335cm37cuioUynuPL53VRUPKJnwiti3XychGe3fuNqsn2IYlWocpU4os+LDa422XI128V72WJeUTDsOk12bpkE3ZCiOa2+3RB1X8drXUeB2K4ddHDh++Q3pA9XFv+wNDFvLFzqqPTxOuVttkb5p03oIXUCmAI7UlICICLQb2izyJsXetOm+6asLa5mPOiP5u75kJVBz1Oa0v5wz5cVUwRpmsvUBEBEBF0kNEXkZaS/VrbPuyOMUMqfOeo9PF+Y5bhZKubFO6CF8tqlAOGXfKNme9JOnHU+dvrzzii3cku0pt5FOcmreQuGl00G4Ta2loMuY229+v70h2OEsodaoQeKRMOhB9tK1tdr2vcHZcriMXZOqJXtA1eXbG0L6N76r2vaxG2wUS6twZ+G3Vm3kr02xoDy0ns7FuasMqbPr1Iky+Xct/nIy7ugkSBnMY2hkWnbjxw4R/wDC6jmPmx4HiAgyIHkiRR/52Uebq7PvoUuB5TtFrGd7GSZmomqbX47rZd/Q/Gozytupfvt+hde/fsqfng4sgi0VsGJ+pjh1XtHuXFVHM3wlGN4T40P9L2kfzMcfesHXp2dvTZTLertWt/OmcYz8WG7IQmYmA+lRoQatj5GGz2PYy/nHVUzPLrcSMyHGlIRBIGrTG0+NxXK1TMtocKC+LBm4oLQTr0DsF9zQqhxlsZkNF1m2vgEQEQEQEXTjwr8jmJ/Rml+yNjDLFHKcx0j+sVvFhXkuW6NnVCqjdo58o3AfoQ57e8L/AOZdyLN9KOoFnnnt8tyfRHruWpnRVory1rey3ExrjeMmmUWPyybguGS2o4dAh7n8dwy/KdVymltouq1fOlKVrTYXKdlOp2FqcZ6dN3HUxg757uA4AbXHcOJIBrxktyX1HFVREjIizBre896xvE8SdjRvPAAkX2tMOmPEukLEFCxDiajpplCho8POnSFEqTV5ZpInZcpz53F8u+xbJSRElJJSkiLJDHmOqjiSpPqNQdd7tQA2Nbua0cB6ztJJN1rzgLAdOw1TGU2nN0WN1kna529zjxPqGwAAAKnbxhtfqtXeb1Y8x3WHXsBWZIdi01TTh+Cr1Q/IeqBp7lJ6G00Z77NkpRbeFUQ0lzbskH926V9snG2nJgAu4sbtDPLvd47D7oWaecrli/vLVfsUk68nLkhttj3bHP8AJub4rn7xWo6bb1fp9Jo9enUOswqFUDdKBOdjLQxNNtXK54Fwy5XOUzIlcpnsfQxYmHOQXxHQWvBe21wCLi+y42i+6+1VyiyMZkNsVzCGOvYkGxttsdhtvtsXhB9S+BARWeezX/nPq8/1C2/6yeKKZ7n+hTvLF+ENX2zHP3ipfphfGIrW4oEtClzseJX5fOrP01qP9MbKZEOaNP6JvwWLGXTnhUeld8VB0SoomXRw4fvkN6QPVxb/ALA0MW8sXOqo9PE65W22RvmnTeghdQKYAjtSUgIgItBvaLPImxd606b7pqwtrmY86I/m7vmQlUHPU5rS/nDPlxVTBGmay9QEQEQEXSQ0ReRlpL9Wts+7I4xQyp856j08X5jluFkq5sU7oIXy2qUA4Zd8gIgIgIvVb6/Mm8P5Llf1Sh9tK/e4f6h8QvNq/wC6Rf0u+BXL6V3n9Y3bWCK+ARARARARdOPCvyOYn9GaX7I2MMsUcpzHSP6xW8WFeS5bo2dULT3xROF1l/XrnDEN62Vf+N7Hsij0I6NVXaq5KXOSo5Tjprjx2mTbdIkrLot1vrv83UWMyDZeKbhKlTMrNQXxIsR+k3R0dHvQLElwI1jc0qtWX3IFU8X1aWmpSNDhwobNF2lpaXfE3aA0g6jvcFtB0u6XsTaQsTUTD2H6I5TqDHUciXLkGlcysTFJIlypThEXO6rlSXQiSlKUpSSUpIignHmPKjiOpOqVSdd51ADvWt3NaNwHrJuSSSp7wDgGm4bpzabTW2YNZJ75zt7nHeT6gLAAALS1xweIwzjC0qpo6w/WuXJNdipK8Z8dz41FpTqN/Ei2Lo/JSouY990MmZbbvJUmzmavkVM/MNxLUm/sIZ/ZNP3ng99+lh2cXfpINYM6zLYJGWdhqmO/bxB+1cPuMI7z9Txt4N/UCKyWknAxanNSGIsDOXJEtFi46oUN+ou7f4MwltbrnIk9iU6aGlpbSZlzOKQnctxebKHi3+wqJM1YMLzCbcNG83AF/Fc3J3C5VEcnOEf7frktSDEEMRnWLjuABJtxJAs0bzYK+llHQZprytpooulKuWHEh4xo8BEW31RtimUB9CFJTLjPGRmUjdSlKUe/hDWvnJRLUR5J0HK5XKfXXYghRiY8Q3ffvXgnW1w8HcAO9sLWsFrtX8kdCqNCZh6LBAgQxZlu+YQNTmnwt5J7650r3KrU1/s6GriLWZ7Fq5j06Vi3kuqKJKnzKnCkOt79FOMIhPJbUZd6ScWRecxd+Uz0MOuhgx5aO1+8AQ3AHxExGk+XRHkVGpzMqxI2K4S81AczcXGI0keMCG4DyaR8q8N+Lq62P86Glz9tVb/80fZ25uF/9iY9mH/9q+PtLMU/iJf24n/1Lcfwj+G9mjQRUc61DMF34vuNy52aSxAbtqXLkEyUZUpS1PKkR2Nt/GEERJJXce5l03rPnE5a6Zi5kpDp0OIzsJeTphovpaNraLneCb3srOZuWRGqYQfNxKnFhv7MGAdjLjbR0r30mt8IWtdbsBWVWkXOx4lfl86s/TWo/wBMbKZEOaNP6JvwWLGXTnhUeld8VB0SoomXRw4fvkN6QPVxb/sDQxbyxc6qj08TrlbbZG+adN6CF1ApgCO1JSAiAi0G9os8ibF3rTpvumrC2uZjzoj+bu+ZCVQc9TmtL+cM+XFVMEaZrL1ARARARTNxjxDdbWHYVHpOPtTOVKXRafGahU+nSqh4/ChR20klDTUaUTjSEJSkkkkkkREREIyruRvC1Se6JOyMNz3EkuA0XEnWSXNsSTvN1KlCyy4qpjWw5OeiNYwABpdpNAGoANdcAAbBZS0t/jpcRWjm38J5Lsq7iT3lULUgt8/1+Lttf+2wj6czU8GRe8gOZ5Ij/wDyLlIcpnZ41hd/HY/9UNn/AIhqklZnaLdUtLU03fmGcG3dFR0UqAidTnnC+lan3kb/AFIIvoHEVPMwoEQEykzFhnx6Dh6tFp967imZ6uIIZAmpWDEHi02n16Th7lJG2+0lU1x+Oi7tJk+NEM/3V2m3el1aC86G3IiSV9RqL6xxc/mTPAJlqiCeDodveHn4Lt5HPhhlwEzTiBvLYt/cWD4hSmtXtDGimstMJuSys/2fLMv3XwtJhyWUH/FW1KNai/2C+ocDUMzjE8IkwIsGIP1OB9RZb3rv6fnm4XigdnhRoZ/S0j1h9/csyK40nDuva2a7SW821O3KtLgSGGWKpbVSaI3FNKIkqdQwtpPU+9SiL6RzIzYsZysdkQyoe1pBJa9h1X4FwJ9AXTnOhwXNS74YmixzmkAOhxBrtxDSB6SqKRnuZmNXVkmvgEQEQEQEXTjwr8jmJ/Rml+yNjDLFHKcx0j+sVvFhXkuW6NnVCyaPEXvLV9xM+IjZ+hrFEqNRZdLruoCuxVt2xRVOJWcTfdPwhKb6mUdsyUaSMv3VaeQjIiWpE45DMjMziqoB0UFsnDP7R3HfoNPhHf4IN+AMC5dstUthOnFsIh07EH7NnDdpuHgjd4RFhvIoZXVdNxXxc1w3ldtXnXDdNVmvVGoz5S+d6ZJdWa3HVq+dSlKMz+sa1yEhBlYDJaXaGw2ANaBsAAsAPIFkXUJ+PNx3zUw4viPJc4naSTck+UrxMObLp0qLUKfKkwagw4l5h5lZoW04k90rSouqVEZEZGXUjIfREhte0seLg6iDsIXzQorobg9psRrBG0FW8uFHxhYOX2rd026q7hi0vLSSbhW1dUlRNs3PsXKmNMWZ8qJ3QiS4eyXzPbo7t4XObOCzbn04vreH2Ey+svhjWYfFzRvZxG1m3ve90hze85VlSDKJiB4EzqDIh1CJwa47n8Dsfs77vrGQporrICICICLnWcSV5p/Xtq0Wy828gr4qSDNB7kSkumRl9ZGRkf0kNlsiTSMJU6/+034LFfLi4HF9RI/3X/FQiEpKJ10cOH75DekD1cW/7A0MW8sXOqo9PE65W22RvmnTeghdQKYAjtSUgIgItBvaLPImxd606b7pqwtrmY86I/m7vmQlUHPU5rS/nDPlxVTBGmay9QEQEQEQEQEQEQEQEQEQEQEQEQEQEXTjwr8jmJ/Rml+yNjDLFHKcx0j+sVvFhXkuW6NnVC0I8aDX9qp0iZlxPZuAsiQ7NoNWtdyozWnKLBmqckFKdbJaVSGlqT8VCS2IyLpvsLaZsmSGgYjpkxM1iCYj2RA0d09urRBtZrgDrVRM6DLDiHDdTlpWjxxDY+GXHuGO16RF7uadyqo5UyvkfN99VzJeV7xrd9XzUnPCzJ85zmWvzISRbJbbSXRLaCJKSIiSREWwv/QMPSVLlGSMhDEOEzY0f9uSd5Nyd5WfGIMQz1Vm3z9RimJFftcfhwAG4CwA1ALHA9pc+gIv1Q4tpaHWlraeSZKSpJ7Gky7jI/OPxzQRYr+2uI1hbPbQ4yXETsq2qHalKz85PplPjNxI7tToNNnSlNoSSU+FkPMKddVsRbrWpSj7zMz6iCKnm1YLmo7piJJ2c4knRe9oueDQ4AeQAAbgp9pmczjWUgMloU5drQANJjHGw4uc0k+UkniV7L+G+4kf+fKjfZCkfdh8XatYJ/CH+JE+tfX21WN/xY/hw/oT8N9xI/8APlRvshSPuwdq1gn8If4kT607arG/4sfw4f0L8n+NxxJH2XGTzrS2uZJp5kWlSCUn6SPxboY/tua5gkG/2Q/xIn1r8dnUY3It9rH8OH9C1dXLcdfvG4a7dt01edXrlqcx6fUJ0pw3Hpkl1ZrcdcUfU1KUpRmfnMTtJSUGWgsl5doaxgAAGoAAWAHiAUCz87GmY75mYcXRHkucTtJJuSfGSvBD7F566OHD98hvSB6uLf8AYGhi3li51VHp4nXK22yN806b0ELqBTAEdqSkBEBFoN7RZ5E2LvWnTfdNWFtczHnRH83d8yEqg56nNaX84Z8uKqYI0zWXqAiAiAiAiAiAiAiAiAiAiAiAiAiAi6ceFfkcxP6M0v2RsYZYo5TmOkf1it4sK8ly3Rs6oVUbtHPlG4D9CHPb3hf/ADLuRZvpR1As889vluT6I9dyrqi5ypSgIgIgIgIgIgIgIgIst4QwpkbURk+0cQ4rt+VcN5ViUiMw02kzRHQZ/HfeWRbNsoTupSz6JSRmOdxTiaSo0hEqM+/QhQxc+PgBxJ2AbyuowrhedrVQh06nsL4sQ2Hi4k8ANpO4LpHYjx5S8Q4sxpimiurfo9tUCn0CK4v8txqLHQylSvpMmyM/pMYoYirMSo1CPUYvfRnuefK5xP8AVbe4dozKdToFOhd7BY1g8jWho+CyOPIXtoCICLQb2izyJsXetOm+6asLa5mPOiP5u75kJVBz1Oa0v5wz5cVUwRpmsvUBEBEBEBEBEBEBEBEBEBEBEBEBEBF048K/I5if0ZpfsjYwyxRynMdI/rFbxYV5LlujZ1QsL6gNDulfVNcFEurPmJqfkWvU2GdPgyH6jNjnHjms1mgksPNpMuZSj3MjPr3jo8H5VK/QIL5ekTBhMebkBrTc2tfumncuWxlkow9iGKyYq8sIr2DRBLniwve3cuG9YH/A9cN39WGgftyrfeh2HbH42/HH2If0Lj+1owP+AHtxPrT8D1w3f1YaB+3Kt96Dtj8bfjj7EP6E7WjA/wCAHtxPrT8D1w3f1YaB+3Kt96Dtj8bfjj7EP6E7WjA/4Ae3E+tPwPXDd/VhoH7cq33oO2Pxt+OPsQ/oTtaMD/gB7cT60/A9cN39WGgftyrfeg7Y/G344+xD+hO1owP+AHtxPrT8D1w3f1YaB+3Kt96Dtj8bfjj7EP6E7WjA/wCAHtxPrT8D1w3f1YaB+3Kt96Dtj8bfjj7EP6E7WjA/4Ae3E+tPwPXDd/VhoH7cq33oO2Pxt+OPsQ/oTtaMD/gB7cT60/A9cN39WGgftyrfeg7Y/G344+xD+hO1owP+AHtxPrUrcIaYNPmnGBMg4OxBY+NEyUJblP06GkpMxCTM0pekq3ddIjMzIlqPbcR5irHlZrbg+rTL41tgcdQ8jRqHoCkfCuAqNRGFlKlmQb7S0az5XbT6SVIAcouwQEQEQEWg3tFnkTYu9adN901YW1zMedEfzd3zISqDnqc1pfzhny4qpgjTNZeoCICICICICICICICICICICICICICLpx4V+RzE/ozS/ZGxhlijlOY6R/WK3iwryXLdGzqhZNHiL3kBEBEBEBEBEBEBEBEBEBEBEBEBEBFqZ4xelDM+sDS7amPMFUSlXHeVLvWHcTsKVPaiHIitwJzCktOPGlvwnPLa2JSkltzdemxz/m25QKZhuvRJ2rPLIT4TmXALrEvY7WBc2s07AVXbOXye1TEmH4clSWB8VkVr7FwbcBkRuomwvdw2keVVHL+4aGvbGrDki6NK2WnY6CM1uUiAVXShJd6lKhKeIkl37n0GiVJy44SnjowahDufCOh19FZzVfIVi+RBdMU+JYeCNPqFyhrW7buG2ZbkC46BWrenIUaFtTorjDiFF0MjSsiMjLY+gk2UnYMdunBeHDiCD8FGE3IxoLtCOwtPAgg+9eCH1L4EBEBEBEBEBEBEBEBEBEBEBEBF048K/I5if0ZpfsjYwyxRynMdI/rFbxYV5LlujZ1QsmjxF7yAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAi9buO1LYu+lyaLd1t0G6aM8nleh1GG3JZdLzKbcI0mX1kPpkp+Ylogiyzyxw2FpII9IXwT8hLzMMwplgew7Q4Ag+g6lCq+eF7w/shNuor+lTFVPNzczVRIq6MojPzHBWyZfzCUaVl5xhJkGDUIh/WRE64covq2QPB06CI1Phi/gAw+oWqC99dnu0V3H8IP2hdWbcdynNzYbj1WPMjRz83I+wpxSfoNzf6RKlKzxMTwbCZhwooG27S0n0tcAPZ9CiWrZmuF49zLRIsInZZwcB6HNJPtelQMvns3mTIfjS8Z6nbFuM9zNhquUGRTti+YlOMuSepd25J69+xdwlulZ68i6wnpF7OOg8O9xDPioiq2ZFPsBMhPsfw02OZ72l/wUGr84HfEOsyTNbpeMLUyNCZI1FKoVxxDQ8RfwG5KmHT+o0EZ+YSrSM6jBs00GJHdCJ3PY7V5S0OHvUUVfNSxpLOIhy7YoG9j26/IHFp9yghfukzVFi16Y3kLTxmm0WmDPwkibbcxEcyLvUl/wfg1p6H8ZKjLp3iWKRlDoNQAMlOQn33B7b+q9wfEQokq+TqvU8kTslFh23mG63rtY+UFR7WhTalNrSpC0mZGRlsZH5jHYg31hcW4W1FfmP1f5oCICICICICICLpx4V+RzE/ozS/ZGxhlijlOY6R/WK3iwryXLdGzqhZNHiL3kBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBFhTIGnPT/leQudk/CGJcgzlJ5Tk1q3Ykx4y83hHG1K2/nHSUbGtYp7dCQmokIcGvc0eoGy5atYKo1Qdpz8pDiu4uY1x9ZBKghkLgtcO/IMuVUEYTlWLUnj5lu29XJkRBH/Fjm4thH1JbIhLFIzncZSbAwzPZGjw2Nd77Bx9JUSVnNdwXOuL/ALL2Nx8B7m/y3LR6AoLZH7ONhGqyDexPqEybZLZnzGxXadGqyS7uiVteKmRd/fzH/wAxLFEz06pDFqjJsieNjnM9x0/6KJa3mS0qIb06diQ/E9rX+8aH9VBPJXZ39WduyX3sa5Nw3kukp38EUh+TSpjn1srbcaL/AIwleh55WHo4AnoEWC7xBr2+sEH+VRLXMy/EUBxMhHhRm+MuY71EEfzKCmTOE9xBcVkbtc01XncMDf4r9tusVklF168kRxxxJdD/ACkp+bzkJWoecDg+oaoU81p4PvD97wB6iVE1czeMZU/XGkXPHFlonuYSR6QFCO+sY5IxhUio+ScfXrj6qqLdMatUp+C6ovOSHkpMy+khKVKrklPs7JIxmxW8WODh6wSoqq1CnpB/Y56C+E7g9pafUQF6KPVXioCLpx4V+RzE/ozS/ZGxhlijlOY6R/WK3iwryXLdGzqhZNHiL3kBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBF4qqUil1yE7Ta1TYFXpzhbOR5TKXW1/WhRGRj+5eZiQnacJxa4bwbH3L548rDitLIrQ5p3EXHvUSsl8PrRLl6O6zfOmHD8t5Z8y5UCkN0yWvu75MTwTp93cavP5zEiUPLDiimuvKT8QDg5xe32X6Tfco6ruRvCtSFpuQhEne1oY72maLveoKZK4Bmg+9W/CWlEyniKaRHy/AteOS0s/46JyHzMvoSpP1iWKJnc4slTaZMOOPzMsfQWFvvBUSV3NAwjNC8sIkA/lfcekPD/cQtx9o29HtK1LZtSK+9KjUynx6e264Rc7qGm0tkpW3TcySRnsK1VGcMzMRJhwsXuLvWbqzVOkRLy8OXabhjQ31Cy9mHyr7kBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBF//Z");

            var rawDataPart = new RawDataPart()
            {
                Type       = "/RawData/PreviewImage",
                MimeType   = MimeType.Jpeg.Code,
                FileName   = "preview_{0}".FormatWith(clue.OriginEntityCode.Key),
                RawDataMD5 = FileHashUtility.GetMD5Base64String(iconBytes),
                RawData    = Convert.ToBase64String(iconBytes)
            };

            clue.Details.RawData.Add(rawDataPart);

            clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 128, 128);

            this.providerRoot = clue;

            return(this.CreateEntityReference(clue, EntityType.Organization, "CluedIn", EntityEdgeType.UsedBy, this.organisationID, p => p.ToString()));
        }
示例#2
0
        public RawDataPart FetchAsRawDataPart(RestRequest request, string type, string filename)
        {
            RawDataPart rawDataPart = null;

            try
            {
                var data = _client.DownloadData(request);
                rawDataPart = new RawDataPart
                {
                    Type       = type,
                    MimeType   = CluedIn.Core.FileTypes.MimeType.Jpeg.Code,
                    FileName   = filename,
                    RawDataMD5 = FileHashUtility.GetMD5Base64String(data),
                    RawData    = Convert.ToBase64String(data)
                };
            }
            catch (Exception exception)
            {
                _log.Warn(() => "Could not download HubSpot thumbnail", exception);
            }

            return(rawDataPart);
        }
示例#3
0
        protected override Clue ConfigureProviderRoot([NotNull] Clue clue)
        {
            if (clue == null)
            {
                throw new ArgumentNullException(nameof(clue));
            }

            clue.ValidationRuleSuppressions.Add(Constants.Validation.Rules.PROPERTIES_001_MustExist);

            var data = clue.Data.EntityData;

            data.Name        = DropBoxConstants.CrawlerName;
            data.Uri         = new Uri(DropBoxConstants.Uri);
            data.Description = DropBoxConstants.CrawlerDescription;
            data.DisplayName = DropBoxConstants.CrawlerDisplayName;
            // data.LastChangedBy = new PersonReference(new EntityCode(EntityType.Infrastructure.User, "CluedIn", userId.ToString())); TODO Figure out how we get user Id
            data.Codes.Add(new EntityCode(EntityType.Product, "CluedIn", "DropBox"));

            var iconBytes = GetIcon();

            var rawDataPart = new RawDataPart
            {
                Type       = "/RawData/PreviewImage",
                MimeType   = MimeType.Jpeg.Code,
                FileName   = "preview_{0}".FormatWith(clue.OriginEntityCode.Key),
                RawDataMD5 = FileHashUtility.GetMD5Base64String(iconBytes),
                RawData    = Convert.ToBase64String(iconBytes)
            };

            clue.Details.RawData.Add(rawDataPart);

            clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 128, 128);

            ProviderRoot = clue;

            return(clue);
        }
示例#4
0
        protected override Clue MakeClueImpl([NotNull] User input, Guid accountId)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            var clue = _factory.Create(EntityType.Infrastructure.User, input.id.ToString(), accountId);

            var data = clue.Data.EntityData;

            if (!string.IsNullOrWhiteSpace(input.screen_name))
            {
                data.Codes.Add(new EntityCode(EntityType.Infrastructure.User, "Twitter", input.screen_name.ToLowerInvariant()));
            }

            if (!string.IsNullOrWhiteSpace(input.screen_name))
            {
                data.Name = input.name.ToString();
            }

            if (!string.IsNullOrWhiteSpace(input.description))
            {
                data.Description = input.description.ToString();
            }

            if (!string.IsNullOrEmpty(input.created_at))
            {
                if (DateTimeOffset.TryParse(input.created_at, out var createdDate))
                {
                    data.CreatedDate = createdDate;
                }
            }

            if (input.profile_image_url != null)
            {
                RawDataPart rawDataPart = null;

                RestClient restClient = new RestClient(input.profile_image_url);
                var        d          = restClient.DownloadData(new RestRequest(Method.GET));
                rawDataPart = new RawDataPart
                {
                    Type       = "/RawData/PreviewImage",
                    MimeType   = CluedIn.Core.FileTypes.MimeType.Jpeg.Code,
                    FileName   = "preview_{0}".FormatWith(input.profile_image_url),
                    RawDataMD5 = FileHashUtility.GetMD5Base64String(d),
                    RawData    = Convert.ToBase64String(d)
                };

                if (rawDataPart != null)
                {
                    clue.Details.RawData.Add(rawDataPart);
                    clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 255, 255);
                }
            }

            if (!string.IsNullOrWhiteSpace(input.following_user))
            {
                _factory.CreateOutgoingEntityReference(clue, EntityType.Infrastructure.User, EntityEdgeType.Follows, input, input.following_user.ToLowerInvariant());
            }

            //if (!string.IsNullOrWhiteSpace(input.id))
            //{
            //    _factory.CreateOutgoingEntityReference(clue, EntityType.Announcement, EntityEdgeType.Created, input, input.id);
            //}

            var vocab = new TwitterUserVocabulary();

            if (!data.OutgoingEdges.Any())
            {
                _factory.CreateEntityRootReference(clue, EntityEdgeType.PartOf);
            }

            data.Properties[vocab.id]               = input.id.PrintIfAvailable();
            data.Properties[vocab.id_str]           = input.id_str.PrintIfAvailable();
            data.Properties[vocab.name]             = input.name.PrintIfAvailable();
            data.Properties[vocab.screen_name]      = input.screen_name.PrintIfAvailable();
            data.Properties[vocab.location]         = input.location.PrintIfAvailable();
            data.Properties[vocab.profile_location] = input.profile_location.PrintIfAvailable();
            data.Properties[vocab.description]      = input.description.PrintIfAvailable();
            data.Properties[vocab.url]              = input.url.PrintIfAvailable();
            //data.Properties[vocab.entities] = input.entities.PrintIfAvailable();
            data.Properties[vocab.isProtected]                        = input.isProtected.PrintIfAvailable();
            data.Properties[vocab.followers_count]                    = input.followers_count.PrintIfAvailable();
            data.Properties[vocab.friends_count]                      = input.friends_count.PrintIfAvailable();
            data.Properties[vocab.listed_count]                       = input.listed_count.PrintIfAvailable();
            data.Properties[vocab.created_at]                         = input.created_at.PrintIfAvailable();
            data.Properties[vocab.favourites_count]                   = input.favourites_count.PrintIfAvailable();
            data.Properties[vocab.utc_offset]                         = input.utc_offset.PrintIfAvailable();
            data.Properties[vocab.time_zone]                          = input.time_zone.PrintIfAvailable();
            data.Properties[vocab.geo_enabled]                        = input.geo_enabled.PrintIfAvailable();
            data.Properties[vocab.verified]                           = input.verified.PrintIfAvailable();
            data.Properties[vocab.statuses_count]                     = input.statuses_count.PrintIfAvailable();
            data.Properties[vocab.lang]                               = input.lang.PrintIfAvailable();
            data.Properties[vocab.contributors_enabled]               = input.contributors_enabled.PrintIfAvailable();
            data.Properties[vocab.is_translator]                      = input.is_translator.PrintIfAvailable();
            data.Properties[vocab.is_translation_enabled]             = input.is_translation_enabled.PrintIfAvailable();
            data.Properties[vocab.profile_background_color]           = input.profile_background_color.PrintIfAvailable();
            data.Properties[vocab.profile_background_image_url]       = input.profile_background_image_url.PrintIfAvailable();
            data.Properties[vocab.profile_background_image_url_https] = input.profile_background_image_url_https.PrintIfAvailable();
            data.Properties[vocab.profile_background_tile]            = input.profile_background_tile.PrintIfAvailable();
            data.Properties[vocab.profile_image_url]                  = input.profile_image_url.PrintIfAvailable();
            data.Properties[vocab.profile_image_url_https]            = input.profile_image_url_https.PrintIfAvailable();
            data.Properties[vocab.profile_banner_url]                 = input.profile_banner_url.PrintIfAvailable();
            data.Properties[vocab.profile_link_color]                 = input.profile_link_color.PrintIfAvailable();
            data.Properties[vocab.profile_sidebar_border_color]       = input.profile_sidebar_border_color.PrintIfAvailable();
            data.Properties[vocab.profile_sidebar_fill_color]         = input.profile_sidebar_fill_color.PrintIfAvailable();
            data.Properties[vocab.profile_text_color]                 = input.profile_text_color.PrintIfAvailable();
            data.Properties[vocab.profile_use_background_image]       = input.profile_use_background_image.PrintIfAvailable();
            data.Properties[vocab.has_extended_profile]               = input.has_extended_profile.PrintIfAvailable();
            data.Properties[vocab.default_profile]                    = input.default_profile.PrintIfAvailable();
            data.Properties[vocab.default_profile_image]              = input.default_profile_image.PrintIfAvailable();
            data.Properties[vocab.following]                          = input.following.PrintIfAvailable();
            data.Properties[vocab.follow_request_sent]                = input.follow_request_sent.PrintIfAvailable();
            data.Properties[vocab.notifications]                      = input.notifications.PrintIfAvailable();
            data.Properties[vocab.translator_type]                    = input.translator_type.PrintIfAvailable();

            return(clue);
        }
示例#5
0
        protected override Clue MakeClueImpl(Employee input, Guid id)
        {
            var clue = _factory.Create("/Employee", input.EmployeeId, id);
            var data = clue.Data.EntityData;

            var vocab = new EmployeeVocabulary();

            //if (!string.IsNullOrEmpty(input.Degree))
            //{
            //    data.Name = input.Degree;
            //}

            if (input.Names != null)
            {
                if (input.Names.Any())
                {
                    data.Name = string.Format("{0} {1}", input.Names.First().FirstName, input.Names.First().LastName);
                    //foreach(var name in input.Names)
                    //{
                    //    data.Aliases.Add(name.);
                    //}
                }
            }

            if (input.EmploymentInfo != null)
            {
                data.Properties[vocab.BusinessTitle]    = input.EmploymentInfo.BusinessTitle.PrintIfAvailable();
                data.Properties[vocab.CustomGroupA]     = input.EmploymentInfo.CustomGroupA.PrintIfAvailable();
                data.Properties[vocab.CustomGroupB]     = input.EmploymentInfo.CustomGroupB.PrintIfAvailable();
                data.Properties[vocab.Department]       = input.EmploymentInfo.Department.PrintIfAvailable();
                data.Properties[vocab.EffectiveDate]    = input.EmploymentInfo.EffectiveDate.PrintIfAvailable();
                data.Properties[vocab.EmployeeClass]    = input.EmploymentInfo.EmployeeClass.PrintIfAvailable();
                data.Properties[vocab.EmployeeType]     = input.EmploymentInfo.EmployeeType.PrintIfAvailable();
                data.Properties[vocab.EmploymentStatus] = input.EmploymentInfo.EmploymentStatus.PrintIfAvailable();
                data.Properties[vocab.EventCode]        = input.EmploymentInfo.EventCode.PrintIfAvailable();
                data.Properties[vocab.EventDesc]        = input.EmploymentInfo.EventDesc.PrintIfAvailable();
                data.Properties[vocab.FlsaCode]         = input.EmploymentInfo.FlsaCode.PrintIfAvailable();
                data.Properties[vocab.JobCode]          = input.EmploymentInfo.JobCode.PrintIfAvailable();
                data.Properties[vocab.Location]         = input.EmploymentInfo.Location.PrintIfAvailable();
                data.Properties[vocab.PayGroup]         = input.EmploymentInfo.PayGroup.PrintIfAvailable();

                data.Properties[vocab.ReasonCode]       = input.EmploymentInfo.ReasonCode.PrintIfAvailable();
                data.Properties[vocab.ReasonDesc]       = input.EmploymentInfo.ReasonDesc.PrintIfAvailable();
                data.Properties[vocab.RegularTemporary] = input.EmploymentInfo.RegularTemporary.PrintIfAvailable();
                data.Properties[vocab.ServiceDate]      = input.EmploymentInfo.ServiceDate.PrintIfAvailable();

                data.Properties[vocab.StandardHours]   = input.EmploymentInfo.StandardHours.PrintIfAvailable();
                data.Properties[vocab.Supervisor]      = input.EmploymentInfo.Supervisor.PrintIfAvailable();
                data.Properties[vocab.TerminationDate] = input.EmploymentInfo.TerminationDate.PrintIfAvailable();

                data.Properties[vocab.WorkEmail] = input.EmploymentInfo.WorkEmail.PrintIfAvailable();
                if (input.EmploymentInfo.WorkEmail != null)
                {
                    var code = new EntityCode("/Employee", "CluedIn", input.EmploymentInfo.WorkEmail);
                    data.Codes.Add(code);
                }

                data.Properties[vocab.WorkersCompCode] = input.EmploymentInfo.WorkersCompCode.PrintIfAvailable();
                data.Properties[vocab.WorkPhone]       = input.EmploymentInfo.WorkPhone.PrintIfAvailable();
            }

            data.Properties[vocab.AlternateId] = input.AlternateId.PrintIfAvailable();
            data.Properties[vocab.EmployeeId]  = input.EmployeeId.PrintIfAvailable();

            if (input.EmployeePhoto != null)
            {
                if (!string.IsNullOrEmpty(input.EmployeePhoto.Uri))
                {
                    RawDataPart rawDataPart = null;

                    try
                    {
                        var download = new RestClient().DownloadData(new RestRequest(input.EmployeePhoto.Uri));

                        rawDataPart = new RawDataPart
                        {
                            Type       = "/RawData/PreviewImage",
                            MimeType   = input.EmployeePhoto.MimeType,
                            FileName   = input.EmployeePhoto.Uri,
                            RawDataMD5 = FileHashUtility.GetMD5Base64String(download),
                            RawData    = Convert.ToBase64String(download)
                        };

                        if (rawDataPart != null)
                        {
                            clue.Details.RawData.Add(rawDataPart);
                            clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 255, 255);
                        }
                    }
                    catch (Exception exception)
                    {
                        _log.LogWarning(exception, "Could not download Trinet Photo Url for Employee");
                    }
                }

                if (!data.OutgoingEdges.Any())
                {
                    _factory.CreateEntityRootReference(clue, EntityEdgeType.PartOf);
                }
            }

            return(clue);
        }
示例#6
0
        protected void PopulateContact(Clue clue, ContactModel contact, ExchangeService service)
        {
            var value = contact.Object;
            var data  = clue.Data.EntityData;

            data.Name        = value.ExPrintIfAvailable(v => v.DisplayName);
            data.CreatedDate = value.ExGetIfAvailable(v => v.DateTimeCreated, data.CreatedDate);
            data.Culture     = CultureInfo.InvariantCulture;

            this.PopulateItem(clue, contact, ExchangeSharedMailboxVocabulary.Contact, service);

            contact.LoadContactSchemaProperties();

            data.DisplayName = value.ExPrintIfAvailable(v => v.DisplayName) ?? data.DisplayName;

            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Alias]            = value.ExPrintIfAvailable(v => v.Alias);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.AssistantName]    = value.ExPrintIfAvailable(v => v.AssistantName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Birthday]         = value.ExPrintIfAvailable(v => v.Birthday);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.BusinessHomePage] = value.ExPrintIfAvailable(v => v.BusinessHomePage);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Companies]        = value.ExPrintIfAvailable(v => v.Companies);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompanyName]      = value.ExPrintIfAvailable(v => v.CompanyName);

            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.FullName]      = value.ExPrintIfAvailable(v => v.CompleteName?.FullName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.GivenName]     = value.ExPrintIfAvailable(v => v.CompleteName?.GivenName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Initials]      = value.ExPrintIfAvailable(v => v.CompleteName?.Initials);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.MiddleName]    = value.ExPrintIfAvailable(v => v.CompleteName?.MiddleName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.NickName]      = value.ExPrintIfAvailable(v => v.CompleteName?.NickName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Suffix]        = value.ExPrintIfAvailable(v => v.CompleteName?.Suffix);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Surname]       = value.ExPrintIfAvailable(v => v.CompleteName?.Surname);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Title]         = value.ExPrintIfAvailable(v => v.CompleteName?.Title);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.YomiGivenName] = value.ExPrintIfAvailable(v => v.CompleteName?.YomiGivenName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.YomiSurname]   = value.ExPrintIfAvailable(v => v.CompleteName?.YomiSurname);

            data.Properties[ExchangeSharedMailboxVocabulary.Contact.ContactSource] = value.ExPrintIfAvailable(v => v.ContactSource);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Department]    = value.ExPrintIfAvailable(v => v.Department);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.DirectoryId]   = value.ExPrintIfAvailable(v => v.DirectoryId);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.DisplayName]   = value.ExPrintIfAvailable(v => v.DisplayName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.FileAs]        = value.ExPrintIfAvailable(v => v.FileAs);

            data.Properties[ExchangeSharedMailboxVocabulary.Contact.FileAsMapping] = value.ExPrintIfAvailable(v => v.FileAsMapping != FileAsMapping.None ? v.FileAsMapping.ToString() : null);

            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Generation]         = value.ExPrintIfAvailable(v => v.Generation);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.GivenName]          = value.ExPrintIfAvailable(v => v.GivenName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.HasPicture]         = value.ExPrintIfAvailable(v => v.HasPicture);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Initials]           = value.ExPrintIfAvailable(v => v.Initials);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.JobTitle]           = value.ExPrintIfAvailable(v => v.JobTitle);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Manager]            = value.ExPrintIfAvailable(v => v.Manager);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.MiddleName]         = value.ExPrintIfAvailable(v => v.MiddleName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Mileage]            = value.ExPrintIfAvailable(v => v.Mileage);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.NickName]           = value.ExPrintIfAvailable(v => v.NickName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Notes]              = value.ExPrintIfAvailable(v => v.Notes);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.OfficeLocation]     = value.ExPrintIfAvailable(v => v.OfficeLocation);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticFirstName]  = value.ExPrintIfAvailable(v => v.PhoneticFirstName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticFullName]   = value.ExPrintIfAvailable(v => v.PhoneticFullName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticLastName]   = value.ExPrintIfAvailable(v => v.PhoneticLastName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.PostalAddressIndex] = value.ExPrintIfAvailable(v => v.PostalAddressIndex);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Profession]         = value.ExPrintIfAvailable(v => v.Profession);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.SpouseName]         = value.ExPrintIfAvailable(v => v.SpouseName);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.Surname]            = value.ExPrintIfAvailable(v => v.Surname);
            data.Properties[ExchangeSharedMailboxVocabulary.Contact.WeddingAnniversary] = value.ExPrintIfAvailable(v => v.WeddingAnniversary);

            // EmailAddresses
            try
            {
                var emails         = contact.GetEmailAddresses();
                var filteredEmails = contact.GetSmtpEmailAddresses(emails).ToList();

                if (filteredEmails.Any())
                {
                    data.Properties[ExchangeSharedMailboxVocabulary.Contact.EmailAddress] = filteredEmails.First();

                    if (filteredEmails.Count > 1)
                    {
                        data.Properties[ExchangeSharedMailboxVocabulary.Contact.EmailAddresses] = string.Join(";", filteredEmails);
                    }

                    data.Aliases.AddRange(filteredEmails);
                }

                clue.Data.EntityData.Codes.AddRange(contact.CreateEntityCodesFromEmailAddresses(emails));
            }
            catch (ServiceObjectPropertyException e)
            {
                this.state.Log.Warn(() => "Could not get email addresses", e);
            }

            // PhoneNumbers
            {
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.AssistantPhone]   = GetPhoneNumber(value, PhoneNumberKey.AssistantPhone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessFax]      = GetPhoneNumber(value, PhoneNumberKey.BusinessFax);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessPhone]    = GetPhoneNumber(value, PhoneNumberKey.BusinessPhone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessPhone2]   = GetPhoneNumber(value, PhoneNumberKey.BusinessPhone2);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Callback]         = GetPhoneNumber(value, PhoneNumberKey.Callback);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.CarPhone]         = GetPhoneNumber(value, PhoneNumberKey.CarPhone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.CompanyMainPhone] = GetPhoneNumber(value, PhoneNumberKey.CompanyMainPhone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomeFax]          = GetPhoneNumber(value, PhoneNumberKey.HomeFax);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomePhone]        = GetPhoneNumber(value, PhoneNumberKey.HomePhone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomePhone2]       = GetPhoneNumber(value, PhoneNumberKey.HomePhone2);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Isdn]             = GetPhoneNumber(value, PhoneNumberKey.Isdn);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.MobilePhone]      = GetPhoneNumber(value, PhoneNumberKey.MobilePhone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.OtherFax]         = GetPhoneNumber(value, PhoneNumberKey.OtherFax);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessFax]      = GetPhoneNumber(value, PhoneNumberKey.BusinessFax);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Pager]            = GetPhoneNumber(value, PhoneNumberKey.Pager);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.OtherTelephone]   = GetPhoneNumber(value, PhoneNumberKey.OtherTelephone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.RadioPhone]       = GetPhoneNumber(value, PhoneNumberKey.RadioPhone);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Telex]            = GetPhoneNumber(value, PhoneNumberKey.Telex);
                data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.TtyTddPhone]      = GetPhoneNumber(value, PhoneNumberKey.TtyTddPhone);
            }

            // DirectoryPhoto
            try
            {
                var version    = (int)contact.Service.RequestedServerVersion;
                var additional = new List <PropertyDefinitionBase>()
                {
                    ContactSchema.Photo
                };
                var filtered = additional.Where(p => ((int)p.Version) <= version).ToArray();

                if (filtered.Any())
                {
                    var tmp = new PropertySet(BasePropertySet.FirstClassProperties, filtered.Concat(new[] { ItemSchema.Attachments }));

                    if (value.Id != null)
                    {
                        value.ExLoad(this.state, tmp);
                    }

                    var directoryPhoto = value.ExGetIfAvailable(v => v.DirectoryPhoto, null);

                    if (directoryPhoto != null)
                    {
                        using (var stream = new MemoryStream(directoryPhoto))
                        {
                            var mimeType = FileCrawlingUtility.DetectMimeType(new FileInfo("PreviewImage"), new DataPart(), stream, this.state);

                            if (mimeType.FileDescriptor.Category == FileCategory.ImageBitmap)
                            {
                                var rawDataPart = new RawDataPart()
                                {
                                    Type       = "/RawData/PreviewImage",
                                    MimeType   = mimeType.Code,
                                    FileName   = "preview_{0}".FormatWith(data.OriginEntityCode.Key),
                                    RawDataMD5 = FileHashUtility.GetMD5Base64String(directoryPhoto),
                                    RawData    = Convert.ToBase64String(directoryPhoto)
                                };

                                clue.Details.RawData.Add(rawDataPart);

                                data.PreviewImage = new ImageReferencePart(rawDataPart);
                            }
                            else
                            {
                                this.state.Log.Info(() => $"DirectoryPhoto is not an image: {mimeType.Code}");
                            }
                        }
                    }
                }

                if (value.Attachments != null)
                {
                    var contactPhotos = value.Attachments.Where(a => a is FileAttachment && ((FileAttachment)a).IsContactPhoto).Cast <FileAttachment>().ToList();
                    var contactPhoto  = contactPhotos.FirstOrDefault();

                    if (contactPhoto != null)
                    {
                        using (var tempFile = new TemporaryFile(contactPhoto.Name))
                        {
                            contactPhoto.ExLoad(this.state, tempFile.FilePath);

                            var mimeType = tempFile.FileInfo.ToMimeType();

                            using (var stream = File.OpenRead(tempFile.FilePath))
                            {
                                mimeType = FileCrawlingUtility.DetectMimeType(tempFile.FileInfo, new DataPart(), stream, this.state);
                            }

                            if (mimeType.FileDescriptor.Category == FileCategory.ImageBitmap)
                            {
                                using (var stream = File.OpenRead(tempFile.FilePath))
                                {
                                    var bytes = stream.ToArray();

                                    var rawDataPart = new RawDataPart()
                                    {
                                        Type       = "/RawData/PreviewImage",
                                        MimeType   = mimeType.Code,
                                        FileName   = "preview_{0}".FormatWith(data.OriginEntityCode.Key),
                                        RawDataMD5 = FileHashUtility.GetMD5Base64String(bytes),
                                        RawData    = Convert.ToBase64String(bytes)
                                    };

                                    clue.Details.RawData.Add(rawDataPart);

                                    data.PreviewImage = new ImageReferencePart(rawDataPart);
                                }
                            }
                            else
                            {
                                this.state.Log.Info(() => $"ContactPhoto is not an image: {mimeType.Code}");
                            }
                        }
                    }
                }
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception e)
            {
                this.state.Log.Warn(() => "Could not get DirectoryPhoto", e);
            }
        }
示例#7
0
        protected override Clue MakeClueImpl(Candidate input, Guid id)
        {
            var clue = _factory.Create("/Candidate", input.Id.ToString(), id);
            var data = clue.Data.EntityData;

            var vocab = new CandidateVocabulary();

            if (!string.IsNullOrEmpty(input.FirstName) && !string.IsNullOrEmpty(input.LastName))
            {
                data.Name = string.Format("{0}{1}", input.FirstName, input.LastName);
            }

            DateTimeOffset modifiedDate;

            if (DateTimeOffset.TryParse(input.UpdatedAt.ToString(), out modifiedDate))
            {
                data.ModifiedDate = modifiedDate;
            }

            DateTimeOffset createdDate;

            if (DateTimeOffset.TryParse(input.CreatedAt.ToString(), out createdDate))
            {
                data.CreatedDate = createdDate;
            }

            if (input.Tags != null)
            {
                foreach (var tag in input.Tags)
                {
                    data.Tags.Add(new Tag(tag.ToString()));
                }
            }

            if (input.SocialMediaAddresses != null)
            {
                foreach (var socialMediaAddress in input.SocialMediaAddresses)
                {
                    data.Aliases.Add(socialMediaAddress.ToString());
                }
            }

            if (input.PhoneNumbers != null)
            {
                foreach (var phoneNumbers in input.PhoneNumbers)
                {
                    data.Aliases.Add(phoneNumbers.ToString());
                }
            }

            if (input.EmailAddresses != null)
            {
                foreach (var emailAddress in input.EmailAddresses)
                {
                    var code = new EntityCode("/Candidate", "CluedIn", emailAddress.Value);
                    data.Codes.Add(code);
                }
            }

            if (input.Educations != null)
            {
                foreach (var education in input.Educations)
                {
                    _factory.CreateOutgoingEntityReference(clue, "/School", EntityEdgeType.Attended, education, education.Id.ToString());
                }
            }

            //if (input.Employments != null)
            //    foreach (var employment in input.Employments)
            //    {
            //        _factory.CreateOutgoingEntityReference(clue, "/Placement", EntityEdgeType.Attended, employment, employment.Id.ToString());
            //    }

            if (input.Company != null)
            {
                _factory.CreateOutgoingEntityReference(clue, EntityType.Organization, EntityEdgeType.Attended, input, input.Company);
            }

            if (input.Attachments != null)
            {
                foreach (var attachment in input.Attachments)
                {
                    //You might need to parse this.
                    _factory.CreateOutgoingEntityReference(clue, EntityType.Files.File, EntityEdgeType.PartOf, attachment, attachment.Url.ToString());
                }
            }

            if (input.Applications != null)
            {
                foreach (var application in input.ApplicationIds)
                {
                    _factory.CreateOutgoingEntityReference(clue, "/Application", EntityEdgeType.For, application, application.ToString());
                }
            }

            if (input.Addresses != null)
            {
                foreach (var address in input.Addresses)
                {
                    _factory.CreateOutgoingEntityReference(clue, EntityType.Location, EntityEdgeType.For, address, address.Value.ToString());
                }
            }

            data.Properties[vocab.Title]    = input.Title.PrintIfAvailable();
            data.Properties[vocab.PhotoUrl] = input.PhotoUrl.PrintIfAvailable();

            if (input.PhotoUrl != null)
            {
                RawDataPart rawDataPart = null;

                try
                {
                    var download = new RestClient().DownloadData(new RestRequest(input.PhotoUrl.ToString()));

                    rawDataPart = new RawDataPart
                    {
                        Type       = "/RawData/PreviewImage",
                        MimeType   = CluedIn.Core.FileTypes.MimeType.Jpeg.Code,
                        FileName   = input.PhotoUrl.ToString(),
                        RawDataMD5 = FileHashUtility.GetMD5Base64String(download),
                        RawData    = Convert.ToBase64String(download)
                    };

                    if (rawDataPart != null)
                    {
                        clue.Details.RawData.Add(rawDataPart);
                        clue.Data.EntityData.PreviewImage = new ImageReferencePart(rawDataPart, 255, 255);
                    }
                }
                catch (Exception exception)
                {
                    _log.LogWarning(exception, "Could not download Greenhouse Photo Url for Candidate");
                }
            }

            data.Properties[vocab.LastName]     = input.LastName.PrintIfAvailable();
            data.Properties[vocab.LastActivity] = input.LastActivity.ToString().PrintIfAvailable();
            data.Properties[vocab.Coordinator]  = input.Coordinator.PrintIfAvailable();
            data.Properties[vocab.CanEmail]     = input.CanEmail.PrintIfAvailable();

            data.Properties[vocab.FirstName] = input.FirstName.PrintIfAvailable();


            if (!data.OutgoingEdges.Any())
            {
                _factory.CreateEntityRootReference(clue, EntityEdgeType.PartOf);
            }

            return(clue);
        }
示例#8
0
        protected override Clue MakeClueImpl([NotNull] FileMetadata input, Guid accountId)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            var clue = _factory.Create(EntityType.Files.File, input.PathLower, accountId);

            clue.ValidationRuleSuppressions.Add(Constants.Validation.Rules.DATA_001_File_MustBeIndexed);

            var data = clue.Data.EntityData;

            var value = input.AsFile;

            if (value.Name != null)
            {
                data.Name        = value.Name;
                data.DisplayName = value.Name;
                data.Properties[DropBoxVocabulary.File.ItemName] = value.Name;
            }

            data.DocumentSize = (long)value.Size;
            data.ModifiedDate = value.ServerModified;

            try
            {
                var url = _uriBuilder.GetUri(value);
                data.Uri = url;
                data.Properties[DropBoxVocabulary.File.EditUrl] = url.ToString().Replace("www.dropbox.com/", "www.dropbox.com/ow/msft/edit/").Replace("?preview=", "/").Replace("+", "%20");
            }
            catch (Exception exc)
            {
                _log.Warn(() => "Could not create ShareTask Dropbox File", exc); //Handle error
            }

            data.Properties[DropBoxVocabulary.File.Bytes]       = value.Size.PrintIfAvailable();
            data.Properties[DropBoxVocabulary.File.ClientMTime] = value.ClientModified.PrintIfAvailable();


            if (value.PathLower != null)
            {
                data.Properties[DropBoxVocabulary.File.Path] = value.PathLower.PrintIfAvailable();
                _factory.CreateOutgoingEntityReference(clue, EntityType.Files.Directory, "Parent", value, "/" + VirtualPathUtility.GetDirectory(value.PathLower).Trim(_trimChars));
            }

            data.Properties[DropBoxVocabulary.File.Rev] = value.Rev.PrintIfAvailable();

            if (value.Rev != null)
            {
                data.Revision = value.Rev.ToString(CultureInfo.InvariantCulture);
            }

            data.Properties[DropBoxVocabulary.File.ParentSharedFolderId] = value.ParentSharedFolderId.PrintIfAvailable();
            _factory.CreateOutgoingEntityReference(clue, EntityType.Provider.Root, EntityEdgeType.ManagedIn, _providerRoot, _providerRoot.OriginEntityCode.Value);



            var shouldIndexFile = _jobData.FileSizeLimit == null || _jobData.FileSizeLimit.Value == 0 || (long)value.Size < _jobData.FileSizeLimit.Value;

            var client = _clientFactory.CreateNew(_jobData);

            if (shouldIndexFile)
            {
                try
                {
                    var indexer = new FileIndexer(client, _state, _context);
                    Task.Run(() => indexer.Index(value, clue).ConfigureAwait(false));
                }
                catch (OperationCanceledException)
                {
                }
                catch (Exception exc)
                {
                    _log.Warn(() => "Could not index Dropbox File", exc); //Handle error
                }
            }

            if (data.PreviewImage == null)
            {
                var extension = string.Empty;

                try
                {
                    extension = new FileInfo(input.Name).Extension;
                }
                catch (ArgumentException)
                {
                }

                var allowedExtensions = new[]
                {
                    ".jpg", ".jpeg", ".tif", ".tiff", ".png", ".gif", ".bmp"
                }.ToHashSet();

                if (!string.IsNullOrEmpty(extension) && allowedExtensions.Contains(extension.ToLowerInvariant()))
                {
                    try
                    {
                        var thumbnail = client.GetThumbnailAsync(value.PathLower, ThumbnailFormat.Jpeg.Instance, ThumbnailSize.W1024h768.Instance).Result;

                        var bytes       = thumbnail.GetContentAsByteArrayAsync().Result;
                        var rawDataPart = new RawDataPart
                        {
                            Type       = "/RawData/PreviewImage",
                            MimeType   = CluedIn.Core.FileTypes.MimeType.Jpeg.Code,
                            FileName   = "preview_{0}".FormatWith(data.OriginEntityCode.Key),
                            RawDataMD5 = FileHashUtility.GetMD5Base64String(bytes),
                            RawData    = Convert.ToBase64String(bytes)
                        };

                        clue.Details.RawData.Add(rawDataPart);

                        data.PreviewImage = new ImageReferencePart(rawDataPart);
                    }
                    catch (OperationCanceledException)
                    {
                    }
                    catch (DropboxException exc)
                    {
                        _log.Warn(new { FileExtention = extension }, () => "Could not get thumbnail from Dropbox: " + extension, exc);
                    }
                }
            }

            return(clue);
        }