From f74e27e0950e7114bee61cea68463b565b55d7bc Mon Sep 17 00:00:00 2001 From: Balu Dontu Date: Wed, 10 May 2017 18:08:08 -0700 Subject: [PATCH 1/7] PBM govmomi dependencies --- Godeps/Godeps.json | 70 +- Godeps/LICENSES | 420 ++++ vendor/github.com/vmware/govmomi/.mailmap | 16 + vendor/github.com/vmware/govmomi/BUILD | 1 + vendor/github.com/vmware/govmomi/CHANGELOG.md | 32 + vendor/github.com/vmware/govmomi/CONTRIBUTORS | 16 +- vendor/github.com/vmware/govmomi/README.md | 10 + vendor/github.com/vmware/govmomi/find/BUILD | 2 + vendor/github.com/vmware/govmomi/find/doc.go | 37 + .../github.com/vmware/govmomi/find/finder.go | 167 +- .../vmware/govmomi/find/recurser.go | 245 +++ vendor/github.com/vmware/govmomi/list/BUILD | 1 - .../github.com/vmware/govmomi/list/lister.go | 25 +- .../vmware/govmomi/list/recurser.go | 97 - vendor/github.com/vmware/govmomi/object/BUILD | 6 +- .../object/authorization_manager_internal.go | 86 + .../vmware/govmomi/object/datastore_file.go | 2 - .../govmomi/object/datastore_file_manager.go | 145 ++ .../govmomi/object/host_config_manager.go | 16 + .../object/host_vsan_internal_system.go | 117 ++ .../vmware/govmomi/object/list_view.go | 70 - .../vmware/govmomi/object/opaque_network.go | 57 + .../object/virtual_disk_manager_internal.go | 97 + .../vmware/govmomi/object/virtual_machine.go | 32 + vendor/github.com/vmware/govmomi/pbm/BUILD | 58 + .../github.com/vmware/govmomi/pbm/client.go | 217 +++ .../vmware/govmomi/pbm/client_test.go | 301 +++ .../vmware/govmomi/pbm/methods/BUILD | 31 + .../vmware/govmomi/pbm/methods/methods.go | 664 +++++++ .../github.com/vmware/govmomi/pbm/pbm_util.go | 146 ++ .../github.com/vmware/govmomi/pbm/types/BUILD | 32 + .../vmware/govmomi/pbm/types/enum.go | 211 ++ .../github.com/vmware/govmomi/pbm/types/if.go | 139 ++ .../vmware/govmomi/pbm/types/types.go | 1712 +++++++++++++++++ .../github.com/vmware/govmomi/property/BUILD | 1 + .../vmware/govmomi/property/collector.go | 27 + .../vmware/govmomi/property/filter.go | 135 ++ vendor/github.com/vmware/govmomi/task/wait.go | 5 + .../vmware/govmomi/vim25/methods/methods.go | 2 +- .../vmware/govmomi/vim25/mo/ancestors.go | 2 + .../github.com/vmware/govmomi/vim25/mo/mo.go | 141 +- .../vmware/govmomi/vim25/soap/client.go | 34 + .../vmware/govmomi/vim25/soap/error.go | 8 +- .../vmware/govmomi/vim25/soap/soap.go | 8 +- .../vmware/govmomi/vim25/types/enum.go | 2 +- .../vmware/govmomi/vim25/types/helpers.go | 4 + .../vmware/govmomi/vim25/types/if.go | 2 +- .../vmware/govmomi/vim25/types/registry.go | 15 +- .../vmware/govmomi/vim25/types/types.go | 2 +- .../vmware/govmomi/vim25/xml/extras.go | 2 + .../vmware/govmomi/vim25/xml/read.go | 4 +- 51 files changed, 5375 insertions(+), 297 deletions(-) create mode 100644 vendor/github.com/vmware/govmomi/.mailmap create mode 100644 vendor/github.com/vmware/govmomi/find/doc.go create mode 100644 vendor/github.com/vmware/govmomi/find/recurser.go delete mode 100644 vendor/github.com/vmware/govmomi/list/recurser.go create mode 100644 vendor/github.com/vmware/govmomi/object/authorization_manager_internal.go create mode 100644 vendor/github.com/vmware/govmomi/object/datastore_file_manager.go create mode 100644 vendor/github.com/vmware/govmomi/object/host_vsan_internal_system.go delete mode 100644 vendor/github.com/vmware/govmomi/object/list_view.go create mode 100644 vendor/github.com/vmware/govmomi/object/opaque_network.go create mode 100644 vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go create mode 100644 vendor/github.com/vmware/govmomi/pbm/BUILD create mode 100644 vendor/github.com/vmware/govmomi/pbm/client.go create mode 100644 vendor/github.com/vmware/govmomi/pbm/client_test.go create mode 100644 vendor/github.com/vmware/govmomi/pbm/methods/BUILD create mode 100644 vendor/github.com/vmware/govmomi/pbm/methods/methods.go create mode 100644 vendor/github.com/vmware/govmomi/pbm/pbm_util.go create mode 100644 vendor/github.com/vmware/govmomi/pbm/types/BUILD create mode 100644 vendor/github.com/vmware/govmomi/pbm/types/enum.go create mode 100644 vendor/github.com/vmware/govmomi/pbm/types/if.go create mode 100644 vendor/github.com/vmware/govmomi/pbm/types/types.go create mode 100644 vendor/github.com/vmware/govmomi/property/filter.go diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 46b0569dc3e9a..4861779abe948 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -2410,78 +2410,88 @@ }, { "ImportPath": "github.com/vmware/govmomi", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/find", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/list", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/object", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/property", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/session", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/task", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25/debug", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25/methods", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25/mo", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25/progress", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25/soap", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25/types", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/govmomi/vim25/xml", - "Comment": "v0.12.1-14-g0a28e59", - "Rev": "0a28e595c8e9e99879e8d2f796e82c5a68202ff0" + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" + }, + { + "ImportPath": "github.com/vmware/govmomi/pbm/types", + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" + }, + { + "ImportPath": "github.com/vmware/govmomi/pbm/methods", + "Comment": "v0.14.0-11-gb8b228c", + "Rev": "b8b228cfbad7f0a69ed90393ca9aee085d3c6ef1" }, { "ImportPath": "github.com/vmware/photon-controller-go-sdk/SSPI", diff --git a/Godeps/LICENSES b/Godeps/LICENSES index 162b28c298186..58eba09052d44 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -77149,6 +77149,426 @@ SOFTWARE. ================================================================================ +================================================================================ += vendor/github.com/vmware/govmomi/pbm/methods licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/github.com/vmware/govmomi/LICENSE.txt 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/github.com/vmware/govmomi/pbm/types licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/github.com/vmware/govmomi/LICENSE.txt 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + ================================================================================ = vendor/github.com/vmware/govmomi/property licensed under: = diff --git a/vendor/github.com/vmware/govmomi/.mailmap b/vendor/github.com/vmware/govmomi/.mailmap new file mode 100644 index 0000000000000..31a0bd55aadda --- /dev/null +++ b/vendor/github.com/vmware/govmomi/.mailmap @@ -0,0 +1,16 @@ +Amit Bathla +Bruce Downs +Bruce Downs +Clint Greenwood +Cédric Blomart +Cédric Blomart cedric +David Stark +Eric Gray +Eric Yutao eric +Henrik Hodne +Jeremy Canady +Pieter Noordhuis +Takaaki Furukawa takaaki.furukawa +Takaaki Furukawa tkak +Vadim Egorov +Zee Yang diff --git a/vendor/github.com/vmware/govmomi/BUILD b/vendor/github.com/vmware/govmomi/BUILD index 938b0270b8cdb..7d4040cb596aa 100644 --- a/vendor/github.com/vmware/govmomi/BUILD +++ b/vendor/github.com/vmware/govmomi/BUILD @@ -34,6 +34,7 @@ filegroup( "//vendor/github.com/vmware/govmomi/find:all-srcs", "//vendor/github.com/vmware/govmomi/list:all-srcs", "//vendor/github.com/vmware/govmomi/object:all-srcs", + "//vendor/github.com/vmware/govmomi/pbm:all-srcs", "//vendor/github.com/vmware/govmomi/property:all-srcs", "//vendor/github.com/vmware/govmomi/session:all-srcs", "//vendor/github.com/vmware/govmomi/task:all-srcs", diff --git a/vendor/github.com/vmware/govmomi/CHANGELOG.md b/vendor/github.com/vmware/govmomi/CHANGELOG.md index fb648df34629f..ea4dd68db020c 100644 --- a/vendor/github.com/vmware/govmomi/CHANGELOG.md +++ b/vendor/github.com/vmware/govmomi/CHANGELOG.md @@ -1,5 +1,37 @@ # changelog +### 0.14.0 (2017-04-08) + +* Add view.ContainerView type and methods + +* Add Collector.RetrieveWithFilter method + +* Add property.Filter type + +* Implement EthernetCardBackingInfo for OpaqueNetwork + +* Finder: support changing object root in find mode + +* Add VirtualDiskManager.QueryVirtualDiskInfo + +* Add performance.Manager APIs + +### 0.13.0 (2017-03-02) + +* Add DatastoreFileManager API wrapper + +* Add HostVsanInternalSystem API wrappers + +* Add Container support to view package + +* Finder supports Folder recursion without specifying a path + +* Add VirtualMachine.QueryConfigTarget method + +* Add device option to VirtualMachine.WaitForNetIP + +* Remove _Task suffix from vapp methods + ### 0.12.1 (2016-12-19) * Add DiagnosticLog helper diff --git a/vendor/github.com/vmware/govmomi/CONTRIBUTORS b/vendor/github.com/vmware/govmomi/CONTRIBUTORS index 03219c4ef4576..6afdb9f56f019 100644 --- a/vendor/github.com/vmware/govmomi/CONTRIBUTORS +++ b/vendor/github.com/vmware/govmomi/CONTRIBUTORS @@ -1,6 +1,6 @@ # People who can (and typically have) contributed to this repository. # -# Please keep the list sorted. +# This script is generated by contributors.sh # abrarshivani @@ -9,24 +9,26 @@ Amit Bathla Andrew Chin Arran Walker Austin Parker +bastienbc Bob Killen Brad Fitzpatrick Bruce Downs Cédric Blomart Christian Höltje -Clint Greenwood +Clint Greenwood Danny Lockard Dave Tucker Davide Agnello David Stark Doug MacEachern Eloy Coto +Eric Gray Eric Yutao Fabio Rapposelli Faiyaz Ahmed forkbomber Gavin Gray -Gavrie Philipson +Gavrie Philipson George Hicken Gerrit Renker gthombare @@ -34,18 +36,20 @@ Hasan Mahmood Henrik Hodne Isaac Rodman Jason Kincl +Jeremy Canady Louie Jiang +Marc Carmier Mevan Samaratunga Nicolas Lamirault -Pieter Noordhuis +Pieter Noordhuis runner.mei S.Çağlar Onur Sergey Ignatov Steve Purcell -Takaaki Furukawa +Takaaki Furukawa Ted Zlatanov Vadim Egorov Yang Yang Yuya Kusakabe Zach Tucker -Zee Yang +Zee Yang diff --git a/vendor/github.com/vmware/govmomi/README.md b/vendor/github.com/vmware/govmomi/README.md index ae3531961cc98..7ebdf1b17c89b 100644 --- a/vendor/github.com/vmware/govmomi/README.md +++ b/vendor/github.com/vmware/govmomi/README.md @@ -61,8 +61,18 @@ Refer to the [CHANGELOG](CHANGELOG.md) for version to version changes. * [Travis CI](https://github.com/travis-ci/jupiter-brain) +* [collectd-vsphere](https://github.com/travis-ci/collectd-vsphere) + * [Gru](https://github.com/dnaeon/gru) +* [Libretto](https://github.com/apcera/libretto/tree/master/virtualmachine/vsphere) + +## Related projects + +* [rbvmomi](https://github.com/vmware/rbvmomi) + +* [pyvmomi](https://github.com/vmware/pyvmomi) + ## License govmomi is available under the [Apache 2 license](LICENSE). diff --git a/vendor/github.com/vmware/govmomi/find/BUILD b/vendor/github.com/vmware/govmomi/find/BUILD index 0a77deec17a35..fd6df8e4d10ee 100644 --- a/vendor/github.com/vmware/govmomi/find/BUILD +++ b/vendor/github.com/vmware/govmomi/find/BUILD @@ -10,8 +10,10 @@ load( go_library( name = "go_default_library", srcs = [ + "doc.go", "error.go", "finder.go", + "recurser.go", ], tags = ["automanaged"], deps = [ diff --git a/vendor/github.com/vmware/govmomi/find/doc.go b/vendor/github.com/vmware/govmomi/find/doc.go new file mode 100644 index 0000000000000..0c8acee01638e --- /dev/null +++ b/vendor/github.com/vmware/govmomi/find/doc.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +Package find implements inventory listing and searching. + +The Finder is an alternative to the object.SearchIndex FindByInventoryPath() and FindChild() methods. +SearchIndex.FindByInventoryPath requires an absolute path, whereas the Finder also supports relative paths +and patterns via path.Match. +SearchIndex.FindChild requires a parent to find the child, whereas the Finder also supports an ancestor via +recursive object traversal. + +The various Finder methods accept a "path" argument, which can absolute or relative to the Folder for the object type. +The Finder supports two modes, "list" and "find". The "list" mode behaves like the "ls" command, only searching within +the immediate path. The "find" mode behaves like the "find" command, with the search starting at the immediate path but +also recursing into sub Folders relative to the Datacenter. The default mode is "list" if the given path contains a "/", +otherwise "find" mode is used. + +The exception is to use a "..." wildcard with a path to find all objects recursively underneath any root object. +For example: VirtualMachineList("/DC1/...") + +See also: https://github.com/vmware/govmomi/blob/master/govc/README.md#usage +*/ +package find diff --git a/vendor/github.com/vmware/govmomi/find/finder.go b/vendor/github.com/vmware/govmomi/find/finder.go index 9f638a52a0592..04d0e891a9b1f 100644 --- a/vendor/github.com/vmware/govmomi/find/finder.go +++ b/vendor/github.com/vmware/govmomi/find/finder.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2014-2016 VMware, Inc. All Rights Reserved. +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import ( "context" "errors" "path" + "strings" "github.com/vmware/govmomi/list" "github.com/vmware/govmomi/object" @@ -30,17 +31,18 @@ import ( ) type Finder struct { - client *vim25.Client - recurser list.Recurser - + client *vim25.Client + r recurser dc *object.Datacenter + si *object.SearchIndex folders *object.DatacenterFolders } func NewFinder(client *vim25.Client, all bool) *Finder { f := &Finder{ client: client, - recurser: list.Recurser{ + si: object.NewSearchIndex(client), + r: recurser{ Collector: property.DefaultCollector(client), All: all, }, @@ -55,9 +57,41 @@ func (f *Finder) SetDatacenter(dc *object.Datacenter) *Finder { return f } -type findRelativeFunc func(ctx context.Context) (object.Reference, error) +// findRoot makes it possible to use "find" mode with a different root path. +// Example: ResourcePoolList("/dc1/host/cluster1/...") +func (f *Finder) findRoot(ctx context.Context, root *list.Element, parts []string) bool { + if len(parts) == 0 { + return false + } + + ix := len(parts) - 1 + + if parts[ix] != "..." { + return false + } + + if ix == 0 { + return true // We already have the Object for root.Path + } + + // Lookup the Object for the new root.Path + rootPath := path.Join(root.Path, path.Join(parts[:ix]...)) + + ref, err := f.si.FindByInventoryPath(ctx, rootPath) + if err != nil || ref == nil { + // If we get an error or fail to match, fall through to find() with the original root and path + return false + } + + root.Path = rootPath + root.Object = ref + + return true +} + +func (f *Finder) find(ctx context.Context, arg string, s *spec) ([]list.Element, error) { + isPath := strings.Contains(arg, "/") -func (f *Finder) find(ctx context.Context, fn findRelativeFunc, tl bool, arg string) ([]list.Element, error) { root := list.Element{ Path: "/", Object: object.NewRootFolder(f.client), @@ -70,7 +104,7 @@ func (f *Finder) find(ctx context.Context, fn findRelativeFunc, tl bool, arg str case "..": // Not supported; many edge case, little value return nil, errors.New("cannot traverse up a tree") case ".": // Relative to whatever - pivot, err := fn(ctx) + pivot, err := s.Relative(ctx) if err != nil { return nil, err } @@ -93,13 +127,17 @@ func (f *Finder) find(ctx context.Context, fn findRelativeFunc, tl bool, arg str } } - f.recurser.TraverseLeafs = tl - es, err := f.recurser.Recurse(ctx, root, parts) - if err != nil { - return nil, err + if s.listMode(isPath) { + if f.findRoot(ctx, &root, parts) { + parts = []string{"*"} + } else { + return f.r.List(ctx, s, root, parts) + } } - return es, nil + s.Parents = append(s.Parents, s.Nested...) + + return f.r.Find(ctx, s, root, parts) } func (f *Finder) datacenter() (*object.Datacenter, error) { @@ -208,7 +246,7 @@ func (f *Finder) rootFolder(_ context.Context) (object.Reference, error) { return object.NewRootFolder(f.client), nil } -func (f *Finder) managedObjectList(ctx context.Context, path string, tl bool) ([]list.Element, error) { +func (f *Finder) managedObjectList(ctx context.Context, path string, tl bool, include []string) ([]list.Element, error) { fn := f.rootFolder if f.dc != nil { @@ -219,7 +257,18 @@ func (f *Finder) managedObjectList(ctx context.Context, path string, tl bool) ([ path = "." } - return f.find(ctx, fn, tl, path) + s := &spec{ + Relative: fn, + Parents: []string{"ComputeResource", "ClusterComputeResource", "HostSystem", "VirtualApp", "StoragePod"}, + Include: include, + } + + if tl { + s.Contents = true + s.ListMode = types.NewBool(true) + } + + return f.find(ctx, path, s) } // Element returns an Element for the given ManagedObjectReference @@ -229,7 +278,11 @@ func (f *Finder) Element(ctx context.Context, ref types.ManagedObjectReference) return ref, nil } - e, err := f.find(ctx, rl, false, ".") + s := &spec{ + Relative: rl, + } + + e, err := f.find(ctx, "./", s) if err != nil { return nil, err } @@ -270,16 +323,21 @@ func (f *Finder) ObjectReference(ctx context.Context, ref types.ManagedObjectRef return r, nil } -func (f *Finder) ManagedObjectList(ctx context.Context, path string) ([]list.Element, error) { - return f.managedObjectList(ctx, path, false) +func (f *Finder) ManagedObjectList(ctx context.Context, path string, include ...string) ([]list.Element, error) { + return f.managedObjectList(ctx, path, false, include) } -func (f *Finder) ManagedObjectListChildren(ctx context.Context, path string) ([]list.Element, error) { - return f.managedObjectList(ctx, path, true) +func (f *Finder) ManagedObjectListChildren(ctx context.Context, path string, include ...string) ([]list.Element, error) { + return f.managedObjectList(ctx, path, true, include) } func (f *Finder) DatacenterList(ctx context.Context, path string) ([]*object.Datacenter, error) { - es, err := f.find(ctx, f.rootFolder, false, path) + s := &spec{ + Relative: f.rootFolder, + Include: []string{"Datacenter"}, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -336,7 +394,12 @@ func (f *Finder) DatacenterOrDefault(ctx context.Context, path string) (*object. } func (f *Finder) DatastoreList(ctx context.Context, path string) ([]*object.Datastore, error) { - es, err := f.find(ctx, f.datastoreFolder, false, path) + s := &spec{ + Relative: f.datastoreFolder, + Parents: []string{"StoragePod"}, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -404,7 +467,11 @@ func (f *Finder) DatastoreOrDefault(ctx context.Context, path string) (*object.D } func (f *Finder) DatastoreClusterList(ctx context.Context, path string) ([]*object.StoragePod, error) { - es, err := f.find(ctx, f.datastoreFolder, false, path) + s := &spec{ + Relative: f.datastoreFolder, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -461,7 +528,11 @@ func (f *Finder) DatastoreClusterOrDefault(ctx context.Context, path string) (*o } func (f *Finder) ComputeResourceList(ctx context.Context, path string) ([]*object.ComputeResource, error) { - es, err := f.find(ctx, f.hostFolder, false, path) + s := &spec{ + Relative: f.hostFolder, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -523,7 +594,11 @@ func (f *Finder) ComputeResourceOrDefault(ctx context.Context, path string) (*ob } func (f *Finder) ClusterComputeResourceList(ctx context.Context, path string) ([]*object.ClusterComputeResource, error) { - es, err := f.find(ctx, f.hostFolder, false, path) + s := &spec{ + Relative: f.hostFolder, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -564,7 +639,13 @@ func (f *Finder) ClusterComputeResource(ctx context.Context, path string) (*obje } func (f *Finder) HostSystemList(ctx context.Context, path string) ([]*object.HostSystem, error) { - es, err := f.find(ctx, f.hostFolder, false, path) + s := &spec{ + Relative: f.hostFolder, + Parents: []string{"ComputeResource", "ClusterComputeResource"}, + Include: []string{"HostSystem"}, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -635,7 +716,11 @@ func (f *Finder) HostSystemOrDefault(ctx context.Context, path string) (*object. } func (f *Finder) NetworkList(ctx context.Context, path string) ([]object.NetworkReference, error) { - es, err := f.find(ctx, f.networkFolder, false, path) + s := &spec{ + Relative: f.networkFolder, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -644,10 +729,14 @@ func (f *Finder) NetworkList(ctx context.Context, path string) ([]object.Network for _, e := range es { ref := e.Object.Reference() switch ref.Type { - case "Network", "OpaqueNetwork": + case "Network": r := object.NewNetwork(f.client, ref) r.InventoryPath = e.Path ns = append(ns, r) + case "OpaqueNetwork": + r := object.NewOpaqueNetwork(f.client, ref) + r.InventoryPath = e.Path + ns = append(ns, r) case "DistributedVirtualPortgroup": r := object.NewDistributedVirtualPortgroup(f.client, ref) r.InventoryPath = e.Path @@ -701,7 +790,14 @@ func (f *Finder) NetworkOrDefault(ctx context.Context, path string) (object.Netw } func (f *Finder) ResourcePoolList(ctx context.Context, path string) ([]*object.ResourcePool, error) { - es, err := f.find(ctx, f.hostFolder, true, path) + s := &spec{ + Relative: f.hostFolder, + Parents: []string{"ComputeResource", "ClusterComputeResource", "VirtualApp"}, + Nested: []string{"ResourcePool"}, + Contents: true, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -804,7 +900,12 @@ func (f *Finder) FolderOrDefault(ctx context.Context, path string) (*object.Fold } func (f *Finder) VirtualMachineList(ctx context.Context, path string) ([]*object.VirtualMachine, error) { - es, err := f.find(ctx, f.vmFolder, false, path) + s := &spec{ + Relative: f.vmFolder, + Parents: []string{"VirtualApp"}, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } @@ -840,7 +941,11 @@ func (f *Finder) VirtualMachine(ctx context.Context, path string) (*object.Virtu } func (f *Finder) VirtualAppList(ctx context.Context, path string) ([]*object.VirtualApp, error) { - es, err := f.find(ctx, f.vmFolder, false, path) + s := &spec{ + Relative: f.vmFolder, + } + + es, err := f.find(ctx, path, s) if err != nil { return nil, err } diff --git a/vendor/github.com/vmware/govmomi/find/recurser.go b/vendor/github.com/vmware/govmomi/find/recurser.go new file mode 100644 index 0000000000000..b62e93a6f8276 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/find/recurser.go @@ -0,0 +1,245 @@ +/* +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package find + +import ( + "context" + "os" + "path" + + "github.com/vmware/govmomi/list" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/property" + "github.com/vmware/govmomi/vim25/mo" +) + +// spec is used to specify per-search configuration, independent of the Finder instance. +type spec struct { + // Relative returns the root object to resolve Relative paths (starts with ".") + Relative func(ctx context.Context) (object.Reference, error) + + // ListMode can be used to optionally force "ls" behavior, rather than "find" behavior + ListMode *bool + + // Contents configures the Recurser to list the Contents of traversable leaf nodes. + // This is typically set to true when used from the ls command, where listing + // a folder means listing its Contents. This is typically set to false for + // commands that take managed entities that are not folders as input. + Contents bool + + // Parents specifies the types which can contain the child types being searched for. + // for example, when searching for a HostSystem, parent types can be + // "ComputeResource" or "ClusterComputeResource". + Parents []string + + // Include specifies which types to be included in the results, used only in "find" mode. + Include []string + + // Nested should be set to types that can be Nested, used only in "find" mode. + Nested []string + + // ChildType avoids traversing into folders that can't contain the Include types, used only in "find" mode. + ChildType []string +} + +func (s *spec) traversable(o mo.Reference) bool { + ref := o.Reference() + + switch ref.Type { + case "Datacenter": + if len(s.Include) == 1 && s.Include[0] == "Datacenter" { + // No point in traversing deeper as Datacenters cannot be nested + return false + } + return true + case "Folder": + if f, ok := o.(mo.Folder); ok { + // TODO: Not making use of this yet, but here we can optimize when searching the entire + // inventory across Datacenters for specific types, for example: 'govc ls -t VirtualMachine /**' + // should not traverse into a Datacenter's host, network or datatore folders. + if !s.traversableChildType(f.ChildType) { + return false + } + } + + return true + } + + for _, kind := range s.Parents { + if kind == ref.Type { + return true + } + } + + return false +} + +func (s *spec) traversableChildType(ctypes []string) bool { + if len(s.ChildType) == 0 { + return true + } + + for _, t := range ctypes { + for _, c := range s.ChildType { + if t == c { + return true + } + } + } + + return false +} + +func (s *spec) wanted(e list.Element) bool { + if len(s.Include) == 0 { + return true + } + + w := e.Object.Reference().Type + + for _, kind := range s.Include { + if w == kind { + return true + } + } + + return false +} + +// listMode is a global option to revert to the original Finder behavior, +// disabling the newer "find" mode. +var listMode = os.Getenv("GOVMOMI_FINDER_LIST_MODE") == "true" + +func (s *spec) listMode(isPath bool) bool { + if listMode { + return true + } + + if s.ListMode != nil { + return *s.ListMode + } + + return isPath +} + +type recurser struct { + Collector *property.Collector + + // All configures the recurses to fetch complete objects for leaf nodes. + All bool +} + +func (r recurser) List(ctx context.Context, s *spec, root list.Element, parts []string) ([]list.Element, error) { + if len(parts) == 0 { + // Include non-traversable leaf elements in result. For example, consider + // the pattern "./vm/my-vm-*", where the pattern should match the VMs and + // not try to traverse them. + // + // Include traversable leaf elements in result, if the contents + // field is set to false. + // + if !s.Contents || !s.traversable(root.Object.Reference()) { + return []list.Element{root}, nil + } + } + + k := list.Lister{ + Collector: r.Collector, + Reference: root.Object.Reference(), + Prefix: root.Path, + } + + if r.All && len(parts) < 2 { + k.All = true + } + + in, err := k.List(ctx) + if err != nil { + return nil, err + } + + // This folder is a leaf as far as the glob goes. + if len(parts) == 0 { + return in, nil + } + + pattern := parts[0] + parts = parts[1:] + + var out []list.Element + for _, e := range in { + matched, err := path.Match(pattern, path.Base(e.Path)) + if err != nil { + return nil, err + } + + if !matched { + continue + } + + nres, err := r.List(ctx, s, e, parts) + if err != nil { + return nil, err + } + + out = append(out, nres...) + } + + return out, nil +} + +func (r recurser) Find(ctx context.Context, s *spec, root list.Element, parts []string) ([]list.Element, error) { + var out []list.Element + + if len(parts) > 0 { + pattern := parts[0] + matched, err := path.Match(pattern, path.Base(root.Path)) + if err != nil { + return nil, err + } + + if matched && s.wanted(root) { + out = append(out, root) + } + } + + if !s.traversable(root.Object) { + return out, nil + } + + k := list.Lister{ + Collector: r.Collector, + Reference: root.Object.Reference(), + Prefix: root.Path, + } + + in, err := k.List(ctx) + if err != nil { + return nil, err + } + + for _, e := range in { + nres, err := r.Find(ctx, s, e, parts) + if err != nil { + return nil, err + } + + out = append(out, nres...) + } + + return out, nil +} diff --git a/vendor/github.com/vmware/govmomi/list/BUILD b/vendor/github.com/vmware/govmomi/list/BUILD index b619bd91e02ed..a58ef53322a09 100644 --- a/vendor/github.com/vmware/govmomi/list/BUILD +++ b/vendor/github.com/vmware/govmomi/list/BUILD @@ -12,7 +12,6 @@ go_library( srcs = [ "lister.go", "path.go", - "recurser.go", ], tags = ["automanaged"], deps = [ diff --git a/vendor/github.com/vmware/govmomi/list/lister.go b/vendor/github.com/vmware/govmomi/list/lister.go index ae162b7fc24bd..2ee32e6bc174b 100644 --- a/vendor/github.com/vmware/govmomi/list/lister.go +++ b/vendor/github.com/vmware/govmomi/list/lister.go @@ -33,6 +33,10 @@ type Element struct { Object mo.Reference } +func (e Element) String() string { + return fmt.Sprintf("%s @ %s", e.Object.Reference(), e.Path) +} + func ToElement(r mo.Reference, prefix string) Element { var name string @@ -112,23 +116,6 @@ type Lister struct { All bool } -func traversable(ref types.ManagedObjectReference) bool { - switch ref.Type { - case "Folder": - case "Datacenter": - case "ComputeResource", "ClusterComputeResource": - // Treat ComputeResource and ClusterComputeResource as one and the same. - // It doesn't matter from the perspective of the lister. - case "HostSystem": - case "VirtualApp": - case "StoragePod": - default: - return false - } - - return true -} - func (l Lister) retrieveProperties(ctx context.Context, req types.RetrieveProperties, dst *[]interface{}) error { res, err := l.Collector.RetrieveProperties(ctx, req) if err != nil { @@ -225,6 +212,8 @@ func (l Lister) ListFolder(ctx context.Context) ([]Element, error) { // Additional basic properties. switch t { + case "Folder": + pspec.PathSet = append(pspec.PathSet, "childType") case "ComputeResource", "ClusterComputeResource": // The ComputeResource and ClusterComputeResource are dereferenced in // the ResourcePoolFlag. Make sure they always have their resourcePool @@ -286,7 +275,7 @@ func (l Lister) ListDatacenter(ctx context.Context) ([]Element, error) { if l.All { pspec.All = types.NewBool(true) } else { - pspec.PathSet = []string{"name"} + pspec.PathSet = []string{"name", "childType"} } req := types.RetrieveProperties{ diff --git a/vendor/github.com/vmware/govmomi/list/recurser.go b/vendor/github.com/vmware/govmomi/list/recurser.go deleted file mode 100644 index 32a67829f5ef4..0000000000000 --- a/vendor/github.com/vmware/govmomi/list/recurser.go +++ /dev/null @@ -1,97 +0,0 @@ -/* -Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package list - -import ( - "context" - "path" - "path/filepath" - - "github.com/vmware/govmomi/property" -) - -type Recurser struct { - Collector *property.Collector - - // All configures the recurses to fetch complete objects for leaf nodes. - All bool - - // TraverseLeafs configures the Recurser to traverse traversable leaf nodes. - // This is typically set to true when used from the ls command, where listing - // a folder means listing its contents. This is typically set to false for - // commands that take managed entities that are not folders as input. - TraverseLeafs bool -} - -func (r Recurser) Recurse(ctx context.Context, root Element, parts []string) ([]Element, error) { - if len(parts) == 0 { - // Include non-traversable leaf elements in result. For example, consider - // the pattern "./vm/my-vm-*", where the pattern should match the VMs and - // not try to traverse them. - // - // Include traversable leaf elements in result, if the TraverseLeafs - // field is set to false. - // - if !traversable(root.Object.Reference()) || !r.TraverseLeafs { - return []Element{root}, nil - } - } - - k := Lister{ - Collector: r.Collector, - Reference: root.Object.Reference(), - Prefix: root.Path, - } - - if r.All && len(parts) < 2 { - k.All = true - } - - in, err := k.List(ctx) - if err != nil { - return nil, err - } - - // This folder is a leaf as far as the glob goes. - if len(parts) == 0 { - return in, nil - } - - pattern := parts[0] - parts = parts[1:] - - var out []Element - for _, e := range in { - matched, err := filepath.Match(pattern, path.Base(e.Path)) - if err != nil { - return nil, err - } - - if !matched { - continue - } - - nres, err := r.Recurse(ctx, e, parts) - if err != nil { - return nil, err - } - - out = append(out, nres...) - } - - return out, nil -} diff --git a/vendor/github.com/vmware/govmomi/object/BUILD b/vendor/github.com/vmware/govmomi/object/BUILD index ae1691bd7fc69..8229b147138e5 100644 --- a/vendor/github.com/vmware/govmomi/object/BUILD +++ b/vendor/github.com/vmware/govmomi/object/BUILD @@ -11,6 +11,7 @@ go_library( name = "go_default_library", srcs = [ "authorization_manager.go", + "authorization_manager_internal.go", "cluster_compute_resource.go", "common.go", "compute_resource.go", @@ -19,6 +20,7 @@ go_library( "datacenter.go", "datastore.go", "datastore_file.go", + "datastore_file_manager.go", "datastore_path.go", "diagnostic_log.go", "diagnostic_manager.go", @@ -41,12 +43,13 @@ go_library( "host_storage_system.go", "host_system.go", "host_virtual_nic_manager.go", + "host_vsan_internal_system.go", "host_vsan_system.go", "http_nfc_lease.go", - "list_view.go", "namespace_manager.go", "network.go", "network_reference.go", + "opaque_network.go", "option_manager.go", "ovf_manager.go", "resource_pool.go", @@ -58,6 +61,7 @@ go_library( "virtual_app.go", "virtual_device_list.go", "virtual_disk_manager.go", + "virtual_disk_manager_internal.go", "virtual_machine.go", "vmware_distributed_virtual_switch.go", ], diff --git a/vendor/github.com/vmware/govmomi/object/authorization_manager_internal.go b/vendor/github.com/vmware/govmomi/object/authorization_manager_internal.go new file mode 100644 index 0000000000000..4fa520f5add20 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/object/authorization_manager_internal.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package object + +import ( + "context" + + "github.com/vmware/govmomi/vim25/soap" + "github.com/vmware/govmomi/vim25/types" +) + +type DisabledMethodRequest struct { + Method string `xml:"method"` + Reason string `xml:"reasonId"` +} + +type disableMethodsRequest struct { + This types.ManagedObjectReference `xml:"_this"` + Entity []types.ManagedObjectReference `xml:"entity"` + Method []DisabledMethodRequest `xml:"method"` + Source string `xml:"sourceId"` + Scope bool `xml:"sessionScope,omitempty"` +} + +type disableMethodsBody struct { + Req *disableMethodsRequest `xml:"urn:internalvim25 DisableMethods,omitempty"` + Res interface{} `xml:"urn:vim25 DisableMethodsResponse,omitempty"` + Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *disableMethodsBody) Fault() *soap.Fault { return b.Err } + +func (m AuthorizationManager) DisableMethods(ctx context.Context, entity []types.ManagedObjectReference, method []DisabledMethodRequest, source string) error { + var reqBody, resBody disableMethodsBody + + reqBody.Req = &disableMethodsRequest{ + This: m.Reference(), + Entity: entity, + Method: method, + Source: source, + } + + return m.Client().RoundTrip(ctx, &reqBody, &resBody) +} + +type enableMethodsRequest struct { + This types.ManagedObjectReference `xml:"_this"` + Entity []types.ManagedObjectReference `xml:"entity"` + Method []string `xml:"method"` + Source string `xml:"sourceId"` +} + +type enableMethodsBody struct { + Req *enableMethodsRequest `xml:"urn:internalvim25 EnableMethods,omitempty"` + Res interface{} `xml:"urn:vim25 EnableMethodsResponse,omitempty"` + Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *enableMethodsBody) Fault() *soap.Fault { return b.Err } + +func (m AuthorizationManager) EnableMethods(ctx context.Context, entity []types.ManagedObjectReference, method []string, source string) error { + var reqBody, resBody enableMethodsBody + + reqBody.Req = &enableMethodsRequest{ + This: m.Reference(), + Entity: entity, + Method: method, + Source: source, + } + + return m.Client().RoundTrip(ctx, &reqBody, &resBody) +} diff --git a/vendor/github.com/vmware/govmomi/object/datastore_file.go b/vendor/github.com/vmware/govmomi/object/datastore_file.go index 1306ef6d4d72f..36c9523485529 100644 --- a/vendor/github.com/vmware/govmomi/object/datastore_file.go +++ b/vendor/github.com/vmware/govmomi/object/datastore_file.go @@ -344,8 +344,6 @@ func (f *followDatastoreFile) Read(p []byte) (int, error) { offset := f.r.offset.seek stop := false - defer f.r.Close() - for { n, err := f.r.Read(p) if err != nil && err == io.EOF { diff --git a/vendor/github.com/vmware/govmomi/object/datastore_file_manager.go b/vendor/github.com/vmware/govmomi/object/datastore_file_manager.go new file mode 100644 index 0000000000000..7164fbbed7d0a --- /dev/null +++ b/vendor/github.com/vmware/govmomi/object/datastore_file_manager.go @@ -0,0 +1,145 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package object + +import ( + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + "path" + "strings" + + "github.com/vmware/govmomi/vim25/soap" +) + +// DatastoreFileManager combines FileManager and VirtualDiskManager to manage files on a Datastore +type DatastoreFileManager struct { + Datacenter *Datacenter + Datastore *Datastore + FileManager *FileManager + VirtualDiskManager *VirtualDiskManager + + Force bool +} + +// NewFileManager creates a new instance of DatastoreFileManager +func (d Datastore) NewFileManager(dc *Datacenter, force bool) *DatastoreFileManager { + c := d.Client() + + m := &DatastoreFileManager{ + Datacenter: dc, + Datastore: &d, + FileManager: NewFileManager(c), + VirtualDiskManager: NewVirtualDiskManager(c), + Force: force, + } + + return m +} + +// Delete dispatches to the appropriate Delete method based on file name extension +func (m *DatastoreFileManager) Delete(ctx context.Context, name string) error { + switch path.Ext(name) { + case ".vmdk": + return m.DeleteVirtualDisk(ctx, name) + default: + return m.DeleteFile(ctx, name) + } +} + +// DeleteFile calls FileManager.DeleteDatastoreFile +func (m *DatastoreFileManager) DeleteFile(ctx context.Context, name string) error { + p := m.Path(name) + + task, err := m.FileManager.DeleteDatastoreFile(ctx, p.String(), m.Datacenter) + if err != nil { + return err + } + + return task.Wait(ctx) +} + +// DeleteVirtualDisk calls VirtualDiskManager.DeleteVirtualDisk +// Regardless of the Datastore type, DeleteVirtualDisk will fail if 'ddb.deletable=false', +// so if Force=true this method attempts to set 'ddb.deletable=true' before starting the delete task. +func (m *DatastoreFileManager) DeleteVirtualDisk(ctx context.Context, name string) error { + p := m.Path(name) + + var merr error + + if m.Force { + merr = m.markDiskAsDeletable(ctx, p) + } + + task, err := m.VirtualDiskManager.DeleteVirtualDisk(ctx, p.String(), m.Datacenter) + if err != nil { + log.Printf("markDiskAsDeletable(%s): %s", p, merr) + return err + } + + return task.Wait(ctx) +} + +// Path converts path name to a DatastorePath +func (m *DatastoreFileManager) Path(name string) *DatastorePath { + var p DatastorePath + + if !p.FromString(name) { + p.Path = name + p.Datastore = m.Datastore.Name() + } + + return &p +} + +func (m *DatastoreFileManager) markDiskAsDeletable(ctx context.Context, path *DatastorePath) error { + r, _, err := m.Datastore.Download(ctx, path.Path, &soap.DefaultDownload) + if err != nil { + return err + } + + defer r.Close() + + hasFlag := false + buf := new(bytes.Buffer) + + s := bufio.NewScanner(&io.LimitedReader{R: r, N: 2048}) // should be only a few hundred bytes, limit to be sure + + for s.Scan() { + line := s.Text() + if strings.HasPrefix(line, "ddb.deletable") { + hasFlag = true + continue + } + + fmt.Fprintln(buf, line) + } + + if err := s.Err(); err != nil { + return err // any error other than EOF + } + + if !hasFlag { + return nil // already deletable, so leave as-is + } + + // rewrite the .vmdk with ddb.deletable flag removed (the default is true) + return m.Datastore.Upload(ctx, buf, path.Path, &soap.DefaultUpload) +} diff --git a/vendor/github.com/vmware/govmomi/object/host_config_manager.go b/vendor/github.com/vmware/govmomi/object/host_config_manager.go index 6f061a6d1499e..123227ecc7068 100644 --- a/vendor/github.com/vmware/govmomi/object/host_config_manager.go +++ b/vendor/github.com/vmware/govmomi/object/host_config_manager.go @@ -105,6 +105,22 @@ func (m HostConfigManager) VsanSystem(ctx context.Context) (*HostVsanSystem, err return NewHostVsanSystem(m.c, *h.ConfigManager.VsanSystem), nil } +func (m HostConfigManager) VsanInternalSystem(ctx context.Context) (*HostVsanInternalSystem, error) { + var h mo.HostSystem + + err := m.Properties(ctx, m.Reference(), []string{"configManager.vsanInternalSystem"}, &h) + if err != nil { + return nil, err + } + + // Added in 5.5 + if h.ConfigManager.VsanInternalSystem == nil { + return nil, ErrNotSupported + } + + return NewHostVsanInternalSystem(m.c, *h.ConfigManager.VsanInternalSystem), nil +} + func (m HostConfigManager) AccountManager(ctx context.Context) (*HostAccountManager, error) { var h mo.HostSystem diff --git a/vendor/github.com/vmware/govmomi/object/host_vsan_internal_system.go b/vendor/github.com/vmware/govmomi/object/host_vsan_internal_system.go new file mode 100644 index 0000000000000..65e4587f6c80e --- /dev/null +++ b/vendor/github.com/vmware/govmomi/object/host_vsan_internal_system.go @@ -0,0 +1,117 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package object + +import ( + "context" + "encoding/json" + + "github.com/vmware/govmomi/vim25" + "github.com/vmware/govmomi/vim25/methods" + "github.com/vmware/govmomi/vim25/types" +) + +type HostVsanInternalSystem struct { + Common +} + +func NewHostVsanInternalSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostVsanInternalSystem { + m := HostVsanInternalSystem{ + Common: NewCommon(c, ref), + } + + return &m +} + +// QueryVsanObjectUuidsByFilter returns vSAN DOM object uuids by filter. +func (m HostVsanInternalSystem) QueryVsanObjectUuidsByFilter(ctx context.Context, uuids []string, limit int32, version int32) ([]string, error) { + req := types.QueryVsanObjectUuidsByFilter{ + This: m.Reference(), + Uuids: uuids, + Limit: limit, + Version: version, + } + + res, err := methods.QueryVsanObjectUuidsByFilter(ctx, m.Client(), &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} + +type VsanObjExtAttrs struct { + Type string `json:"Object type"` + Class string `json:"Object class"` + Size string `json:"Object size"` + Path string `json:"Object path"` + Name string `json:"User friendly name"` +} + +func (a *VsanObjExtAttrs) DatastorePath(dir string) string { + l := len(dir) + path := a.Path + + if len(path) >= l { + path = a.Path[l:] + } + + if path != "" { + return path + } + + return a.Name // vmnamespace +} + +// GetVsanObjExtAttrs is internal and intended for troubleshooting/debugging situations in the field. +// WARNING: This API can be slow because we do IOs (reads) to all the objects. +func (m HostVsanInternalSystem) GetVsanObjExtAttrs(ctx context.Context, uuids []string) (map[string]VsanObjExtAttrs, error) { + req := types.GetVsanObjExtAttrs{ + This: m.Reference(), + Uuids: uuids, + } + + res, err := methods.GetVsanObjExtAttrs(ctx, m.Client(), &req) + if err != nil { + return nil, err + } + + var attrs map[string]VsanObjExtAttrs + + err = json.Unmarshal([]byte(res.Returnval), &attrs) + + return attrs, err +} + +// DeleteVsanObjects is internal and intended for troubleshooting/debugging only. +// WARNING: This API can be slow because we do IOs to all the objects. +// DOM won't allow access to objects which have lost quorum. Such objects can be deleted with the optional "force" flag. +// These objects may however re-appear with quorum if the absent components come back (network partition gets resolved, etc.) +func (m HostVsanInternalSystem) DeleteVsanObjects(ctx context.Context, uuids []string, force *bool) ([]types.HostVsanInternalSystemDeleteVsanObjectsResult, error) { + req := types.DeleteVsanObjects{ + This: m.Reference(), + Uuids: uuids, + Force: force, + } + + res, err := methods.DeleteVsanObjects(ctx, m.Client(), &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} diff --git a/vendor/github.com/vmware/govmomi/object/list_view.go b/vendor/github.com/vmware/govmomi/object/list_view.go deleted file mode 100644 index 8c755427e88ad..0000000000000 --- a/vendor/github.com/vmware/govmomi/object/list_view.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright (c) 2015 VMware, Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package object - -import ( - "context" - - "github.com/vmware/govmomi/vim25" - "github.com/vmware/govmomi/vim25/methods" - "github.com/vmware/govmomi/vim25/types" -) - -type ListView struct { - Common -} - -func NewListView(c *vim25.Client, ref types.ManagedObjectReference) *ListView { - return &ListView{ - Common: NewCommon(c, ref), - } -} - -func (v ListView) Destroy(ctx context.Context) error { - req := types.DestroyView{ - This: v.Reference(), - } - _, err := methods.DestroyView(ctx, v.c, &req) - return err -} - -func (v ListView) Add(ctx context.Context, refs []types.ManagedObjectReference) error { - req := types.ModifyListView{ - This: v.Reference(), - Add: refs, - } - _, err := methods.ModifyListView(ctx, v.c, &req) - return err -} - -func (v ListView) Remove(ctx context.Context, refs []types.ManagedObjectReference) error { - req := types.ModifyListView{ - This: v.Reference(), - Remove: refs, - } - _, err := methods.ModifyListView(ctx, v.c, &req) - return err -} - -func (v ListView) Reset(ctx context.Context, refs []types.ManagedObjectReference) error { - req := types.ResetListView{ - This: v.Reference(), - Obj: refs, - } - _, err := methods.ResetListView(ctx, v.c, &req) - return err -} diff --git a/vendor/github.com/vmware/govmomi/object/opaque_network.go b/vendor/github.com/vmware/govmomi/object/opaque_network.go new file mode 100644 index 0000000000000..47ce4cefe622d --- /dev/null +++ b/vendor/github.com/vmware/govmomi/object/opaque_network.go @@ -0,0 +1,57 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package object + +import ( + "context" + "fmt" + + "github.com/vmware/govmomi/vim25" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/types" +) + +type OpaqueNetwork struct { + Common +} + +func NewOpaqueNetwork(c *vim25.Client, ref types.ManagedObjectReference) *OpaqueNetwork { + return &OpaqueNetwork{ + Common: NewCommon(c, ref), + } +} + +// EthernetCardBackingInfo returns the VirtualDeviceBackingInfo for this Network +func (n OpaqueNetwork) EthernetCardBackingInfo(ctx context.Context) (types.BaseVirtualDeviceBackingInfo, error) { + var net mo.OpaqueNetwork + + if err := n.Properties(ctx, n.Reference(), []string{"summary"}, &net); err != nil { + return nil, err + } + + summary, ok := net.Summary.(*types.OpaqueNetworkSummary) + if !ok { + return nil, fmt.Errorf("%s unsupported network type: %T", n, net.Summary) + } + + backing := &types.VirtualEthernetCardOpaqueNetworkBackingInfo{ + OpaqueNetworkId: summary.OpaqueNetworkId, + OpaqueNetworkType: summary.OpaqueNetworkType, + } + + return backing, nil +} diff --git a/vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go b/vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go new file mode 100644 index 0000000000000..642cd62f6e9c4 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go @@ -0,0 +1,97 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package object + +import ( + "context" + "reflect" + + "github.com/vmware/govmomi/vim25/soap" + "github.com/vmware/govmomi/vim25/types" +) + +func init() { + types.Add("ArrayOfVirtualDiskInfo", reflect.TypeOf((*arrayOfVirtualDiskInfo)(nil)).Elem()) + + types.Add("VirtualDiskInfo", reflect.TypeOf((*VirtualDiskInfo)(nil)).Elem()) +} + +type arrayOfVirtualDiskInfo struct { + VirtualDiskInfo []VirtualDiskInfo `xml:"VirtualDiskInfo,omitempty"` +} + +type queryVirtualDiskInfoTaskRequest struct { + This types.ManagedObjectReference `xml:"_this"` + Name string `xml:"name"` + Datacenter *types.ManagedObjectReference `xml:"datacenter,omitempty"` + IncludeParents bool `xml:"includeParents"` +} + +type queryVirtualDiskInfoTaskResponse struct { + Returnval types.ManagedObjectReference `xml:"returnval"` +} + +type queryVirtualDiskInfoTaskBody struct { + Req *queryVirtualDiskInfoTaskRequest `xml:"urn:internalvim25 QueryVirtualDiskInfo_Task,omitempty"` + Res *queryVirtualDiskInfoTaskResponse `xml:"urn:vim25 QueryVirtualDiskInfo_TaskResponse,omitempty"` + Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *queryVirtualDiskInfoTaskBody) Fault() *soap.Fault { return b.Err } + +func queryVirtualDiskInfoTask(ctx context.Context, r soap.RoundTripper, req *queryVirtualDiskInfoTaskRequest) (*queryVirtualDiskInfoTaskResponse, error) { + var reqBody, resBody queryVirtualDiskInfoTaskBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type VirtualDiskInfo struct { + Name string `xml:"unit>name"` + DiskType string `xml:"diskType"` + Parent string `xml:"parent,omitempty"` +} + +func (m VirtualDiskManager) QueryVirtualDiskInfo(ctx context.Context, name string, dc *Datacenter, includeParents bool) ([]VirtualDiskInfo, error) { + req := queryVirtualDiskInfoTaskRequest{ + This: m.Reference(), + Name: name, + IncludeParents: includeParents, + } + + if dc != nil { + ref := dc.Reference() + req.Datacenter = &ref + } + + res, err := queryVirtualDiskInfoTask(ctx, m.Client(), &req) + if err != nil { + return nil, err + } + + info, err := NewTask(m.Client(), res.Returnval).WaitForResult(ctx, nil) + if err != nil { + return nil, err + } + + return info.Result.(arrayOfVirtualDiskInfo).VirtualDiskInfo, nil +} diff --git a/vendor/github.com/vmware/govmomi/object/virtual_machine.go b/vendor/github.com/vmware/govmomi/object/virtual_machine.go index 87ae9a5111fdd..8fd6a421b2840 100644 --- a/vendor/github.com/vmware/govmomi/object/virtual_machine.go +++ b/vendor/github.com/vmware/govmomi/object/virtual_machine.go @@ -725,3 +725,35 @@ func (v VirtualMachine) QueryConfigTarget(ctx context.Context) (*types.ConfigTar return res.Returnval, nil } + +func (v VirtualMachine) MountToolsInstaller(ctx context.Context) error { + req := types.MountToolsInstaller{ + This: v.Reference(), + } + + _, err := methods.MountToolsInstaller(ctx, v.Client(), &req) + return err +} + +func (v VirtualMachine) UnmountToolsInstaller(ctx context.Context) error { + req := types.UnmountToolsInstaller{ + This: v.Reference(), + } + + _, err := methods.UnmountToolsInstaller(ctx, v.Client(), &req) + return err +} + +func (v VirtualMachine) UpgradeTools(ctx context.Context, options string) (*Task, error) { + req := types.UpgradeTools_Task{ + This: v.Reference(), + InstallerOptions: options, + } + + res, err := methods.UpgradeTools_Task(ctx, v.Client(), &req) + if err != nil { + return nil, err + } + + return NewTask(v.c, res.Returnval), nil +} diff --git a/vendor/github.com/vmware/govmomi/pbm/BUILD b/vendor/github.com/vmware/govmomi/pbm/BUILD new file mode 100644 index 0000000000000..0582860ab841a --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/BUILD @@ -0,0 +1,58 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["client_test.go"], + library = ":go_default_library", + tags = ["automanaged"], + deps = [ + "//vendor/github.com/vmware/govmomi:go_default_library", + "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", + "//vendor/github.com/vmware/govmomi/property:go_default_library", + "//vendor/github.com/vmware/govmomi/view:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "client.go", + "pbm_util.go", + ], + tags = ["automanaged"], + deps = [ + "//vendor/github.com/vmware/govmomi/pbm/methods:go_default_library", + "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/vmware/govmomi/pbm/methods:all-srcs", + "//vendor/github.com/vmware/govmomi/pbm/types:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/vendor/github.com/vmware/govmomi/pbm/client.go b/vendor/github.com/vmware/govmomi/pbm/client.go new file mode 100644 index 0000000000000..a0f07fc9e2835 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/client.go @@ -0,0 +1,217 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pbm + +import ( + "context" + "fmt" + + "github.com/vmware/govmomi/pbm/methods" + "github.com/vmware/govmomi/pbm/types" + "github.com/vmware/govmomi/vim25" + "github.com/vmware/govmomi/vim25/soap" + vim "github.com/vmware/govmomi/vim25/types" +) + +type Client struct { + *soap.Client + + ServiceContent types.PbmServiceInstanceContent +} + +func NewClient(ctx context.Context, c *vim25.Client) (*Client, error) { + sc := c.Client.NewServiceClient("/pbm/sdk", "urn:pbm") + + req := types.PbmRetrieveServiceContent{ + This: vim.ManagedObjectReference{ + Type: "PbmServiceInstance", + Value: "ServiceInstance", + }, + } + + res, err := methods.PbmRetrieveServiceContent(ctx, sc, &req) + if err != nil { + return nil, err + } + + return &Client{sc, res.Returnval}, nil +} + +func (c *Client) QueryProfile(ctx context.Context, rtype types.PbmProfileResourceType, category string) ([]types.PbmProfileId, error) { + req := types.PbmQueryProfile{ + This: c.ServiceContent.ProfileManager, + ResourceType: rtype, + ProfileCategory: category, + } + + res, err := methods.PbmQueryProfile(ctx, c, &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} + +func (c *Client) RetrieveContent(ctx context.Context, ids []types.PbmProfileId) ([]types.BasePbmProfile, error) { + req := types.PbmRetrieveContent{ + This: c.ServiceContent.ProfileManager, + ProfileIds: ids, + } + + res, err := methods.PbmRetrieveContent(ctx, c, &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} + +type PlacementCompatibilityResult []types.PbmPlacementCompatibilityResult + +func (c *Client) CheckRequirements(ctx context.Context, hubs []types.PbmPlacementHub, ref *types.PbmServerObjectRef, preq []types.BasePbmPlacementRequirement) (PlacementCompatibilityResult, error) { + req := types.PbmCheckRequirements{ + This: c.ServiceContent.PlacementSolver, + HubsToSearch: hubs, + PlacementSubjectRef: ref, + PlacementSubjectRequirement: preq, + } + + res, err := methods.PbmCheckRequirements(ctx, c, &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} + +func (l PlacementCompatibilityResult) CompatibleDatastores() []types.PbmPlacementHub { + var compatibleDatastores []types.PbmPlacementHub + + for _, res := range l { + if len(res.Error) == 0 { + compatibleDatastores = append(compatibleDatastores, res.Hub) + } + } + return compatibleDatastores +} + +func (l PlacementCompatibilityResult) NonCompatibleDatastores() []types.PbmPlacementHub { + var nonCompatibleDatastores []types.PbmPlacementHub + + for _, res := range l { + if len(res.Error) > 0 { + nonCompatibleDatastores = append(nonCompatibleDatastores, res.Hub) + } + } + return nonCompatibleDatastores +} + +func (c *Client) CreateProfile(ctx context.Context, capabilityProfileCreateSpec types.PbmCapabilityProfileCreateSpec) (*types.PbmProfileId, error) { + req := types.PbmCreate{ + This: c.ServiceContent.ProfileManager, + CreateSpec: capabilityProfileCreateSpec, + } + + res, err := methods.PbmCreate(ctx, c, &req) + if err != nil { + return nil, err + } + + return &res.Returnval, nil +} + +func (c *Client) UpdateProfile(ctx context.Context, id types.PbmProfileId, updateSpec types.PbmCapabilityProfileUpdateSpec) error { + req := types.PbmUpdate{ + This: c.ServiceContent.ProfileManager, + ProfileId: id, + UpdateSpec: updateSpec, + } + + _, err := methods.PbmUpdate(ctx, c, &req) + if err != nil { + return err + } + + return nil +} + +func (c *Client) DeleteProfile(ctx context.Context, ids []types.PbmProfileId) ([]types.PbmProfileOperationOutcome, error) { + req := types.PbmDelete{ + This: c.ServiceContent.ProfileManager, + ProfileId: ids, + } + + res, err := methods.PbmDelete(ctx, c, &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} + +func (c *Client) QueryAssociatedEntity(ctx context.Context, id types.PbmProfileId, entityType string) ([]types.PbmServerObjectRef, error) { + req := types.PbmQueryAssociatedEntity{ + This: c.ServiceContent.ProfileManager, + Profile: id, + EntityType: entityType, + } + + res, err := methods.PbmQueryAssociatedEntity(ctx, c, &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} + +func (c *Client) QueryAssociatedEntities(ctx context.Context, ids []types.PbmProfileId) ([]types.PbmQueryProfileResult, error) { + req := types.PbmQueryAssociatedEntities{ + This: c.ServiceContent.ProfileManager, + Profiles: ids, + } + + res, err := methods.PbmQueryAssociatedEntities(ctx, c, &req) + if err != nil { + return nil, err + } + + return res.Returnval, nil +} + +func (c *Client) ProfileIDByName(ctx context.Context, profileName string) (string, error) { + resourceType := types.PbmProfileResourceType{ + ResourceType: string(types.PbmProfileResourceTypeEnumSTORAGE), + } + category := types.PbmProfileCategoryEnumREQUIREMENT + ids, err := c.QueryProfile(ctx, resourceType, string(category)) + if err != nil { + return "", err + } + + profiles, err := c.RetrieveContent(ctx, ids) + if err != nil { + return "", err + } + + for i := range profiles { + profile := profiles[i].GetPbmProfile() + if profile.Name == profileName { + return profile.ProfileId.UniqueId, nil + } + } + return "", fmt.Errorf("no pbm profile found with name: %q", profileName) +} diff --git a/vendor/github.com/vmware/govmomi/pbm/client_test.go b/vendor/github.com/vmware/govmomi/pbm/client_test.go new file mode 100644 index 0000000000000..8cf1c5b838a33 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/client_test.go @@ -0,0 +1,301 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pbm + +import ( + "context" + "os" + "reflect" + "sort" + "testing" + + "github.com/vmware/govmomi" + "github.com/vmware/govmomi/pbm/types" + "github.com/vmware/govmomi/property" + "github.com/vmware/govmomi/view" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/soap" + vim "github.com/vmware/govmomi/vim25/types" +) + +func TestClient(t *testing.T) { + url := os.Getenv("GOVMOMI_PBM_URL") + if url == "" { + t.SkipNow() + } + + clusterName := os.Getenv("GOVMOMI_PBM_CLUSTER") + + u, err := soap.ParseURL(url) + if err != nil { + t.Fatal(err) + } + + ctx := context.Background() + + c, err := govmomi.NewClient(ctx, u, true) + if err != nil { + t.Fatal(err) + } + + pc, err := NewClient(ctx, c.Client) + if err != nil { + t.Fatal(err) + } + + t.Logf("PBM version=%s", pc.ServiceContent.AboutInfo.Version) + + rtype := types.PbmProfileResourceType{ + ResourceType: string(types.PbmProfileResourceTypeEnumSTORAGE), + } + + category := types.PbmProfileCategoryEnumREQUIREMENT + + // 1. Query all the profiles on the vCenter. + ids, err := pc.QueryProfile(ctx, rtype, string(category)) + if err != nil { + t.Fatal(err) + } + + var qids []string + + for _, id := range ids { + qids = append(qids, id.UniqueId) + } + + var cids []string + + // 2. Retrieve the content of all profiles. + policies, err := pc.RetrieveContent(ctx, ids) + if err != nil { + t.Fatal(err) + } + + for i := range policies { + profile := policies[i].GetPbmProfile() + cids = append(cids, profile.ProfileId.UniqueId) + } + + sort.Strings(qids) + sort.Strings(cids) + + // Check whether ids retreived from QueryProfile and RetrieveContent are identical. + if !reflect.DeepEqual(qids, cids) { + t.Error("ids mismatch") + } + + // 3. Get list of datastores in a cluster if cluster name is specified. + root := c.ServiceContent.RootFolder + var datastores []vim.ManagedObjectReference + var kind []string + + if clusterName == "" { + kind = []string{"Datastore"} + } else { + kind = []string{"ClusterComputeResource"} + } + + m := view.NewManager(c.Client) + + v, err := m.CreateContainerView(ctx, root, kind, true) + if err != nil { + t.Fatal(err) + } + + if clusterName == "" { + datastores, err = v.Find(ctx, kind, nil) + if err != nil { + t.Fatal(err) + } + } else { + var cluster mo.ClusterComputeResource + + err = v.RetrieveWithFilter(ctx, kind, []string{"datastore"}, &cluster, property.Filter{"name": clusterName}) + if err != nil { + t.Fatal(err) + } + + datastores = cluster.Datastore + } + + _ = v.Destroy(ctx) + + t.Logf("checking %d datatores for compatibility results", len(datastores)) + + var hubs []types.PbmPlacementHub + + for _, ds := range datastores { + hubs = append(hubs, types.PbmPlacementHub{ + HubType: ds.Type, + HubId: ds.Value, + }) + } + + var req []types.BasePbmPlacementRequirement + + for _, id := range ids { + req = append(req, &types.PbmPlacementCapabilityProfileRequirement{ + ProfileId: id, + }) + } + + // 4. Get the compatibility results for all the profiles on the vCenter. + res, err := pc.CheckRequirements(ctx, hubs, nil, req) + if err != nil { + t.Fatal(err) + } + + t.Logf("CheckRequirements results: %d", len(res)) + + // user spec for the profile. + // VSAN profile with 2 capability instances - hostFailuresToTolerate = 2, stripeWidth = 1 + pbmCreateSpecForVSAN := CapabilityProfileCreateSpec{ + Name: "Kubernetes-VSAN-TestPolicy", + Description: "VSAN Test policy create", + Category: string(types.PbmProfileCategoryEnumREQUIREMENT), + CapabilityList: []Capability{ + Capability{ + ID: "hostFailuresToTolerate", + Namespace: "VSAN", + PropertyList: []Property{ + Property{ + ID: "hostFailuresToTolerate", + Value: "2", + DataType: "int", + }, + }, + }, + Capability{ + ID: "stripeWidth", + Namespace: "VSAN", + PropertyList: []Property{ + Property{ + ID: "stripeWidth", + Value: "1", + DataType: "int", + }, + }, + }, + }, + } + + // Create PBM capability spec for the above defined user spec. + createSpecVSAN, err := CreateCapabilityProfileSpec(pbmCreateSpecForVSAN) + if err != nil { + t.Fatal(err) + } + + // 5. Create SPBM VSAN profile. + vsanProfileID, err := pc.CreateProfile(ctx, *createSpecVSAN) + if err != nil { + t.Fatal(err) + } + t.Logf("VSAN Profile: %q successfully created", vsanProfileID.UniqueId) + + // 6. Verify if profile created exists by issuing a RetrieveContent request. + _, err = pc.RetrieveContent(ctx, []types.PbmProfileId{*vsanProfileID}) + if err != nil { + t.Fatal(err) + } + t.Logf("Profile: %q exists on vCenter", vsanProfileID.UniqueId) + + // 7. Get compatible datastores for the VSAN profile. + compatibleDatastores := res.CompatibleDatastores() + t.Logf("Found %d compatible-datastores for profile: %q", len(compatibleDatastores), vsanProfileID.UniqueId) + + // 8. Get non-compatible datastores for the VSAN profile. + nonCompatibleDatastores := res.NonCompatibleDatastores() + t.Logf("Found %d non-compatible datastores for profile: %q", len(nonCompatibleDatastores), vsanProfileID.UniqueId) + + // Check whether count of compatible and non-compatible datastores match the total number of datastores. + if (len(nonCompatibleDatastores) + len(compatibleDatastores)) != len(datastores) { + t.Error("datastore count mismatch") + } + + // user spec for the profile. + // VSAN profile with 2 capability instances - stripeWidth = 1 and an SIOC profile. + pbmCreateSpecVSANandSIOC := CapabilityProfileCreateSpec{ + Name: "Kubernetes-VSAN-SIOC-TestPolicy", + Description: "VSAN-SIOC-Test policy create", + Category: string(types.PbmProfileCategoryEnumREQUIREMENT), + CapabilityList: []Capability{ + Capability{ + ID: "stripeWidth", + Namespace: "VSAN", + PropertyList: []Property{ + Property{ + ID: "stripeWidth", + Value: "1", + DataType: "int", + }, + }, + }, + Capability{ + ID: "spm@DATASTOREIOCONTROL", + Namespace: "spm", + PropertyList: []Property{ + Property{ + ID: "limit", + Value: "200", + DataType: "int", + }, + Property{ + ID: "reservation", + Value: "1000", + DataType: "int", + }, + Property{ + ID: "shares", + Value: "2000", + DataType: "int", + }, + }, + }, + }, + } + + // Create PBM capability spec for the above defined user spec. + createSpecVSANandSIOC, err := CreateCapabilityProfileSpec(pbmCreateSpecVSANandSIOC) + if err != nil { + t.Fatal(err) + } + + // 9. Create SPBM VSAN profile. + vsansiocProfileID, err := pc.CreateProfile(ctx, *createSpecVSANandSIOC) + if err != nil { + t.Fatal(err) + } + t.Logf("VSAN-SIOC Profile: %q successfully created", vsansiocProfileID.UniqueId) + + // 9. Get ProfileID by Name + profileID, err := pc.ProfileIDByName(ctx, "Kubernetes-VSAN-SIOC-TestPolicy") + if err != nil { + t.Fatal(err) + } + + if vsansiocProfileID.UniqueId != profileID { + t.Errorf("vsan-sioc profile: %q and retrieved profileID: %q successfully matched", vsansiocProfileID.UniqueId, profileID) + } + t.Logf("VSAN-SIOC profile: %q and retrieved profileID: %q successfully matched", vsansiocProfileID.UniqueId, profileID) + + // 10. Delete VSAN and VSAN-SIOC profile. + _, err = pc.DeleteProfile(ctx, []types.PbmProfileId{*vsanProfileID, *vsansiocProfileID}) + if err != nil { + t.Fatal(err) + } + t.Logf("Profile: %+v successfully deleted", []types.PbmProfileId{*vsanProfileID, *vsansiocProfileID}) +} diff --git a/vendor/github.com/vmware/govmomi/pbm/methods/BUILD b/vendor/github.com/vmware/govmomi/pbm/methods/BUILD new file mode 100644 index 0000000000000..e46975ca601e0 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/methods/BUILD @@ -0,0 +1,31 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["methods.go"], + tags = ["automanaged"], + deps = [ + "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", + "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/vendor/github.com/vmware/govmomi/pbm/methods/methods.go b/vendor/github.com/vmware/govmomi/pbm/methods/methods.go new file mode 100644 index 0000000000000..08ee48e990e11 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/methods/methods.go @@ -0,0 +1,664 @@ +/* +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package methods + +import ( + "context" + + "github.com/vmware/govmomi/pbm/types" + "github.com/vmware/govmomi/vim25/soap" +) + +type PbmAssignDefaultRequirementProfileBody struct { + Req *types.PbmAssignDefaultRequirementProfile `xml:"urn:pbm PbmAssignDefaultRequirementProfile,omitempty"` + Res *types.PbmAssignDefaultRequirementProfileResponse `xml:"urn:pbm PbmAssignDefaultRequirementProfileResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmAssignDefaultRequirementProfileBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmAssignDefaultRequirementProfile(ctx context.Context, r soap.RoundTripper, req *types.PbmAssignDefaultRequirementProfile) (*types.PbmAssignDefaultRequirementProfileResponse, error) { + var reqBody, resBody PbmAssignDefaultRequirementProfileBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmCheckCompatibilityBody struct { + Req *types.PbmCheckCompatibility `xml:"urn:pbm PbmCheckCompatibility,omitempty"` + Res *types.PbmCheckCompatibilityResponse `xml:"urn:pbm PbmCheckCompatibilityResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmCheckCompatibilityBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmCheckCompatibility(ctx context.Context, r soap.RoundTripper, req *types.PbmCheckCompatibility) (*types.PbmCheckCompatibilityResponse, error) { + var reqBody, resBody PbmCheckCompatibilityBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmCheckCompatibilityWithSpecBody struct { + Req *types.PbmCheckCompatibilityWithSpec `xml:"urn:pbm PbmCheckCompatibilityWithSpec,omitempty"` + Res *types.PbmCheckCompatibilityWithSpecResponse `xml:"urn:pbm PbmCheckCompatibilityWithSpecResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmCheckCompatibilityWithSpecBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmCheckCompatibilityWithSpec(ctx context.Context, r soap.RoundTripper, req *types.PbmCheckCompatibilityWithSpec) (*types.PbmCheckCompatibilityWithSpecResponse, error) { + var reqBody, resBody PbmCheckCompatibilityWithSpecBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmCheckComplianceBody struct { + Req *types.PbmCheckCompliance `xml:"urn:pbm PbmCheckCompliance,omitempty"` + Res *types.PbmCheckComplianceResponse `xml:"urn:pbm PbmCheckComplianceResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmCheckComplianceBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmCheckCompliance(ctx context.Context, r soap.RoundTripper, req *types.PbmCheckCompliance) (*types.PbmCheckComplianceResponse, error) { + var reqBody, resBody PbmCheckComplianceBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmCheckRequirementsBody struct { + Req *types.PbmCheckRequirements `xml:"urn:pbm PbmCheckRequirements,omitempty"` + Res *types.PbmCheckRequirementsResponse `xml:"urn:pbm PbmCheckRequirementsResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmCheckRequirementsBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmCheckRequirements(ctx context.Context, r soap.RoundTripper, req *types.PbmCheckRequirements) (*types.PbmCheckRequirementsResponse, error) { + var reqBody, resBody PbmCheckRequirementsBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmCheckRollupComplianceBody struct { + Req *types.PbmCheckRollupCompliance `xml:"urn:pbm PbmCheckRollupCompliance,omitempty"` + Res *types.PbmCheckRollupComplianceResponse `xml:"urn:pbm PbmCheckRollupComplianceResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmCheckRollupComplianceBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmCheckRollupCompliance(ctx context.Context, r soap.RoundTripper, req *types.PbmCheckRollupCompliance) (*types.PbmCheckRollupComplianceResponse, error) { + var reqBody, resBody PbmCheckRollupComplianceBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmCreateBody struct { + Req *types.PbmCreate `xml:"urn:pbm PbmCreate,omitempty"` + Res *types.PbmCreateResponse `xml:"urn:pbm PbmCreateResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmCreateBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmCreate(ctx context.Context, r soap.RoundTripper, req *types.PbmCreate) (*types.PbmCreateResponse, error) { + var reqBody, resBody PbmCreateBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmDeleteBody struct { + Req *types.PbmDelete `xml:"urn:pbm PbmDelete,omitempty"` + Res *types.PbmDeleteResponse `xml:"urn:pbm PbmDeleteResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmDeleteBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmDelete(ctx context.Context, r soap.RoundTripper, req *types.PbmDelete) (*types.PbmDeleteResponse, error) { + var reqBody, resBody PbmDeleteBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmFetchCapabilityMetadataBody struct { + Req *types.PbmFetchCapabilityMetadata `xml:"urn:pbm PbmFetchCapabilityMetadata,omitempty"` + Res *types.PbmFetchCapabilityMetadataResponse `xml:"urn:pbm PbmFetchCapabilityMetadataResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmFetchCapabilityMetadataBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmFetchCapabilityMetadata(ctx context.Context, r soap.RoundTripper, req *types.PbmFetchCapabilityMetadata) (*types.PbmFetchCapabilityMetadataResponse, error) { + var reqBody, resBody PbmFetchCapabilityMetadataBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmFetchCapabilitySchemaBody struct { + Req *types.PbmFetchCapabilitySchema `xml:"urn:pbm PbmFetchCapabilitySchema,omitempty"` + Res *types.PbmFetchCapabilitySchemaResponse `xml:"urn:pbm PbmFetchCapabilitySchemaResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmFetchCapabilitySchemaBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmFetchCapabilitySchema(ctx context.Context, r soap.RoundTripper, req *types.PbmFetchCapabilitySchema) (*types.PbmFetchCapabilitySchemaResponse, error) { + var reqBody, resBody PbmFetchCapabilitySchemaBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmFetchComplianceResultBody struct { + Req *types.PbmFetchComplianceResult `xml:"urn:pbm PbmFetchComplianceResult,omitempty"` + Res *types.PbmFetchComplianceResultResponse `xml:"urn:pbm PbmFetchComplianceResultResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmFetchComplianceResultBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmFetchComplianceResult(ctx context.Context, r soap.RoundTripper, req *types.PbmFetchComplianceResult) (*types.PbmFetchComplianceResultResponse, error) { + var reqBody, resBody PbmFetchComplianceResultBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmFetchResourceTypeBody struct { + Req *types.PbmFetchResourceType `xml:"urn:pbm PbmFetchResourceType,omitempty"` + Res *types.PbmFetchResourceTypeResponse `xml:"urn:pbm PbmFetchResourceTypeResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmFetchResourceTypeBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmFetchResourceType(ctx context.Context, r soap.RoundTripper, req *types.PbmFetchResourceType) (*types.PbmFetchResourceTypeResponse, error) { + var reqBody, resBody PbmFetchResourceTypeBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmFetchRollupComplianceResultBody struct { + Req *types.PbmFetchRollupComplianceResult `xml:"urn:pbm PbmFetchRollupComplianceResult,omitempty"` + Res *types.PbmFetchRollupComplianceResultResponse `xml:"urn:pbm PbmFetchRollupComplianceResultResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmFetchRollupComplianceResultBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmFetchRollupComplianceResult(ctx context.Context, r soap.RoundTripper, req *types.PbmFetchRollupComplianceResult) (*types.PbmFetchRollupComplianceResultResponse, error) { + var reqBody, resBody PbmFetchRollupComplianceResultBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmFetchVendorInfoBody struct { + Req *types.PbmFetchVendorInfo `xml:"urn:pbm PbmFetchVendorInfo,omitempty"` + Res *types.PbmFetchVendorInfoResponse `xml:"urn:pbm PbmFetchVendorInfoResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmFetchVendorInfoBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmFetchVendorInfo(ctx context.Context, r soap.RoundTripper, req *types.PbmFetchVendorInfo) (*types.PbmFetchVendorInfoResponse, error) { + var reqBody, resBody PbmFetchVendorInfoBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmFindApplicableDefaultProfileBody struct { + Req *types.PbmFindApplicableDefaultProfile `xml:"urn:pbm PbmFindApplicableDefaultProfile,omitempty"` + Res *types.PbmFindApplicableDefaultProfileResponse `xml:"urn:pbm PbmFindApplicableDefaultProfileResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmFindApplicableDefaultProfileBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmFindApplicableDefaultProfile(ctx context.Context, r soap.RoundTripper, req *types.PbmFindApplicableDefaultProfile) (*types.PbmFindApplicableDefaultProfileResponse, error) { + var reqBody, resBody PbmFindApplicableDefaultProfileBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryAssociatedEntitiesBody struct { + Req *types.PbmQueryAssociatedEntities `xml:"urn:pbm PbmQueryAssociatedEntities,omitempty"` + Res *types.PbmQueryAssociatedEntitiesResponse `xml:"urn:pbm PbmQueryAssociatedEntitiesResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryAssociatedEntitiesBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryAssociatedEntities(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryAssociatedEntities) (*types.PbmQueryAssociatedEntitiesResponse, error) { + var reqBody, resBody PbmQueryAssociatedEntitiesBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryAssociatedEntityBody struct { + Req *types.PbmQueryAssociatedEntity `xml:"urn:pbm PbmQueryAssociatedEntity,omitempty"` + Res *types.PbmQueryAssociatedEntityResponse `xml:"urn:pbm PbmQueryAssociatedEntityResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryAssociatedEntityBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryAssociatedEntity(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryAssociatedEntity) (*types.PbmQueryAssociatedEntityResponse, error) { + var reqBody, resBody PbmQueryAssociatedEntityBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryAssociatedProfileBody struct { + Req *types.PbmQueryAssociatedProfile `xml:"urn:pbm PbmQueryAssociatedProfile,omitempty"` + Res *types.PbmQueryAssociatedProfileResponse `xml:"urn:pbm PbmQueryAssociatedProfileResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryAssociatedProfileBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryAssociatedProfile(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryAssociatedProfile) (*types.PbmQueryAssociatedProfileResponse, error) { + var reqBody, resBody PbmQueryAssociatedProfileBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryAssociatedProfilesBody struct { + Req *types.PbmQueryAssociatedProfiles `xml:"urn:pbm PbmQueryAssociatedProfiles,omitempty"` + Res *types.PbmQueryAssociatedProfilesResponse `xml:"urn:pbm PbmQueryAssociatedProfilesResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryAssociatedProfilesBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryAssociatedProfiles(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryAssociatedProfiles) (*types.PbmQueryAssociatedProfilesResponse, error) { + var reqBody, resBody PbmQueryAssociatedProfilesBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryByRollupComplianceStatusBody struct { + Req *types.PbmQueryByRollupComplianceStatus `xml:"urn:pbm PbmQueryByRollupComplianceStatus,omitempty"` + Res *types.PbmQueryByRollupComplianceStatusResponse `xml:"urn:pbm PbmQueryByRollupComplianceStatusResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryByRollupComplianceStatusBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryByRollupComplianceStatus(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryByRollupComplianceStatus) (*types.PbmQueryByRollupComplianceStatusResponse, error) { + var reqBody, resBody PbmQueryByRollupComplianceStatusBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryDefaultRequirementProfileBody struct { + Req *types.PbmQueryDefaultRequirementProfile `xml:"urn:pbm PbmQueryDefaultRequirementProfile,omitempty"` + Res *types.PbmQueryDefaultRequirementProfileResponse `xml:"urn:pbm PbmQueryDefaultRequirementProfileResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryDefaultRequirementProfileBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryDefaultRequirementProfile(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryDefaultRequirementProfile) (*types.PbmQueryDefaultRequirementProfileResponse, error) { + var reqBody, resBody PbmQueryDefaultRequirementProfileBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryDefaultRequirementProfilesBody struct { + Req *types.PbmQueryDefaultRequirementProfiles `xml:"urn:pbm PbmQueryDefaultRequirementProfiles,omitempty"` + Res *types.PbmQueryDefaultRequirementProfilesResponse `xml:"urn:pbm PbmQueryDefaultRequirementProfilesResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryDefaultRequirementProfilesBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryDefaultRequirementProfiles(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryDefaultRequirementProfiles) (*types.PbmQueryDefaultRequirementProfilesResponse, error) { + var reqBody, resBody PbmQueryDefaultRequirementProfilesBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryMatchingHubBody struct { + Req *types.PbmQueryMatchingHub `xml:"urn:pbm PbmQueryMatchingHub,omitempty"` + Res *types.PbmQueryMatchingHubResponse `xml:"urn:pbm PbmQueryMatchingHubResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryMatchingHubBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryMatchingHub(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryMatchingHub) (*types.PbmQueryMatchingHubResponse, error) { + var reqBody, resBody PbmQueryMatchingHubBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryMatchingHubWithSpecBody struct { + Req *types.PbmQueryMatchingHubWithSpec `xml:"urn:pbm PbmQueryMatchingHubWithSpec,omitempty"` + Res *types.PbmQueryMatchingHubWithSpecResponse `xml:"urn:pbm PbmQueryMatchingHubWithSpecResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryMatchingHubWithSpecBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryMatchingHubWithSpec(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryMatchingHubWithSpec) (*types.PbmQueryMatchingHubWithSpecResponse, error) { + var reqBody, resBody PbmQueryMatchingHubWithSpecBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryProfileBody struct { + Req *types.PbmQueryProfile `xml:"urn:pbm PbmQueryProfile,omitempty"` + Res *types.PbmQueryProfileResponse `xml:"urn:pbm PbmQueryProfileResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryProfileBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryProfile(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryProfile) (*types.PbmQueryProfileResponse, error) { + var reqBody, resBody PbmQueryProfileBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQueryReplicationGroupsBody struct { + Req *types.PbmQueryReplicationGroups `xml:"urn:pbm PbmQueryReplicationGroups,omitempty"` + Res *types.PbmQueryReplicationGroupsResponse `xml:"urn:pbm PbmQueryReplicationGroupsResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQueryReplicationGroupsBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQueryReplicationGroups(ctx context.Context, r soap.RoundTripper, req *types.PbmQueryReplicationGroups) (*types.PbmQueryReplicationGroupsResponse, error) { + var reqBody, resBody PbmQueryReplicationGroupsBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmQuerySpaceStatsForStorageContainerBody struct { + Req *types.PbmQuerySpaceStatsForStorageContainer `xml:"urn:pbm PbmQuerySpaceStatsForStorageContainer,omitempty"` + Res *types.PbmQuerySpaceStatsForStorageContainerResponse `xml:"urn:pbm PbmQuerySpaceStatsForStorageContainerResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmQuerySpaceStatsForStorageContainerBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmQuerySpaceStatsForStorageContainer(ctx context.Context, r soap.RoundTripper, req *types.PbmQuerySpaceStatsForStorageContainer) (*types.PbmQuerySpaceStatsForStorageContainerResponse, error) { + var reqBody, resBody PbmQuerySpaceStatsForStorageContainerBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmResetDefaultRequirementProfileBody struct { + Req *types.PbmResetDefaultRequirementProfile `xml:"urn:pbm PbmResetDefaultRequirementProfile,omitempty"` + Res *types.PbmResetDefaultRequirementProfileResponse `xml:"urn:pbm PbmResetDefaultRequirementProfileResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmResetDefaultRequirementProfileBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmResetDefaultRequirementProfile(ctx context.Context, r soap.RoundTripper, req *types.PbmResetDefaultRequirementProfile) (*types.PbmResetDefaultRequirementProfileResponse, error) { + var reqBody, resBody PbmResetDefaultRequirementProfileBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmResetVSanDefaultProfileBody struct { + Req *types.PbmResetVSanDefaultProfile `xml:"urn:pbm PbmResetVSanDefaultProfile,omitempty"` + Res *types.PbmResetVSanDefaultProfileResponse `xml:"urn:pbm PbmResetVSanDefaultProfileResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmResetVSanDefaultProfileBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmResetVSanDefaultProfile(ctx context.Context, r soap.RoundTripper, req *types.PbmResetVSanDefaultProfile) (*types.PbmResetVSanDefaultProfileResponse, error) { + var reqBody, resBody PbmResetVSanDefaultProfileBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmRetrieveContentBody struct { + Req *types.PbmRetrieveContent `xml:"urn:pbm PbmRetrieveContent,omitempty"` + Res *types.PbmRetrieveContentResponse `xml:"urn:pbm PbmRetrieveContentResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmRetrieveContentBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmRetrieveContent(ctx context.Context, r soap.RoundTripper, req *types.PbmRetrieveContent) (*types.PbmRetrieveContentResponse, error) { + var reqBody, resBody PbmRetrieveContentBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmRetrieveServiceContentBody struct { + Req *types.PbmRetrieveServiceContent `xml:"urn:pbm PbmRetrieveServiceContent,omitempty"` + Res *types.PbmRetrieveServiceContentResponse `xml:"urn:pbm PbmRetrieveServiceContentResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmRetrieveServiceContentBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmRetrieveServiceContent(ctx context.Context, r soap.RoundTripper, req *types.PbmRetrieveServiceContent) (*types.PbmRetrieveServiceContentResponse, error) { + var reqBody, resBody PbmRetrieveServiceContentBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} + +type PbmUpdateBody struct { + Req *types.PbmUpdate `xml:"urn:pbm PbmUpdate,omitempty"` + Res *types.PbmUpdateResponse `xml:"urn:pbm PbmUpdateResponse,omitempty"` + Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"` +} + +func (b *PbmUpdateBody) Fault() *soap.Fault { return b.Fault_ } + +func PbmUpdate(ctx context.Context, r soap.RoundTripper, req *types.PbmUpdate) (*types.PbmUpdateResponse, error) { + var reqBody, resBody PbmUpdateBody + + reqBody.Req = req + + if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil { + return nil, err + } + + return resBody.Res, nil +} diff --git a/vendor/github.com/vmware/govmomi/pbm/pbm_util.go b/vendor/github.com/vmware/govmomi/pbm/pbm_util.go new file mode 100644 index 0000000000000..4cc8085f34468 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/pbm_util.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pbm + +import ( + "fmt" + "strconv" + "strings" + + "github.com/vmware/govmomi/pbm/types" +) + +// A struct to capture pbm create spec details. +type CapabilityProfileCreateSpec struct { + Name string + Description string + Category string + CapabilityList []Capability +} + +// A struct to capture pbm capability instance details. +type Capability struct { + ID string + Namespace string + PropertyList []Property +} + +// A struct to capture pbm property instance details. +type Property struct { + ID string + Operator string + Value string + DataType string +} + +func CreateCapabilityProfileSpec(pbmCreateSpec CapabilityProfileCreateSpec) (*types.PbmCapabilityProfileCreateSpec, error) { + capabilities, err := createCapabilityInstances(pbmCreateSpec.CapabilityList) + if err != nil { + return nil, err + } + + pbmCapabilityProfileSpec := types.PbmCapabilityProfileCreateSpec{ + Name: pbmCreateSpec.Name, + Description: pbmCreateSpec.Description, + Category: pbmCreateSpec.Category, + ResourceType: types.PbmProfileResourceType{ + ResourceType: string(types.PbmProfileResourceTypeEnumSTORAGE), + }, + Constraints: &types.PbmCapabilitySubProfileConstraints{ + SubProfiles: []types.PbmCapabilitySubProfile{ + types.PbmCapabilitySubProfile{ + Capability: capabilities, + }, + }, + }, + } + return &pbmCapabilityProfileSpec, nil +} + +func createCapabilityInstances(rules []Capability) ([]types.PbmCapabilityInstance, error) { + var capabilityInstances []types.PbmCapabilityInstance + for _, capabilityRule := range rules { + capability := types.PbmCapabilityInstance{ + Id: types.PbmCapabilityMetadataUniqueId{ + Namespace: capabilityRule.Namespace, + Id: capabilityRule.ID, + }, + } + + var propertyInstances []types.PbmCapabilityPropertyInstance + for _, propertyRule := range capabilityRule.PropertyList { + property := types.PbmCapabilityPropertyInstance{ + Id: propertyRule.ID, + } + if propertyRule.Operator != "" { + property.Operator = propertyRule.Operator + } + var err error + switch strings.ToLower(propertyRule.DataType) { + case "int": + // Go int32 is marshalled to xsi:int whereas Go int is marshalled to xsi:long when sending down the wire. + var val int32 + val, err = verifyPropertyValueIsInt(propertyRule.Value, propertyRule.DataType) + property.Value = val + case "bool": + var val bool + val, err = verifyPropertyValueIsBoolean(propertyRule.Value, propertyRule.DataType) + property.Value = val + case "string": + property.Value = propertyRule.Value + case "set": + set := types.PbmCapabilityDiscreteSet{} + for _, val := range strings.Split(propertyRule.Value, ",") { + set.Values = append(set.Values, val) + } + property.Value = set + default: + return nil, fmt.Errorf("invalid value: %q with datatype: %q", propertyRule.Value, propertyRule.Value) + } + if err != nil { + return nil, fmt.Errorf("invalid value: %q with datatype: %q", propertyRule.Value, propertyRule.Value) + } + propertyInstances = append(propertyInstances, property) + } + constraintInstances := []types.PbmCapabilityConstraintInstance{ + types.PbmCapabilityConstraintInstance{ + PropertyInstance: propertyInstances, + }, + } + capability.Constraint = constraintInstances + capabilityInstances = append(capabilityInstances, capability) + } + return capabilityInstances, nil +} + +// Verify if the capability value is of type integer. +func verifyPropertyValueIsInt(propertyValue string, dataType string) (int32, error) { + val, err := strconv.ParseInt(propertyValue, 10, 32) + if err != nil { + return -1, err + } + return int32(val), nil +} + +// Verify if the capability value is of type integer. +func verifyPropertyValueIsBoolean(propertyValue string, dataType string) (bool, error) { + val, err := strconv.ParseBool(propertyValue) + if err != nil { + return false, err + } + return val, nil +} diff --git a/vendor/github.com/vmware/govmomi/pbm/types/BUILD b/vendor/github.com/vmware/govmomi/pbm/types/BUILD new file mode 100644 index 0000000000000..5106154689f3f --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/types/BUILD @@ -0,0 +1,32 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "enum.go", + "if.go", + "types.go", + ], + tags = ["automanaged"], + deps = ["//vendor/github.com/vmware/govmomi/vim25/types:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/vendor/github.com/vmware/govmomi/pbm/types/enum.go b/vendor/github.com/vmware/govmomi/pbm/types/enum.go new file mode 100644 index 0000000000000..7cee751417cfc --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/types/enum.go @@ -0,0 +1,211 @@ +/* +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package types + +import ( + "reflect" + + "github.com/vmware/govmomi/vim25/types" +) + +type PbmBuiltinGenericType string + +const ( + PbmBuiltinGenericTypeVMW_RANGE = PbmBuiltinGenericType("VMW_RANGE") + PbmBuiltinGenericTypeVMW_SET = PbmBuiltinGenericType("VMW_SET") +) + +func init() { + types.Add("pbm:PbmBuiltinGenericType", reflect.TypeOf((*PbmBuiltinGenericType)(nil)).Elem()) +} + +type PbmBuiltinType string + +const ( + PbmBuiltinTypeXSD_LONG = PbmBuiltinType("XSD_LONG") + PbmBuiltinTypeXSD_SHORT = PbmBuiltinType("XSD_SHORT") + PbmBuiltinTypeXSD_INTEGER = PbmBuiltinType("XSD_INTEGER") + PbmBuiltinTypeXSD_INT = PbmBuiltinType("XSD_INT") + PbmBuiltinTypeXSD_STRING = PbmBuiltinType("XSD_STRING") + PbmBuiltinTypeXSD_BOOLEAN = PbmBuiltinType("XSD_BOOLEAN") + PbmBuiltinTypeXSD_DOUBLE = PbmBuiltinType("XSD_DOUBLE") + PbmBuiltinTypeXSD_DATETIME = PbmBuiltinType("XSD_DATETIME") + PbmBuiltinTypeVMW_TIMESPAN = PbmBuiltinType("VMW_TIMESPAN") + PbmBuiltinTypeVMW_POLICY = PbmBuiltinType("VMW_POLICY") +) + +func init() { + types.Add("pbm:PbmBuiltinType", reflect.TypeOf((*PbmBuiltinType)(nil)).Elem()) +} + +type PbmCapabilityOperator string + +const ( + PbmCapabilityOperatorNOT = PbmCapabilityOperator("NOT") +) + +func init() { + types.Add("pbm:PbmCapabilityOperator", reflect.TypeOf((*PbmCapabilityOperator)(nil)).Elem()) +} + +type PbmCapabilityTimeUnitType string + +const ( + PbmCapabilityTimeUnitTypeSECONDS = PbmCapabilityTimeUnitType("SECONDS") + PbmCapabilityTimeUnitTypeMINUTES = PbmCapabilityTimeUnitType("MINUTES") + PbmCapabilityTimeUnitTypeHOURS = PbmCapabilityTimeUnitType("HOURS") + PbmCapabilityTimeUnitTypeDAYS = PbmCapabilityTimeUnitType("DAYS") + PbmCapabilityTimeUnitTypeWEEKS = PbmCapabilityTimeUnitType("WEEKS") + PbmCapabilityTimeUnitTypeMONTHS = PbmCapabilityTimeUnitType("MONTHS") + PbmCapabilityTimeUnitTypeYEARS = PbmCapabilityTimeUnitType("YEARS") +) + +func init() { + types.Add("pbm:PbmCapabilityTimeUnitType", reflect.TypeOf((*PbmCapabilityTimeUnitType)(nil)).Elem()) +} + +type PbmComplianceResultComplianceTaskStatus string + +const ( + PbmComplianceResultComplianceTaskStatusInProgress = PbmComplianceResultComplianceTaskStatus("inProgress") + PbmComplianceResultComplianceTaskStatusSuccess = PbmComplianceResultComplianceTaskStatus("success") + PbmComplianceResultComplianceTaskStatusFailed = PbmComplianceResultComplianceTaskStatus("failed") +) + +func init() { + types.Add("pbm:PbmComplianceResultComplianceTaskStatus", reflect.TypeOf((*PbmComplianceResultComplianceTaskStatus)(nil)).Elem()) +} + +type PbmComplianceStatus string + +const ( + PbmComplianceStatusCompliant = PbmComplianceStatus("compliant") + PbmComplianceStatusNonCompliant = PbmComplianceStatus("nonCompliant") + PbmComplianceStatusUnknown = PbmComplianceStatus("unknown") + PbmComplianceStatusNotApplicable = PbmComplianceStatus("notApplicable") + PbmComplianceStatusOutOfDate = PbmComplianceStatus("outOfDate") +) + +func init() { + types.Add("pbm:PbmComplianceStatus", reflect.TypeOf((*PbmComplianceStatus)(nil)).Elem()) +} + +type PbmIofilterInfoFilterType string + +const ( + PbmIofilterInfoFilterTypeINSPECTION = PbmIofilterInfoFilterType("INSPECTION") + PbmIofilterInfoFilterTypeCOMPRESSION = PbmIofilterInfoFilterType("COMPRESSION") + PbmIofilterInfoFilterTypeENCRYPTION = PbmIofilterInfoFilterType("ENCRYPTION") + PbmIofilterInfoFilterTypeREPLICATION = PbmIofilterInfoFilterType("REPLICATION") + PbmIofilterInfoFilterTypeCACHE = PbmIofilterInfoFilterType("CACHE") + PbmIofilterInfoFilterTypeDATAPROVIDER = PbmIofilterInfoFilterType("DATAPROVIDER") + PbmIofilterInfoFilterTypeDATASTOREIOCONTROL = PbmIofilterInfoFilterType("DATASTOREIOCONTROL") +) + +func init() { + types.Add("pbm:PbmIofilterInfoFilterType", reflect.TypeOf((*PbmIofilterInfoFilterType)(nil)).Elem()) +} + +type PbmLineOfServiceInfoLineOfServiceEnum string + +const ( + PbmLineOfServiceInfoLineOfServiceEnumINSPECTION = PbmLineOfServiceInfoLineOfServiceEnum("INSPECTION") + PbmLineOfServiceInfoLineOfServiceEnumCOMPRESSION = PbmLineOfServiceInfoLineOfServiceEnum("COMPRESSION") + PbmLineOfServiceInfoLineOfServiceEnumENCRYPTION = PbmLineOfServiceInfoLineOfServiceEnum("ENCRYPTION") + PbmLineOfServiceInfoLineOfServiceEnumREPLICATION = PbmLineOfServiceInfoLineOfServiceEnum("REPLICATION") + PbmLineOfServiceInfoLineOfServiceEnumCACHING = PbmLineOfServiceInfoLineOfServiceEnum("CACHING") + PbmLineOfServiceInfoLineOfServiceEnumPERSISTENCE = PbmLineOfServiceInfoLineOfServiceEnum("PERSISTENCE") + PbmLineOfServiceInfoLineOfServiceEnumDATA_PROVIDER = PbmLineOfServiceInfoLineOfServiceEnum("DATA_PROVIDER") + PbmLineOfServiceInfoLineOfServiceEnumDATASTORE_IO_CONTROL = PbmLineOfServiceInfoLineOfServiceEnum("DATASTORE_IO_CONTROL") +) + +func init() { + types.Add("pbm:PbmLineOfServiceInfoLineOfServiceEnum", reflect.TypeOf((*PbmLineOfServiceInfoLineOfServiceEnum)(nil)).Elem()) +} + +type PbmObjectType string + +const ( + PbmObjectTypeVirtualMachine = PbmObjectType("virtualMachine") + PbmObjectTypeVirtualMachineAndDisks = PbmObjectType("virtualMachineAndDisks") + PbmObjectTypeVirtualDiskId = PbmObjectType("virtualDiskId") + PbmObjectTypeVirtualDiskUUID = PbmObjectType("virtualDiskUUID") + PbmObjectTypeDatastore = PbmObjectType("datastore") + PbmObjectTypeUnknown = PbmObjectType("unknown") +) + +func init() { + types.Add("pbm:PbmObjectType", reflect.TypeOf((*PbmObjectType)(nil)).Elem()) +} + +type PbmProfileCategoryEnum string + +const ( + PbmProfileCategoryEnumREQUIREMENT = PbmProfileCategoryEnum("REQUIREMENT") + PbmProfileCategoryEnumRESOURCE = PbmProfileCategoryEnum("RESOURCE") + PbmProfileCategoryEnumDATA_SERVICE_POLICY = PbmProfileCategoryEnum("DATA_SERVICE_POLICY") +) + +func init() { + types.Add("pbm:PbmProfileCategoryEnum", reflect.TypeOf((*PbmProfileCategoryEnum)(nil)).Elem()) +} + +type PbmProfileResourceTypeEnum string + +const ( + PbmProfileResourceTypeEnumSTORAGE = PbmProfileResourceTypeEnum("STORAGE") +) + +func init() { + types.Add("pbm:PbmProfileResourceTypeEnum", reflect.TypeOf((*PbmProfileResourceTypeEnum)(nil)).Elem()) +} + +type PbmSystemCreatedProfileType string + +const ( + PbmSystemCreatedProfileTypeVsanDefaultProfile = PbmSystemCreatedProfileType("VsanDefaultProfile") + PbmSystemCreatedProfileTypeVVolDefaultProfile = PbmSystemCreatedProfileType("VVolDefaultProfile") +) + +func init() { + types.Add("pbm:PbmSystemCreatedProfileType", reflect.TypeOf((*PbmSystemCreatedProfileType)(nil)).Elem()) +} + +type PbmVmOperation string + +const ( + PbmVmOperationCREATE = PbmVmOperation("CREATE") + PbmVmOperationRECONFIGURE = PbmVmOperation("RECONFIGURE") + PbmVmOperationMIGRATE = PbmVmOperation("MIGRATE") + PbmVmOperationCLONE = PbmVmOperation("CLONE") +) + +func init() { + types.Add("pbm:PbmVmOperation", reflect.TypeOf((*PbmVmOperation)(nil)).Elem()) +} + +type PbmVvolType string + +const ( + PbmVvolTypeConfig = PbmVvolType("Config") + PbmVvolTypeData = PbmVvolType("Data") + PbmVvolTypeSwap = PbmVvolType("Swap") +) + +func init() { + types.Add("pbm:PbmVvolType", reflect.TypeOf((*PbmVvolType)(nil)).Elem()) +} diff --git a/vendor/github.com/vmware/govmomi/pbm/types/if.go b/vendor/github.com/vmware/govmomi/pbm/types/if.go new file mode 100644 index 0000000000000..2a3ac5acc0458 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/types/if.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package types + +import ( + "reflect" + + "github.com/vmware/govmomi/vim25/types" +) + +func (b *PbmCapabilityConstraints) GetPbmCapabilityConstraints() *PbmCapabilityConstraints { return b } + +type BasePbmCapabilityConstraints interface { + GetPbmCapabilityConstraints() *PbmCapabilityConstraints +} + +func init() { + types.Add("BasePbmCapabilityConstraints", reflect.TypeOf((*PbmCapabilityConstraints)(nil)).Elem()) +} + +func (b *PbmCapabilityProfile) GetPbmCapabilityProfile() *PbmCapabilityProfile { return b } + +type BasePbmCapabilityProfile interface { + GetPbmCapabilityProfile() *PbmCapabilityProfile +} + +func init() { + types.Add("BasePbmCapabilityProfile", reflect.TypeOf((*PbmCapabilityProfile)(nil)).Elem()) +} + +func (b *PbmCapabilityProfilePropertyMismatchFault) GetPbmCapabilityProfilePropertyMismatchFault() *PbmCapabilityProfilePropertyMismatchFault { + return b +} + +type BasePbmCapabilityProfilePropertyMismatchFault interface { + GetPbmCapabilityProfilePropertyMismatchFault() *PbmCapabilityProfilePropertyMismatchFault +} + +func init() { + types.Add("BasePbmCapabilityProfilePropertyMismatchFault", reflect.TypeOf((*PbmCapabilityProfilePropertyMismatchFault)(nil)).Elem()) +} + +func (b *PbmCapabilityTypeInfo) GetPbmCapabilityTypeInfo() *PbmCapabilityTypeInfo { return b } + +type BasePbmCapabilityTypeInfo interface { + GetPbmCapabilityTypeInfo() *PbmCapabilityTypeInfo +} + +func init() { + types.Add("BasePbmCapabilityTypeInfo", reflect.TypeOf((*PbmCapabilityTypeInfo)(nil)).Elem()) +} + +func (b *PbmCompatibilityCheckFault) GetPbmCompatibilityCheckFault() *PbmCompatibilityCheckFault { + return b +} + +type BasePbmCompatibilityCheckFault interface { + GetPbmCompatibilityCheckFault() *PbmCompatibilityCheckFault +} + +func init() { + types.Add("BasePbmCompatibilityCheckFault", reflect.TypeOf((*PbmCompatibilityCheckFault)(nil)).Elem()) +} + +func (b *PbmFault) GetPbmFault() *PbmFault { return b } + +type BasePbmFault interface { + GetPbmFault() *PbmFault +} + +func init() { + types.Add("BasePbmFault", reflect.TypeOf((*PbmFault)(nil)).Elem()) +} + +func (b *PbmLineOfServiceInfo) GetPbmLineOfServiceInfo() *PbmLineOfServiceInfo { return b } + +type BasePbmLineOfServiceInfo interface { + GetPbmLineOfServiceInfo() *PbmLineOfServiceInfo +} + +func init() { + types.Add("BasePbmLineOfServiceInfo", reflect.TypeOf((*PbmLineOfServiceInfo)(nil)).Elem()) +} + +func (b *PbmPlacementMatchingResources) GetPbmPlacementMatchingResources() *PbmPlacementMatchingResources { + return b +} + +type BasePbmPlacementMatchingResources interface { + GetPbmPlacementMatchingResources() *PbmPlacementMatchingResources +} + +func init() { + types.Add("BasePbmPlacementMatchingResources", reflect.TypeOf((*PbmPlacementMatchingResources)(nil)).Elem()) +} + +func (b *PbmPlacementRequirement) GetPbmPlacementRequirement() *PbmPlacementRequirement { return b } + +type BasePbmPlacementRequirement interface { + GetPbmPlacementRequirement() *PbmPlacementRequirement +} + +func init() { + types.Add("BasePbmPlacementRequirement", reflect.TypeOf((*PbmPlacementRequirement)(nil)).Elem()) +} + +func (b *PbmProfile) GetPbmProfile() *PbmProfile { return b } + +type BasePbmProfile interface { + GetPbmProfile() *PbmProfile +} + +func init() { + types.Add("BasePbmProfile", reflect.TypeOf((*PbmProfile)(nil)).Elem()) +} + +func (b *PbmPropertyMismatchFault) GetPbmPropertyMismatchFault() *PbmPropertyMismatchFault { return b } + +type BasePbmPropertyMismatchFault interface { + GetPbmPropertyMismatchFault() *PbmPropertyMismatchFault +} + +func init() { + types.Add("BasePbmPropertyMismatchFault", reflect.TypeOf((*PbmPropertyMismatchFault)(nil)).Elem()) +} diff --git a/vendor/github.com/vmware/govmomi/pbm/types/types.go b/vendor/github.com/vmware/govmomi/pbm/types/types.go new file mode 100644 index 0000000000000..47bd73c17bd46 --- /dev/null +++ b/vendor/github.com/vmware/govmomi/pbm/types/types.go @@ -0,0 +1,1712 @@ +/* +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package types + +import ( + "reflect" + "time" + + "github.com/vmware/govmomi/vim25/types" +) + +type ArrayOfPbmCapabilityConstraintInstance struct { + PbmCapabilityConstraintInstance []PbmCapabilityConstraintInstance `xml:"PbmCapabilityConstraintInstance,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityConstraintInstance", reflect.TypeOf((*ArrayOfPbmCapabilityConstraintInstance)(nil)).Elem()) +} + +type ArrayOfPbmCapabilityInstance struct { + PbmCapabilityInstance []PbmCapabilityInstance `xml:"PbmCapabilityInstance,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityInstance", reflect.TypeOf((*ArrayOfPbmCapabilityInstance)(nil)).Elem()) +} + +type ArrayOfPbmCapabilityMetadata struct { + PbmCapabilityMetadata []PbmCapabilityMetadata `xml:"PbmCapabilityMetadata,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityMetadata", reflect.TypeOf((*ArrayOfPbmCapabilityMetadata)(nil)).Elem()) +} + +type ArrayOfPbmCapabilityMetadataPerCategory struct { + PbmCapabilityMetadataPerCategory []PbmCapabilityMetadataPerCategory `xml:"PbmCapabilityMetadataPerCategory,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityMetadataPerCategory", reflect.TypeOf((*ArrayOfPbmCapabilityMetadataPerCategory)(nil)).Elem()) +} + +type ArrayOfPbmCapabilityPropertyInstance struct { + PbmCapabilityPropertyInstance []PbmCapabilityPropertyInstance `xml:"PbmCapabilityPropertyInstance,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityPropertyInstance", reflect.TypeOf((*ArrayOfPbmCapabilityPropertyInstance)(nil)).Elem()) +} + +type ArrayOfPbmCapabilityPropertyMetadata struct { + PbmCapabilityPropertyMetadata []PbmCapabilityPropertyMetadata `xml:"PbmCapabilityPropertyMetadata,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityPropertyMetadata", reflect.TypeOf((*ArrayOfPbmCapabilityPropertyMetadata)(nil)).Elem()) +} + +type ArrayOfPbmCapabilitySchema struct { + PbmCapabilitySchema []PbmCapabilitySchema `xml:"PbmCapabilitySchema,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilitySchema", reflect.TypeOf((*ArrayOfPbmCapabilitySchema)(nil)).Elem()) +} + +type ArrayOfPbmCapabilitySubProfile struct { + PbmCapabilitySubProfile []PbmCapabilitySubProfile `xml:"PbmCapabilitySubProfile,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilitySubProfile", reflect.TypeOf((*ArrayOfPbmCapabilitySubProfile)(nil)).Elem()) +} + +type ArrayOfPbmCapabilityVendorNamespaceInfo struct { + PbmCapabilityVendorNamespaceInfo []PbmCapabilityVendorNamespaceInfo `xml:"PbmCapabilityVendorNamespaceInfo,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityVendorNamespaceInfo", reflect.TypeOf((*ArrayOfPbmCapabilityVendorNamespaceInfo)(nil)).Elem()) +} + +type ArrayOfPbmCapabilityVendorResourceTypeInfo struct { + PbmCapabilityVendorResourceTypeInfo []PbmCapabilityVendorResourceTypeInfo `xml:"PbmCapabilityVendorResourceTypeInfo,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCapabilityVendorResourceTypeInfo", reflect.TypeOf((*ArrayOfPbmCapabilityVendorResourceTypeInfo)(nil)).Elem()) +} + +type ArrayOfPbmCompliancePolicyStatus struct { + PbmCompliancePolicyStatus []PbmCompliancePolicyStatus `xml:"PbmCompliancePolicyStatus,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmCompliancePolicyStatus", reflect.TypeOf((*ArrayOfPbmCompliancePolicyStatus)(nil)).Elem()) +} + +type ArrayOfPbmComplianceResult struct { + PbmComplianceResult []PbmComplianceResult `xml:"PbmComplianceResult,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmComplianceResult", reflect.TypeOf((*ArrayOfPbmComplianceResult)(nil)).Elem()) +} + +type ArrayOfPbmDatastoreSpaceStatistics struct { + PbmDatastoreSpaceStatistics []PbmDatastoreSpaceStatistics `xml:"PbmDatastoreSpaceStatistics,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmDatastoreSpaceStatistics", reflect.TypeOf((*ArrayOfPbmDatastoreSpaceStatistics)(nil)).Elem()) +} + +type ArrayOfPbmDefaultProfileInfo struct { + PbmDefaultProfileInfo []PbmDefaultProfileInfo `xml:"PbmDefaultProfileInfo,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmDefaultProfileInfo", reflect.TypeOf((*ArrayOfPbmDefaultProfileInfo)(nil)).Elem()) +} + +type ArrayOfPbmPlacementCompatibilityResult struct { + PbmPlacementCompatibilityResult []PbmPlacementCompatibilityResult `xml:"PbmPlacementCompatibilityResult,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmPlacementCompatibilityResult", reflect.TypeOf((*ArrayOfPbmPlacementCompatibilityResult)(nil)).Elem()) +} + +type ArrayOfPbmPlacementHub struct { + PbmPlacementHub []PbmPlacementHub `xml:"PbmPlacementHub,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmPlacementHub", reflect.TypeOf((*ArrayOfPbmPlacementHub)(nil)).Elem()) +} + +type ArrayOfPbmPlacementMatchingResources struct { + PbmPlacementMatchingResources []BasePbmPlacementMatchingResources `xml:"PbmPlacementMatchingResources,omitempty,typeattr"` +} + +func init() { + types.Add("pbm:ArrayOfPbmPlacementMatchingResources", reflect.TypeOf((*ArrayOfPbmPlacementMatchingResources)(nil)).Elem()) +} + +type ArrayOfPbmPlacementRequirement struct { + PbmPlacementRequirement []BasePbmPlacementRequirement `xml:"PbmPlacementRequirement,omitempty,typeattr"` +} + +func init() { + types.Add("pbm:ArrayOfPbmPlacementRequirement", reflect.TypeOf((*ArrayOfPbmPlacementRequirement)(nil)).Elem()) +} + +type ArrayOfPbmPlacementResourceUtilization struct { + PbmPlacementResourceUtilization []PbmPlacementResourceUtilization `xml:"PbmPlacementResourceUtilization,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmPlacementResourceUtilization", reflect.TypeOf((*ArrayOfPbmPlacementResourceUtilization)(nil)).Elem()) +} + +type ArrayOfPbmProfile struct { + PbmProfile []BasePbmProfile `xml:"PbmProfile,omitempty,typeattr"` +} + +func init() { + types.Add("pbm:ArrayOfPbmProfile", reflect.TypeOf((*ArrayOfPbmProfile)(nil)).Elem()) +} + +type ArrayOfPbmProfileId struct { + PbmProfileId []PbmProfileId `xml:"PbmProfileId,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmProfileId", reflect.TypeOf((*ArrayOfPbmProfileId)(nil)).Elem()) +} + +type ArrayOfPbmProfileOperationOutcome struct { + PbmProfileOperationOutcome []PbmProfileOperationOutcome `xml:"PbmProfileOperationOutcome,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmProfileOperationOutcome", reflect.TypeOf((*ArrayOfPbmProfileOperationOutcome)(nil)).Elem()) +} + +type ArrayOfPbmProfileResourceType struct { + PbmProfileResourceType []PbmProfileResourceType `xml:"PbmProfileResourceType,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmProfileResourceType", reflect.TypeOf((*ArrayOfPbmProfileResourceType)(nil)).Elem()) +} + +type ArrayOfPbmProfileType struct { + PbmProfileType []PbmProfileType `xml:"PbmProfileType,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmProfileType", reflect.TypeOf((*ArrayOfPbmProfileType)(nil)).Elem()) +} + +type ArrayOfPbmQueryProfileResult struct { + PbmQueryProfileResult []PbmQueryProfileResult `xml:"PbmQueryProfileResult,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmQueryProfileResult", reflect.TypeOf((*ArrayOfPbmQueryProfileResult)(nil)).Elem()) +} + +type ArrayOfPbmQueryReplicationGroupResult struct { + PbmQueryReplicationGroupResult []PbmQueryReplicationGroupResult `xml:"PbmQueryReplicationGroupResult,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmQueryReplicationGroupResult", reflect.TypeOf((*ArrayOfPbmQueryReplicationGroupResult)(nil)).Elem()) +} + +type ArrayOfPbmRollupComplianceResult struct { + PbmRollupComplianceResult []PbmRollupComplianceResult `xml:"PbmRollupComplianceResult,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmRollupComplianceResult", reflect.TypeOf((*ArrayOfPbmRollupComplianceResult)(nil)).Elem()) +} + +type ArrayOfPbmServerObjectRef struct { + PbmServerObjectRef []PbmServerObjectRef `xml:"PbmServerObjectRef,omitempty"` +} + +func init() { + types.Add("pbm:ArrayOfPbmServerObjectRef", reflect.TypeOf((*ArrayOfPbmServerObjectRef)(nil)).Elem()) +} + +type PbmAboutInfo struct { + types.DynamicData + + Name string `xml:"name"` + Version string `xml:"version"` + InstanceUuid string `xml:"instanceUuid"` +} + +func init() { + types.Add("pbm:PbmAboutInfo", reflect.TypeOf((*PbmAboutInfo)(nil)).Elem()) +} + +type PbmAlreadyExists struct { + PbmFault + + Name string `xml:"name,omitempty"` +} + +func init() { + types.Add("pbm:PbmAlreadyExists", reflect.TypeOf((*PbmAlreadyExists)(nil)).Elem()) +} + +type PbmAssignDefaultRequirementProfile PbmAssignDefaultRequirementProfileRequestType + +func init() { + types.Add("pbm:PbmAssignDefaultRequirementProfile", reflect.TypeOf((*PbmAssignDefaultRequirementProfile)(nil)).Elem()) +} + +type PbmAssignDefaultRequirementProfileRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Profile PbmProfileId `xml:"profile"` + Datastores []PbmPlacementHub `xml:"datastores"` +} + +func init() { + types.Add("pbm:PbmAssignDefaultRequirementProfileRequestType", reflect.TypeOf((*PbmAssignDefaultRequirementProfileRequestType)(nil)).Elem()) +} + +type PbmAssignDefaultRequirementProfileResponse struct { +} + +type PbmCapabilityConstraintInstance struct { + types.DynamicData + + PropertyInstance []PbmCapabilityPropertyInstance `xml:"propertyInstance"` +} + +func init() { + types.Add("pbm:PbmCapabilityConstraintInstance", reflect.TypeOf((*PbmCapabilityConstraintInstance)(nil)).Elem()) +} + +type PbmCapabilityConstraints struct { + types.DynamicData +} + +func init() { + types.Add("pbm:PbmCapabilityConstraints", reflect.TypeOf((*PbmCapabilityConstraints)(nil)).Elem()) +} + +type PbmCapabilityDescription struct { + types.DynamicData + + Description PbmExtendedElementDescription `xml:"description"` + Value types.AnyType `xml:"value,typeattr"` +} + +func init() { + types.Add("pbm:PbmCapabilityDescription", reflect.TypeOf((*PbmCapabilityDescription)(nil)).Elem()) +} + +type PbmCapabilityDiscreteSet struct { + types.DynamicData + + Values []types.AnyType `xml:"values,typeattr"` +} + +func init() { + types.Add("pbm:PbmCapabilityDiscreteSet", reflect.TypeOf((*PbmCapabilityDiscreteSet)(nil)).Elem()) +} + +type PbmCapabilityGenericTypeInfo struct { + PbmCapabilityTypeInfo + + GenericTypeName string `xml:"genericTypeName"` +} + +func init() { + types.Add("pbm:PbmCapabilityGenericTypeInfo", reflect.TypeOf((*PbmCapabilityGenericTypeInfo)(nil)).Elem()) +} + +type PbmCapabilityInstance struct { + types.DynamicData + + Id PbmCapabilityMetadataUniqueId `xml:"id"` + Constraint []PbmCapabilityConstraintInstance `xml:"constraint"` +} + +func init() { + types.Add("pbm:PbmCapabilityInstance", reflect.TypeOf((*PbmCapabilityInstance)(nil)).Elem()) +} + +type PbmCapabilityMetadata struct { + types.DynamicData + + Id PbmCapabilityMetadataUniqueId `xml:"id"` + Summary PbmExtendedElementDescription `xml:"summary"` + Mandatory *bool `xml:"mandatory"` + Hint *bool `xml:"hint"` + KeyId string `xml:"keyId,omitempty"` + AllowMultipleConstraints *bool `xml:"allowMultipleConstraints"` + PropertyMetadata []PbmCapabilityPropertyMetadata `xml:"propertyMetadata"` +} + +func init() { + types.Add("pbm:PbmCapabilityMetadata", reflect.TypeOf((*PbmCapabilityMetadata)(nil)).Elem()) +} + +type PbmCapabilityMetadataPerCategory struct { + types.DynamicData + + SubCategory string `xml:"subCategory"` + CapabilityMetadata []PbmCapabilityMetadata `xml:"capabilityMetadata"` +} + +func init() { + types.Add("pbm:PbmCapabilityMetadataPerCategory", reflect.TypeOf((*PbmCapabilityMetadataPerCategory)(nil)).Elem()) +} + +type PbmCapabilityMetadataUniqueId struct { + types.DynamicData + + Namespace string `xml:"namespace"` + Id string `xml:"id"` +} + +func init() { + types.Add("pbm:PbmCapabilityMetadataUniqueId", reflect.TypeOf((*PbmCapabilityMetadataUniqueId)(nil)).Elem()) +} + +type PbmCapabilityNamespaceInfo struct { + types.DynamicData + + Version string `xml:"version"` + Namespace string `xml:"namespace"` + Info *PbmExtendedElementDescription `xml:"info,omitempty"` +} + +func init() { + types.Add("pbm:PbmCapabilityNamespaceInfo", reflect.TypeOf((*PbmCapabilityNamespaceInfo)(nil)).Elem()) +} + +type PbmCapabilityProfile struct { + PbmProfile + + ProfileCategory string `xml:"profileCategory"` + ResourceType PbmProfileResourceType `xml:"resourceType"` + Constraints BasePbmCapabilityConstraints `xml:"constraints,typeattr"` + GenerationId int64 `xml:"generationId,omitempty"` + IsDefault bool `xml:"isDefault"` + SystemCreatedProfileType string `xml:"systemCreatedProfileType,omitempty"` + LineOfService string `xml:"lineOfService,omitempty"` +} + +func init() { + types.Add("pbm:PbmCapabilityProfile", reflect.TypeOf((*PbmCapabilityProfile)(nil)).Elem()) +} + +type PbmCapabilityProfileCreateSpec struct { + types.DynamicData + + Name string `xml:"name"` + Description string `xml:"description,omitempty"` + Category string `xml:"category,omitempty"` + ResourceType PbmProfileResourceType `xml:"resourceType"` + Constraints BasePbmCapabilityConstraints `xml:"constraints,typeattr"` +} + +func init() { + types.Add("pbm:PbmCapabilityProfileCreateSpec", reflect.TypeOf((*PbmCapabilityProfileCreateSpec)(nil)).Elem()) +} + +type PbmCapabilityProfilePropertyMismatchFault struct { + PbmPropertyMismatchFault + + ResourcePropertyInstance PbmCapabilityPropertyInstance `xml:"resourcePropertyInstance"` +} + +func init() { + types.Add("pbm:PbmCapabilityProfilePropertyMismatchFault", reflect.TypeOf((*PbmCapabilityProfilePropertyMismatchFault)(nil)).Elem()) +} + +type PbmCapabilityProfilePropertyMismatchFaultFault BasePbmCapabilityProfilePropertyMismatchFault + +func init() { + types.Add("pbm:PbmCapabilityProfilePropertyMismatchFaultFault", reflect.TypeOf((*PbmCapabilityProfilePropertyMismatchFaultFault)(nil)).Elem()) +} + +type PbmCapabilityProfileUpdateSpec struct { + types.DynamicData + + Name string `xml:"name,omitempty"` + Description string `xml:"description,omitempty"` + Constraints BasePbmCapabilityConstraints `xml:"constraints,omitempty,typeattr"` +} + +func init() { + types.Add("pbm:PbmCapabilityProfileUpdateSpec", reflect.TypeOf((*PbmCapabilityProfileUpdateSpec)(nil)).Elem()) +} + +type PbmCapabilityPropertyInstance struct { + types.DynamicData + + Id string `xml:"id"` + Operator string `xml:"operator,omitempty"` + Value types.AnyType `xml:"value,typeattr"` +} + +func init() { + types.Add("pbm:PbmCapabilityPropertyInstance", reflect.TypeOf((*PbmCapabilityPropertyInstance)(nil)).Elem()) +} + +type PbmCapabilityPropertyMetadata struct { + types.DynamicData + + Id string `xml:"id"` + Summary PbmExtendedElementDescription `xml:"summary"` + Mandatory bool `xml:"mandatory"` + Type BasePbmCapabilityTypeInfo `xml:"type,omitempty,typeattr"` + DefaultValue types.AnyType `xml:"defaultValue,omitempty,typeattr"` + AllowedValue types.AnyType `xml:"allowedValue,omitempty,typeattr"` + RequirementsTypeHint string `xml:"requirementsTypeHint,omitempty"` +} + +func init() { + types.Add("pbm:PbmCapabilityPropertyMetadata", reflect.TypeOf((*PbmCapabilityPropertyMetadata)(nil)).Elem()) +} + +type PbmCapabilityRange struct { + types.DynamicData + + Min types.AnyType `xml:"min,typeattr"` + Max types.AnyType `xml:"max,typeattr"` +} + +func init() { + types.Add("pbm:PbmCapabilityRange", reflect.TypeOf((*PbmCapabilityRange)(nil)).Elem()) +} + +type PbmCapabilitySchema struct { + types.DynamicData + + VendorInfo PbmCapabilitySchemaVendorInfo `xml:"vendorInfo"` + NamespaceInfo PbmCapabilityNamespaceInfo `xml:"namespaceInfo"` + LineOfService BasePbmLineOfServiceInfo `xml:"lineOfService,omitempty,typeattr"` + CapabilityMetadataPerCategory []PbmCapabilityMetadataPerCategory `xml:"capabilityMetadataPerCategory"` +} + +func init() { + types.Add("pbm:PbmCapabilitySchema", reflect.TypeOf((*PbmCapabilitySchema)(nil)).Elem()) +} + +type PbmCapabilitySchemaVendorInfo struct { + types.DynamicData + + VendorUuid string `xml:"vendorUuid"` + Info PbmExtendedElementDescription `xml:"info"` +} + +func init() { + types.Add("pbm:PbmCapabilitySchemaVendorInfo", reflect.TypeOf((*PbmCapabilitySchemaVendorInfo)(nil)).Elem()) +} + +type PbmCapabilitySubProfile struct { + types.DynamicData + + Name string `xml:"name"` + Capability []PbmCapabilityInstance `xml:"capability"` + ForceProvision *bool `xml:"forceProvision"` +} + +func init() { + types.Add("pbm:PbmCapabilitySubProfile", reflect.TypeOf((*PbmCapabilitySubProfile)(nil)).Elem()) +} + +type PbmCapabilitySubProfileConstraints struct { + PbmCapabilityConstraints + + SubProfiles []PbmCapabilitySubProfile `xml:"subProfiles"` +} + +func init() { + types.Add("pbm:PbmCapabilitySubProfileConstraints", reflect.TypeOf((*PbmCapabilitySubProfileConstraints)(nil)).Elem()) +} + +type PbmCapabilityTimeSpan struct { + types.DynamicData + + Value int32 `xml:"value"` + Unit string `xml:"unit"` +} + +func init() { + types.Add("pbm:PbmCapabilityTimeSpan", reflect.TypeOf((*PbmCapabilityTimeSpan)(nil)).Elem()) +} + +type PbmCapabilityTypeInfo struct { + types.DynamicData + + TypeName string `xml:"typeName"` +} + +func init() { + types.Add("pbm:PbmCapabilityTypeInfo", reflect.TypeOf((*PbmCapabilityTypeInfo)(nil)).Elem()) +} + +type PbmCapabilityVendorNamespaceInfo struct { + types.DynamicData + + VendorInfo PbmCapabilitySchemaVendorInfo `xml:"vendorInfo"` + NamespaceInfo PbmCapabilityNamespaceInfo `xml:"namespaceInfo"` +} + +func init() { + types.Add("pbm:PbmCapabilityVendorNamespaceInfo", reflect.TypeOf((*PbmCapabilityVendorNamespaceInfo)(nil)).Elem()) +} + +type PbmCapabilityVendorResourceTypeInfo struct { + types.DynamicData + + ResourceType string `xml:"resourceType"` + VendorNamespaceInfo []PbmCapabilityVendorNamespaceInfo `xml:"vendorNamespaceInfo"` +} + +func init() { + types.Add("pbm:PbmCapabilityVendorResourceTypeInfo", reflect.TypeOf((*PbmCapabilityVendorResourceTypeInfo)(nil)).Elem()) +} + +type PbmCheckCompatibility PbmCheckCompatibilityRequestType + +func init() { + types.Add("pbm:PbmCheckCompatibility", reflect.TypeOf((*PbmCheckCompatibility)(nil)).Elem()) +} + +type PbmCheckCompatibilityRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + HubsToSearch []PbmPlacementHub `xml:"hubsToSearch,omitempty"` + Profile PbmProfileId `xml:"profile"` +} + +func init() { + types.Add("pbm:PbmCheckCompatibilityRequestType", reflect.TypeOf((*PbmCheckCompatibilityRequestType)(nil)).Elem()) +} + +type PbmCheckCompatibilityResponse struct { + Returnval []PbmPlacementCompatibilityResult `xml:"returnval,omitempty"` +} + +type PbmCheckCompatibilityWithSpec PbmCheckCompatibilityWithSpecRequestType + +func init() { + types.Add("pbm:PbmCheckCompatibilityWithSpec", reflect.TypeOf((*PbmCheckCompatibilityWithSpec)(nil)).Elem()) +} + +type PbmCheckCompatibilityWithSpecRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + HubsToSearch []PbmPlacementHub `xml:"hubsToSearch,omitempty"` + ProfileSpec PbmCapabilityProfileCreateSpec `xml:"profileSpec"` +} + +func init() { + types.Add("pbm:PbmCheckCompatibilityWithSpecRequestType", reflect.TypeOf((*PbmCheckCompatibilityWithSpecRequestType)(nil)).Elem()) +} + +type PbmCheckCompatibilityWithSpecResponse struct { + Returnval []PbmPlacementCompatibilityResult `xml:"returnval,omitempty"` +} + +type PbmCheckCompliance PbmCheckComplianceRequestType + +func init() { + types.Add("pbm:PbmCheckCompliance", reflect.TypeOf((*PbmCheckCompliance)(nil)).Elem()) +} + +type PbmCheckComplianceRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Entities []PbmServerObjectRef `xml:"entities"` + Profile *PbmProfileId `xml:"profile,omitempty"` +} + +func init() { + types.Add("pbm:PbmCheckComplianceRequestType", reflect.TypeOf((*PbmCheckComplianceRequestType)(nil)).Elem()) +} + +type PbmCheckComplianceResponse struct { + Returnval []PbmComplianceResult `xml:"returnval,omitempty"` +} + +type PbmCheckRequirements PbmCheckRequirementsRequestType + +func init() { + types.Add("pbm:PbmCheckRequirements", reflect.TypeOf((*PbmCheckRequirements)(nil)).Elem()) +} + +type PbmCheckRequirementsRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + HubsToSearch []PbmPlacementHub `xml:"hubsToSearch,omitempty"` + PlacementSubjectRef *PbmServerObjectRef `xml:"placementSubjectRef,omitempty"` + PlacementSubjectRequirement []BasePbmPlacementRequirement `xml:"placementSubjectRequirement,omitempty,typeattr"` +} + +func init() { + types.Add("pbm:PbmCheckRequirementsRequestType", reflect.TypeOf((*PbmCheckRequirementsRequestType)(nil)).Elem()) +} + +type PbmCheckRequirementsResponse struct { + Returnval []PbmPlacementCompatibilityResult `xml:"returnval,omitempty"` +} + +type PbmCheckRollupCompliance PbmCheckRollupComplianceRequestType + +func init() { + types.Add("pbm:PbmCheckRollupCompliance", reflect.TypeOf((*PbmCheckRollupCompliance)(nil)).Elem()) +} + +type PbmCheckRollupComplianceRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Entity []PbmServerObjectRef `xml:"entity"` +} + +func init() { + types.Add("pbm:PbmCheckRollupComplianceRequestType", reflect.TypeOf((*PbmCheckRollupComplianceRequestType)(nil)).Elem()) +} + +type PbmCheckRollupComplianceResponse struct { + Returnval []PbmRollupComplianceResult `xml:"returnval,omitempty"` +} + +type PbmCompatibilityCheckFault struct { + PbmFault + + Hub PbmPlacementHub `xml:"hub"` +} + +func init() { + types.Add("pbm:PbmCompatibilityCheckFault", reflect.TypeOf((*PbmCompatibilityCheckFault)(nil)).Elem()) +} + +type PbmCompatibilityCheckFaultFault BasePbmCompatibilityCheckFault + +func init() { + types.Add("pbm:PbmCompatibilityCheckFaultFault", reflect.TypeOf((*PbmCompatibilityCheckFaultFault)(nil)).Elem()) +} + +type PbmComplianceOperationalStatus struct { + types.DynamicData + + Healthy *bool `xml:"healthy"` + OperationETA *time.Time `xml:"operationETA"` + OperationProgress int64 `xml:"operationProgress,omitempty"` + Transitional *bool `xml:"transitional"` +} + +func init() { + types.Add("pbm:PbmComplianceOperationalStatus", reflect.TypeOf((*PbmComplianceOperationalStatus)(nil)).Elem()) +} + +type PbmCompliancePolicyStatus struct { + types.DynamicData + + ExpectedValue PbmCapabilityInstance `xml:"expectedValue"` + CurrentValue *PbmCapabilityInstance `xml:"currentValue,omitempty"` +} + +func init() { + types.Add("pbm:PbmCompliancePolicyStatus", reflect.TypeOf((*PbmCompliancePolicyStatus)(nil)).Elem()) +} + +type PbmComplianceResult struct { + types.DynamicData + + CheckTime time.Time `xml:"checkTime"` + Entity PbmServerObjectRef `xml:"entity"` + Profile *PbmProfileId `xml:"profile,omitempty"` + ComplianceTaskStatus string `xml:"complianceTaskStatus,omitempty"` + ComplianceStatus string `xml:"complianceStatus"` + Mismatch bool `xml:"mismatch"` + ViolatedPolicies []PbmCompliancePolicyStatus `xml:"violatedPolicies,omitempty"` + ErrorCause []types.LocalizedMethodFault `xml:"errorCause,omitempty"` + OperationalStatus *PbmComplianceOperationalStatus `xml:"operationalStatus,omitempty"` + Info *PbmExtendedElementDescription `xml:"info,omitempty"` +} + +func init() { + types.Add("pbm:PbmComplianceResult", reflect.TypeOf((*PbmComplianceResult)(nil)).Elem()) +} + +type PbmCreate PbmCreateRequestType + +func init() { + types.Add("pbm:PbmCreate", reflect.TypeOf((*PbmCreate)(nil)).Elem()) +} + +type PbmCreateRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + CreateSpec PbmCapabilityProfileCreateSpec `xml:"createSpec"` +} + +func init() { + types.Add("pbm:PbmCreateRequestType", reflect.TypeOf((*PbmCreateRequestType)(nil)).Elem()) +} + +type PbmCreateResponse struct { + Returnval PbmProfileId `xml:"returnval"` +} + +type PbmDataServiceToPoliciesMap struct { + types.DynamicData + + DataServicePolicy PbmProfileId `xml:"dataServicePolicy"` + ParentStoragePolicies []PbmProfileId `xml:"parentStoragePolicies,omitempty"` + Fault *types.LocalizedMethodFault `xml:"fault,omitempty"` +} + +func init() { + types.Add("pbm:PbmDataServiceToPoliciesMap", reflect.TypeOf((*PbmDataServiceToPoliciesMap)(nil)).Elem()) +} + +type PbmDatastoreSpaceStatistics struct { + types.DynamicData + + ProfileId string `xml:"profileId,omitempty"` + PhysicalTotalInMB int64 `xml:"physicalTotalInMB"` + PhysicalFreeInMB int64 `xml:"physicalFreeInMB"` + PhysicalUsedInMB int64 `xml:"physicalUsedInMB"` + LogicalLimitInMB int64 `xml:"logicalLimitInMB,omitempty"` + LogicalFreeInMB int64 `xml:"logicalFreeInMB"` + LogicalUsedInMB int64 `xml:"logicalUsedInMB"` +} + +func init() { + types.Add("pbm:PbmDatastoreSpaceStatistics", reflect.TypeOf((*PbmDatastoreSpaceStatistics)(nil)).Elem()) +} + +type PbmDefaultCapabilityProfile struct { + PbmCapabilityProfile + + VvolType []string `xml:"vvolType"` + ContainerId string `xml:"containerId"` +} + +func init() { + types.Add("pbm:PbmDefaultCapabilityProfile", reflect.TypeOf((*PbmDefaultCapabilityProfile)(nil)).Elem()) +} + +type PbmDefaultProfileAppliesFault struct { + PbmCompatibilityCheckFault +} + +func init() { + types.Add("pbm:PbmDefaultProfileAppliesFault", reflect.TypeOf((*PbmDefaultProfileAppliesFault)(nil)).Elem()) +} + +type PbmDefaultProfileAppliesFaultFault PbmDefaultProfileAppliesFault + +func init() { + types.Add("pbm:PbmDefaultProfileAppliesFaultFault", reflect.TypeOf((*PbmDefaultProfileAppliesFaultFault)(nil)).Elem()) +} + +type PbmDefaultProfileInfo struct { + types.DynamicData + + Datastores []PbmPlacementHub `xml:"datastores"` + DefaultProfile BasePbmProfile `xml:"defaultProfile,omitempty,typeattr"` +} + +func init() { + types.Add("pbm:PbmDefaultProfileInfo", reflect.TypeOf((*PbmDefaultProfileInfo)(nil)).Elem()) +} + +type PbmDelete PbmDeleteRequestType + +func init() { + types.Add("pbm:PbmDelete", reflect.TypeOf((*PbmDelete)(nil)).Elem()) +} + +type PbmDeleteRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + ProfileId []PbmProfileId `xml:"profileId"` +} + +func init() { + types.Add("pbm:PbmDeleteRequestType", reflect.TypeOf((*PbmDeleteRequestType)(nil)).Elem()) +} + +type PbmDeleteResponse struct { + Returnval []PbmProfileOperationOutcome `xml:"returnval,omitempty"` +} + +type PbmDuplicateName struct { + PbmFault + + Name string `xml:"name"` +} + +func init() { + types.Add("pbm:PbmDuplicateName", reflect.TypeOf((*PbmDuplicateName)(nil)).Elem()) +} + +type PbmDuplicateNameFault PbmDuplicateName + +func init() { + types.Add("pbm:PbmDuplicateNameFault", reflect.TypeOf((*PbmDuplicateNameFault)(nil)).Elem()) +} + +type PbmExtendedElementDescription struct { + types.DynamicData + + Label string `xml:"label"` + Summary string `xml:"summary"` + Key string `xml:"key"` + MessageCatalogKeyPrefix string `xml:"messageCatalogKeyPrefix"` + MessageArg []types.KeyAnyValue `xml:"messageArg,omitempty"` +} + +func init() { + types.Add("pbm:PbmExtendedElementDescription", reflect.TypeOf((*PbmExtendedElementDescription)(nil)).Elem()) +} + +type PbmFault struct { + types.MethodFault +} + +func init() { + types.Add("pbm:PbmFault", reflect.TypeOf((*PbmFault)(nil)).Elem()) +} + +type PbmFaultFault BasePbmFault + +func init() { + types.Add("pbm:PbmFaultFault", reflect.TypeOf((*PbmFaultFault)(nil)).Elem()) +} + +type PbmFaultInvalidLogin struct { + PbmFault +} + +func init() { + types.Add("pbm:PbmFaultInvalidLogin", reflect.TypeOf((*PbmFaultInvalidLogin)(nil)).Elem()) +} + +type PbmFaultInvalidLoginFault PbmFaultInvalidLogin + +func init() { + types.Add("pbm:PbmFaultInvalidLoginFault", reflect.TypeOf((*PbmFaultInvalidLoginFault)(nil)).Elem()) +} + +type PbmFaultNotFound struct { + PbmFault +} + +func init() { + types.Add("pbm:PbmFaultNotFound", reflect.TypeOf((*PbmFaultNotFound)(nil)).Elem()) +} + +type PbmFaultNotFoundFault PbmFaultNotFound + +func init() { + types.Add("pbm:PbmFaultNotFoundFault", reflect.TypeOf((*PbmFaultNotFoundFault)(nil)).Elem()) +} + +type PbmFaultProfileStorageFault struct { + PbmFault +} + +func init() { + types.Add("pbm:PbmFaultProfileStorageFault", reflect.TypeOf((*PbmFaultProfileStorageFault)(nil)).Elem()) +} + +type PbmFaultProfileStorageFaultFault PbmFaultProfileStorageFault + +func init() { + types.Add("pbm:PbmFaultProfileStorageFaultFault", reflect.TypeOf((*PbmFaultProfileStorageFaultFault)(nil)).Elem()) +} + +type PbmFetchCapabilityMetadata PbmFetchCapabilityMetadataRequestType + +func init() { + types.Add("pbm:PbmFetchCapabilityMetadata", reflect.TypeOf((*PbmFetchCapabilityMetadata)(nil)).Elem()) +} + +type PbmFetchCapabilityMetadataRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + ResourceType *PbmProfileResourceType `xml:"resourceType,omitempty"` + VendorUuid string `xml:"vendorUuid,omitempty"` +} + +func init() { + types.Add("pbm:PbmFetchCapabilityMetadataRequestType", reflect.TypeOf((*PbmFetchCapabilityMetadataRequestType)(nil)).Elem()) +} + +type PbmFetchCapabilityMetadataResponse struct { + Returnval []PbmCapabilityMetadataPerCategory `xml:"returnval,omitempty"` +} + +type PbmFetchCapabilitySchema PbmFetchCapabilitySchemaRequestType + +func init() { + types.Add("pbm:PbmFetchCapabilitySchema", reflect.TypeOf((*PbmFetchCapabilitySchema)(nil)).Elem()) +} + +type PbmFetchCapabilitySchemaRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + VendorUuid string `xml:"vendorUuid,omitempty"` + LineOfService []string `xml:"lineOfService,omitempty"` +} + +func init() { + types.Add("pbm:PbmFetchCapabilitySchemaRequestType", reflect.TypeOf((*PbmFetchCapabilitySchemaRequestType)(nil)).Elem()) +} + +type PbmFetchCapabilitySchemaResponse struct { + Returnval []PbmCapabilitySchema `xml:"returnval,omitempty"` +} + +type PbmFetchComplianceResult PbmFetchComplianceResultRequestType + +func init() { + types.Add("pbm:PbmFetchComplianceResult", reflect.TypeOf((*PbmFetchComplianceResult)(nil)).Elem()) +} + +type PbmFetchComplianceResultRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Entities []PbmServerObjectRef `xml:"entities"` + Profile *PbmProfileId `xml:"profile,omitempty"` +} + +func init() { + types.Add("pbm:PbmFetchComplianceResultRequestType", reflect.TypeOf((*PbmFetchComplianceResultRequestType)(nil)).Elem()) +} + +type PbmFetchComplianceResultResponse struct { + Returnval []PbmComplianceResult `xml:"returnval,omitempty"` +} + +type PbmFetchResourceType PbmFetchResourceTypeRequestType + +func init() { + types.Add("pbm:PbmFetchResourceType", reflect.TypeOf((*PbmFetchResourceType)(nil)).Elem()) +} + +type PbmFetchResourceTypeRequestType struct { + This types.ManagedObjectReference `xml:"_this"` +} + +func init() { + types.Add("pbm:PbmFetchResourceTypeRequestType", reflect.TypeOf((*PbmFetchResourceTypeRequestType)(nil)).Elem()) +} + +type PbmFetchResourceTypeResponse struct { + Returnval []PbmProfileResourceType `xml:"returnval,omitempty"` +} + +type PbmFetchRollupComplianceResult PbmFetchRollupComplianceResultRequestType + +func init() { + types.Add("pbm:PbmFetchRollupComplianceResult", reflect.TypeOf((*PbmFetchRollupComplianceResult)(nil)).Elem()) +} + +type PbmFetchRollupComplianceResultRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Entity []PbmServerObjectRef `xml:"entity"` +} + +func init() { + types.Add("pbm:PbmFetchRollupComplianceResultRequestType", reflect.TypeOf((*PbmFetchRollupComplianceResultRequestType)(nil)).Elem()) +} + +type PbmFetchRollupComplianceResultResponse struct { + Returnval []PbmRollupComplianceResult `xml:"returnval,omitempty"` +} + +type PbmFetchVendorInfo PbmFetchVendorInfoRequestType + +func init() { + types.Add("pbm:PbmFetchVendorInfo", reflect.TypeOf((*PbmFetchVendorInfo)(nil)).Elem()) +} + +type PbmFetchVendorInfoRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + ResourceType *PbmProfileResourceType `xml:"resourceType,omitempty"` +} + +func init() { + types.Add("pbm:PbmFetchVendorInfoRequestType", reflect.TypeOf((*PbmFetchVendorInfoRequestType)(nil)).Elem()) +} + +type PbmFetchVendorInfoResponse struct { + Returnval []PbmCapabilityVendorResourceTypeInfo `xml:"returnval,omitempty"` +} + +type PbmFindApplicableDefaultProfile PbmFindApplicableDefaultProfileRequestType + +func init() { + types.Add("pbm:PbmFindApplicableDefaultProfile", reflect.TypeOf((*PbmFindApplicableDefaultProfile)(nil)).Elem()) +} + +type PbmFindApplicableDefaultProfileRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Datastores []PbmPlacementHub `xml:"datastores"` +} + +func init() { + types.Add("pbm:PbmFindApplicableDefaultProfileRequestType", reflect.TypeOf((*PbmFindApplicableDefaultProfileRequestType)(nil)).Elem()) +} + +type PbmFindApplicableDefaultProfileResponse struct { + Returnval []BasePbmProfile `xml:"returnval,omitempty,typeattr"` +} + +type PbmIncompatibleVendorSpecificRuleSet struct { + PbmCapabilityProfilePropertyMismatchFault +} + +func init() { + types.Add("pbm:PbmIncompatibleVendorSpecificRuleSet", reflect.TypeOf((*PbmIncompatibleVendorSpecificRuleSet)(nil)).Elem()) +} + +type PbmIncompatibleVendorSpecificRuleSetFault PbmIncompatibleVendorSpecificRuleSet + +func init() { + types.Add("pbm:PbmIncompatibleVendorSpecificRuleSetFault", reflect.TypeOf((*PbmIncompatibleVendorSpecificRuleSetFault)(nil)).Elem()) +} + +type PbmLegacyHubsNotSupported struct { + PbmFault + + Hubs []PbmPlacementHub `xml:"hubs"` +} + +func init() { + types.Add("pbm:PbmLegacyHubsNotSupported", reflect.TypeOf((*PbmLegacyHubsNotSupported)(nil)).Elem()) +} + +type PbmLegacyHubsNotSupportedFault PbmLegacyHubsNotSupported + +func init() { + types.Add("pbm:PbmLegacyHubsNotSupportedFault", reflect.TypeOf((*PbmLegacyHubsNotSupportedFault)(nil)).Elem()) +} + +type PbmLineOfServiceInfo struct { + types.DynamicData + + LineOfService string `xml:"lineOfService"` + Name PbmExtendedElementDescription `xml:"name"` + Description *PbmExtendedElementDescription `xml:"description,omitempty"` +} + +func init() { + types.Add("pbm:PbmLineOfServiceInfo", reflect.TypeOf((*PbmLineOfServiceInfo)(nil)).Elem()) +} + +type PbmNonExistentHubs struct { + PbmFault + + Hubs []PbmPlacementHub `xml:"hubs"` +} + +func init() { + types.Add("pbm:PbmNonExistentHubs", reflect.TypeOf((*PbmNonExistentHubs)(nil)).Elem()) +} + +type PbmNonExistentHubsFault PbmNonExistentHubs + +func init() { + types.Add("pbm:PbmNonExistentHubsFault", reflect.TypeOf((*PbmNonExistentHubsFault)(nil)).Elem()) +} + +type PbmPersistenceBasedDataServiceInfo struct { + PbmLineOfServiceInfo + + CompatiblePersistenceSchemaNamespace []string `xml:"compatiblePersistenceSchemaNamespace,omitempty"` +} + +func init() { + types.Add("pbm:PbmPersistenceBasedDataServiceInfo", reflect.TypeOf((*PbmPersistenceBasedDataServiceInfo)(nil)).Elem()) +} + +type PbmPlacementCapabilityConstraintsRequirement struct { + PbmPlacementRequirement + + Constraints BasePbmCapabilityConstraints `xml:"constraints,typeattr"` +} + +func init() { + types.Add("pbm:PbmPlacementCapabilityConstraintsRequirement", reflect.TypeOf((*PbmPlacementCapabilityConstraintsRequirement)(nil)).Elem()) +} + +type PbmPlacementCapabilityProfileRequirement struct { + PbmPlacementRequirement + + ProfileId PbmProfileId `xml:"profileId"` +} + +func init() { + types.Add("pbm:PbmPlacementCapabilityProfileRequirement", reflect.TypeOf((*PbmPlacementCapabilityProfileRequirement)(nil)).Elem()) +} + +type PbmPlacementCompatibilityResult struct { + types.DynamicData + + Hub PbmPlacementHub `xml:"hub"` + MatchingResources []BasePbmPlacementMatchingResources `xml:"matchingResources,omitempty,typeattr"` + HowMany int64 `xml:"howMany,omitempty"` + Utilization []PbmPlacementResourceUtilization `xml:"utilization,omitempty"` + Warning []types.LocalizedMethodFault `xml:"warning,omitempty"` + Error []types.LocalizedMethodFault `xml:"error,omitempty"` +} + +func init() { + types.Add("pbm:PbmPlacementCompatibilityResult", reflect.TypeOf((*PbmPlacementCompatibilityResult)(nil)).Elem()) +} + +type PbmPlacementHub struct { + types.DynamicData + + HubType string `xml:"hubType"` + HubId string `xml:"hubId"` +} + +func init() { + types.Add("pbm:PbmPlacementHub", reflect.TypeOf((*PbmPlacementHub)(nil)).Elem()) +} + +type PbmPlacementMatchingReplicationResources struct { + PbmPlacementMatchingResources + + ReplicationGroup []types.ReplicationGroupId `xml:"replicationGroup,omitempty"` +} + +func init() { + types.Add("pbm:PbmPlacementMatchingReplicationResources", reflect.TypeOf((*PbmPlacementMatchingReplicationResources)(nil)).Elem()) +} + +type PbmPlacementMatchingResources struct { + types.DynamicData +} + +func init() { + types.Add("pbm:PbmPlacementMatchingResources", reflect.TypeOf((*PbmPlacementMatchingResources)(nil)).Elem()) +} + +type PbmPlacementRequirement struct { + types.DynamicData +} + +func init() { + types.Add("pbm:PbmPlacementRequirement", reflect.TypeOf((*PbmPlacementRequirement)(nil)).Elem()) +} + +type PbmPlacementResourceUtilization struct { + types.DynamicData + + Name PbmExtendedElementDescription `xml:"name"` + Description PbmExtendedElementDescription `xml:"description"` + AvailableBefore int64 `xml:"availableBefore,omitempty"` + AvailableAfter int64 `xml:"availableAfter,omitempty"` + Total int64 `xml:"total,omitempty"` +} + +func init() { + types.Add("pbm:PbmPlacementResourceUtilization", reflect.TypeOf((*PbmPlacementResourceUtilization)(nil)).Elem()) +} + +type PbmProfile struct { + types.DynamicData + + ProfileId PbmProfileId `xml:"profileId"` + Name string `xml:"name"` + Description string `xml:"description,omitempty"` + CreationTime time.Time `xml:"creationTime"` + CreatedBy string `xml:"createdBy"` + LastUpdatedTime time.Time `xml:"lastUpdatedTime"` + LastUpdatedBy string `xml:"lastUpdatedBy"` +} + +func init() { + types.Add("pbm:PbmProfile", reflect.TypeOf((*PbmProfile)(nil)).Elem()) +} + +type PbmProfileId struct { + types.DynamicData + + UniqueId string `xml:"uniqueId"` +} + +func init() { + types.Add("pbm:PbmProfileId", reflect.TypeOf((*PbmProfileId)(nil)).Elem()) +} + +type PbmProfileOperationOutcome struct { + types.DynamicData + + ProfileId PbmProfileId `xml:"profileId"` + Fault *types.LocalizedMethodFault `xml:"fault,omitempty"` +} + +func init() { + types.Add("pbm:PbmProfileOperationOutcome", reflect.TypeOf((*PbmProfileOperationOutcome)(nil)).Elem()) +} + +type PbmProfileResourceType struct { + types.DynamicData + + ResourceType string `xml:"resourceType"` +} + +func init() { + types.Add("pbm:PbmProfileResourceType", reflect.TypeOf((*PbmProfileResourceType)(nil)).Elem()) +} + +type PbmProfileType struct { + types.DynamicData + + UniqueId string `xml:"uniqueId"` +} + +func init() { + types.Add("pbm:PbmProfileType", reflect.TypeOf((*PbmProfileType)(nil)).Elem()) +} + +type PbmPropertyMismatchFault struct { + PbmCompatibilityCheckFault + + CapabilityInstanceId PbmCapabilityMetadataUniqueId `xml:"capabilityInstanceId"` + RequirementPropertyInstance PbmCapabilityPropertyInstance `xml:"requirementPropertyInstance"` +} + +func init() { + types.Add("pbm:PbmPropertyMismatchFault", reflect.TypeOf((*PbmPropertyMismatchFault)(nil)).Elem()) +} + +type PbmPropertyMismatchFaultFault BasePbmPropertyMismatchFault + +func init() { + types.Add("pbm:PbmPropertyMismatchFaultFault", reflect.TypeOf((*PbmPropertyMismatchFaultFault)(nil)).Elem()) +} + +type PbmQueryAssociatedEntities PbmQueryAssociatedEntitiesRequestType + +func init() { + types.Add("pbm:PbmQueryAssociatedEntities", reflect.TypeOf((*PbmQueryAssociatedEntities)(nil)).Elem()) +} + +type PbmQueryAssociatedEntitiesRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Profiles []PbmProfileId `xml:"profiles,omitempty"` +} + +func init() { + types.Add("pbm:PbmQueryAssociatedEntitiesRequestType", reflect.TypeOf((*PbmQueryAssociatedEntitiesRequestType)(nil)).Elem()) +} + +type PbmQueryAssociatedEntitiesResponse struct { + Returnval []PbmQueryProfileResult `xml:"returnval,omitempty"` +} + +type PbmQueryAssociatedEntity PbmQueryAssociatedEntityRequestType + +func init() { + types.Add("pbm:PbmQueryAssociatedEntity", reflect.TypeOf((*PbmQueryAssociatedEntity)(nil)).Elem()) +} + +type PbmQueryAssociatedEntityRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Profile PbmProfileId `xml:"profile"` + EntityType string `xml:"entityType,omitempty"` +} + +func init() { + types.Add("pbm:PbmQueryAssociatedEntityRequestType", reflect.TypeOf((*PbmQueryAssociatedEntityRequestType)(nil)).Elem()) +} + +type PbmQueryAssociatedEntityResponse struct { + Returnval []PbmServerObjectRef `xml:"returnval,omitempty"` +} + +type PbmQueryAssociatedProfile PbmQueryAssociatedProfileRequestType + +func init() { + types.Add("pbm:PbmQueryAssociatedProfile", reflect.TypeOf((*PbmQueryAssociatedProfile)(nil)).Elem()) +} + +type PbmQueryAssociatedProfileRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Entity PbmServerObjectRef `xml:"entity"` +} + +func init() { + types.Add("pbm:PbmQueryAssociatedProfileRequestType", reflect.TypeOf((*PbmQueryAssociatedProfileRequestType)(nil)).Elem()) +} + +type PbmQueryAssociatedProfileResponse struct { + Returnval []PbmProfileId `xml:"returnval,omitempty"` +} + +type PbmQueryAssociatedProfiles PbmQueryAssociatedProfilesRequestType + +func init() { + types.Add("pbm:PbmQueryAssociatedProfiles", reflect.TypeOf((*PbmQueryAssociatedProfiles)(nil)).Elem()) +} + +type PbmQueryAssociatedProfilesRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Entities []PbmServerObjectRef `xml:"entities"` +} + +func init() { + types.Add("pbm:PbmQueryAssociatedProfilesRequestType", reflect.TypeOf((*PbmQueryAssociatedProfilesRequestType)(nil)).Elem()) +} + +type PbmQueryAssociatedProfilesResponse struct { + Returnval []PbmQueryProfileResult `xml:"returnval,omitempty"` +} + +type PbmQueryByRollupComplianceStatus PbmQueryByRollupComplianceStatusRequestType + +func init() { + types.Add("pbm:PbmQueryByRollupComplianceStatus", reflect.TypeOf((*PbmQueryByRollupComplianceStatus)(nil)).Elem()) +} + +type PbmQueryByRollupComplianceStatusRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Status string `xml:"status"` +} + +func init() { + types.Add("pbm:PbmQueryByRollupComplianceStatusRequestType", reflect.TypeOf((*PbmQueryByRollupComplianceStatusRequestType)(nil)).Elem()) +} + +type PbmQueryByRollupComplianceStatusResponse struct { + Returnval []PbmServerObjectRef `xml:"returnval,omitempty"` +} + +type PbmQueryDefaultRequirementProfile PbmQueryDefaultRequirementProfileRequestType + +func init() { + types.Add("pbm:PbmQueryDefaultRequirementProfile", reflect.TypeOf((*PbmQueryDefaultRequirementProfile)(nil)).Elem()) +} + +type PbmQueryDefaultRequirementProfileRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Hub PbmPlacementHub `xml:"hub"` +} + +func init() { + types.Add("pbm:PbmQueryDefaultRequirementProfileRequestType", reflect.TypeOf((*PbmQueryDefaultRequirementProfileRequestType)(nil)).Elem()) +} + +type PbmQueryDefaultRequirementProfileResponse struct { + Returnval *PbmProfileId `xml:"returnval,omitempty"` +} + +type PbmQueryDefaultRequirementProfiles PbmQueryDefaultRequirementProfilesRequestType + +func init() { + types.Add("pbm:PbmQueryDefaultRequirementProfiles", reflect.TypeOf((*PbmQueryDefaultRequirementProfiles)(nil)).Elem()) +} + +type PbmQueryDefaultRequirementProfilesRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Datastores []PbmPlacementHub `xml:"datastores"` +} + +func init() { + types.Add("pbm:PbmQueryDefaultRequirementProfilesRequestType", reflect.TypeOf((*PbmQueryDefaultRequirementProfilesRequestType)(nil)).Elem()) +} + +type PbmQueryDefaultRequirementProfilesResponse struct { + Returnval []PbmDefaultProfileInfo `xml:"returnval"` +} + +type PbmQueryMatchingHub PbmQueryMatchingHubRequestType + +func init() { + types.Add("pbm:PbmQueryMatchingHub", reflect.TypeOf((*PbmQueryMatchingHub)(nil)).Elem()) +} + +type PbmQueryMatchingHubRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + HubsToSearch []PbmPlacementHub `xml:"hubsToSearch,omitempty"` + Profile PbmProfileId `xml:"profile"` +} + +func init() { + types.Add("pbm:PbmQueryMatchingHubRequestType", reflect.TypeOf((*PbmQueryMatchingHubRequestType)(nil)).Elem()) +} + +type PbmQueryMatchingHubResponse struct { + Returnval []PbmPlacementHub `xml:"returnval,omitempty"` +} + +type PbmQueryMatchingHubWithSpec PbmQueryMatchingHubWithSpecRequestType + +func init() { + types.Add("pbm:PbmQueryMatchingHubWithSpec", reflect.TypeOf((*PbmQueryMatchingHubWithSpec)(nil)).Elem()) +} + +type PbmQueryMatchingHubWithSpecRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + HubsToSearch []PbmPlacementHub `xml:"hubsToSearch,omitempty"` + CreateSpec PbmCapabilityProfileCreateSpec `xml:"createSpec"` +} + +func init() { + types.Add("pbm:PbmQueryMatchingHubWithSpecRequestType", reflect.TypeOf((*PbmQueryMatchingHubWithSpecRequestType)(nil)).Elem()) +} + +type PbmQueryMatchingHubWithSpecResponse struct { + Returnval []PbmPlacementHub `xml:"returnval,omitempty"` +} + +type PbmQueryProfile PbmQueryProfileRequestType + +func init() { + types.Add("pbm:PbmQueryProfile", reflect.TypeOf((*PbmQueryProfile)(nil)).Elem()) +} + +type PbmQueryProfileRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + ResourceType PbmProfileResourceType `xml:"resourceType"` + ProfileCategory string `xml:"profileCategory,omitempty"` +} + +func init() { + types.Add("pbm:PbmQueryProfileRequestType", reflect.TypeOf((*PbmQueryProfileRequestType)(nil)).Elem()) +} + +type PbmQueryProfileResponse struct { + Returnval []PbmProfileId `xml:"returnval,omitempty"` +} + +type PbmQueryProfileResult struct { + types.DynamicData + + Object PbmServerObjectRef `xml:"object"` + ProfileId []PbmProfileId `xml:"profileId,omitempty"` + Fault *types.LocalizedMethodFault `xml:"fault,omitempty"` +} + +func init() { + types.Add("pbm:PbmQueryProfileResult", reflect.TypeOf((*PbmQueryProfileResult)(nil)).Elem()) +} + +type PbmQueryReplicationGroupResult struct { + types.DynamicData + + Object PbmServerObjectRef `xml:"object"` + ReplicationGroupId *types.ReplicationGroupId `xml:"replicationGroupId,omitempty"` + Fault *types.LocalizedMethodFault `xml:"fault,omitempty"` +} + +func init() { + types.Add("pbm:PbmQueryReplicationGroupResult", reflect.TypeOf((*PbmQueryReplicationGroupResult)(nil)).Elem()) +} + +type PbmQueryReplicationGroups PbmQueryReplicationGroupsRequestType + +func init() { + types.Add("pbm:PbmQueryReplicationGroups", reflect.TypeOf((*PbmQueryReplicationGroups)(nil)).Elem()) +} + +type PbmQueryReplicationGroupsRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Entities []PbmServerObjectRef `xml:"entities,omitempty"` +} + +func init() { + types.Add("pbm:PbmQueryReplicationGroupsRequestType", reflect.TypeOf((*PbmQueryReplicationGroupsRequestType)(nil)).Elem()) +} + +type PbmQueryReplicationGroupsResponse struct { + Returnval []PbmQueryReplicationGroupResult `xml:"returnval,omitempty"` +} + +type PbmQuerySpaceStatsForStorageContainer PbmQuerySpaceStatsForStorageContainerRequestType + +func init() { + types.Add("pbm:PbmQuerySpaceStatsForStorageContainer", reflect.TypeOf((*PbmQuerySpaceStatsForStorageContainer)(nil)).Elem()) +} + +type PbmQuerySpaceStatsForStorageContainerRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Datastore PbmServerObjectRef `xml:"datastore"` + CapabilityProfileId []PbmProfileId `xml:"capabilityProfileId,omitempty"` +} + +func init() { + types.Add("pbm:PbmQuerySpaceStatsForStorageContainerRequestType", reflect.TypeOf((*PbmQuerySpaceStatsForStorageContainerRequestType)(nil)).Elem()) +} + +type PbmQuerySpaceStatsForStorageContainerResponse struct { + Returnval []PbmDatastoreSpaceStatistics `xml:"returnval,omitempty"` +} + +type PbmResetDefaultRequirementProfile PbmResetDefaultRequirementProfileRequestType + +func init() { + types.Add("pbm:PbmResetDefaultRequirementProfile", reflect.TypeOf((*PbmResetDefaultRequirementProfile)(nil)).Elem()) +} + +type PbmResetDefaultRequirementProfileRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + Profile *PbmProfileId `xml:"profile,omitempty"` +} + +func init() { + types.Add("pbm:PbmResetDefaultRequirementProfileRequestType", reflect.TypeOf((*PbmResetDefaultRequirementProfileRequestType)(nil)).Elem()) +} + +type PbmResetDefaultRequirementProfileResponse struct { +} + +type PbmResetVSanDefaultProfile PbmResetVSanDefaultProfileRequestType + +func init() { + types.Add("pbm:PbmResetVSanDefaultProfile", reflect.TypeOf((*PbmResetVSanDefaultProfile)(nil)).Elem()) +} + +type PbmResetVSanDefaultProfileRequestType struct { + This types.ManagedObjectReference `xml:"_this"` +} + +func init() { + types.Add("pbm:PbmResetVSanDefaultProfileRequestType", reflect.TypeOf((*PbmResetVSanDefaultProfileRequestType)(nil)).Elem()) +} + +type PbmResetVSanDefaultProfileResponse struct { +} + +type PbmResourceInUse struct { + PbmFault + + Type string `xml:"type,omitempty"` + Name string `xml:"name,omitempty"` +} + +func init() { + types.Add("pbm:PbmResourceInUse", reflect.TypeOf((*PbmResourceInUse)(nil)).Elem()) +} + +type PbmResourceInUseFault PbmResourceInUse + +func init() { + types.Add("pbm:PbmResourceInUseFault", reflect.TypeOf((*PbmResourceInUseFault)(nil)).Elem()) +} + +type PbmRetrieveContent PbmRetrieveContentRequestType + +func init() { + types.Add("pbm:PbmRetrieveContent", reflect.TypeOf((*PbmRetrieveContent)(nil)).Elem()) +} + +type PbmRetrieveContentRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + ProfileIds []PbmProfileId `xml:"profileIds"` +} + +func init() { + types.Add("pbm:PbmRetrieveContentRequestType", reflect.TypeOf((*PbmRetrieveContentRequestType)(nil)).Elem()) +} + +type PbmRetrieveContentResponse struct { + Returnval []BasePbmProfile `xml:"returnval,typeattr"` +} + +type PbmRetrieveServiceContent PbmRetrieveServiceContentRequestType + +func init() { + types.Add("pbm:PbmRetrieveServiceContent", reflect.TypeOf((*PbmRetrieveServiceContent)(nil)).Elem()) +} + +type PbmRetrieveServiceContentRequestType struct { + This types.ManagedObjectReference `xml:"_this"` +} + +func init() { + types.Add("pbm:PbmRetrieveServiceContentRequestType", reflect.TypeOf((*PbmRetrieveServiceContentRequestType)(nil)).Elem()) +} + +type PbmRetrieveServiceContentResponse struct { + Returnval PbmServiceInstanceContent `xml:"returnval"` +} + +type PbmRollupComplianceResult struct { + types.DynamicData + + OldestCheckTime time.Time `xml:"oldestCheckTime"` + Entity PbmServerObjectRef `xml:"entity"` + OverallComplianceStatus string `xml:"overallComplianceStatus"` + OverallComplianceTaskStatus string `xml:"overallComplianceTaskStatus,omitempty"` + Result []PbmComplianceResult `xml:"result,omitempty"` + ErrorCause []types.LocalizedMethodFault `xml:"errorCause,omitempty"` + ProfileMismatch bool `xml:"profileMismatch"` +} + +func init() { + types.Add("pbm:PbmRollupComplianceResult", reflect.TypeOf((*PbmRollupComplianceResult)(nil)).Elem()) +} + +type PbmServerObjectRef struct { + types.DynamicData + + ObjectType string `xml:"objectType"` + Key string `xml:"key"` + ServerUuid string `xml:"serverUuid,omitempty"` +} + +func init() { + types.Add("pbm:PbmServerObjectRef", reflect.TypeOf((*PbmServerObjectRef)(nil)).Elem()) +} + +type PbmServiceInstanceContent struct { + types.DynamicData + + AboutInfo PbmAboutInfo `xml:"aboutInfo"` + SessionManager types.ManagedObjectReference `xml:"sessionManager"` + CapabilityMetadataManager types.ManagedObjectReference `xml:"capabilityMetadataManager"` + ProfileManager types.ManagedObjectReference `xml:"profileManager"` + ComplianceManager types.ManagedObjectReference `xml:"complianceManager"` + PlacementSolver types.ManagedObjectReference `xml:"placementSolver"` + ReplicationManager *types.ManagedObjectReference `xml:"replicationManager,omitempty"` +} + +func init() { + types.Add("pbm:PbmServiceInstanceContent", reflect.TypeOf((*PbmServiceInstanceContent)(nil)).Elem()) +} + +type PbmUpdate PbmUpdateRequestType + +func init() { + types.Add("pbm:PbmUpdate", reflect.TypeOf((*PbmUpdate)(nil)).Elem()) +} + +type PbmUpdateRequestType struct { + This types.ManagedObjectReference `xml:"_this"` + ProfileId PbmProfileId `xml:"profileId"` + UpdateSpec PbmCapabilityProfileUpdateSpec `xml:"updateSpec"` +} + +func init() { + types.Add("pbm:PbmUpdateRequestType", reflect.TypeOf((*PbmUpdateRequestType)(nil)).Elem()) +} + +type PbmUpdateResponse struct { +} + +type PbmVaioDataServiceInfo struct { + PbmLineOfServiceInfo +} + +func init() { + types.Add("pbm:PbmVaioDataServiceInfo", reflect.TypeOf((*PbmVaioDataServiceInfo)(nil)).Elem()) +} diff --git a/vendor/github.com/vmware/govmomi/property/BUILD b/vendor/github.com/vmware/govmomi/property/BUILD index 30c0b55954557..ba6f040c4acbb 100644 --- a/vendor/github.com/vmware/govmomi/property/BUILD +++ b/vendor/github.com/vmware/govmomi/property/BUILD @@ -11,6 +11,7 @@ go_library( name = "go_default_library", srcs = [ "collector.go", + "filter.go", "wait.go", ], tags = ["automanaged"], diff --git a/vendor/github.com/vmware/govmomi/property/collector.go b/vendor/github.com/vmware/govmomi/property/collector.go index 32a0e409e2088..e2059d923f91b 100644 --- a/vendor/github.com/vmware/govmomi/property/collector.go +++ b/vendor/github.com/vmware/govmomi/property/collector.go @@ -164,9 +164,36 @@ func (p *Collector) Retrieve(ctx context.Context, objs []types.ManagedObjectRefe return err } + if d, ok := dst.(*[]types.ObjectContent); ok { + *d = res.Returnval + return nil + } + return mo.LoadRetrievePropertiesResponse(res, dst) } +// RetrieveWithFilter populates dst as Retrieve does, but only for entities matching the given filter. +func (p *Collector) RetrieveWithFilter(ctx context.Context, objs []types.ManagedObjectReference, ps []string, dst interface{}, filter Filter) error { + if len(filter) == 0 { + return p.Retrieve(ctx, objs, ps, dst) + } + + var content []types.ObjectContent + + err := p.Retrieve(ctx, objs, filter.Keys(), &content) + if err != nil { + return err + } + + objs = filter.MatchObjectContent(content) + + if len(objs) == 0 { + return nil + } + + return p.Retrieve(ctx, objs, ps, dst) +} + // RetrieveOne calls Retrieve with a single managed object reference. func (p *Collector) RetrieveOne(ctx context.Context, obj types.ManagedObjectReference, ps []string, dst interface{}) error { var objs = []types.ManagedObjectReference{obj} diff --git a/vendor/github.com/vmware/govmomi/property/filter.go b/vendor/github.com/vmware/govmomi/property/filter.go new file mode 100644 index 0000000000000..a6fa1de9ffd6f --- /dev/null +++ b/vendor/github.com/vmware/govmomi/property/filter.go @@ -0,0 +1,135 @@ +/* +Copyright (c) 2017 VMware, Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package property + +import ( + "fmt" + "path/filepath" + "reflect" + "strconv" + "strings" + + "github.com/vmware/govmomi/vim25/types" +) + +// Filter provides methods for matching against types.DynamicProperty +type Filter map[string]types.AnyType + +// Keys returns the Filter map keys as a []string +func (f Filter) Keys() []string { + keys := make([]string, 0, len(f)) + + for key := range f { + keys = append(keys, key) + } + + return keys +} + +// MatchProperty returns true if a Filter entry matches the given prop. +func (f Filter) MatchProperty(prop types.DynamicProperty) bool { + match, ok := f[prop.Name] + if !ok { + return false + } + + if match == prop.Val { + return true + } + + ptype := reflect.TypeOf(prop.Val) + + if strings.HasPrefix(ptype.Name(), "ArrayOf") { + pval := reflect.ValueOf(prop.Val).Field(0) + + for i := 0; i < pval.Len(); i++ { + prop.Val = pval.Index(i).Interface() + + if f.MatchProperty(prop) { + return true + } + } + + return false + } + + if reflect.TypeOf(match) != ptype { + s, ok := match.(string) + if !ok { + return false + } + + // convert if we can + switch prop.Val.(type) { + case bool: + match, _ = strconv.ParseBool(s) + case int16: + x, _ := strconv.ParseInt(s, 10, 16) + match = int16(x) + case int32: + x, _ := strconv.ParseInt(s, 10, 32) + match = int32(x) + case int64: + match, _ = strconv.ParseInt(s, 10, 64) + case float32: + x, _ := strconv.ParseFloat(s, 32) + match = float32(x) + case float64: + match, _ = strconv.ParseFloat(s, 64) + case fmt.Stringer: + prop.Val = prop.Val.(fmt.Stringer).String() + default: + if ptype.Kind() != reflect.String { + return false + } + // An enum type we can convert to a string type + prop.Val = reflect.ValueOf(prop.Val).String() + } + } + + switch pval := prop.Val.(type) { + case string: + m, _ := filepath.Match(match.(string), pval) + return m + default: + return reflect.DeepEqual(match, pval) + } +} + +// MatchPropertyList returns true if all given props match the Filter. +func (f Filter) MatchPropertyList(props []types.DynamicProperty) bool { + for _, p := range props { + if !f.MatchProperty(p) { + return false + } + } + + return true +} + +// MatchObjectContent returns a list of ObjectContent.Obj where the ObjectContent.PropSet matches the Filter. +func (f Filter) MatchObjectContent(objects []types.ObjectContent) []types.ManagedObjectReference { + var refs []types.ManagedObjectReference + + for _, o := range objects { + if f.MatchPropertyList(o.PropSet) { + refs = append(refs, o.Obj) + } + } + + return refs +} diff --git a/vendor/github.com/vmware/govmomi/task/wait.go b/vendor/github.com/vmware/govmomi/task/wait.go index 379093ee7682f..19fee53846368 100644 --- a/vendor/github.com/vmware/govmomi/task/wait.go +++ b/vendor/github.com/vmware/govmomi/task/wait.go @@ -68,6 +68,11 @@ func (t *taskCallback) fn(pc []types.PropertyChange) bool { t.info = &ti } + // t.info could be nil if pc can't satify the rules above + if t.info == nil { + return false + } + pr := taskProgress{t.info} // Store copy of error, so Wait() can return it as well. diff --git a/vendor/github.com/vmware/govmomi/vim25/methods/methods.go b/vendor/github.com/vmware/govmomi/vim25/methods/methods.go index 79c49435a403e..0895a81c6005d 100644 --- a/vendor/github.com/vmware/govmomi/vim25/methods/methods.go +++ b/vendor/github.com/vmware/govmomi/vim25/methods/methods.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2014-2016 VMware, Inc. All Rights Reserved. +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/vmware/govmomi/vim25/mo/ancestors.go b/vendor/github.com/vmware/govmomi/vim25/mo/ancestors.go index 86a3a69f7ca40..d3da5b1847c9d 100644 --- a/vendor/github.com/vmware/govmomi/vim25/mo/ancestors.go +++ b/vendor/github.com/vmware/govmomi/vim25/mo/ancestors.go @@ -104,6 +104,8 @@ func Ancestors(ctx context.Context, rt soap.RoundTripper, pc, obj types.ManagedO me.Name = x.Name case DistributedVirtualPortgroup: me.Name = x.Name + case OpaqueNetwork: + me.Name = x.Name default: // ManagedEntity always has a Name, if we hit this point we missed a case above. panic(fmt.Sprintf("%#v Name is empty", me.Reference())) diff --git a/vendor/github.com/vmware/govmomi/vim25/mo/mo.go b/vendor/github.com/vmware/govmomi/vim25/mo/mo.go index 0764eb49fb889..ede6e44d7d934 100644 --- a/vendor/github.com/vmware/govmomi/vim25/mo/mo.go +++ b/vendor/github.com/vmware/govmomi/vim25/mo/mo.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2014-2016 VMware, Inc. All Rights Reserved. +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -150,6 +150,30 @@ func init() { t["ContainerView"] = reflect.TypeOf((*ContainerView)(nil)).Elem() } +type CryptoManager struct { + Self types.ManagedObjectReference + + Enabled bool `mo:"enabled"` +} + +func (m CryptoManager) Reference() types.ManagedObjectReference { + return m.Self +} + +func init() { + t["CryptoManager"] = reflect.TypeOf((*CryptoManager)(nil)).Elem() +} + +type CryptoManagerKmip struct { + CryptoManager + + KmipServers []types.KmipClusterInfo `mo:"kmipServers"` +} + +func init() { + t["CryptoManagerKmip"] = reflect.TypeOf((*CryptoManagerKmip)(nil)).Elem() +} + type CustomFieldsManager struct { Self types.ManagedObjectReference @@ -356,6 +380,34 @@ func init() { t["ExtensionManager"] = reflect.TypeOf((*ExtensionManager)(nil)).Elem() } +type FailoverClusterConfigurator struct { + Self types.ManagedObjectReference + + DisabledConfigureMethod []string `mo:"disabledConfigureMethod"` +} + +func (m FailoverClusterConfigurator) Reference() types.ManagedObjectReference { + return m.Self +} + +func init() { + t["FailoverClusterConfigurator"] = reflect.TypeOf((*FailoverClusterConfigurator)(nil)).Elem() +} + +type FailoverClusterManager struct { + Self types.ManagedObjectReference + + DisabledClusterMethod []string `mo:"disabledClusterMethod"` +} + +func (m FailoverClusterManager) Reference() types.ManagedObjectReference { + return m.Self +} + +func init() { + t["FailoverClusterManager"] = reflect.TypeOf((*FailoverClusterManager)(nil)).Elem() +} + type FileManager struct { Self types.ManagedObjectReference } @@ -461,6 +513,18 @@ func init() { t["GuestWindowsRegistryManager"] = reflect.TypeOf((*GuestWindowsRegistryManager)(nil)).Elem() } +type HealthUpdateManager struct { + Self types.ManagedObjectReference +} + +func (m HealthUpdateManager) Reference() types.ManagedObjectReference { + return m.Self +} + +func init() { + t["HealthUpdateManager"] = reflect.TypeOf((*HealthUpdateManager)(nil)).Elem() +} + type HistoryCollector struct { Self types.ManagedObjectReference @@ -695,8 +759,9 @@ func init() { type HostGraphicsManager struct { ExtensibleManagedObject - GraphicsInfo []types.HostGraphicsInfo `mo:"graphicsInfo"` - SharedPassthruGpuTypes []string `mo:"sharedPassthruGpuTypes"` + GraphicsInfo []types.HostGraphicsInfo `mo:"graphicsInfo"` + GraphicsConfig *types.HostGraphicsConfig `mo:"graphicsConfig"` + SharedPassthruGpuTypes []string `mo:"sharedPassthruGpuTypes"` } func init() { @@ -803,7 +868,8 @@ func init() { type HostPciPassthruSystem struct { ExtensibleManagedObject - PciPassthruInfo []types.BaseHostPciPassthruInfo `mo:"pciPassthruInfo"` + PciPassthruInfo []types.BaseHostPciPassthruInfo `mo:"pciPassthruInfo"` + SriovDevicePoolInfo []types.BaseHostSriovDevicePoolInfo `mo:"sriovDevicePoolInfo"` } func init() { @@ -868,6 +934,18 @@ func init() { t["HostSnmpSystem"] = reflect.TypeOf((*HostSnmpSystem)(nil)).Elem() } +type HostSpecificationManager struct { + Self types.ManagedObjectReference +} + +func (m HostSpecificationManager) Reference() types.ManagedObjectReference { + return m.Self +} + +func init() { + t["HostSpecificationManager"] = reflect.TypeOf((*HostSpecificationManager)(nil)).Elem() +} + type HostStorageSystem struct { ExtensibleManagedObject @@ -931,6 +1009,14 @@ func init() { t["HostVMotionSystem"] = reflect.TypeOf((*HostVMotionSystem)(nil)).Elem() } +type HostVStorageObjectManager struct { + VStorageObjectManagerBase +} + +func init() { + t["HostVStorageObjectManager"] = reflect.TypeOf((*HostVStorageObjectManager)(nil)).Elem() +} + type HostVirtualNicManager struct { ExtensibleManagedObject @@ -984,18 +1070,6 @@ func init() { t["HttpNfcLease"] = reflect.TypeOf((*HttpNfcLease)(nil)).Elem() } -type InternalDynamicTypeManager struct { - Self types.ManagedObjectReference -} - -func (m InternalDynamicTypeManager) Reference() types.ManagedObjectReference { - return m.Self -} - -func init() { - t["InternalDynamicTypeManager"] = reflect.TypeOf((*InternalDynamicTypeManager)(nil)).Elem() -} - type InventoryView struct { ManagedObjectView } @@ -1163,6 +1237,9 @@ func init() { type OpaqueNetwork struct { Network + + Capability *types.OpaqueNetworkCapability `mo:"capability"` + ExtraConfig []types.BaseOptionValue `mo:"extraConfig"` } func init() { @@ -1302,18 +1379,6 @@ func init() { t["PropertyFilter"] = reflect.TypeOf((*PropertyFilter)(nil)).Elem() } -type ReflectManagedMethodExecuter struct { - Self types.ManagedObjectReference -} - -func (m ReflectManagedMethodExecuter) Reference() types.ManagedObjectReference { - return m.Self -} - -func init() { - t["ReflectManagedMethodExecuter"] = reflect.TypeOf((*ReflectManagedMethodExecuter)(nil)).Elem() -} - type ResourcePlanningManager struct { Self types.ManagedObjectReference } @@ -1520,6 +1585,26 @@ func init() { t["UserDirectory"] = reflect.TypeOf((*UserDirectory)(nil)).Elem() } +type VStorageObjectManagerBase struct { + Self types.ManagedObjectReference +} + +func (m VStorageObjectManagerBase) Reference() types.ManagedObjectReference { + return m.Self +} + +func init() { + t["VStorageObjectManagerBase"] = reflect.TypeOf((*VStorageObjectManagerBase)(nil)).Elem() +} + +type VcenterVStorageObjectManager struct { + VStorageObjectManagerBase +} + +func init() { + t["VcenterVStorageObjectManager"] = reflect.TypeOf((*VcenterVStorageObjectManager)(nil)).Elem() +} + type View struct { Self types.ManagedObjectReference } diff --git a/vendor/github.com/vmware/govmomi/vim25/soap/client.go b/vendor/github.com/vmware/govmomi/vim25/soap/client.go index e89ffc81076d6..9ac3cc4d6d90a 100644 --- a/vendor/github.com/vmware/govmomi/vim25/soap/client.go +++ b/vendor/github.com/vmware/govmomi/vim25/soap/client.go @@ -58,6 +58,10 @@ const ( DefaultMinVimVersion = "5.5" ) +type header struct { + Cookie string `xml:"vcSessionCookie,omitempty"` +} + type Client struct { http.Client @@ -73,6 +77,8 @@ type Client struct { Namespace string // Vim namespace Version string // Vim version UserAgent string + + header *header } var schemeMatch = regexp.MustCompile(`^\w+://`) @@ -147,6 +153,32 @@ func NewClient(u *url.URL, insecure bool) *Client { return &c } +// NewServiceClient creates a NewClient with the given URL.Path and namespace. +func (c *Client) NewServiceClient(path string, namespace string) *Client { + u := c.URL() + u.Path = path + + client := NewClient(u, c.k) + + client.Namespace = namespace + + // Copy the cookies + client.Client.Jar.SetCookies(u, c.Client.Jar.Cookies(u)) + + // Set SOAP Header cookie + for _, cookie := range client.Jar.Cookies(u) { + if cookie.Name == "vmware_soap_session" { + client.header = &header{ + Cookie: cookie.Value, + } + + break + } + } + + return client +} + // SetRootCAs defines the set of root certificate authorities // that clients use when verifying server certificates. // By default TLS uses the host's root CA set. @@ -401,6 +433,8 @@ func (c *Client) RoundTrip(ctx context.Context, reqBody, resBody HasFault) error reqEnv := Envelope{Body: reqBody} resEnv := Envelope{Body: resBody} + reqEnv.Header = c.header + // Create debugging context for this round trip d := c.d.newRoundTrip() if d.enabled() { diff --git a/vendor/github.com/vmware/govmomi/vim25/soap/error.go b/vendor/github.com/vmware/govmomi/vim25/soap/error.go index 0408e7bf0d165..d89208522a9b9 100644 --- a/vendor/github.com/vmware/govmomi/vim25/soap/error.go +++ b/vendor/github.com/vmware/govmomi/vim25/soap/error.go @@ -36,7 +36,13 @@ type soapFaultError struct { } func (s soapFaultError) Error() string { - return fmt.Sprintf("%s: %s", s.fault.Code, s.fault.String) + msg := s.fault.String + + if msg == "" { + msg = reflect.TypeOf(s.fault.Detail.Fault).Name() + } + + return fmt.Sprintf("%s: %s", s.fault.Code, msg) } type vimFaultError struct { diff --git a/vendor/github.com/vmware/govmomi/vim25/soap/soap.go b/vendor/github.com/vmware/govmomi/vim25/soap/soap.go index ea35e77ad7bdd..a8baa0122ae77 100644 --- a/vendor/github.com/vmware/govmomi/vim25/soap/soap.go +++ b/vendor/github.com/vmware/govmomi/vim25/soap/soap.go @@ -22,15 +22,11 @@ import ( ) type Envelope struct { - XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` - Header *Header `xml:",omitempty"` + XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` + Header interface{} `xml:",omitempty"` Body interface{} } -type Header struct { - XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Header"` -} - type Fault struct { XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault"` Code string `xml:"faultcode"` diff --git a/vendor/github.com/vmware/govmomi/vim25/types/enum.go b/vendor/github.com/vmware/govmomi/vim25/types/enum.go index 1db935ef7a43e..02f7f3cb59bca 100644 --- a/vendor/github.com/vmware/govmomi/vim25/types/enum.go +++ b/vendor/github.com/vmware/govmomi/vim25/types/enum.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2014-2016 VMware, Inc. All Rights Reserved. +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/vmware/govmomi/vim25/types/helpers.go b/vendor/github.com/vmware/govmomi/vim25/types/helpers.go index 7b72358b25d4f..2364ed4213cda 100644 --- a/vendor/github.com/vmware/govmomi/vim25/types/helpers.go +++ b/vendor/github.com/vmware/govmomi/vim25/types/helpers.go @@ -46,3 +46,7 @@ func (r *ManagedObjectReference) FromString(o string) bool { return true } + +func (c *PerfCounterInfo) Name() string { + return c.GroupInfo.GetElementDescription().Key + "." + c.NameInfo.GetElementDescription().Key + "." + string(c.RollupType) +} diff --git a/vendor/github.com/vmware/govmomi/vim25/types/if.go b/vendor/github.com/vmware/govmomi/vim25/types/if.go index 5ae275c6da2e4..dbf594cfc0a5a 100644 --- a/vendor/github.com/vmware/govmomi/vim25/types/if.go +++ b/vendor/github.com/vmware/govmomi/vim25/types/if.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2014-2016 VMware, Inc. All Rights Reserved. +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/vmware/govmomi/vim25/types/registry.go b/vendor/github.com/vmware/govmomi/vim25/types/registry.go index 8f238088dbbe7..ff7c302d3185a 100644 --- a/vendor/github.com/vmware/govmomi/vim25/types/registry.go +++ b/vendor/github.com/vmware/govmomi/vim25/types/registry.go @@ -16,15 +16,28 @@ limitations under the License. package types -import "reflect" +import ( + "reflect" + "strings" +) var t = map[string]reflect.Type{} +func Add(name string, kind reflect.Type) { + t[name] = kind +} + type Func func(string) (reflect.Type, bool) func TypeFunc() Func { return func(name string) (reflect.Type, bool) { typ, ok := t[name] + if !ok { + // The /sdk endpoint does not prefix types with the namespace, + // but extension endpoints, such as /pbm/sdk do. + name = strings.TrimPrefix(name, "vim25:") + typ, ok = t[name] + } return typ, ok } } diff --git a/vendor/github.com/vmware/govmomi/vim25/types/types.go b/vendor/github.com/vmware/govmomi/vim25/types/types.go index ffb4606c63ef5..fa62c01815d2a 100644 --- a/vendor/github.com/vmware/govmomi/vim25/types/types.go +++ b/vendor/github.com/vmware/govmomi/vim25/types/types.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2014-2016 VMware, Inc. All Rights Reserved. +Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/vmware/govmomi/vim25/xml/extras.go b/vendor/github.com/vmware/govmomi/vim25/xml/extras.go index 3b7f44b01b8d5..9a15b7c8eb6d1 100644 --- a/vendor/github.com/vmware/govmomi/vim25/xml/extras.go +++ b/vendor/github.com/vmware/govmomi/vim25/xml/extras.go @@ -23,6 +23,8 @@ import ( var xmlSchemaInstance = Name{Space: "http://www.w3.org/2001/XMLSchema-instance", Local: "type"} +var xsiType = Name{Space: "xsi", Local: "type"} + var stringToTypeMap = map[string]reflect.Type{ "xsd:boolean": reflect.TypeOf((*bool)(nil)).Elem(), "xsd:byte": reflect.TypeOf((*int8)(nil)).Elem(), diff --git a/vendor/github.com/vmware/govmomi/vim25/xml/read.go b/vendor/github.com/vmware/govmomi/vim25/xml/read.go index 5b407b7909244..fe35fce6ca457 100644 --- a/vendor/github.com/vmware/govmomi/vim25/xml/read.go +++ b/vendor/github.com/vmware/govmomi/vim25/xml/read.go @@ -272,13 +272,15 @@ var ( func (p *Decoder) typeForElement(val reflect.Value, start *StartElement) reflect.Type { t := "" for i, a := range start.Attr { - if a.Name == xmlSchemaInstance { + if a.Name == xmlSchemaInstance || a.Name == xsiType { t = a.Value // HACK: ensure xsi:type is last in the list to avoid using that value for // a "type" attribute, such as ManagedObjectReference.Type for example. // Note that xsi:type is already the last attribute in VC/ESX responses. // This is only an issue with govmomi simulator generated responses. // Proper fix will require finding a few needles in this xml package haystack. + // Note: govmomi uses xmlSchemaInstance, other clients (e.g. rbvmomi) use xsiType. + // They are the same thing to XML parsers, but not to this hack here. x := len(start.Attr) - 1 if i != x { start.Attr[i] = start.Attr[x] From 5bee771feb280f8b28f9bfc622353ccc0e46b2cb Mon Sep 17 00:00:00 2001 From: Balu Dontu Date: Wed, 10 May 2017 18:08:59 -0700 Subject: [PATCH 2/7] Kubernetes core API changes for vSphere --- pkg/api/types.go | 6 + pkg/api/v1/generated.pb.go | 1473 +++++++++++---------- pkg/api/v1/generated.proto | 8 + pkg/api/v1/types.generated.go | 178 ++- pkg/api/v1/types.go | 6 + pkg/api/v1/types_swagger_doc_generated.go | 8 +- pkg/api/v1/zz_generated.conversion.go | 4 + 7 files changed, 951 insertions(+), 732 deletions(-) diff --git a/pkg/api/types.go b/pkg/api/types.go index 9d0ab25f521ad..56c4bc8dcb92e 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -1020,6 +1020,12 @@ type VsphereVirtualDiskVolumeSource struct { // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // +optional FSType string + // Storage Policy Based Management (SPBM) profile name. + // +optional + StoragePolicyName string + // Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + // +optional + StoragePolicyID string } // Represents a Photon Controller persistent disk resource. diff --git a/pkg/api/v1/generated.pb.go b/pkg/api/v1/generated.pb.go index fb5626bb43844..5768a27a07883 100644 --- a/pkg/api/v1/generated.pb.go +++ b/pkg/api/v1/generated.pb.go @@ -9091,6 +9091,14 @@ func (m *VsphereVirtualDiskVolumeSource) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.FSType))) i += copy(dAtA[i:], m.FSType) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.StoragePolicyName))) + i += copy(dAtA[i:], m.StoragePolicyName) + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.StoragePolicyID))) + i += copy(dAtA[i:], m.StoragePolicyID) return i, nil } @@ -12086,6 +12094,10 @@ func (m *VsphereVirtualDiskVolumeSource) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.FSType) n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StoragePolicyName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StoragePolicyID) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -14477,6 +14489,8 @@ func (this *VsphereVirtualDiskVolumeSource) String() string { s := strings.Join([]string{`&VsphereVirtualDiskVolumeSource{`, `VolumePath:` + fmt.Sprintf("%v", this.VolumePath) + `,`, `FSType:` + fmt.Sprintf("%v", this.FSType) + `,`, + `StoragePolicyName:` + fmt.Sprintf("%v", this.StoragePolicyName) + `,`, + `StoragePolicyID:` + fmt.Sprintf("%v", this.StoragePolicyID) + `,`, `}`, }, "") return s @@ -42917,6 +42931,64 @@ func (m *VsphereVirtualDiskVolumeSource) Unmarshal(dAtA []byte) error { } m.FSType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePolicyName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StoragePolicyName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePolicyID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StoragePolicyID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -43147,704 +43219,705 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11175 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x8c, 0x24, 0xc7, - 0x75, 0x98, 0x7a, 0x66, 0xbf, 0xe6, 0xed, 0xe7, 0xd5, 0xed, 0x1d, 0x97, 0x2b, 0xf2, 0xf6, 0xd8, - 0x14, 0xe9, 0x23, 0x79, 0xdc, 0xd5, 0x1d, 0x49, 0xf1, 0x24, 0x2a, 0xb4, 0x76, 0x77, 0x76, 0xef, - 0x56, 0xf7, 0x35, 0xac, 0xd9, 0xbb, 0xa3, 0x28, 0x46, 0x64, 0xdf, 0x74, 0xed, 0x6c, 0xf3, 0x7a, - 0xbb, 0x87, 0xdd, 0x3d, 0x7b, 0xb7, 0x52, 0x04, 0xd8, 0x8a, 0x20, 0x25, 0x80, 0x92, 0xc8, 0x70, - 0x04, 0x04, 0x4e, 0x00, 0x05, 0x06, 0xe2, 0x28, 0x9f, 0x8e, 0x22, 0xe8, 0xc3, 0xb0, 0x9c, 0x0f, - 0x27, 0x72, 0x64, 0x20, 0x71, 0x0c, 0x18, 0xb1, 0x1d, 0x18, 0x59, 0x5b, 0x2b, 0xc4, 0x3f, 0x02, - 0x24, 0x08, 0xe2, 0x7f, 0x9b, 0x20, 0x08, 0xea, 0xb3, 0xab, 0x7a, 0x66, 0xb6, 0x7b, 0x96, 0xb7, - 0x6b, 0x4a, 0xc8, 0xbf, 0x99, 0x7a, 0xaf, 0x5e, 0x7d, 0x74, 0xd5, 0xab, 0xf7, 0x5e, 0xbd, 0xf7, - 0x0a, 0xce, 0xdf, 0xbb, 0x14, 0xcf, 0x7b, 0xe1, 0xc2, 0xbd, 0xf6, 0x5d, 0x12, 0x05, 0x24, 0x21, - 0xf1, 0x42, 0xeb, 0x5e, 0x73, 0xc1, 0x69, 0x79, 0x0b, 0xdb, 0x17, 0x16, 0x9a, 0x24, 0x20, 0x91, - 0x93, 0x10, 0x77, 0xbe, 0x15, 0x85, 0x49, 0x88, 0x1e, 0xe3, 0xd8, 0xf3, 0x29, 0xf6, 0x7c, 0xeb, - 0x5e, 0x73, 0xde, 0x69, 0x79, 0xf3, 0xdb, 0x17, 0x66, 0x9f, 0x6f, 0x7a, 0xc9, 0x66, 0xfb, 0xee, - 0x7c, 0x23, 0xdc, 0x5a, 0x68, 0x86, 0xcd, 0x70, 0x81, 0x55, 0xba, 0xdb, 0xde, 0x60, 0xff, 0xd8, - 0x1f, 0xf6, 0x8b, 0x13, 0x9b, 0x7d, 0x51, 0x34, 0xed, 0xb4, 0xbc, 0x2d, 0xa7, 0xb1, 0xe9, 0x05, - 0x24, 0xda, 0x51, 0x8d, 0x47, 0x24, 0x0e, 0xdb, 0x51, 0x83, 0x64, 0xbb, 0x70, 0x60, 0xad, 0x78, - 0x61, 0x8b, 0x24, 0x4e, 0x97, 0x8e, 0xcf, 0x2e, 0xf4, 0xaa, 0x15, 0xb5, 0x83, 0xc4, 0xdb, 0xea, - 0x6c, 0xe6, 0x23, 0x79, 0x15, 0xe2, 0xc6, 0x26, 0xd9, 0x72, 0x3a, 0xea, 0xbd, 0xd0, 0xab, 0x5e, - 0x3b, 0xf1, 0xfc, 0x05, 0x2f, 0x48, 0xe2, 0x24, 0x3a, 0x68, 0x4c, 0x31, 0x89, 0xb6, 0x49, 0x94, - 0x0e, 0x88, 0x3c, 0x70, 0xb6, 0x5a, 0x3e, 0xe9, 0x36, 0xa6, 0x2b, 0xda, 0xa7, 0x7b, 0xde, 0x69, - 0x36, 0x23, 0xd2, 0x74, 0x92, 0x50, 0xab, 0xeb, 0xb4, 0xbc, 0x88, 0x34, 0xbd, 0x38, 0x89, 0x9c, - 0xc4, 0x0b, 0x83, 0x85, 0xed, 0x0b, 0x8e, 0xdf, 0xda, 0x74, 0x3a, 0x28, 0xd9, 0x7f, 0x60, 0xc1, - 0xd9, 0xc5, 0x3b, 0xf5, 0x15, 0xdf, 0x89, 0x13, 0xaf, 0xb1, 0xe4, 0x87, 0x8d, 0x7b, 0xf5, 0x24, - 0x8c, 0xc8, 0xed, 0xd0, 0x6f, 0x6f, 0x91, 0x3a, 0xfb, 0x10, 0xe8, 0x3c, 0x8c, 0x6c, 0xb3, 0xff, - 0x6b, 0xd5, 0x19, 0xeb, 0xac, 0x75, 0xae, 0xb2, 0x34, 0xf5, 0xc3, 0xdd, 0xb9, 0x0f, 0xec, 0xed, - 0xce, 0x8d, 0xdc, 0x16, 0xe5, 0x58, 0x61, 0xa0, 0xa7, 0x61, 0x68, 0x23, 0x5e, 0xdf, 0x69, 0x91, - 0x99, 0x12, 0xc3, 0x9d, 0x10, 0xb8, 0x43, 0xab, 0x75, 0x5a, 0x8a, 0x05, 0x14, 0x2d, 0x40, 0xa5, - 0xe5, 0x44, 0x89, 0x47, 0x3b, 0x38, 0x53, 0x3e, 0x6b, 0x9d, 0x1b, 0x5c, 0x3a, 0x21, 0x50, 0x2b, - 0x35, 0x09, 0xc0, 0x29, 0x0e, 0xed, 0x46, 0x44, 0x1c, 0xf7, 0x66, 0xe0, 0xef, 0xcc, 0x0c, 0x9c, - 0xb5, 0xce, 0x8d, 0xa4, 0xdd, 0xc0, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x7b, 0x25, 0x18, 0x59, 0xdc, - 0xd8, 0xf0, 0x02, 0x2f, 0xd9, 0x41, 0x6f, 0xc3, 0x58, 0x10, 0xba, 0x44, 0xfe, 0x67, 0xa3, 0x18, - 0xbd, 0xf8, 0xec, 0xfc, 0x41, 0x8b, 0x7a, 0xfe, 0x86, 0x56, 0x63, 0x69, 0x6a, 0x6f, 0x77, 0x6e, - 0x4c, 0x2f, 0xc1, 0x06, 0x45, 0xf4, 0x26, 0x8c, 0xb6, 0x42, 0x57, 0x35, 0x50, 0x62, 0x0d, 0x3c, - 0x73, 0x70, 0x03, 0xb5, 0xb4, 0xc2, 0xd2, 0xe4, 0xde, 0xee, 0xdc, 0xa8, 0x56, 0x80, 0x75, 0x72, - 0xc8, 0x87, 0x49, 0xfa, 0x37, 0x48, 0x3c, 0xd5, 0x42, 0x99, 0xb5, 0xf0, 0x7c, 0x7e, 0x0b, 0x5a, - 0xa5, 0xa5, 0x93, 0x7b, 0xbb, 0x73, 0x93, 0x99, 0x42, 0x9c, 0x25, 0x6d, 0x7f, 0x16, 0x26, 0x16, - 0x93, 0xc4, 0x69, 0x6c, 0x12, 0x97, 0x7f, 0x5f, 0xf4, 0x22, 0x0c, 0x04, 0xce, 0x16, 0x11, 0x5f, - 0xff, 0xac, 0x98, 0xf6, 0x81, 0x1b, 0xce, 0x16, 0xd9, 0xdf, 0x9d, 0x9b, 0xba, 0x15, 0x78, 0xef, - 0xb6, 0xc5, 0x9a, 0xa1, 0x65, 0x98, 0x61, 0xa3, 0x8b, 0x00, 0x2e, 0xd9, 0xf6, 0x1a, 0xa4, 0xe6, - 0x24, 0x9b, 0x62, 0x35, 0x20, 0x51, 0x17, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x0b, 0x16, 0x54, - 0x16, 0xb7, 0x43, 0xcf, 0xad, 0x85, 0x6e, 0x8c, 0xda, 0x30, 0xd9, 0x8a, 0xc8, 0x06, 0x89, 0x54, - 0xd1, 0x8c, 0x75, 0xb6, 0x7c, 0x6e, 0xf4, 0xe2, 0xc5, 0x9c, 0x71, 0x9b, 0x95, 0x56, 0x82, 0x24, - 0xda, 0x59, 0x7a, 0x44, 0x34, 0x3d, 0x99, 0x81, 0xe2, 0x6c, 0x1b, 0xf6, 0x2f, 0x94, 0xe0, 0xd4, - 0xe2, 0x67, 0xdb, 0x11, 0xa9, 0x7a, 0xf1, 0xbd, 0xec, 0x56, 0x70, 0xbd, 0xf8, 0xde, 0x8d, 0x74, - 0x32, 0xd4, 0x1a, 0xac, 0x8a, 0x72, 0xac, 0x30, 0xd0, 0xf3, 0x30, 0x4c, 0x7f, 0xdf, 0xc2, 0x6b, - 0x62, 0xf4, 0x27, 0x05, 0xf2, 0x68, 0xd5, 0x49, 0x9c, 0x2a, 0x07, 0x61, 0x89, 0x83, 0xae, 0xc3, - 0x68, 0x83, 0x71, 0x8e, 0xe6, 0xf5, 0xd0, 0x25, 0xec, 0x0b, 0x57, 0x96, 0x9e, 0xa3, 0xe8, 0xcb, - 0x69, 0xf1, 0xfe, 0xee, 0xdc, 0x0c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, - 0x23, 0x0e, 0x30, 0x4a, 0xd0, 0x65, 0x13, 0x9e, 0xd3, 0xf6, 0xd4, 0x20, 0xdb, 0x53, 0x63, 0x3d, - 0xf6, 0xd3, 0x3f, 0xb4, 0xc4, 0x9c, 0xac, 0x7a, 0xbe, 0xc9, 0x1e, 0x2e, 0x02, 0xc4, 0xa4, 0x11, - 0x91, 0x44, 0x9b, 0x15, 0xf5, 0x99, 0xeb, 0x0a, 0x82, 0x35, 0x2c, 0xba, 0xf9, 0xe3, 0x4d, 0x27, - 0x62, 0xab, 0x45, 0xcc, 0x8d, 0xda, 0xfc, 0x75, 0x09, 0xc0, 0x29, 0x8e, 0xb1, 0xf9, 0xcb, 0xb9, - 0x9b, 0xff, 0x37, 0x2d, 0x18, 0x5e, 0xf2, 0x02, 0xd7, 0x0b, 0x9a, 0xe8, 0x6d, 0x18, 0xa1, 0x67, - 0x83, 0xeb, 0x24, 0x8e, 0xd8, 0xf7, 0x1f, 0x96, 0x8b, 0x47, 0x67, 0xd5, 0x72, 0xf9, 0xc4, 0xf3, - 0x14, 0x9b, 0x2e, 0xa2, 0x9b, 0x77, 0xdf, 0x21, 0x8d, 0xe4, 0x3a, 0x49, 0x9c, 0x74, 0x38, 0x69, - 0x19, 0x56, 0x54, 0xd1, 0x2d, 0x18, 0x4a, 0x9c, 0xa8, 0x49, 0x12, 0xb1, 0xed, 0x73, 0x36, 0x25, - 0xa7, 0x81, 0xe9, 0x92, 0x23, 0x41, 0x83, 0xa4, 0x0c, 0x72, 0x9d, 0x11, 0xc1, 0x82, 0x98, 0xdd, - 0x80, 0xb1, 0x65, 0xa7, 0xe5, 0xdc, 0xf5, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x7e, 0x06, 0xca, 0x8e, - 0xeb, 0xb2, 0x0d, 0x50, 0x59, 0x3a, 0xb5, 0xb7, 0x3b, 0x57, 0x5e, 0x74, 0xdd, 0xfd, 0xdd, 0x39, - 0x50, 0x58, 0x3b, 0x98, 0x62, 0xa0, 0x67, 0x61, 0xc0, 0x8d, 0xc2, 0xd6, 0x4c, 0x89, 0x61, 0x9e, - 0xa6, 0x3b, 0xb5, 0x1a, 0x85, 0xad, 0x0c, 0x2a, 0xc3, 0xb1, 0x7f, 0x50, 0x02, 0xb4, 0x4c, 0x5a, - 0x9b, 0xab, 0x75, 0xe3, 0x9b, 0x9e, 0x83, 0x91, 0xad, 0x30, 0xf0, 0x92, 0x30, 0x8a, 0x45, 0x83, - 0x6c, 0x5d, 0x5c, 0x17, 0x65, 0x58, 0x41, 0xd1, 0x59, 0x18, 0x68, 0xa5, 0xdb, 0x7b, 0x4c, 0xb2, - 0x06, 0xb6, 0xb1, 0x19, 0x84, 0x62, 0xb4, 0x63, 0x12, 0x89, 0xf5, 0xac, 0x30, 0x6e, 0xc5, 0x24, - 0xc2, 0x0c, 0x92, 0xae, 0x20, 0xba, 0xb6, 0xc4, 0x6a, 0xcd, 0xac, 0x20, 0x0a, 0xc1, 0x1a, 0x16, - 0x7a, 0x0b, 0x2a, 0xfc, 0x1f, 0x26, 0x1b, 0x6c, 0xe9, 0xe6, 0x32, 0x85, 0x6b, 0x61, 0xc3, 0xf1, - 0xb3, 0x93, 0x3f, 0xce, 0x56, 0x9c, 0x24, 0x84, 0x53, 0x9a, 0xc6, 0x8a, 0x1b, 0xca, 0x5d, 0x71, - 0x7f, 0xcb, 0x02, 0xb4, 0xec, 0x05, 0x2e, 0x89, 0x8e, 0xe1, 0xe8, 0xec, 0x6f, 0x33, 0xfc, 0x11, - 0xed, 0x5a, 0xb8, 0xd5, 0x0a, 0x03, 0x12, 0x24, 0xcb, 0x61, 0xe0, 0xf2, 0xe3, 0xf4, 0x63, 0x30, - 0x90, 0xd0, 0xa6, 0x78, 0xb7, 0x9e, 0x96, 0x9f, 0x85, 0x36, 0xb0, 0xbf, 0x3b, 0x77, 0xba, 0xb3, - 0x06, 0xeb, 0x02, 0xab, 0x83, 0x3e, 0x0a, 0x43, 0x71, 0xe2, 0x24, 0xed, 0x58, 0x74, 0xf4, 0x09, - 0xd9, 0xd1, 0x3a, 0x2b, 0xdd, 0xdf, 0x9d, 0x9b, 0x54, 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0x33, - 0x30, 0xbc, 0x45, 0xe2, 0xd8, 0x69, 0x4a, 0x06, 0x37, 0x29, 0xea, 0x0e, 0x5f, 0xe7, 0xc5, 0x58, - 0xc2, 0xd1, 0x93, 0x30, 0x48, 0xa2, 0x28, 0x8c, 0xc4, 0x8a, 0x18, 0x17, 0x88, 0x83, 0x2b, 0xb4, - 0x10, 0x73, 0x98, 0xfd, 0x9f, 0x2d, 0x98, 0x54, 0x7d, 0xe5, 0x6d, 0x1d, 0xc3, 0x96, 0x77, 0x01, - 0x1a, 0x72, 0x80, 0x31, 0xdb, 0x68, 0x5a, 0x1b, 0xdd, 0x97, 0x5f, 0xe7, 0x84, 0xa6, 0x6d, 0xa8, - 0xa2, 0x18, 0x6b, 0x74, 0xed, 0x7f, 0x67, 0xc1, 0xc9, 0xcc, 0xd8, 0xae, 0x79, 0x71, 0x82, 0xde, - 0xec, 0x18, 0xdf, 0x7c, 0xb1, 0xf1, 0xd1, 0xda, 0x6c, 0x74, 0x6a, 0xbd, 0xc8, 0x12, 0x6d, 0x6c, - 0x18, 0x06, 0xbd, 0x84, 0x6c, 0xc9, 0x61, 0x3d, 0x5f, 0x70, 0x58, 0xbc, 0x7f, 0xe9, 0x57, 0x5a, - 0xa3, 0x34, 0x30, 0x27, 0x65, 0xff, 0x6f, 0x0b, 0x2a, 0xcb, 0x61, 0xb0, 0xe1, 0x35, 0xaf, 0x3b, - 0xad, 0x63, 0xf8, 0x3e, 0x75, 0x18, 0x60, 0xd4, 0xf9, 0x10, 0x2e, 0xe4, 0x0d, 0x41, 0x74, 0x6c, - 0x9e, 0x9e, 0xa9, 0x5c, 0x58, 0x50, 0x6c, 0x8a, 0x16, 0x61, 0x46, 0x6c, 0xf6, 0x65, 0xa8, 0x28, - 0x04, 0x34, 0x05, 0xe5, 0x7b, 0x84, 0x4b, 0x92, 0x15, 0x4c, 0x7f, 0xa2, 0x69, 0x18, 0xdc, 0x76, - 0xfc, 0xb6, 0xd8, 0xbc, 0x98, 0xff, 0xf9, 0x58, 0xe9, 0x92, 0x65, 0xff, 0x80, 0xed, 0x40, 0xd1, - 0xc8, 0x4a, 0xb0, 0x2d, 0x98, 0xc3, 0x17, 0x2d, 0x98, 0xf6, 0xbb, 0x30, 0x25, 0x31, 0x27, 0x87, - 0x61, 0x67, 0x8f, 0x89, 0x6e, 0x4f, 0x77, 0x83, 0xe2, 0xae, 0xad, 0x51, 0x5e, 0x1f, 0xb6, 0xe8, - 0x82, 0x73, 0x7c, 0xd6, 0x75, 0x21, 0x03, 0xdc, 0x14, 0x65, 0x58, 0x41, 0xed, 0x3f, 0xb5, 0x60, - 0x5a, 0x8d, 0xe3, 0x2a, 0xd9, 0xa9, 0x13, 0x9f, 0x34, 0x92, 0x30, 0x7a, 0xbf, 0x8c, 0xe4, 0x71, - 0xfe, 0x4d, 0x38, 0x4f, 0x1a, 0x15, 0x04, 0xca, 0x57, 0xc9, 0x0e, 0xff, 0x40, 0xfa, 0x40, 0xcb, - 0x07, 0x0e, 0xf4, 0xd7, 0x2d, 0x18, 0x57, 0x03, 0x3d, 0x86, 0x2d, 0x77, 0xcd, 0xdc, 0x72, 0x3f, - 0x53, 0x70, 0xbd, 0xf6, 0xd8, 0x6c, 0x7f, 0xb3, 0x44, 0xd9, 0x86, 0xc0, 0xa9, 0x45, 0x21, 0x9d, - 0x24, 0xca, 0xf1, 0xdf, 0x27, 0x5f, 0xa9, 0xbf, 0xc1, 0x5e, 0x25, 0x3b, 0xeb, 0x21, 0x95, 0x26, - 0xba, 0x0f, 0xd6, 0xf8, 0xa8, 0x03, 0x07, 0x7e, 0xd4, 0xdf, 0x2e, 0xc1, 0x29, 0x35, 0x2d, 0xc6, - 0x29, 0xfd, 0x53, 0x39, 0x31, 0x17, 0x60, 0xd4, 0x25, 0x1b, 0x4e, 0xdb, 0x4f, 0x94, 0x36, 0x31, - 0xc8, 0xd5, 0xcc, 0x6a, 0x5a, 0x8c, 0x75, 0x9c, 0x3e, 0xe6, 0xf2, 0xeb, 0xa3, 0x8c, 0x9f, 0x27, - 0x0e, 0x5d, 0xf5, 0x54, 0xc2, 0xd3, 0xd4, 0xc3, 0x31, 0x5d, 0x3d, 0x14, 0xaa, 0xe0, 0x93, 0x30, - 0xe8, 0x6d, 0xd1, 0x33, 0xbf, 0x64, 0x1e, 0xe5, 0x6b, 0xb4, 0x10, 0x73, 0x18, 0x7a, 0x0a, 0x86, - 0x1b, 0xe1, 0xd6, 0x96, 0x13, 0xb8, 0x33, 0x65, 0x26, 0x73, 0x8e, 0x52, 0xb1, 0x60, 0x99, 0x17, - 0x61, 0x09, 0x43, 0x8f, 0xc1, 0x80, 0x13, 0x35, 0xe3, 0x99, 0x01, 0x86, 0x33, 0x42, 0x5b, 0x5a, - 0x8c, 0x9a, 0x31, 0x66, 0xa5, 0x54, 0x96, 0xbc, 0x1f, 0x46, 0xf7, 0xbc, 0xa0, 0x59, 0xf5, 0x22, - 0x26, 0x18, 0x6a, 0xb2, 0xe4, 0x1d, 0x05, 0xc1, 0x1a, 0x16, 0xaa, 0xc1, 0x60, 0x2b, 0x8c, 0x92, - 0x78, 0x66, 0x88, 0x4d, 0xfc, 0x73, 0xb9, 0xdb, 0x8f, 0x8f, 0xbb, 0x16, 0x46, 0x49, 0x3a, 0x14, - 0xfa, 0x2f, 0xc6, 0x9c, 0x10, 0x5a, 0x86, 0x32, 0x09, 0xb6, 0x67, 0x86, 0x19, 0xbd, 0x0f, 0x1d, - 0x4c, 0x6f, 0x25, 0xd8, 0xbe, 0xed, 0x44, 0x29, 0xbf, 0x5a, 0x09, 0xb6, 0x31, 0xad, 0x8d, 0x1a, - 0x50, 0x91, 0xc6, 0xb0, 0x78, 0x66, 0xa4, 0xc8, 0x52, 0xc4, 0x02, 0x1d, 0x93, 0x77, 0xdb, 0x5e, - 0x44, 0xb6, 0x48, 0x90, 0xc4, 0xa9, 0x62, 0x25, 0xa1, 0x31, 0x4e, 0xe9, 0xa2, 0x06, 0x8c, 0x71, - 0xf9, 0xf3, 0x7a, 0xd8, 0x0e, 0x92, 0x78, 0xa6, 0xc2, 0xba, 0x9c, 0x63, 0xb9, 0xb8, 0x9d, 0xd6, - 0x58, 0x9a, 0x16, 0xe4, 0xc7, 0xb4, 0xc2, 0x18, 0x1b, 0x44, 0xd1, 0x9b, 0x30, 0xee, 0x7b, 0xdb, - 0x24, 0x20, 0x71, 0x5c, 0x8b, 0xc2, 0xbb, 0x64, 0x06, 0xd8, 0x68, 0x9e, 0xcc, 0xd3, 0xe2, 0xc3, - 0xbb, 0x64, 0xe9, 0xc4, 0xde, 0xee, 0xdc, 0xf8, 0x35, 0xbd, 0x36, 0x36, 0x89, 0xa1, 0xb7, 0x60, - 0x82, 0x0a, 0xbb, 0x5e, 0x4a, 0x7e, 0xb4, 0x38, 0x79, 0xb4, 0xb7, 0x3b, 0x37, 0x81, 0x8d, 0xea, - 0x38, 0x43, 0x0e, 0xad, 0x43, 0xc5, 0xf7, 0x36, 0x48, 0x63, 0xa7, 0xe1, 0x93, 0x99, 0x31, 0x46, - 0x3b, 0x67, 0x73, 0x5e, 0x93, 0xe8, 0x5c, 0xc1, 0x50, 0x7f, 0x71, 0x4a, 0x08, 0xdd, 0x86, 0xd3, - 0x09, 0x89, 0xb6, 0xbc, 0x80, 0xd9, 0xe8, 0x84, 0xf4, 0xcb, 0x4c, 0x25, 0xe3, 0x6c, 0xd5, 0x9e, - 0x11, 0x13, 0x7b, 0x7a, 0xbd, 0x2b, 0x16, 0xee, 0x51, 0x1b, 0xdd, 0x84, 0x49, 0xb6, 0x9f, 0x6a, - 0x6d, 0xdf, 0xaf, 0x85, 0xbe, 0xd7, 0xd8, 0x99, 0x99, 0x60, 0x04, 0x9f, 0x92, 0x06, 0x90, 0x35, - 0x13, 0x4c, 0x15, 0xc3, 0xf4, 0x1f, 0xce, 0xd6, 0x46, 0x3e, 0x4c, 0xc6, 0xa4, 0xd1, 0x8e, 0xbc, - 0x64, 0x87, 0xae, 0x7d, 0xf2, 0x20, 0x99, 0x99, 0x2c, 0xa2, 0xe8, 0xd6, 0xcd, 0x4a, 0xdc, 0xfa, - 0x94, 0x29, 0xc4, 0x59, 0xd2, 0x94, 0x55, 0xc4, 0x89, 0xeb, 0x05, 0x33, 0x53, 0x8c, 0x03, 0xa9, - 0xfd, 0x55, 0xa7, 0x85, 0x98, 0xc3, 0x98, 0xfd, 0x80, 0xfe, 0xb8, 0x49, 0xb9, 0xf4, 0x09, 0x86, - 0x98, 0xda, 0x0f, 0x24, 0x00, 0xa7, 0x38, 0x54, 0x34, 0x48, 0x92, 0x9d, 0x19, 0xc4, 0x50, 0xd5, - 0x56, 0x5b, 0x5f, 0xff, 0x14, 0xa6, 0xe5, 0xe8, 0x36, 0x0c, 0x93, 0x60, 0x7b, 0x35, 0x0a, 0xb7, - 0x66, 0x4e, 0x16, 0xe1, 0x01, 0x2b, 0x1c, 0x99, 0x9f, 0x1f, 0xa9, 0x0a, 0x23, 0x8a, 0xb1, 0x24, - 0x86, 0x1e, 0xc0, 0x4c, 0x97, 0xaf, 0xc4, 0x3f, 0xca, 0x34, 0xfb, 0x28, 0x1f, 0x17, 0x75, 0x67, - 0xd6, 0x7b, 0xe0, 0xed, 0x1f, 0x00, 0xc3, 0x3d, 0xa9, 0xdb, 0x77, 0x61, 0x42, 0x31, 0x2a, 0xf6, - 0xbd, 0xd1, 0x1c, 0x0c, 0x52, 0x5e, 0x2c, 0x15, 0xfa, 0x0a, 0x9d, 0x54, 0xca, 0xa2, 0x63, 0xcc, - 0xcb, 0xd9, 0xa4, 0x7a, 0x9f, 0x25, 0x4b, 0x3b, 0x09, 0xe1, 0x8a, 0x5d, 0x59, 0x9b, 0x54, 0x09, - 0xc0, 0x29, 0x8e, 0xfd, 0x7f, 0xb9, 0x98, 0x94, 0x72, 0xc3, 0x02, 0x27, 0xc1, 0x79, 0x18, 0xd9, - 0x0c, 0xe3, 0x84, 0x62, 0xb3, 0x36, 0x06, 0x53, 0xc1, 0xe8, 0x8a, 0x28, 0xc7, 0x0a, 0x03, 0xbd, - 0x02, 0xe3, 0x0d, 0xbd, 0x01, 0x71, 0x8c, 0x9d, 0x12, 0x55, 0xcc, 0xd6, 0xb1, 0x89, 0x8b, 0x2e, - 0xc1, 0x08, 0xb3, 0x72, 0x37, 0x42, 0x5f, 0xa8, 0x90, 0xf2, 0x54, 0x1e, 0xa9, 0x89, 0xf2, 0x7d, - 0xed, 0x37, 0x56, 0xd8, 0x54, 0x11, 0xa7, 0x5d, 0x58, 0xab, 0x89, 0x03, 0x44, 0x29, 0xe2, 0x57, - 0x58, 0x29, 0x16, 0x50, 0xfb, 0x9f, 0x95, 0xb4, 0x59, 0xa6, 0x0a, 0x10, 0x41, 0x6f, 0xc0, 0xf0, - 0x7d, 0xc7, 0x4b, 0xbc, 0xa0, 0x29, 0xa4, 0x87, 0x17, 0x0a, 0x9e, 0x26, 0xac, 0xfa, 0x1d, 0x5e, - 0x95, 0x9f, 0x7c, 0xe2, 0x0f, 0x96, 0x04, 0x29, 0xed, 0xa8, 0x1d, 0x04, 0x94, 0x76, 0xa9, 0x7f, - 0xda, 0x98, 0x57, 0xe5, 0xb4, 0xc5, 0x1f, 0x2c, 0x09, 0xa2, 0x0d, 0x00, 0xb9, 0x96, 0x88, 0x2b, - 0xac, 0xcb, 0x1f, 0xe9, 0x87, 0xfc, 0xba, 0xaa, 0xbd, 0x34, 0x41, 0xcf, 0xda, 0xf4, 0x3f, 0xd6, - 0x28, 0xdb, 0x09, 0x13, 0xc2, 0x3a, 0xbb, 0x85, 0x3e, 0x4d, 0xb7, 0xb4, 0x13, 0x25, 0xc4, 0x5d, - 0x4c, 0xb2, 0x06, 0xfa, 0x83, 0x45, 0xec, 0x75, 0x6f, 0x8b, 0xe8, 0xdb, 0x5f, 0x10, 0xc1, 0x29, - 0x3d, 0xfb, 0xbb, 0x65, 0x98, 0xe9, 0xd5, 0x5d, 0xba, 0x24, 0xc9, 0x03, 0x2f, 0x59, 0xa6, 0x62, - 0x92, 0x65, 0x2e, 0xc9, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x5d, 0x1b, 0xb1, 0xd7, 0x94, 0xca, 0xd2, - 0x60, 0xba, 0x36, 0xea, 0xac, 0x14, 0x0b, 0x28, 0xc5, 0x8b, 0x88, 0x13, 0x8b, 0xcb, 0x0d, 0x6d, - 0x0d, 0x61, 0x56, 0x8a, 0x05, 0x54, 0x37, 0x88, 0x0c, 0xe4, 0x18, 0x44, 0x8c, 0x29, 0x1a, 0x7c, - 0xb8, 0x53, 0x84, 0x3e, 0x03, 0xb0, 0xe1, 0x05, 0x5e, 0xbc, 0xc9, 0xa8, 0x0f, 0xf5, 0x4d, 0x5d, - 0x09, 0x59, 0xab, 0x8a, 0x0a, 0xd6, 0x28, 0xa2, 0x97, 0x60, 0x54, 0x6d, 0xcf, 0xb5, 0xea, 0xcc, - 0xb0, 0x69, 0x10, 0x4f, 0x79, 0x55, 0x15, 0xeb, 0x78, 0xf6, 0x3b, 0xd9, 0xf5, 0x22, 0x76, 0x85, - 0x36, 0xbf, 0x56, 0xd1, 0xf9, 0x2d, 0x1d, 0x3c, 0xbf, 0xf6, 0xef, 0x97, 0x61, 0xd2, 0x68, 0xac, - 0x1d, 0x17, 0xe0, 0x68, 0xaf, 0xd1, 0x03, 0xcb, 0x49, 0x88, 0xd8, 0x93, 0xe7, 0xfb, 0xd9, 0x34, - 0xfa, 0xf1, 0x46, 0xf7, 0x02, 0xa7, 0x84, 0x36, 0xa1, 0xe2, 0x3b, 0x31, 0x33, 0xa9, 0x10, 0xb1, - 0x17, 0xfb, 0x23, 0x9b, 0xaa, 0x1f, 0x4e, 0x9c, 0x68, 0xa7, 0x07, 0x6f, 0x25, 0x25, 0x4e, 0x4f, - 0x5b, 0x2a, 0xec, 0xc8, 0x1b, 0x35, 0xd5, 0x1d, 0x2a, 0x11, 0xed, 0x60, 0x0e, 0x43, 0x97, 0x60, - 0x2c, 0x22, 0x6c, 0xa5, 0x2c, 0x53, 0x79, 0x8e, 0x2d, 0xbd, 0xc1, 0x54, 0xf0, 0xc3, 0x1a, 0x0c, - 0x1b, 0x98, 0xa9, 0xdc, 0x3f, 0x74, 0x80, 0xdc, 0xff, 0x0c, 0x0c, 0xb3, 0x1f, 0x6a, 0x55, 0xa8, - 0x2f, 0xb4, 0xc6, 0x8b, 0xb1, 0x84, 0x67, 0x17, 0xd1, 0x48, 0xc1, 0x45, 0xf4, 0x2c, 0x4c, 0x54, - 0x1d, 0xb2, 0x15, 0x06, 0x2b, 0x81, 0xdb, 0x0a, 0xbd, 0x20, 0x41, 0x33, 0x30, 0xc0, 0xce, 0x13, - 0xbe, 0xdf, 0x07, 0x28, 0x05, 0x3c, 0x40, 0x65, 0x77, 0xfb, 0x8f, 0x4a, 0x30, 0x5e, 0x25, 0x3e, - 0x49, 0x08, 0xd7, 0x7b, 0x62, 0xb4, 0x0a, 0xa8, 0x19, 0x39, 0x0d, 0x52, 0x23, 0x91, 0x17, 0xba, - 0x75, 0xd2, 0x08, 0x03, 0x76, 0x11, 0x45, 0x0f, 0xc8, 0xd3, 0x7b, 0xbb, 0x73, 0xe8, 0x72, 0x07, - 0x14, 0x77, 0xa9, 0x81, 0x5c, 0x18, 0x6f, 0x45, 0xc4, 0xb0, 0x1b, 0x5a, 0xf9, 0xa2, 0x46, 0x4d, - 0xaf, 0xc2, 0xa5, 0x61, 0xa3, 0x08, 0x9b, 0x44, 0xd1, 0x27, 0x60, 0x2a, 0x8c, 0x5a, 0x9b, 0x4e, - 0x50, 0x25, 0x2d, 0x12, 0xb8, 0x54, 0x05, 0x10, 0xd6, 0x8e, 0xe9, 0xbd, 0xdd, 0xb9, 0xa9, 0x9b, - 0x19, 0x18, 0xee, 0xc0, 0x46, 0x6f, 0xc0, 0x89, 0x56, 0x14, 0xb6, 0x9c, 0x26, 0x5b, 0x32, 0x42, - 0x5a, 0xe1, 0xbc, 0xe9, 0xfc, 0xde, 0xee, 0xdc, 0x89, 0x5a, 0x16, 0xb8, 0xbf, 0x3b, 0x77, 0x92, - 0x4d, 0x19, 0x2d, 0x49, 0x81, 0xb8, 0x93, 0x8c, 0xfd, 0x2e, 0x9c, 0xaa, 0x86, 0xf7, 0x83, 0xfb, - 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0x34, 0xe3, 0xc4, 0xeb, 0x52, 0xf9, 0xe5, 0x17, 0x7c, 0x39, 0x27, - 0x9b, 0x46, 0x83, 0xab, 0x1d, 0xab, 0x9e, 0x4f, 0x7a, 0x98, 0x43, 0xfe, 0x51, 0xc9, 0x68, 0x33, - 0xc5, 0x57, 0x77, 0x17, 0x56, 0xcf, 0xbb, 0x8b, 0x4f, 0xc3, 0xc8, 0x86, 0x47, 0x7c, 0x17, 0x93, - 0x0d, 0xf1, 0xb5, 0x2e, 0x14, 0xb9, 0xdc, 0x59, 0xa5, 0x75, 0xa4, 0x75, 0x8c, 0x2b, 0xd1, 0xab, - 0x82, 0x0c, 0x56, 0x04, 0x51, 0x1b, 0xa6, 0xa4, 0x1e, 0x26, 0xa1, 0x62, 0xb3, 0xbf, 0x50, 0x4c, - 0xcd, 0x33, 0x9b, 0x61, 0x9f, 0x17, 0x67, 0x08, 0xe2, 0x8e, 0x26, 0xa8, 0xfe, 0xbc, 0x45, 0x8f, - 0xba, 0x01, 0xb6, 0xf4, 0x99, 0xfe, 0xcc, 0x4c, 0x01, 0xac, 0xd4, 0xfe, 0x15, 0x0b, 0x1e, 0xe9, - 0x98, 0x2d, 0x61, 0x27, 0x39, 0xb2, 0x6f, 0x94, 0x35, 0x56, 0x94, 0xf2, 0x8d, 0x15, 0xf6, 0x4d, - 0x98, 0x5e, 0xd9, 0x6a, 0x25, 0x3b, 0x55, 0xcf, 0xbc, 0x72, 0x79, 0x19, 0x86, 0xb6, 0x88, 0xeb, - 0xb5, 0xb7, 0xc4, 0x67, 0x9d, 0x93, 0xe7, 0xc2, 0x75, 0x56, 0xba, 0xbf, 0x3b, 0x37, 0x5e, 0x4f, - 0xc2, 0xc8, 0x69, 0x12, 0x5e, 0x80, 0x05, 0xba, 0xfd, 0x23, 0x0b, 0x26, 0x25, 0x7f, 0x58, 0x74, - 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x85, 0x92, 0xd7, 0x12, 0x84, 0x40, 0x10, 0x2a, 0xad, 0xd5, 0x70, - 0xc9, 0x6b, 0xa1, 0x37, 0xa0, 0xc2, 0x6f, 0xea, 0xd2, 0xc5, 0xd1, 0xe7, 0xcd, 0x1f, 0xd3, 0x0d, - 0xd7, 0x25, 0x0d, 0x9c, 0x92, 0x93, 0x52, 0x32, 0x3b, 0x79, 0xca, 0xe6, 0xbd, 0xd1, 0x15, 0x51, - 0x8e, 0x15, 0x06, 0x3a, 0x07, 0x23, 0x41, 0xe8, 0xf2, 0xcb, 0x54, 0xbe, 0x4f, 0xd9, 0x92, 0xbb, - 0x21, 0xca, 0xb0, 0x82, 0xda, 0x5f, 0xb1, 0x60, 0x4c, 0x8e, 0xb1, 0xa0, 0xc0, 0x4e, 0x37, 0x49, - 0x2a, 0xac, 0xa7, 0x9b, 0x84, 0x0a, 0xdc, 0x0c, 0x62, 0xc8, 0xd9, 0xe5, 0x7e, 0xe4, 0x6c, 0xfb, - 0xd7, 0x4a, 0x30, 0x21, 0xbb, 0x53, 0x6f, 0xdf, 0x8d, 0x09, 0x15, 0x43, 0x2a, 0x0e, 0x9f, 0x7c, - 0x22, 0xd7, 0xd9, 0xf3, 0x79, 0xba, 0x98, 0xf1, 0xcd, 0x52, 0x31, 0x67, 0x51, 0xd2, 0xc1, 0x29, - 0x49, 0xb4, 0x0d, 0x27, 0x82, 0x30, 0x61, 0xc7, 0x9b, 0x82, 0x17, 0xbb, 0xe9, 0xc8, 0xb6, 0xf3, - 0xa8, 0x68, 0xe7, 0xc4, 0x8d, 0x2c, 0x3d, 0xdc, 0xd9, 0x04, 0xba, 0x29, 0x6d, 0x4c, 0x65, 0xd6, - 0xd6, 0xb3, 0xc5, 0xda, 0xea, 0x6d, 0x62, 0xb2, 0x7f, 0xcb, 0x82, 0x8a, 0x44, 0x3b, 0x8e, 0x2b, - 0xaf, 0x3b, 0x30, 0x1c, 0xb3, 0x4f, 0x24, 0xa7, 0xeb, 0x7c, 0xb1, 0x21, 0xf0, 0xef, 0x9a, 0x9e, - 0xe9, 0xfc, 0x7f, 0x8c, 0x25, 0x35, 0x66, 0x6c, 0x57, 0x03, 0x79, 0xdf, 0x19, 0xdb, 0x55, 0xcf, - 0x7a, 0xdf, 0x6c, 0x8d, 0x1b, 0xd6, 0x00, 0x2a, 0x98, 0xb6, 0x22, 0xb2, 0xe1, 0x3d, 0xc8, 0x0a, - 0xa6, 0x35, 0x56, 0x8a, 0x05, 0x14, 0x6d, 0xc0, 0x58, 0x43, 0x9a, 0xa3, 0x53, 0x16, 0xf2, 0xe1, - 0x82, 0xb6, 0x7f, 0x75, 0x8d, 0xc4, 0x5d, 0x93, 0x96, 0x35, 0x4a, 0xd8, 0xa0, 0x4b, 0xf9, 0x54, - 0x7a, 0x53, 0x5e, 0x2e, 0x68, 0xb8, 0x89, 0x48, 0x92, 0xb6, 0xd0, 0xf3, 0x92, 0xdc, 0xfe, 0x86, - 0x05, 0x43, 0xdc, 0x7e, 0x59, 0xcc, 0x08, 0xac, 0x5d, 0x90, 0xa5, 0xf3, 0x79, 0x9b, 0x16, 0x8a, - 0xfb, 0x32, 0x74, 0x07, 0x2a, 0xec, 0x07, 0xb3, 0xc5, 0x94, 0x8b, 0xf8, 0x69, 0xf1, 0xf6, 0xf5, - 0xae, 0xde, 0x96, 0x04, 0x70, 0x4a, 0xcb, 0xfe, 0x7e, 0x99, 0xb2, 0xbe, 0x14, 0xd5, 0x38, 0xdb, - 0xad, 0xe3, 0x38, 0xdb, 0x4b, 0x47, 0x7f, 0xb6, 0xbf, 0x0b, 0x93, 0x0d, 0xed, 0x82, 0x2e, 0xfd, - 0xe2, 0x17, 0x0b, 0x2e, 0x2b, 0xed, 0x56, 0x8f, 0xdb, 0xeb, 0x96, 0x4d, 0x72, 0x38, 0x4b, 0x1f, - 0x11, 0x18, 0xe3, 0xeb, 0x41, 0xb4, 0x37, 0xc0, 0xda, 0x5b, 0x28, 0xb2, 0xc2, 0xf4, 0xc6, 0xd8, - 0x2a, 0xae, 0x6b, 0x84, 0xb0, 0x41, 0xd6, 0xfe, 0xa5, 0x41, 0x18, 0x5c, 0xd9, 0x26, 0x41, 0x72, - 0x0c, 0xac, 0x6e, 0x0b, 0x26, 0xbc, 0x60, 0x3b, 0xf4, 0xb7, 0x89, 0xcb, 0xe1, 0x87, 0x3b, 0xde, - 0x4f, 0x8b, 0x46, 0x26, 0xd6, 0x0c, 0x62, 0x38, 0x43, 0xfc, 0x28, 0x2c, 0x05, 0xaf, 0xc1, 0x10, - 0x5f, 0x19, 0xc2, 0x4c, 0x90, 0x63, 0xcf, 0x67, 0x13, 0x2b, 0x76, 0x50, 0x6a, 0xcf, 0xe0, 0x57, - 0x09, 0x82, 0x10, 0x7a, 0x07, 0x26, 0x36, 0xbc, 0x28, 0x4e, 0xa8, 0xb2, 0x1f, 0x27, 0xce, 0x56, - 0xeb, 0x10, 0x36, 0x02, 0x35, 0x23, 0xab, 0x06, 0x25, 0x9c, 0xa1, 0x8c, 0x9a, 0x30, 0x4e, 0x55, - 0xd4, 0xb4, 0xa9, 0xe1, 0xbe, 0x9b, 0x52, 0x26, 0xc2, 0x6b, 0x3a, 0x21, 0x6c, 0xd2, 0xa5, 0x2c, - 0xa9, 0xc1, 0x54, 0xda, 0x11, 0x26, 0xdd, 0x28, 0x96, 0xc4, 0x75, 0x59, 0x0e, 0xa3, 0x9c, 0x8d, - 0x79, 0xca, 0x54, 0x4c, 0xce, 0x96, 0xfa, 0xc3, 0xd8, 0xdf, 0xa2, 0x67, 0x31, 0x9d, 0xc3, 0x63, - 0x38, 0xbe, 0xae, 0x98, 0xc7, 0xd7, 0x93, 0x05, 0xbe, 0x6c, 0x8f, 0xa3, 0xeb, 0x6d, 0x18, 0xd5, - 0x3e, 0x3c, 0x5a, 0x80, 0x4a, 0x43, 0x3a, 0x73, 0x08, 0x2e, 0xae, 0x44, 0x29, 0xe5, 0xe5, 0x81, - 0x53, 0x1c, 0x3a, 0x2f, 0x54, 0x04, 0xcd, 0xba, 0x7e, 0x51, 0x01, 0x15, 0x33, 0x88, 0xfd, 0x02, - 0xc0, 0xca, 0x03, 0xd2, 0x58, 0xe4, 0x2a, 0x9e, 0x76, 0xbf, 0x67, 0xf5, 0xbe, 0xdf, 0xb3, 0xbf, - 0x69, 0xc1, 0xc4, 0xea, 0xb2, 0x21, 0xd3, 0xcf, 0x03, 0x70, 0xd9, 0xf8, 0xce, 0x9d, 0x1b, 0xd2, - 0x7e, 0xcd, 0x8d, 0x8c, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x51, 0x28, 0xfb, 0xed, 0x40, 0x88, 0xac, - 0xc3, 0x7b, 0xbb, 0x73, 0xe5, 0x6b, 0xed, 0x00, 0xd3, 0x32, 0xcd, 0xc7, 0xaa, 0x5c, 0xd8, 0xc7, - 0x2a, 0xdf, 0xdb, 0xf8, 0x6b, 0x65, 0x98, 0x5a, 0xf5, 0xc9, 0x03, 0xa3, 0xd7, 0x4f, 0xc3, 0x90, - 0x1b, 0x79, 0xdb, 0x24, 0xca, 0x0a, 0x02, 0x55, 0x56, 0x8a, 0x05, 0xb4, 0xb0, 0xdb, 0xd7, 0x5b, - 0x9d, 0x07, 0xf9, 0xd1, 0xb9, 0xbc, 0xe5, 0x8e, 0x19, 0x6d, 0xc0, 0x30, 0xbf, 0x0f, 0x8e, 0x67, - 0x06, 0xd9, 0x52, 0x7c, 0xe5, 0xe0, 0xce, 0x64, 0xe7, 0x67, 0x5e, 0xd8, 0x57, 0xb8, 0xc3, 0x8d, - 0xe2, 0x65, 0xa2, 0x14, 0x4b, 0xe2, 0xb3, 0x1f, 0x83, 0x31, 0x1d, 0xb3, 0x2f, 0xcf, 0x9b, 0xbf, - 0x6c, 0xc1, 0xc9, 0x55, 0x3f, 0x6c, 0xdc, 0xcb, 0xf8, 0xe5, 0xbd, 0x04, 0xa3, 0x74, 0x33, 0xc5, - 0x86, 0xd3, 0xaa, 0xe1, 0x9d, 0x2b, 0x40, 0x58, 0xc7, 0xd3, 0xaa, 0xdd, 0xba, 0xb5, 0x56, 0xed, - 0xe6, 0xd4, 0x2b, 0x40, 0x58, 0xc7, 0xb3, 0x7f, 0xc7, 0x82, 0xc7, 0x2f, 0x2f, 0xaf, 0xd4, 0x48, - 0x14, 0x7b, 0x71, 0x42, 0x82, 0xa4, 0xc3, 0xaf, 0x98, 0xca, 0x8c, 0xae, 0xd6, 0x95, 0x54, 0x66, - 0xac, 0xb2, 0x5e, 0x08, 0xe8, 0xfb, 0xc5, 0xb9, 0xfe, 0x1b, 0x16, 0x9c, 0xbc, 0xec, 0x25, 0x98, - 0xb4, 0xc2, 0xac, 0x2b, 0x70, 0x44, 0x5a, 0x61, 0xec, 0x25, 0x61, 0xb4, 0x93, 0x75, 0x05, 0xc6, - 0x0a, 0x82, 0x35, 0x2c, 0xde, 0xf2, 0xb6, 0x17, 0xd3, 0x9e, 0x96, 0x4c, 0x55, 0x17, 0x8b, 0x72, - 0xac, 0x30, 0xe8, 0xc0, 0x5c, 0x2f, 0x62, 0x22, 0xc3, 0x8e, 0xd8, 0xc1, 0x6a, 0x60, 0x55, 0x09, - 0xc0, 0x29, 0x8e, 0xfd, 0x77, 0x2c, 0x38, 0x75, 0xd9, 0x6f, 0xc7, 0x09, 0x89, 0x36, 0x62, 0xa3, - 0xb3, 0x2f, 0x40, 0x85, 0x48, 0xe1, 0x5e, 0xf4, 0x55, 0x1d, 0x1a, 0x4a, 0xea, 0xe7, 0x7e, 0xc8, - 0x0a, 0xaf, 0x80, 0xbb, 0x6b, 0x7f, 0xce, 0x99, 0xbf, 0x51, 0x82, 0xf1, 0x2b, 0xeb, 0xeb, 0xb5, - 0xcb, 0x24, 0x11, 0x5c, 0x32, 0xdf, 0x28, 0x85, 0x35, 0x8d, 0xfc, 0x20, 0xe1, 0xa7, 0x9d, 0x78, - 0xfe, 0x3c, 0x0f, 0x3c, 0x99, 0x5f, 0x0b, 0x92, 0x9b, 0x51, 0x3d, 0x89, 0xbc, 0xa0, 0xd9, 0x55, - 0x87, 0x97, 0xbc, 0xbc, 0xdc, 0x8b, 0x97, 0xa3, 0x17, 0x60, 0x88, 0x45, 0xbe, 0x48, 0xe1, 0xe3, - 0x83, 0x4a, 0x4e, 0x60, 0xa5, 0xfb, 0xbb, 0x73, 0x95, 0x5b, 0x78, 0x8d, 0xff, 0xc1, 0x02, 0x15, - 0xbd, 0x05, 0xa3, 0x9b, 0x49, 0xd2, 0xba, 0x42, 0x1c, 0x97, 0x44, 0x92, 0x4f, 0x9c, 0x3b, 0x98, - 0x4f, 0xd0, 0xe9, 0xe0, 0x15, 0xd2, 0xad, 0x95, 0x96, 0xc5, 0x58, 0xa7, 0x68, 0xd7, 0x01, 0x52, - 0xd8, 0x43, 0xd2, 0x41, 0xec, 0x9f, 0x2f, 0xc1, 0xf0, 0x15, 0x27, 0x70, 0x7d, 0x12, 0xa1, 0x55, - 0x18, 0x20, 0x0f, 0x48, 0x43, 0x1c, 0xe4, 0x39, 0x5d, 0x4f, 0x0f, 0x3b, 0x6e, 0x57, 0xa3, 0xff, - 0x31, 0xab, 0x8f, 0x30, 0x0c, 0xd3, 0x7e, 0x5f, 0x56, 0x5e, 0xe2, 0xcf, 0xe5, 0xcf, 0x82, 0x5a, - 0x14, 0xfc, 0xa4, 0x14, 0x45, 0x58, 0x12, 0x62, 0x16, 0xa8, 0x46, 0xab, 0x4e, 0xd9, 0x5b, 0x52, - 0x4c, 0xb3, 0x5b, 0x5f, 0xae, 0x71, 0x74, 0x41, 0x97, 0x5b, 0xa0, 0x64, 0x21, 0x4e, 0xc9, 0xd9, - 0xeb, 0x50, 0xa1, 0x1f, 0x7f, 0xd1, 0xf7, 0x9c, 0x83, 0xcd, 0x60, 0xcf, 0x41, 0x45, 0x1a, 0xa2, - 0x62, 0xe1, 0x72, 0xce, 0xa8, 0x4a, 0x3b, 0x55, 0x8c, 0x53, 0xb8, 0x7d, 0x09, 0xa6, 0xd9, 0x2d, - 0xaf, 0x93, 0x6c, 0x1a, 0x7b, 0x31, 0x77, 0xd1, 0xdb, 0xdf, 0x1e, 0x80, 0x13, 0x6b, 0xf5, 0xe5, - 0xba, 0x69, 0x91, 0xbc, 0x04, 0x63, 0xfc, 0xd8, 0xa7, 0x4b, 0xd9, 0xf1, 0x45, 0x7d, 0x75, 0x33, - 0xb1, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0x1e, 0x87, 0xb2, 0xf7, 0x6e, 0x90, 0xf5, 0x15, 0x5c, 0x7b, - 0xed, 0x06, 0xa6, 0xe5, 0x14, 0x4c, 0x25, 0x08, 0xce, 0x3a, 0x15, 0x58, 0x49, 0x11, 0xaf, 0xc2, - 0x84, 0x17, 0x37, 0x62, 0x6f, 0x2d, 0xa0, 0x7c, 0xc5, 0x69, 0xc8, 0x4d, 0x91, 0x8a, 0xfc, 0xb4, - 0xab, 0x0a, 0x8a, 0x33, 0xd8, 0x1a, 0x1f, 0x1f, 0x2c, 0x2c, 0x85, 0xe4, 0x3a, 0xa1, 0x53, 0x01, - 0xab, 0xc5, 0x46, 0x17, 0x33, 0xcf, 0x23, 0x21, 0x60, 0xf1, 0x01, 0xc7, 0x58, 0xc2, 0xd0, 0x65, - 0x38, 0xd1, 0xd8, 0x74, 0x5a, 0x8b, 0xed, 0x64, 0xb3, 0xea, 0xc5, 0x8d, 0x70, 0x9b, 0x44, 0x3b, - 0x4c, 0x00, 0x1e, 0x49, 0x6d, 0x5a, 0x0a, 0xb0, 0x7c, 0x65, 0xb1, 0x46, 0x31, 0x71, 0x67, 0x1d, - 0x53, 0x20, 0x81, 0x23, 0x10, 0x48, 0x16, 0x61, 0x52, 0xb6, 0x5a, 0x27, 0x31, 0x3b, 0x22, 0x46, - 0x59, 0x3f, 0x55, 0x2c, 0x8f, 0x28, 0x56, 0xbd, 0xcc, 0xe2, 0xdb, 0xef, 0x40, 0x45, 0x79, 0xca, - 0x49, 0x07, 0x51, 0xab, 0x87, 0x83, 0x68, 0x3e, 0x73, 0x97, 0xb6, 0xf3, 0x72, 0x57, 0xdb, 0xf9, - 0x3f, 0xb1, 0x20, 0x75, 0xf5, 0x41, 0x18, 0x2a, 0xad, 0x90, 0xdd, 0xb3, 0x45, 0xf2, 0x42, 0xfb, - 0xa9, 0x9c, 0x3d, 0xcf, 0x79, 0x0e, 0x9f, 0x90, 0x9a, 0xac, 0x8b, 0x53, 0x32, 0xe8, 0x1a, 0x0c, - 0xb7, 0x22, 0x52, 0x4f, 0x58, 0x74, 0x47, 0x1f, 0x14, 0xf9, 0x42, 0xe0, 0x35, 0xb1, 0x24, 0x61, - 0xff, 0x0b, 0x0b, 0xe0, 0x9a, 0xb7, 0xe5, 0x25, 0xd8, 0x09, 0x9a, 0xe4, 0x18, 0x14, 0xeb, 0x1b, - 0x30, 0x10, 0xb7, 0x48, 0xa3, 0xd8, 0x4d, 0x69, 0xda, 0xb3, 0x7a, 0x8b, 0x34, 0xd2, 0xcf, 0x41, - 0xff, 0x61, 0x46, 0xc7, 0xfe, 0x1e, 0xc0, 0x44, 0x8a, 0x46, 0x95, 0x1b, 0xf4, 0xbc, 0x11, 0xd6, - 0xf0, 0x68, 0x26, 0xac, 0xa1, 0xc2, 0xb0, 0xb5, 0x48, 0x86, 0x04, 0xca, 0x5b, 0xce, 0x03, 0xa1, - 0x4b, 0xbd, 0x54, 0xb4, 0x43, 0xb4, 0xa5, 0xf9, 0xeb, 0xce, 0x03, 0x2e, 0xba, 0x3e, 0x27, 0x17, - 0xd2, 0x75, 0xe7, 0xc1, 0x3e, 0xbf, 0x0f, 0x65, 0xdc, 0x89, 0x2a, 0x6f, 0x5f, 0xf8, 0xe3, 0xf4, - 0x3f, 0x3b, 0x86, 0x68, 0x73, 0xac, 0x55, 0x2f, 0x10, 0xa6, 0xe0, 0x3e, 0x5b, 0xf5, 0x82, 0x6c, - 0xab, 0x5e, 0x50, 0xa0, 0x55, 0x8f, 0xf9, 0xff, 0x0e, 0x8b, 0x1b, 0x14, 0xe6, 0x3c, 0x39, 0x7a, - 0xf1, 0xa3, 0x7d, 0x35, 0x2d, 0xae, 0x62, 0x78, 0xf3, 0x0b, 0x52, 0x5e, 0x17, 0xa5, 0xb9, 0x5d, - 0x90, 0x4d, 0xa3, 0xbf, 0x6b, 0xc1, 0x84, 0xf8, 0x8d, 0xc9, 0xbb, 0x6d, 0x12, 0x27, 0x42, 0x2e, - 0xf8, 0xc4, 0x61, 0x7a, 0x23, 0x48, 0xf0, 0x4e, 0x7d, 0x44, 0xb2, 0x5f, 0x13, 0x98, 0xdb, 0xb7, - 0x4c, 0x7f, 0xd0, 0xf7, 0x2c, 0x98, 0xde, 0x72, 0x1e, 0xf0, 0x16, 0x79, 0x19, 0x76, 0x12, 0x2f, - 0x14, 0x0e, 0xa2, 0xab, 0xfd, 0xae, 0x93, 0x0e, 0x42, 0xbc, 0xbb, 0xd2, 0xf7, 0x6b, 0xba, 0x1b, - 0x4a, 0x6e, 0xa7, 0xbb, 0xf6, 0x70, 0x76, 0x03, 0x46, 0xe4, 0xc2, 0xec, 0xa2, 0x29, 0x55, 0x75, - 0xf1, 0x27, 0xc7, 0x2e, 0x31, 0x2f, 0xad, 0x8b, 0xf3, 0xaf, 0xb5, 0x9d, 0x20, 0xf1, 0x92, 0x1d, - 0x4d, 0xb3, 0x62, 0xed, 0x88, 0xa5, 0x78, 0xa4, 0xed, 0xbc, 0x03, 0x63, 0xfa, 0xba, 0x3b, 0xd2, - 0xb6, 0xde, 0x85, 0x93, 0x5d, 0x56, 0xd5, 0x91, 0x36, 0x79, 0x1f, 0x1e, 0xed, 0xb9, 0x3e, 0x8e, - 0xb2, 0x61, 0xfb, 0x37, 0x2c, 0x9d, 0x75, 0x1e, 0x83, 0xdd, 0xea, 0xba, 0x69, 0xb7, 0x3a, 0x57, - 0x74, 0x0f, 0xf5, 0x30, 0x5e, 0x6d, 0xe8, 0xdd, 0xa7, 0x47, 0x02, 0x5a, 0x87, 0x21, 0x9f, 0x96, - 0xc8, 0x6b, 0xc3, 0xf3, 0xfd, 0xec, 0xd2, 0x54, 0x02, 0x63, 0xe5, 0x31, 0x16, 0xb4, 0xec, 0xef, - 0x59, 0x30, 0xf0, 0xe7, 0x18, 0x74, 0xd5, 0x41, 0x5a, 0x64, 0x21, 0x98, 0xc7, 0xce, 0xfd, 0x95, - 0x07, 0x09, 0x09, 0x62, 0x26, 0xc6, 0xf7, 0x72, 0x7c, 0x18, 0xa5, 0x4d, 0x49, 0x3f, 0x96, 0x57, - 0x60, 0xdc, 0x77, 0xee, 0x12, 0x5f, 0xda, 0xdc, 0xb3, 0x4a, 0xef, 0x35, 0x1d, 0x88, 0x4d, 0x5c, - 0x5a, 0x79, 0x43, 0xbf, 0x92, 0x10, 0x42, 0x92, 0xaa, 0x6c, 0xdc, 0x57, 0x60, 0x13, 0x97, 0x6a, - 0x5d, 0xf7, 0x9d, 0xa4, 0xb1, 0x29, 0x14, 0x62, 0xd5, 0xdd, 0x3b, 0xb4, 0x10, 0x73, 0x18, 0x15, - 0xf6, 0xe4, 0x8a, 0xbd, 0x4d, 0x22, 0x26, 0xec, 0x71, 0xa1, 0x5a, 0x09, 0x7b, 0xd8, 0x04, 0xe3, - 0x2c, 0x3e, 0xfa, 0x18, 0x4c, 0xd0, 0xc9, 0x09, 0xdb, 0x89, 0xf4, 0xd2, 0x19, 0x64, 0x5e, 0x3a, - 0xcc, 0xc9, 0x7b, 0xdd, 0x80, 0xe0, 0x0c, 0xa6, 0xfd, 0x16, 0x9c, 0xbc, 0x16, 0x3a, 0xee, 0x92, - 0xe3, 0x3b, 0x41, 0x83, 0x44, 0x6b, 0x41, 0x33, 0xd7, 0x03, 0x40, 0xbf, 0xa5, 0x2f, 0xe5, 0xdd, - 0xd2, 0xdb, 0x11, 0x20, 0xbd, 0x01, 0xe1, 0x5f, 0xf6, 0x26, 0x0c, 0x7b, 0xbc, 0x29, 0xb1, 0x6c, - 0x2f, 0xe4, 0x49, 0xd0, 0x1d, 0x7d, 0xd4, 0xfc, 0xa5, 0x78, 0x01, 0x96, 0x24, 0xa9, 0xbe, 0xd5, - 0x4d, 0xe4, 0xce, 0x57, 0x94, 0xed, 0xbf, 0x6a, 0xc1, 0xe4, 0x8d, 0x4c, 0x54, 0xf0, 0xd3, 0x30, - 0xc4, 0xb3, 0x54, 0x64, 0xad, 0x54, 0x75, 0x56, 0x8a, 0x05, 0xf4, 0xa1, 0x1b, 0x49, 0x7e, 0xb1, - 0x04, 0x15, 0xe6, 0xa9, 0xdc, 0xa2, 0xba, 0xd3, 0xd1, 0x8b, 0xa9, 0xd7, 0x0d, 0x31, 0x35, 0x47, - 0x51, 0x57, 0x1d, 0xeb, 0x25, 0xa5, 0xa2, 0x5b, 0x2a, 0x5a, 0xb6, 0x90, 0x8e, 0x9e, 0x12, 0xe4, - 0x11, 0x95, 0x13, 0x66, 0x70, 0xad, 0x8c, 0xa4, 0x65, 0xf7, 0xe6, 0x0a, 0xf7, 0x7d, 0x77, 0x6f, - 0xae, 0x7a, 0xd6, 0x83, 0x39, 0xd5, 0xb4, 0xce, 0x33, 0xf6, 0xfd, 0xb3, 0xcc, 0xff, 0xd4, 0xf1, - 0xbd, 0xcf, 0x12, 0x15, 0x74, 0x3e, 0x27, 0xfc, 0x49, 0x45, 0xe9, 0x3e, 0xe3, 0x33, 0xe2, 0x1f, - 0xcf, 0x29, 0x90, 0x56, 0xb1, 0xaf, 0xc0, 0x64, 0x66, 0xea, 0xd0, 0x4b, 0x30, 0xd8, 0xda, 0x74, - 0x62, 0x92, 0x71, 0x05, 0x1a, 0xac, 0xd1, 0xc2, 0xfd, 0xdd, 0xb9, 0x09, 0x55, 0x81, 0x95, 0x60, - 0x8e, 0x6d, 0x7f, 0xb1, 0x04, 0x03, 0x37, 0x42, 0xf7, 0x38, 0x96, 0xda, 0x15, 0x63, 0xa9, 0x3d, - 0x9d, 0x9f, 0x91, 0xa4, 0xe7, 0x2a, 0xab, 0x65, 0x56, 0xd9, 0xb9, 0x02, 0xb4, 0x0e, 0x5e, 0x60, - 0x5b, 0x30, 0xca, 0x32, 0x9e, 0x08, 0x5f, 0xa8, 0x17, 0x0c, 0xcd, 0x6a, 0x2e, 0xa3, 0x59, 0x4d, - 0x6a, 0xa8, 0x9a, 0x7e, 0xf5, 0x0c, 0x0c, 0x0b, 0xdf, 0x9b, 0xac, 0xf7, 0xad, 0xc0, 0xc5, 0x12, - 0x6e, 0xff, 0xf3, 0x32, 0x18, 0x19, 0x56, 0xd0, 0x6f, 0x59, 0x30, 0x1f, 0xf1, 0x48, 0x26, 0xb7, - 0xda, 0x8e, 0xbc, 0xa0, 0x59, 0x6f, 0x6c, 0x12, 0xb7, 0xed, 0x7b, 0x41, 0x73, 0xad, 0x19, 0x84, - 0xaa, 0x78, 0xe5, 0x01, 0x69, 0xb4, 0x99, 0xa9, 0xbb, 0x70, 0x62, 0x17, 0x75, 0xef, 0x7c, 0x71, - 0x6f, 0x77, 0x6e, 0x1e, 0xf7, 0xd5, 0x0a, 0xee, 0xb3, 0x57, 0xe8, 0x0f, 0x2d, 0x58, 0xe0, 0x39, - 0x46, 0x8a, 0x8f, 0xa4, 0x90, 0x46, 0x5a, 0x93, 0x44, 0x53, 0x72, 0xeb, 0x24, 0xda, 0x5a, 0x7a, - 0x59, 0x4c, 0xf2, 0x42, 0xad, 0xbf, 0x56, 0x71, 0xbf, 0xdd, 0xb4, 0xff, 0x75, 0x19, 0xc6, 0xe9, - 0x7c, 0xa6, 0x79, 0x05, 0x5e, 0x32, 0x96, 0xc9, 0x13, 0x99, 0x65, 0x72, 0xc2, 0x40, 0x7e, 0x38, - 0x29, 0x05, 0x62, 0x38, 0xe1, 0x3b, 0x71, 0x72, 0x85, 0x38, 0x51, 0x72, 0x97, 0x38, 0xec, 0x7a, - 0x37, 0xeb, 0x3a, 0x52, 0xe0, 0xc6, 0x58, 0xd9, 0xbe, 0xae, 0x65, 0x89, 0xe1, 0x4e, 0xfa, 0x68, - 0x1b, 0x10, 0xbb, 0x4a, 0x8e, 0x9c, 0x20, 0xe6, 0x63, 0xf1, 0x84, 0x69, 0xbc, 0xbf, 0x56, 0x67, - 0x45, 0xab, 0xe8, 0x5a, 0x07, 0x35, 0xdc, 0xa5, 0x05, 0xcd, 0x59, 0x60, 0xb0, 0xa8, 0xb3, 0xc0, - 0x50, 0x8e, 0xdb, 0xfb, 0x97, 0x2c, 0x38, 0x49, 0x3f, 0x8b, 0xe9, 0x22, 0x1d, 0xa3, 0x10, 0x26, - 0xe9, 0xb2, 0xf3, 0x49, 0x22, 0xcb, 0xc4, 0xfe, 0xca, 0x91, 0xac, 0x4d, 0x3a, 0xa9, 0xf8, 0x76, - 0xd5, 0x24, 0x86, 0xb3, 0xd4, 0xed, 0x6f, 0x5a, 0xc0, 0x9c, 0x16, 0x8f, 0xe1, 0x30, 0xbb, 0x6c, - 0x1e, 0x66, 0x76, 0x3e, 0xc7, 0xe8, 0x71, 0x8e, 0xbd, 0x08, 0x53, 0x14, 0x5a, 0x8b, 0xc2, 0x07, - 0x3b, 0x52, 0xd0, 0xce, 0xb7, 0x66, 0x7f, 0xa9, 0xc4, 0xb7, 0x8d, 0x0a, 0xc9, 0x44, 0x5f, 0xb6, - 0x60, 0xa4, 0xe1, 0xb4, 0x9c, 0x06, 0xcf, 0x4f, 0x55, 0xc0, 0x3a, 0x63, 0xd4, 0x9f, 0x5f, 0x16, - 0x75, 0xb9, 0x65, 0xe1, 0xc3, 0x72, 0xe8, 0xb2, 0x38, 0xd7, 0x9a, 0xa0, 0x1a, 0x9f, 0xbd, 0x07, - 0xe3, 0x06, 0xb1, 0x23, 0x55, 0x43, 0xbf, 0x6c, 0x71, 0xa6, 0xaf, 0x54, 0x85, 0xfb, 0x70, 0x22, - 0xd0, 0xfe, 0x53, 0x76, 0x26, 0x25, 0xe3, 0xf9, 0xe2, 0x6c, 0x9d, 0x71, 0x41, 0xcd, 0x41, 0x33, - 0x43, 0x10, 0x77, 0xb6, 0x61, 0xff, 0xb2, 0x05, 0x8f, 0xe8, 0x88, 0x5a, 0x0c, 0x6d, 0x9e, 0xdd, - 0xb8, 0x0a, 0x23, 0x61, 0x8b, 0x44, 0x4e, 0xaa, 0x16, 0x9d, 0x93, 0xf3, 0x7f, 0x53, 0x94, 0xef, - 0xef, 0xce, 0x4d, 0xeb, 0xd4, 0x65, 0x39, 0x56, 0x35, 0x91, 0x0d, 0x43, 0x6c, 0x5e, 0x62, 0x11, - 0xfd, 0xcc, 0xf2, 0x35, 0xb1, 0x7b, 0xa9, 0x18, 0x0b, 0x88, 0xfd, 0x37, 0x2c, 0xbe, 0xdc, 0xf4, - 0xae, 0xa3, 0xcf, 0xc1, 0xd4, 0x16, 0xd5, 0xa0, 0x56, 0x1e, 0xb4, 0x22, 0x6e, 0xf5, 0x96, 0x33, - 0xf6, 0x52, 0xf1, 0x19, 0xd3, 0x86, 0xbb, 0x34, 0x23, 0x7a, 0x3f, 0x75, 0x3d, 0x43, 0x16, 0x77, - 0x34, 0x64, 0xff, 0xfd, 0x12, 0xdf, 0xb3, 0x4c, 0x86, 0x7b, 0x06, 0x86, 0x5b, 0xa1, 0xbb, 0xbc, - 0x56, 0xc5, 0x62, 0xae, 0x14, 0xd3, 0xa9, 0xf1, 0x62, 0x2c, 0xe1, 0xe8, 0x22, 0x00, 0x79, 0x90, - 0x90, 0x28, 0x70, 0x7c, 0x75, 0x93, 0xae, 0x44, 0xa5, 0x15, 0x05, 0xc1, 0x1a, 0x16, 0xad, 0xd3, - 0x8a, 0xc2, 0x6d, 0xcf, 0x65, 0xc1, 0x1f, 0x65, 0xb3, 0x4e, 0x4d, 0x41, 0xb0, 0x86, 0x45, 0xf5, - 0xd6, 0x76, 0x10, 0xf3, 0x63, 0xcc, 0xb9, 0x2b, 0xd2, 0x0b, 0x8d, 0xa4, 0x7a, 0xeb, 0x2d, 0x1d, - 0x88, 0x4d, 0x5c, 0x74, 0x15, 0x86, 0x12, 0x87, 0xdd, 0x0f, 0x0f, 0x16, 0x71, 0xb6, 0x59, 0xa7, - 0xb8, 0x7a, 0x3e, 0x27, 0x5a, 0x15, 0x0b, 0x12, 0xf6, 0x7f, 0xaa, 0x00, 0xa4, 0x52, 0x17, 0xfa, - 0x62, 0xe7, 0x86, 0xff, 0x48, 0x51, 0x91, 0xed, 0xe1, 0xed, 0x76, 0xf4, 0x55, 0x0b, 0x46, 0x1d, - 0xdf, 0x0f, 0x1b, 0x4e, 0xc2, 0xa6, 0xa7, 0x54, 0x94, 0xf5, 0x88, 0x9e, 0x2c, 0xa6, 0x75, 0x79, - 0x67, 0x5e, 0x90, 0x77, 0xb6, 0x1a, 0x24, 0xb7, 0x3f, 0x7a, 0x17, 0xd0, 0x87, 0xa5, 0xd4, 0xce, - 0xbf, 0xf0, 0x6c, 0x56, 0x6a, 0xaf, 0x30, 0x86, 0xab, 0x09, 0xec, 0xe8, 0x2d, 0x23, 0x1d, 0xcf, - 0x40, 0x91, 0x08, 0x5e, 0x43, 0x0e, 0xc9, 0xcb, 0xc4, 0x83, 0xde, 0xd0, 0xbd, 0xd2, 0x07, 0x8b, - 0x84, 0xc8, 0x6b, 0xe2, 0x70, 0x8e, 0x47, 0x7a, 0x02, 0x93, 0xae, 0x79, 0xf2, 0x0a, 0xcf, 0xba, - 0x0b, 0xf9, 0x2d, 0x64, 0x8e, 0xec, 0xf4, 0xac, 0xcd, 0x00, 0x70, 0xb6, 0x09, 0xf4, 0x06, 0x8f, - 0x19, 0x58, 0x0b, 0x36, 0x42, 0xe1, 0x5d, 0x77, 0xbe, 0xc0, 0x37, 0xdf, 0x89, 0x13, 0xb2, 0x45, - 0xeb, 0xa4, 0x87, 0xeb, 0x0d, 0x41, 0x05, 0x2b, 0x7a, 0x68, 0x1d, 0x86, 0x58, 0xc0, 0x56, 0x3c, - 0x33, 0x52, 0xc4, 0x12, 0x67, 0xc6, 0x29, 0xa7, 0xfb, 0x87, 0xfd, 0x8d, 0xb1, 0xa0, 0x85, 0xae, - 0xc8, 0x4c, 0x05, 0xf1, 0x5a, 0x70, 0x2b, 0x26, 0x2c, 0x53, 0x41, 0x65, 0xe9, 0x43, 0x69, 0xea, - 0x01, 0x5e, 0xde, 0x35, 0x21, 0xa1, 0x51, 0x93, 0x0a, 0x36, 0xe2, 0xbf, 0xcc, 0x73, 0x38, 0x03, - 0x45, 0x3a, 0x6a, 0x66, 0x45, 0x4c, 0x27, 0xfb, 0xb6, 0x49, 0x0c, 0x67, 0xa9, 0x1f, 0xeb, 0x91, - 0x3a, 0x1b, 0xc0, 0x54, 0x76, 0x53, 0x1e, 0xe9, 0x11, 0xfe, 0xe3, 0x01, 0x98, 0x30, 0x17, 0x07, - 0x5a, 0x80, 0x8a, 0x20, 0xa2, 0xf2, 0x9e, 0xa9, 0x3d, 0x70, 0x5d, 0x02, 0x70, 0x8a, 0xc3, 0x32, - 0xc0, 0xb1, 0xea, 0x9a, 0x5f, 0x55, 0x9a, 0x01, 0x4e, 0x41, 0xb0, 0x86, 0x45, 0x25, 0xe1, 0xbb, - 0x61, 0x98, 0xa8, 0x93, 0x40, 0xad, 0x9b, 0x25, 0x56, 0x8a, 0x05, 0x94, 0x9e, 0x00, 0xf7, 0xe8, - 0xc7, 0xf4, 0x4d, 0xab, 0xa2, 0x3a, 0x01, 0xae, 0xea, 0x40, 0x6c, 0xe2, 0xd2, 0x13, 0x2d, 0x8c, - 0xd9, 0x42, 0x14, 0xf2, 0x76, 0xea, 0xa7, 0x56, 0xe7, 0x41, 0x8c, 0x12, 0x8e, 0x3e, 0x05, 0x8f, - 0xa8, 0x98, 0x43, 0xcc, 0xad, 0xb4, 0xb2, 0xc5, 0x21, 0x43, 0x65, 0x7e, 0x64, 0xb9, 0x3b, 0x1a, - 0xee, 0x55, 0x1f, 0xbd, 0x0a, 0x13, 0x42, 0x56, 0x96, 0x14, 0x87, 0x4d, 0x77, 0x83, 0xab, 0x06, - 0x14, 0x67, 0xb0, 0x51, 0x15, 0xa6, 0x68, 0x09, 0x13, 0x52, 0x25, 0x05, 0x1e, 0x3b, 0xa9, 0x8e, - 0xfa, 0xab, 0x19, 0x38, 0xee, 0xa8, 0x81, 0x16, 0x61, 0x92, 0x0b, 0x2b, 0x54, 0x31, 0x64, 0xdf, - 0x41, 0xb8, 0xc4, 0xaa, 0x8d, 0x70, 0xd3, 0x04, 0xe3, 0x2c, 0x3e, 0xba, 0x04, 0x63, 0x4e, 0xd4, - 0xd8, 0xf4, 0x12, 0xd2, 0x48, 0xda, 0x11, 0xcf, 0x03, 0xa2, 0xf9, 0x6b, 0x2c, 0x6a, 0x30, 0x6c, - 0x60, 0xda, 0x9f, 0x85, 0x93, 0x5d, 0xfc, 0xef, 0xe9, 0xc2, 0x71, 0x5a, 0x9e, 0x1c, 0x53, 0xc6, - 0xe3, 0x6c, 0xb1, 0xb6, 0x26, 0x47, 0xa3, 0x61, 0xd1, 0xd5, 0xc9, 0xcc, 0xd3, 0x5a, 0x5a, 0x52, - 0xb5, 0x3a, 0x57, 0x25, 0x00, 0xa7, 0x38, 0xf6, 0x9f, 0x55, 0x40, 0xb3, 0xde, 0x14, 0xf0, 0x32, - 0xba, 0x04, 0x63, 0x32, 0xd3, 0xae, 0x96, 0xe1, 0x52, 0x0d, 0xf3, 0xb2, 0x06, 0xc3, 0x06, 0x26, - 0xed, 0x5b, 0x20, 0x6d, 0x52, 0x59, 0xff, 0x36, 0x65, 0xac, 0xc2, 0x29, 0x0e, 0x3a, 0x0f, 0x23, - 0x31, 0xf1, 0x37, 0xae, 0x79, 0xc1, 0x3d, 0xb1, 0xb0, 0x15, 0x67, 0xae, 0x8b, 0x72, 0xac, 0x30, - 0xd0, 0x12, 0x94, 0xdb, 0x9e, 0x2b, 0x96, 0xb2, 0x14, 0x1b, 0xca, 0xb7, 0xd6, 0xaa, 0xfb, 0xbb, - 0x73, 0x4f, 0xf4, 0x4a, 0x60, 0x4c, 0xf5, 0xf3, 0x78, 0x9e, 0x6e, 0x3f, 0x5a, 0xb9, 0x9b, 0x9d, - 0x7e, 0xa8, 0x4f, 0x3b, 0xfd, 0x45, 0x00, 0x31, 0x6a, 0xb9, 0x96, 0xcb, 0xe9, 0x57, 0xbb, 0xac, - 0x20, 0x58, 0xc3, 0xa2, 0x5a, 0x7e, 0x23, 0x22, 0x8e, 0x54, 0x84, 0xb9, 0x5f, 0xf8, 0xc8, 0xe1, - 0xb5, 0xfc, 0xe5, 0x2c, 0x31, 0xdc, 0x49, 0x1f, 0x85, 0x70, 0xc2, 0x15, 0x81, 0xad, 0x69, 0xa3, - 0x95, 0xfe, 0x9d, 0xd1, 0x99, 0x4b, 0x4d, 0x96, 0x10, 0xee, 0xa4, 0x8d, 0x3e, 0x03, 0xb3, 0xb2, - 0xb0, 0x33, 0xaa, 0x98, 0x6d, 0x97, 0xf2, 0xd2, 0x99, 0xbd, 0xdd, 0xb9, 0xd9, 0x6a, 0x4f, 0x2c, - 0x7c, 0x00, 0x05, 0xf4, 0x26, 0x0c, 0xb1, 0x7b, 0x9d, 0x78, 0x66, 0x94, 0x9d, 0x78, 0x2f, 0x16, - 0x09, 0x69, 0xa0, 0xab, 0x7e, 0x9e, 0xdd, 0x0e, 0x09, 0x67, 0xdd, 0xf4, 0xb2, 0x8c, 0x15, 0x62, - 0x41, 0x13, 0xb5, 0x60, 0xd4, 0x09, 0x82, 0x30, 0x71, 0xb8, 0x20, 0x36, 0x56, 0x44, 0x96, 0xd4, - 0x9a, 0x58, 0x4c, 0xeb, 0xf2, 0x76, 0x94, 0xff, 0x9f, 0x06, 0xc1, 0x7a, 0x13, 0xe8, 0x3e, 0x4c, - 0x86, 0xf7, 0x29, 0xc3, 0x94, 0x57, 0x1b, 0xf1, 0xcc, 0xb8, 0x39, 0xb0, 0x1c, 0x43, 0xad, 0x51, - 0x59, 0xe3, 0x64, 0x26, 0x51, 0x9c, 0x6d, 0x05, 0xcd, 0x1b, 0xe6, 0xea, 0x89, 0xd4, 0x25, 0x3d, - 0x35, 0x57, 0xeb, 0xd6, 0x69, 0x16, 0xb9, 0xce, 0xdd, 0x50, 0x19, 0x47, 0x98, 0xcc, 0x44, 0xae, - 0xa7, 0x20, 0xac, 0xe3, 0xcd, 0x7e, 0x14, 0x46, 0xb5, 0x89, 0xef, 0xc7, 0xf7, 0x79, 0xf6, 0x55, - 0x98, 0xca, 0x4e, 0x68, 0x5f, 0xbe, 0xd3, 0xff, 0xab, 0x04, 0x93, 0x5d, 0xee, 0x8d, 0xee, 0x79, - 0xcc, 0x7f, 0xdf, 0x60, 0x7d, 0x57, 0xbd, 0xc0, 0xc5, 0x0c, 0x62, 0x32, 0xb0, 0x52, 0x01, 0x06, - 0x26, 0xb9, 0x69, 0xb9, 0x27, 0x37, 0x15, 0x4c, 0x6b, 0xe0, 0xbd, 0x30, 0x2d, 0xf3, 0x9c, 0x18, - 0x2c, 0x74, 0x4e, 0x3c, 0x04, 0x46, 0x67, 0x1c, 0x35, 0xc3, 0x05, 0x8e, 0x9a, 0x6f, 0x94, 0x60, - 0x2a, 0xf5, 0x13, 0x17, 0xe9, 0xb7, 0x8f, 0xfe, 0x1a, 0x62, 0xdd, 0xb8, 0x86, 0xc8, 0xcb, 0xae, - 0x9d, 0xe9, 0x5f, 0xcf, 0x2b, 0x89, 0x37, 0x33, 0x57, 0x12, 0x2f, 0xf6, 0x49, 0xf7, 0xe0, 0xeb, - 0x89, 0xef, 0x96, 0xe0, 0x54, 0xb6, 0xca, 0xb2, 0xef, 0x78, 0x5b, 0xc7, 0x30, 0x5f, 0x9f, 0x32, - 0xe6, 0xeb, 0xe5, 0xfe, 0xc6, 0xc5, 0x3a, 0xd9, 0x73, 0xd2, 0x9c, 0xcc, 0xa4, 0x7d, 0xf4, 0x30, - 0xc4, 0x0f, 0x9e, 0xb9, 0xdf, 0xb3, 0xe0, 0xd1, 0xae, 0xf5, 0x8e, 0xc1, 0xf0, 0xfa, 0xba, 0x69, - 0x78, 0x7d, 0xe1, 0x10, 0xa3, 0xeb, 0x61, 0x89, 0xfd, 0x95, 0x72, 0x8f, 0x51, 0x31, 0xd3, 0xd4, - 0x4d, 0x18, 0x75, 0x1a, 0x0d, 0x12, 0xc7, 0xd7, 0x43, 0x57, 0xe5, 0xc0, 0x7a, 0x9e, 0x9d, 0x2d, - 0x69, 0xf1, 0xfe, 0xee, 0xdc, 0x6c, 0x96, 0x44, 0x0a, 0xc6, 0x3a, 0x05, 0x33, 0x3b, 0x5f, 0xe9, - 0x88, 0xb2, 0xf3, 0x5d, 0x04, 0xd8, 0x56, 0x5a, 0x6c, 0xd6, 0xe2, 0xa5, 0xe9, 0xb7, 0x1a, 0x16, - 0xfa, 0x8b, 0x4c, 0x22, 0xe4, 0x4e, 0x1a, 0x03, 0x66, 0xc8, 0x69, 0xce, 0xf7, 0xd3, 0x1d, 0x3e, - 0x78, 0x64, 0xab, 0xb2, 0x0e, 0x2a, 0x92, 0xe8, 0x13, 0x30, 0x15, 0xf3, 0xfc, 0x09, 0xcb, 0xbe, - 0x13, 0xb3, 0x00, 0x09, 0xc1, 0x4f, 0x59, 0x90, 0x6a, 0x3d, 0x03, 0xc3, 0x1d, 0xd8, 0xf6, 0x77, - 0xca, 0xf0, 0xc1, 0x03, 0x96, 0x2d, 0x5a, 0x34, 0x6f, 0x6d, 0x9f, 0xcb, 0xda, 0x7f, 0x66, 0xbb, - 0x56, 0x36, 0x0c, 0x42, 0x99, 0xaf, 0x5d, 0x7a, 0xcf, 0x5f, 0xfb, 0x6b, 0xba, 0xb5, 0x8e, 0xfb, - 0x6d, 0x5e, 0x3e, 0xf4, 0xc6, 0xfc, 0x49, 0x35, 0xd6, 0x7f, 0xc1, 0x82, 0x27, 0xba, 0x0e, 0xcb, - 0xf0, 0x12, 0x59, 0x80, 0x4a, 0x83, 0x16, 0x6a, 0xe1, 0x4c, 0x69, 0x1c, 0xa1, 0x04, 0xe0, 0x14, - 0xc7, 0x70, 0x06, 0x29, 0xe5, 0x3a, 0x83, 0xfc, 0xb6, 0x05, 0xd3, 0xd9, 0x4e, 0x1c, 0x03, 0xdf, - 0xaa, 0x9b, 0x7c, 0x6b, 0xbe, 0xbf, 0x8f, 0xdf, 0x83, 0x65, 0xfd, 0xb7, 0x09, 0x38, 0xdd, 0x71, - 0xea, 0xf1, 0x59, 0xfc, 0x39, 0x0b, 0x4e, 0x34, 0x99, 0xf4, 0xae, 0xc5, 0x8c, 0x89, 0x71, 0xe5, - 0x04, 0xda, 0x1d, 0x18, 0x6a, 0xc6, 0x75, 0x91, 0x0e, 0x14, 0xdc, 0xd9, 0x18, 0xfa, 0x8a, 0x05, - 0xd3, 0xce, 0xfd, 0xb8, 0xe3, 0x71, 0x18, 0xb1, 0x90, 0x5e, 0xcd, 0x31, 0x96, 0xe5, 0x3c, 0x2b, - 0xb3, 0x34, 0xb3, 0xb7, 0x3b, 0x37, 0xdd, 0x0d, 0x0b, 0x77, 0x6d, 0x95, 0x7e, 0xdf, 0x4d, 0x11, - 0x3b, 0x52, 0x2c, 0xfa, 0xb1, 0x5b, 0xa4, 0x09, 0x67, 0x6b, 0x12, 0x82, 0x15, 0x45, 0xf4, 0x36, - 0x54, 0x9a, 0x32, 0x4c, 0x2c, 0xcb, 0x36, 0x7b, 0x4c, 0x73, 0xb7, 0xa8, 0x32, 0xee, 0xbb, 0xaf, - 0x40, 0x38, 0x25, 0x8a, 0xae, 0x40, 0x39, 0xd8, 0x88, 0x45, 0x40, 0x76, 0x9e, 0x0f, 0x90, 0xe9, - 0x79, 0xc5, 0x63, 0x58, 0x6f, 0xac, 0xd6, 0x31, 0x25, 0x41, 0x29, 0x45, 0x77, 0x5d, 0x61, 0x25, - 0xce, 0xa1, 0x84, 0x97, 0xaa, 0x9d, 0x94, 0xf0, 0x52, 0x15, 0x53, 0x12, 0xa8, 0x06, 0x83, 0x2c, - 0x32, 0x45, 0x98, 0x80, 0x73, 0xa2, 0xf6, 0x3b, 0xe2, 0x6f, 0x78, 0x12, 0x49, 0x56, 0x8c, 0x39, - 0x21, 0xb4, 0x0e, 0x43, 0x0d, 0xf6, 0x0e, 0x82, 0xd0, 0xcd, 0xf3, 0xf2, 0x59, 0x74, 0xbc, 0x99, - 0xc0, 0xef, 0xbd, 0x78, 0x39, 0x16, 0xb4, 0x18, 0x55, 0xd2, 0xda, 0xdc, 0x88, 0x85, 0xf2, 0x9d, - 0x47, 0xb5, 0xe3, 0x45, 0x0b, 0x41, 0x95, 0x95, 0x63, 0x41, 0x0b, 0x55, 0xa1, 0xb4, 0xd1, 0x10, - 0x81, 0x2b, 0x39, 0xa6, 0x5f, 0x33, 0x20, 0x79, 0x69, 0x68, 0x6f, 0x77, 0xae, 0xb4, 0xba, 0x8c, - 0x4b, 0x1b, 0x0d, 0xf4, 0x3a, 0x0c, 0x6f, 0xf0, 0x10, 0x53, 0x91, 0x77, 0xf6, 0x42, 0x5e, 0x1c, - 0x6c, 0x47, 0x3c, 0x2a, 0x8f, 0xcf, 0x10, 0x00, 0x2c, 0xc9, 0xb1, 0x94, 0x7c, 0x2a, 0x68, 0x56, - 0x24, 0x9e, 0x9d, 0xef, 0x2f, 0xc8, 0x56, 0xe8, 0xa4, 0xaa, 0x14, 0x6b, 0x14, 0xe9, 0x9a, 0x77, - 0xe4, 0x93, 0x2e, 0x2c, 0xe9, 0x6c, 0xee, 0x9a, 0xef, 0xfa, 0x02, 0x0c, 0x5f, 0xf3, 0x0a, 0x84, - 0x53, 0xa2, 0xa8, 0x0d, 0xe3, 0xdb, 0x71, 0x6b, 0x93, 0xc8, 0xad, 0xcf, 0x32, 0xd1, 0x8e, 0x5e, - 0xfc, 0x78, 0x4e, 0x7a, 0x61, 0x51, 0xc5, 0x8b, 0x92, 0xb6, 0xe3, 0x77, 0x70, 0x30, 0x96, 0x03, - 0xed, 0xb6, 0x4e, 0x16, 0x9b, 0xad, 0xd0, 0x4f, 0xf2, 0x6e, 0x3b, 0xbc, 0xbb, 0x93, 0x10, 0x91, - 0xa9, 0x36, 0xe7, 0x93, 0xbc, 0xc6, 0x91, 0x3b, 0x3f, 0x89, 0x00, 0x60, 0x49, 0x4e, 0x4d, 0x19, - 0xe3, 0xc6, 0x53, 0x85, 0xa7, 0xac, 0x63, 0x0c, 0xe9, 0x94, 0x31, 0xee, 0x9b, 0x12, 0x65, 0x5c, - 0xb7, 0xb5, 0x19, 0x26, 0x61, 0x90, 0xe1, 0xfd, 0x27, 0x8a, 0x70, 0xdd, 0x5a, 0x97, 0x9a, 0x9d, - 0x5c, 0xb7, 0x1b, 0x16, 0xee, 0xda, 0x2a, 0x0a, 0x60, 0xa2, 0x15, 0x46, 0xc9, 0xfd, 0x30, 0x92, - 0xeb, 0x10, 0x15, 0xd2, 0x11, 0x8d, 0x3a, 0xa2, 0x6d, 0xe6, 0x86, 0x6b, 0x42, 0x70, 0x86, 0x3a, - 0xfd, 0x74, 0x71, 0xc3, 0xf1, 0xc9, 0xda, 0xcd, 0x99, 0x93, 0x45, 0x3e, 0x5d, 0x9d, 0x23, 0x77, - 0x7e, 0x3a, 0x01, 0xc0, 0x92, 0x9c, 0xfd, 0xcb, 0x43, 0x9d, 0x82, 0x03, 0x53, 0x0d, 0xfe, 0x7a, - 0xe7, 0x4d, 0xec, 0x27, 0xfa, 0xd7, 0x80, 0x1f, 0xe2, 0x9d, 0xec, 0x57, 0x2c, 0x38, 0xdd, 0xea, - 0x2a, 0x16, 0x88, 0xa3, 0xb7, 0x5f, 0x45, 0x9a, 0x4f, 0x8b, 0x4a, 0x28, 0xdd, 0x1d, 0x8e, 0x7b, - 0xb4, 0x99, 0x15, 0xa6, 0xcb, 0xef, 0x59, 0x98, 0xbe, 0x03, 0x23, 0x4c, 0xfa, 0x4b, 0xd3, 0xc5, - 0xf4, 0x99, 0x59, 0x85, 0x1d, 0xe2, 0xcb, 0x82, 0x04, 0x56, 0xc4, 0xe8, 0xc4, 0x3d, 0x9e, 0x1d, - 0x04, 0x26, 0x0c, 0x2c, 0xd2, 0x18, 0x72, 0x4d, 0x65, 0x55, 0xcc, 0xc4, 0xe3, 0xb5, 0x83, 0x90, - 0xf7, 0xf3, 0x10, 0xf0, 0xc1, 0x8d, 0xa1, 0x6a, 0x17, 0x55, 0x69, 0xc8, 0xbc, 0x76, 0xc9, 0x57, - 0x97, 0x8e, 0x57, 0xc4, 0xff, 0x07, 0x56, 0x17, 0x89, 0x94, 0xab, 0x65, 0x1f, 0x37, 0xd5, 0xb2, - 0xa7, 0xb3, 0x6a, 0x59, 0x87, 0x31, 0xc6, 0xd0, 0xc8, 0x8a, 0xa7, 0x61, 0x2d, 0x9a, 0x0f, 0xc7, - 0xf6, 0xe1, 0x6c, 0x1e, 0xbb, 0x63, 0xae, 0x58, 0xae, 0xba, 0x84, 0x4c, 0x5d, 0xb1, 0xdc, 0xb5, - 0x2a, 0x66, 0x90, 0xa2, 0x29, 0x15, 0xec, 0x9f, 0x2f, 0x41, 0xb9, 0x16, 0xba, 0xc7, 0x60, 0x5c, - 0xba, 0x6c, 0x18, 0x97, 0x9e, 0xca, 0x7d, 0xe2, 0xaf, 0xa7, 0x29, 0xe9, 0x66, 0xc6, 0x94, 0xf4, - 0x33, 0xf9, 0xa4, 0x0e, 0x36, 0x1c, 0x7d, 0xaf, 0x0c, 0xfa, 0x23, 0x85, 0xe8, 0x3f, 0x1c, 0xc6, - 0x43, 0xb7, 0x5c, 0xec, 0xdd, 0x42, 0xd1, 0x06, 0xf3, 0xe4, 0x92, 0x71, 0x7d, 0x3f, 0xb1, 0x8e, - 0xba, 0x77, 0x88, 0xd7, 0xdc, 0x4c, 0x88, 0x9b, 0x1d, 0xd8, 0xf1, 0x39, 0xea, 0xfe, 0xa9, 0x05, - 0x93, 0x99, 0xd6, 0x91, 0xdf, 0x2d, 0x20, 0xe8, 0x90, 0xe6, 0xa2, 0x13, 0xb9, 0x11, 0x44, 0xf3, - 0x00, 0xca, 0xea, 0x2f, 0x4d, 0x32, 0x4c, 0x3a, 0x55, 0xd7, 0x02, 0x31, 0xd6, 0x30, 0xd0, 0x4b, - 0x30, 0x9a, 0x84, 0xad, 0xd0, 0x0f, 0x9b, 0x3b, 0x57, 0x89, 0x4c, 0xf6, 0xa1, 0x6e, 0x4c, 0xd6, - 0x53, 0x10, 0xd6, 0xf1, 0xec, 0xef, 0x97, 0x21, 0xfb, 0xc4, 0xe5, 0xff, 0x5f, 0xa7, 0x3f, 0x39, - 0xeb, 0xf4, 0x0f, 0x2c, 0x98, 0xa2, 0xad, 0x33, 0xd7, 0x19, 0xe9, 0x50, 0xab, 0xde, 0x84, 0xb0, - 0x0e, 0x78, 0x13, 0xe2, 0x69, 0xca, 0xed, 0xdc, 0xb0, 0x9d, 0x08, 0x23, 0x92, 0xc6, 0xc4, 0x68, - 0x29, 0x16, 0x50, 0x81, 0x47, 0xa2, 0x48, 0x44, 0x1e, 0xe9, 0x78, 0x24, 0x8a, 0xb0, 0x80, 0xca, - 0x27, 0x23, 0x06, 0x7a, 0x3c, 0x19, 0xc1, 0xd2, 0x65, 0x09, 0x77, 0x0d, 0x21, 0x56, 0x68, 0xe9, - 0xb2, 0xa4, 0x1f, 0x47, 0x8a, 0x63, 0x7f, 0xab, 0x0c, 0x63, 0xb5, 0xd0, 0x4d, 0x3d, 0xe5, 0x5f, - 0x34, 0x3c, 0xe5, 0xcf, 0x66, 0x3c, 0xe5, 0xa7, 0x74, 0xdc, 0x87, 0xe3, 0x28, 0x2f, 0xd2, 0xaa, - 0xb1, 0x47, 0x4d, 0x0e, 0xe9, 0x24, 0x6f, 0xa4, 0x55, 0x53, 0x84, 0xb0, 0x49, 0xf7, 0xa7, 0xc9, - 0x39, 0xfe, 0xff, 0x58, 0x30, 0x51, 0x0b, 0x5d, 0xba, 0x40, 0x7f, 0x9a, 0x56, 0xa3, 0x9e, 0x8c, - 0x6d, 0xe8, 0x80, 0x64, 0x6c, 0xbf, 0x6a, 0xc1, 0x70, 0x2d, 0x74, 0x8f, 0xc1, 0xc0, 0xba, 0x6a, - 0x1a, 0x58, 0x9f, 0xc8, 0xe5, 0xbc, 0x3d, 0x6c, 0xaa, 0xdf, 0x29, 0xc3, 0x38, 0xed, 0x71, 0xd8, - 0x94, 0xdf, 0xcb, 0x98, 0x1b, 0xab, 0xc0, 0xdc, 0x50, 0x91, 0x30, 0xf4, 0xfd, 0xf0, 0x7e, 0xf6, - 0xdb, 0xad, 0xb2, 0x52, 0x2c, 0xa0, 0xe8, 0x3c, 0x8c, 0xb4, 0x22, 0xb2, 0xed, 0x85, 0xed, 0x38, - 0x1b, 0xc5, 0x58, 0x13, 0xe5, 0x58, 0x61, 0xa0, 0x17, 0x61, 0x2c, 0xf6, 0x82, 0x06, 0x91, 0xce, - 0x1c, 0x03, 0xcc, 0x99, 0x83, 0xe7, 0xbd, 0xd4, 0xca, 0xb1, 0x81, 0x85, 0xee, 0x40, 0x85, 0xfd, - 0x67, 0x3b, 0xa8, 0xff, 0x37, 0x1f, 0x78, 0x6e, 0x15, 0x49, 0x00, 0xa7, 0xb4, 0xd0, 0x45, 0x80, - 0x44, 0xba, 0x9d, 0xc4, 0x22, 0xb9, 0x8c, 0x92, 0x4b, 0x95, 0x43, 0x4a, 0x8c, 0x35, 0x2c, 0xf4, - 0x1c, 0x54, 0x12, 0xc7, 0xf3, 0xaf, 0x79, 0x01, 0x89, 0x85, 0xdb, 0x8e, 0xc8, 0x61, 0x2d, 0x0a, - 0x71, 0x0a, 0xa7, 0xe7, 0x3d, 0x8b, 0xa1, 0xe6, 0xef, 0xc9, 0x8c, 0x30, 0x6c, 0x76, 0xde, 0x5f, - 0x53, 0xa5, 0x58, 0xc3, 0xb0, 0x2f, 0xc1, 0xa9, 0x5a, 0xe8, 0xd6, 0xc2, 0x28, 0x59, 0x0d, 0xa3, - 0xfb, 0x4e, 0xe4, 0xca, 0xef, 0x37, 0x27, 0x53, 0x27, 0xd3, 0x33, 0x79, 0x90, 0xdb, 0x1c, 0x8d, - 0x54, 0xc8, 0x2f, 0xb0, 0x13, 0xbf, 0xcf, 0x10, 0x8c, 0xdf, 0x2f, 0x03, 0xaa, 0x31, 0xc7, 0x18, - 0xe3, 0xf9, 0xa1, 0x4d, 0x98, 0x88, 0xc9, 0x35, 0x2f, 0x68, 0x3f, 0x10, 0xa4, 0x8a, 0xc5, 0xbc, - 0xd4, 0x57, 0xf4, 0x3a, 0xdc, 0xd2, 0x61, 0x96, 0xe1, 0x0c, 0x5d, 0xfa, 0x65, 0xa3, 0x76, 0xb0, - 0x18, 0xdf, 0x8a, 0x49, 0x24, 0x9e, 0xdb, 0xf9, 0x28, 0xbb, 0x08, 0x94, 0x85, 0xfb, 0xbb, 0x73, - 0xe7, 0x72, 0xdc, 0x1b, 0x02, 0xef, 0x01, 0xc5, 0x5c, 0xab, 0xe2, 0x94, 0x16, 0x5d, 0x68, 0xec, - 0xcf, 0x8d, 0x30, 0xc0, 0x61, 0x98, 0xc8, 0xa5, 0xc9, 0x9e, 0x6a, 0xd0, 0xca, 0xb1, 0x81, 0x85, - 0x62, 0x40, 0x71, 0xbb, 0xd5, 0xf2, 0xd9, 0xbd, 0xa4, 0xe3, 0x5f, 0x8e, 0xc2, 0x76, 0x8b, 0xfb, - 0x52, 0x97, 0x97, 0x96, 0x29, 0x0f, 0xae, 0x77, 0x40, 0xf7, 0x77, 0xe7, 0x9e, 0xc9, 0xef, 0x20, - 0xc3, 0x5d, 0xab, 0xe2, 0x2e, 0xe4, 0x11, 0x86, 0xe1, 0x8d, 0x98, 0xfd, 0x16, 0x91, 0xda, 0x97, - 0x98, 0x21, 0xb4, 0xce, 0x8a, 0xfa, 0x23, 0x2f, 0x09, 0xd9, 0x9f, 0x67, 0xc7, 0x2c, 0x7b, 0x8d, - 0x25, 0x69, 0x47, 0x04, 0x6d, 0xc1, 0x78, 0x8b, 0x1d, 0xa5, 0x49, 0x14, 0xfa, 0x3e, 0x91, 0x52, - 0xee, 0xe1, 0x1c, 0x84, 0xf8, 0xfb, 0x0b, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0xff, 0xfb, 0x04, 0xe3, - 0x98, 0xe2, 0xd2, 0x79, 0x58, 0xb8, 0x02, 0x0b, 0x79, 0xf2, 0x43, 0x45, 0xde, 0x55, 0x4b, 0x4f, - 0x23, 0xe1, 0x58, 0x8c, 0x25, 0x15, 0xf4, 0x69, 0xe6, 0xe8, 0xce, 0xd9, 0x54, 0xf1, 0xd7, 0x22, - 0x39, 0xbe, 0xe1, 0xe4, 0x2e, 0x48, 0x60, 0x8d, 0x1c, 0xba, 0x06, 0xe3, 0xe2, 0xf1, 0x0e, 0x61, - 0x2c, 0x29, 0x1b, 0x8a, 0xfe, 0x38, 0xd6, 0x81, 0xfb, 0xd9, 0x02, 0x6c, 0x56, 0x46, 0x4d, 0x78, - 0x5c, 0x7b, 0x9c, 0xaa, 0x8b, 0x33, 0x1b, 0xe7, 0x7f, 0x4f, 0xec, 0xed, 0xce, 0x3d, 0xbe, 0x7e, - 0x10, 0x22, 0x3e, 0x98, 0x0e, 0xba, 0x09, 0xa7, 0x9c, 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, - 0xdf, 0x0b, 0x88, 0x19, 0xfb, 0xff, 0xe8, 0xde, 0xee, 0xdc, 0xa9, 0xc5, 0x6e, 0x08, 0xb8, 0x7b, - 0x3d, 0xf4, 0x71, 0xa8, 0xb8, 0x41, 0x2c, 0xe6, 0x60, 0xc8, 0x78, 0x8b, 0xad, 0x52, 0xbd, 0x51, - 0x57, 0xe3, 0x4f, 0xff, 0xe0, 0xb4, 0x02, 0x7a, 0x17, 0xc6, 0xf4, 0xe0, 0x22, 0xf1, 0x06, 0xe0, - 0xcb, 0x85, 0xb4, 0x78, 0x23, 0x22, 0x87, 0xdb, 0x11, 0x95, 0xd3, 0xa8, 0x11, 0xac, 0x63, 0x34, - 0x81, 0x3e, 0x09, 0x28, 0x26, 0xd1, 0xb6, 0xd7, 0x20, 0x8b, 0x0d, 0x96, 0xb2, 0x96, 0x59, 0x9a, - 0x46, 0x8c, 0xe8, 0x09, 0x54, 0xef, 0xc0, 0xc0, 0x5d, 0x6a, 0xa1, 0x2b, 0x94, 0xff, 0xe9, 0xa5, - 0xc2, 0xc7, 0x57, 0x8a, 0xa7, 0x33, 0x55, 0xd2, 0x8a, 0x48, 0xc3, 0x49, 0x88, 0x6b, 0x52, 0xc4, - 0x99, 0x7a, 0xf4, 0x74, 0x54, 0xaf, 0x12, 0x80, 0xe9, 0x99, 0xda, 0xf9, 0x32, 0x01, 0xd5, 0xf6, - 0x36, 0xc3, 0x38, 0xb9, 0x41, 0x92, 0xfb, 0x61, 0x74, 0x4f, 0xa4, 0xf9, 0x4a, 0xf3, 0xff, 0xa5, - 0x20, 0xac, 0xe3, 0x51, 0x49, 0x8e, 0x5d, 0xe1, 0xad, 0x55, 0xd9, 0xfd, 0xc8, 0x48, 0xba, 0x77, - 0xae, 0xf0, 0x62, 0x2c, 0xe1, 0x12, 0x75, 0xad, 0xb6, 0xcc, 0xee, 0x3a, 0x32, 0xa8, 0x6b, 0xb5, - 0x65, 0x2c, 0xe1, 0x28, 0xec, 0x7c, 0xf1, 0x6e, 0xa2, 0xc8, 0xbd, 0x53, 0xe7, 0x79, 0x52, 0xf0, - 0xd1, 0xbb, 0x07, 0x30, 0xa5, 0x5e, 0xdd, 0xe3, 0x99, 0xd0, 0xe2, 0x99, 0x49, 0xb6, 0x70, 0x0e, - 0x93, 0x50, 0x4d, 0x59, 0x17, 0xd7, 0x32, 0x34, 0x71, 0x47, 0x2b, 0x46, 0x0e, 0x8b, 0xa9, 0xdc, - 0x97, 0x26, 0x16, 0xa0, 0x12, 0xb7, 0xef, 0xba, 0xe1, 0x96, 0xe3, 0x05, 0xec, 0x42, 0x42, 0x7f, - 0xb7, 0x5f, 0x02, 0x70, 0x8a, 0x83, 0x6a, 0x30, 0xe2, 0x08, 0x45, 0x52, 0x5c, 0x1c, 0xe4, 0xc4, - 0xb8, 0x4b, 0xb5, 0x93, 0xdb, 0x78, 0xe5, 0x3f, 0xac, 0xa8, 0xa0, 0x57, 0x60, 0x5c, 0x84, 0x68, - 0x09, 0x57, 0xca, 0x93, 0xa6, 0x3b, 0x7f, 0x5d, 0x07, 0x62, 0x13, 0x17, 0x35, 0x61, 0x82, 0x52, - 0x49, 0x19, 0xe0, 0xcc, 0x74, 0x7f, 0x3c, 0x54, 0xcb, 0xe9, 0xad, 0x93, 0xc1, 0x19, 0xb2, 0xc8, - 0x85, 0xc7, 0x9c, 0x76, 0x12, 0x6e, 0xd1, 0x9d, 0x60, 0xee, 0x93, 0xf5, 0xf0, 0x1e, 0x09, 0x66, - 0x4e, 0xb1, 0x15, 0x78, 0x76, 0x6f, 0x77, 0xee, 0xb1, 0xc5, 0x03, 0xf0, 0xf0, 0x81, 0x54, 0xd0, - 0x5b, 0x30, 0x9a, 0x84, 0xbe, 0xf0, 0x90, 0x8e, 0x67, 0x4e, 0x17, 0xc9, 0xac, 0xb3, 0xae, 0x2a, - 0xe8, 0xc6, 0x14, 0x45, 0x04, 0xeb, 0x14, 0xd1, 0xdb, 0x30, 0x46, 0xbf, 0xfd, 0x75, 0xa7, 0xd5, - 0xf2, 0x82, 0x66, 0x3c, 0xf3, 0x48, 0x91, 0xd9, 0x52, 0x79, 0x23, 0xcd, 0xfd, 0xcb, 0x8a, 0x48, - 0x8c, 0x0d, 0x8a, 0xb3, 0x3f, 0x0b, 0x27, 0x3a, 0x98, 0x5e, 0x5f, 0x6e, 0xaa, 0xff, 0x71, 0x10, - 0x2a, 0xca, 0x72, 0x89, 0x16, 0x4c, 0x23, 0xf5, 0xa3, 0x59, 0x23, 0xf5, 0x08, 0x15, 0x14, 0x75, - 0xbb, 0xf4, 0x67, 0xba, 0xbc, 0xe4, 0xfe, 0x6c, 0xee, 0x2e, 0x2f, 0x1e, 0x39, 0xd6, 0xc7, 0x7b, - 0xf7, 0xa9, 0xf6, 0x3a, 0x70, 0xa0, 0xf6, 0x5a, 0xf0, 0x75, 0x42, 0xaa, 0xa7, 0xb6, 0x42, 0x77, - 0xad, 0x96, 0x7d, 0x7c, 0xab, 0x46, 0x0b, 0x31, 0x87, 0x31, 0xfd, 0x82, 0x9e, 0xda, 0x4c, 0xbf, - 0x18, 0x3e, 0xa4, 0x7e, 0x21, 0x09, 0xe0, 0x94, 0x16, 0xda, 0x86, 0x13, 0x0d, 0xf3, 0x2d, 0x35, - 0x15, 0x0f, 0xf6, 0x7c, 0x1f, 0x6f, 0x99, 0xb5, 0xb5, 0x87, 0x56, 0x96, 0xb3, 0xf4, 0x70, 0x67, - 0x13, 0xe8, 0x15, 0x18, 0x79, 0x37, 0x8c, 0xd9, 0xf5, 0x89, 0x38, 0xba, 0x64, 0xdc, 0xcd, 0xc8, - 0x6b, 0x37, 0xeb, 0xac, 0x7c, 0x7f, 0x77, 0x6e, 0xb4, 0x16, 0xba, 0xf2, 0x2f, 0x56, 0x15, 0xd0, - 0x17, 0x2c, 0x38, 0x65, 0xec, 0x64, 0xd5, 0x73, 0x38, 0x4c, 0xcf, 0x1f, 0x17, 0x2d, 0x9f, 0x5a, - 0xeb, 0x46, 0x13, 0x77, 0x6f, 0xca, 0xfe, 0xb7, 0xdc, 0x54, 0x2b, 0x8c, 0x37, 0x24, 0x6e, 0xfb, - 0xc7, 0xf1, 0xe8, 0xc1, 0x4d, 0xc3, 0xae, 0xf4, 0x10, 0x2e, 0x0b, 0xfe, 0xbd, 0xc5, 0x2e, 0x0b, - 0xd6, 0xc9, 0x56, 0xcb, 0x77, 0x92, 0xe3, 0xf0, 0x62, 0xfe, 0x34, 0x8c, 0x24, 0xa2, 0xb5, 0x62, - 0x2f, 0x36, 0x68, 0xdd, 0x63, 0x97, 0x28, 0xea, 0xe8, 0x93, 0xa5, 0x58, 0x11, 0xb4, 0xff, 0x25, - 0xff, 0x2a, 0x12, 0x72, 0x0c, 0x16, 0x91, 0x1b, 0xa6, 0x45, 0xe4, 0x99, 0xc2, 0x63, 0xe9, 0x61, - 0x19, 0xf9, 0xbe, 0x39, 0x02, 0xa6, 0xa1, 0xfc, 0xe4, 0xdc, 0x66, 0xd9, 0xbf, 0x64, 0xc1, 0x74, - 0x37, 0xb7, 0x02, 0x2a, 0xc2, 0x70, 0xfd, 0x48, 0xdd, 0xf3, 0xa9, 0x59, 0xbd, 0x2d, 0xca, 0xb1, - 0xc2, 0x28, 0x9c, 0x42, 0xbd, 0xbf, 0x14, 0x55, 0x37, 0xc1, 0x7c, 0x95, 0x0f, 0xbd, 0xca, 0x83, - 0x16, 0x2c, 0xf5, 0x6c, 0x5e, 0x7f, 0x01, 0x0b, 0xf6, 0xb7, 0x4b, 0x30, 0xcd, 0x8d, 0xed, 0x8b, - 0xdb, 0xa1, 0xe7, 0xd6, 0x42, 0x57, 0x84, 0x70, 0xb8, 0x30, 0xd6, 0xd2, 0xd4, 0xdb, 0x62, 0x29, - 0x6f, 0x74, 0x85, 0x38, 0x55, 0x29, 0xf4, 0x52, 0x6c, 0x50, 0xa5, 0xad, 0x90, 0x6d, 0xaf, 0xa1, - 0x6c, 0xb7, 0xa5, 0xbe, 0x4f, 0x06, 0xd5, 0xca, 0x8a, 0x46, 0x07, 0x1b, 0x54, 0x8f, 0xe0, 0xe5, - 0x13, 0xfb, 0xef, 0x59, 0xf0, 0x48, 0x8f, 0xb4, 0x38, 0xb4, 0xb9, 0xfb, 0xec, 0x82, 0x43, 0x3c, - 0xfb, 0xa8, 0x9a, 0xe3, 0xd7, 0x1e, 0x58, 0x40, 0xd1, 0x5d, 0x00, 0x7e, 0x6d, 0x41, 0xa5, 0xe9, - 0xec, 0x9d, 0x7a, 0xc1, 0xe4, 0x13, 0x5a, 0x5e, 0x02, 0xf5, 0xec, 0xbf, 0x46, 0xd5, 0xfe, 0x66, - 0x19, 0x06, 0xf9, 0xeb, 0xe2, 0x35, 0x18, 0xde, 0xe4, 0x69, 0x7a, 0xfb, 0xcb, 0x12, 0x9c, 0xaa, - 0x2f, 0xbc, 0x00, 0x4b, 0x32, 0xe8, 0x3a, 0x9c, 0xa4, 0x27, 0x8b, 0xe7, 0xf8, 0x55, 0xe2, 0x3b, - 0x3b, 0x52, 0x1f, 0xe6, 0xcf, 0x61, 0xc8, 0xbc, 0xed, 0x27, 0xd7, 0x3a, 0x51, 0x70, 0xb7, 0x7a, - 0xe8, 0xd5, 0x8e, 0xac, 0x7a, 0x3c, 0xfd, 0xb1, 0x92, 0x85, 0x0f, 0xce, 0xac, 0x47, 0x25, 0xf6, - 0x56, 0x87, 0xe6, 0xaf, 0x3d, 0xe2, 0x6c, 0x6a, 0xfb, 0x26, 0x2e, 0xf3, 0xa1, 0x68, 0x33, 0xdf, - 0x91, 0xf5, 0xcd, 0x88, 0xc4, 0x9b, 0xa1, 0xef, 0x8a, 0xf7, 0x47, 0x53, 0x1f, 0x8a, 0x0c, 0x1c, - 0x77, 0xd4, 0xa0, 0x54, 0x36, 0x1c, 0xcf, 0x6f, 0x47, 0x24, 0xa5, 0x32, 0x64, 0x52, 0x59, 0xcd, - 0xc0, 0x71, 0x47, 0x0d, 0xba, 0xb6, 0x4e, 0x89, 0x27, 0x2b, 0x65, 0x10, 0xb8, 0x60, 0x41, 0x9f, - 0x82, 0x61, 0x19, 0x0a, 0x50, 0x28, 0x57, 0x89, 0x70, 0x90, 0x50, 0xcf, 0x5f, 0x6a, 0xcf, 0xa3, - 0x89, 0x20, 0x00, 0x49, 0xef, 0x30, 0x4f, 0x23, 0xfe, 0x89, 0x05, 0x27, 0xbb, 0xb8, 0xb4, 0x71, - 0x96, 0xd6, 0xf4, 0xe2, 0x44, 0x3d, 0xce, 0xa0, 0xb1, 0x34, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x2d, - 0x9c, 0x69, 0x66, 0x19, 0xa5, 0x70, 0x75, 0x11, 0xd0, 0xfe, 0x18, 0x25, 0x3a, 0x0b, 0x03, 0xed, - 0x98, 0x44, 0xf2, 0x9d, 0x42, 0xc9, 0xe7, 0x6f, 0xc5, 0x24, 0xc2, 0x0c, 0x42, 0xc5, 0xd6, 0xa6, - 0xb2, 0x08, 0x6a, 0x62, 0x2b, 0xb3, 0xee, 0x61, 0x0e, 0xb3, 0xbf, 0x56, 0x86, 0xc9, 0x8c, 0x6b, - 0x2b, 0xed, 0xc8, 0x56, 0x18, 0x78, 0x49, 0xa8, 0xf2, 0xc7, 0xf1, 0xa7, 0xd1, 0x48, 0x6b, 0xf3, - 0xba, 0x28, 0xc7, 0x0a, 0x03, 0x3d, 0x2d, 0x9f, 0xa6, 0xcd, 0x3e, 0x3a, 0xb1, 0x54, 0x35, 0x5e, - 0xa7, 0x2d, 0xfa, 0x60, 0xcc, 0x93, 0x30, 0xd0, 0x0a, 0xd5, 0x4b, 0xe3, 0xea, 0x7b, 0xe2, 0xa5, - 0x6a, 0x2d, 0x0c, 0x7d, 0xcc, 0x80, 0xe8, 0x29, 0x31, 0xfa, 0xcc, 0x0d, 0x0d, 0x76, 0xdc, 0x30, - 0xd6, 0xa6, 0xe0, 0x19, 0x18, 0xbe, 0x47, 0x76, 0x22, 0x2f, 0x68, 0x66, 0xef, 0xa7, 0xae, 0xf2, - 0x62, 0x2c, 0xe1, 0x66, 0x0e, 0xf6, 0xe1, 0x23, 0x7e, 0x14, 0x66, 0x24, 0xf7, 0x1c, 0xfc, 0x8e, - 0x05, 0x93, 0x2c, 0xa9, 0xaa, 0x48, 0x41, 0xe0, 0x85, 0xc1, 0x31, 0xc8, 0x18, 0x4f, 0xc2, 0x60, - 0x44, 0x1b, 0xcd, 0xbe, 0xea, 0xc0, 0x7a, 0x82, 0x39, 0x0c, 0x3d, 0x06, 0x03, 0xac, 0x0b, 0xf4, - 0x33, 0x8e, 0xf1, 0xdc, 0xed, 0x55, 0x27, 0x71, 0x30, 0x2b, 0x65, 0xd1, 0x64, 0x98, 0xb4, 0x7c, - 0x8f, 0x77, 0x3a, 0x35, 0xe8, 0xbe, 0xdf, 0xa2, 0xc9, 0xba, 0x76, 0xf2, 0x61, 0x45, 0x93, 0x75, - 0x27, 0x7e, 0xb0, 0x9c, 0xff, 0x3f, 0x4a, 0x70, 0xa6, 0x6b, 0xbd, 0xf4, 0xa6, 0x7b, 0xd5, 0xb8, - 0xe9, 0xbe, 0x98, 0xb9, 0xe9, 0xb6, 0x0f, 0xae, 0xfd, 0x70, 0xee, 0xbe, 0xbb, 0x5f, 0x49, 0x97, - 0x8f, 0xf1, 0x4a, 0x7a, 0xa0, 0xa8, 0x88, 0x33, 0x98, 0x23, 0xe2, 0xfc, 0x9e, 0x05, 0x8f, 0x76, - 0x9d, 0xb2, 0xf7, 0x5d, 0xf8, 0x5e, 0xd7, 0x5e, 0xf6, 0xd0, 0x4e, 0x7e, 0xb1, 0xdc, 0x63, 0x54, - 0x4c, 0x4f, 0x39, 0x47, 0xb9, 0x10, 0x03, 0xc6, 0x42, 0x78, 0x1b, 0xe3, 0x1c, 0x88, 0x97, 0x61, - 0x05, 0x45, 0xb1, 0x16, 0xfe, 0xc6, 0x3b, 0xb9, 0x72, 0xc8, 0x0d, 0x35, 0x6f, 0x5a, 0xe2, 0xf5, - 0xbc, 0x0a, 0xd9, 0xa0, 0xb8, 0x3b, 0x9a, 0xe6, 0x59, 0x3e, 0x8c, 0xe6, 0x39, 0xd6, 0x5d, 0xeb, - 0x44, 0x8b, 0x30, 0xb9, 0xe5, 0x05, 0xec, 0x2d, 0x59, 0x53, 0x7a, 0x52, 0x31, 0xc8, 0xd7, 0x4d, - 0x30, 0xce, 0xe2, 0xcf, 0xbe, 0x02, 0xe3, 0x87, 0xb7, 0xae, 0xfd, 0xa8, 0x0c, 0x1f, 0x3c, 0x80, - 0x29, 0xf0, 0xd3, 0xc1, 0xf8, 0x2e, 0xda, 0xe9, 0xd0, 0xf1, 0x6d, 0x6a, 0x30, 0xbd, 0xd1, 0xf6, - 0xfd, 0x1d, 0xe6, 0x27, 0x46, 0x5c, 0x89, 0x21, 0x84, 0x1a, 0xf5, 0x68, 0xfd, 0x6a, 0x17, 0x1c, - 0xdc, 0xb5, 0x26, 0xfa, 0x24, 0xa0, 0xf0, 0x2e, 0x4b, 0x3b, 0xec, 0xa6, 0x79, 0x23, 0xd8, 0x27, - 0x28, 0xa7, 0x5b, 0xf5, 0x66, 0x07, 0x06, 0xee, 0x52, 0x8b, 0xca, 0xa9, 0xec, 0xbd, 0x7b, 0xd5, - 0xad, 0x8c, 0x9c, 0x8a, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x65, 0x38, 0xe1, 0x6c, 0x3b, 0x1e, 0x4f, - 0x23, 0x26, 0x09, 0x70, 0x41, 0x55, 0xd9, 0xaf, 0x16, 0xb3, 0x08, 0xb8, 0xb3, 0x0e, 0x6a, 0x19, - 0x06, 0x49, 0xfe, 0xe0, 0xc0, 0xc7, 0x0f, 0xb1, 0x82, 0x0b, 0x9b, 0x28, 0xed, 0xff, 0x62, 0xd1, - 0xa3, 0xaf, 0xcb, 0xb3, 0xa3, 0x74, 0x46, 0x94, 0x81, 0x4d, 0x0b, 0xe7, 0x53, 0x33, 0xb2, 0xac, - 0x03, 0xb1, 0x89, 0xcb, 0x97, 0x46, 0x9c, 0xba, 0xad, 0x1b, 0xd2, 0xa6, 0x88, 0x84, 0x55, 0x18, - 0x54, 0x82, 0x76, 0xbd, 0x6d, 0x2f, 0x0e, 0x23, 0xb1, 0x81, 0xfa, 0x74, 0x62, 0x4e, 0xf9, 0x65, - 0x95, 0x93, 0xc1, 0x92, 0x9e, 0xfd, 0xf5, 0x12, 0x8c, 0xcb, 0x16, 0x5f, 0x6b, 0x87, 0x89, 0x73, - 0x0c, 0x47, 0xfa, 0x6b, 0xc6, 0x91, 0xbe, 0x50, 0x2c, 0x30, 0x98, 0x75, 0xae, 0xe7, 0x51, 0xfe, - 0xa9, 0xcc, 0x51, 0x7e, 0xa1, 0x1f, 0xa2, 0x07, 0x1f, 0xe1, 0xff, 0xc6, 0x82, 0x13, 0x06, 0xfe, - 0x31, 0x9c, 0x24, 0x35, 0xf3, 0x24, 0x79, 0xae, 0x8f, 0xd1, 0xf4, 0x38, 0x41, 0xbe, 0x55, 0xca, - 0x8c, 0x82, 0x9d, 0x1c, 0x9f, 0x83, 0x81, 0x4d, 0x27, 0x72, 0x8b, 0xe5, 0xd4, 0xec, 0xa8, 0x3e, - 0x7f, 0xc5, 0x89, 0x5c, 0xce, 0xff, 0xcf, 0xab, 0x47, 0xd1, 0x9c, 0xc8, 0xcd, 0x8d, 0xe6, 0x60, - 0x8d, 0xa2, 0x4b, 0x30, 0x14, 0x37, 0xc2, 0x96, 0xf2, 0x77, 0x3d, 0xcb, 0x1f, 0x4c, 0xa3, 0x25, - 0xfb, 0xbb, 0x73, 0xc8, 0x6c, 0x8e, 0x16, 0x63, 0x81, 0x3f, 0xdb, 0x84, 0x8a, 0x6a, 0xfa, 0x48, - 0x3d, 0xfe, 0xff, 0x6b, 0x19, 0x4e, 0x76, 0x59, 0x2b, 0xe8, 0xf3, 0xc6, 0xbc, 0xbd, 0xd2, 0xf7, - 0x62, 0x7b, 0x8f, 0x33, 0xf7, 0x79, 0xa6, 0x29, 0xb9, 0x62, 0x75, 0x1c, 0xa2, 0xf9, 0x5b, 0x31, - 0xc9, 0x36, 0x4f, 0x8b, 0xf2, 0x9b, 0xa7, 0xcd, 0x1e, 0xdb, 0xf4, 0xd3, 0x86, 0x54, 0x4f, 0x8f, - 0xf4, 0x3b, 0xff, 0x95, 0x01, 0x98, 0xee, 0x96, 0x81, 0x00, 0x7d, 0xc9, 0xca, 0x3c, 0x9c, 0xf1, - 0x6a, 0xff, 0x69, 0x0c, 0xf8, 0x6b, 0x1a, 0x22, 0x6b, 0xcf, 0xbc, 0xf9, 0x94, 0x46, 0xee, 0x8c, - 0x8b, 0xd6, 0x59, 0x1c, 0x56, 0xc4, 0x1f, 0x41, 0x91, 0x5c, 0xe1, 0x13, 0x87, 0xe8, 0x8a, 0x78, - 0x47, 0x25, 0xce, 0xc4, 0x61, 0xc9, 0xe2, 0xfc, 0x38, 0x2c, 0xd9, 0x87, 0x59, 0x0f, 0x46, 0xb5, - 0x71, 0x1d, 0xe9, 0x32, 0xb8, 0x47, 0x8f, 0x28, 0xad, 0xdf, 0x47, 0xba, 0x14, 0xfe, 0xb6, 0x05, - 0x19, 0xe7, 0x34, 0x65, 0x96, 0xb1, 0x7a, 0x9a, 0x65, 0xce, 0xc2, 0x40, 0x14, 0xfa, 0x24, 0xfb, - 0xa8, 0x03, 0x0e, 0x7d, 0x82, 0x19, 0x44, 0xbd, 0x93, 0x5c, 0xee, 0xf5, 0x4e, 0x32, 0xd5, 0xd3, - 0x7d, 0xb2, 0x4d, 0xa4, 0x91, 0x44, 0xb1, 0xf1, 0x6b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0xeb, 0x03, - 0x70, 0xb2, 0x4b, 0x54, 0x1f, 0xd5, 0x90, 0x9a, 0x4e, 0x42, 0xee, 0x3b, 0x3b, 0xd9, 0xe4, 0xb2, - 0x97, 0x79, 0x31, 0x96, 0x70, 0xe6, 0x54, 0xcb, 0x13, 0xd4, 0x65, 0x4c, 0x57, 0x22, 0x2f, 0x9d, - 0x80, 0x1e, 0xfd, 0x8b, 0xba, 0x17, 0x01, 0xe2, 0xd8, 0x5f, 0x09, 0xa8, 0x84, 0xe7, 0x0a, 0xe7, - 0xdd, 0x34, 0xaf, 0x61, 0xfd, 0x9a, 0x80, 0x60, 0x0d, 0x0b, 0x55, 0x61, 0xaa, 0x15, 0x85, 0x09, - 0x37, 0x0c, 0x56, 0xb9, 0xab, 0xc5, 0xa0, 0x19, 0x35, 0x56, 0xcb, 0xc0, 0x71, 0x47, 0x0d, 0xf4, - 0x12, 0x8c, 0x8a, 0x48, 0xb2, 0x5a, 0x18, 0xfa, 0xc2, 0x8c, 0xa4, 0xee, 0xe3, 0xeb, 0x29, 0x08, - 0xeb, 0x78, 0x5a, 0x35, 0x66, 0x6d, 0x1c, 0xee, 0x5a, 0x8d, 0x5b, 0x1c, 0x35, 0xbc, 0x4c, 0x9e, - 0x92, 0x91, 0x42, 0x79, 0x4a, 0x52, 0xc3, 0x5a, 0xa5, 0xf0, 0x45, 0x0c, 0xe4, 0x1a, 0xa0, 0x7e, - 0xa7, 0x0c, 0x43, 0xfc, 0x53, 0x1c, 0x83, 0x94, 0x57, 0x13, 0x26, 0xa5, 0x42, 0x39, 0x21, 0x78, - 0xaf, 0xe6, 0xab, 0x4e, 0xe2, 0x70, 0xd6, 0xa4, 0x76, 0x48, 0x6a, 0x86, 0x42, 0xf3, 0xc6, 0x1e, - 0x9a, 0xcd, 0x58, 0x4a, 0x80, 0xd3, 0xd0, 0x76, 0xd4, 0x26, 0x40, 0xcc, 0x5e, 0x75, 0xa5, 0x34, - 0x44, 0xe6, 0xdb, 0x17, 0x0b, 0xf5, 0xa3, 0xae, 0xaa, 0xf1, 0xde, 0xa4, 0xcb, 0x52, 0x01, 0xb0, - 0x46, 0x7b, 0xf6, 0x65, 0xa8, 0x28, 0xe4, 0x3c, 0x15, 0x72, 0x4c, 0x67, 0x6d, 0x7f, 0x01, 0x26, - 0x33, 0x6d, 0xf5, 0xa5, 0x81, 0xfe, 0xa6, 0x05, 0x93, 0xbc, 0xcb, 0x2b, 0xc1, 0xb6, 0x60, 0x05, - 0x5f, 0xb4, 0x60, 0xda, 0xef, 0xb2, 0x13, 0xc5, 0x67, 0x3e, 0xcc, 0x1e, 0x56, 0xca, 0x67, 0x37, - 0x28, 0xee, 0xda, 0x1a, 0x3a, 0x07, 0x23, 0xfc, 0x91, 0x6a, 0xc7, 0x17, 0x9e, 0xe2, 0x63, 0x3c, - 0xe7, 0x37, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0xd8, 0x82, 0x13, 0x7c, 0x10, 0x57, 0xc9, 0x8e, 0x52, - 0xaf, 0xde, 0x27, 0xc3, 0x10, 0xd9, 0xcd, 0x4b, 0x3d, 0xb2, 0x9b, 0xeb, 0xa3, 0x2c, 0x1f, 0x38, - 0xca, 0x6f, 0x5b, 0x20, 0x56, 0xe8, 0x31, 0xe8, 0x0f, 0x6b, 0xa6, 0xfe, 0xf0, 0xa1, 0x22, 0x8b, - 0xbe, 0x87, 0xe2, 0xf0, 0x0b, 0x25, 0x98, 0xe2, 0x08, 0xe9, 0x8d, 0xcc, 0xfb, 0xe5, 0xe3, 0xf4, - 0xf7, 0xea, 0x8e, 0x7a, 0xea, 0xb4, 0xfb, 0x48, 0x8d, 0x6f, 0x39, 0x70, 0xe0, 0xb7, 0xfc, 0x33, - 0x0b, 0x10, 0x9f, 0x93, 0xec, 0x0b, 0xdf, 0xfc, 0x74, 0xd3, 0xcc, 0x01, 0x29, 0xe7, 0x50, 0x10, - 0xac, 0x61, 0x3d, 0xe4, 0x21, 0x64, 0xee, 0xc3, 0xca, 0xf9, 0xf7, 0x61, 0x7d, 0x8c, 0xfa, 0x7f, - 0x96, 0x21, 0xeb, 0xac, 0x89, 0xde, 0x86, 0xb1, 0x86, 0xd3, 0x72, 0xee, 0x7a, 0xbe, 0x97, 0x78, - 0x24, 0x2e, 0x76, 0xe1, 0xbe, 0xac, 0xd5, 0x10, 0xd7, 0x50, 0x5a, 0x09, 0x36, 0x28, 0xa2, 0x79, - 0x80, 0x56, 0xe4, 0x6d, 0x7b, 0x3e, 0x69, 0x32, 0x8d, 0x87, 0xc5, 0x9c, 0xf0, 0xbb, 0x63, 0x59, - 0x8a, 0x35, 0x8c, 0x2e, 0x31, 0x0a, 0xe5, 0xe3, 0x88, 0x51, 0x18, 0x38, 0xc2, 0x18, 0x85, 0xc1, - 0x42, 0x31, 0x0a, 0x18, 0x4e, 0xcb, 0x83, 0x9e, 0xfe, 0x5f, 0xf5, 0x7c, 0x22, 0xe4, 0x3c, 0x1e, - 0xbf, 0x32, 0xbb, 0xb7, 0x3b, 0x77, 0x1a, 0x77, 0xc5, 0xc0, 0x3d, 0x6a, 0xda, 0x6d, 0x38, 0x59, - 0x27, 0x91, 0xc7, 0xf2, 0x74, 0xba, 0xe9, 0xbe, 0xfb, 0x0c, 0x54, 0xa2, 0xcc, 0x96, 0xef, 0x33, - 0x49, 0x81, 0x96, 0xd9, 0x4d, 0x6e, 0xf1, 0x94, 0xa4, 0xfd, 0xd7, 0x4a, 0x30, 0x2c, 0x5c, 0x3a, - 0x8f, 0x41, 0x50, 0xb9, 0x6a, 0x98, 0xa3, 0x9e, 0xc9, 0xe3, 0x95, 0xac, 0x5b, 0x3d, 0x0d, 0x51, - 0xf5, 0x8c, 0x21, 0xea, 0xb9, 0x62, 0xe4, 0x0e, 0x36, 0x41, 0xfd, 0xe3, 0x32, 0x4c, 0x98, 0x2e, - 0xae, 0xc7, 0x30, 0x2d, 0xaf, 0xc3, 0x70, 0x2c, 0xbc, 0xad, 0x4b, 0x45, 0xfc, 0xfb, 0xb2, 0x9f, - 0x38, 0xbd, 0xb5, 0x17, 0xfe, 0xd5, 0x92, 0x5c, 0x57, 0x87, 0xee, 0xf2, 0xb1, 0x38, 0x74, 0xe7, - 0x79, 0x1e, 0x0f, 0x3c, 0x0c, 0xcf, 0x63, 0xfb, 0x07, 0xec, 0x78, 0xd0, 0xcb, 0x8f, 0xe1, 0xc8, - 0x7f, 0xcd, 0x3c, 0x48, 0xce, 0x17, 0x5a, 0x77, 0xa2, 0x7b, 0x3d, 0x8e, 0xfe, 0xef, 0x5a, 0x30, - 0x2a, 0x10, 0x8f, 0x61, 0x00, 0x9f, 0x34, 0x07, 0xf0, 0x54, 0xa1, 0x01, 0xf4, 0xe8, 0xf9, 0xd7, - 0x4b, 0xaa, 0xe7, 0xb5, 0x30, 0x4a, 0x0a, 0x65, 0x25, 0x1f, 0xa1, 0x6a, 0x62, 0xd8, 0x08, 0x7d, - 0x21, 0xec, 0x3d, 0x96, 0x86, 0x2b, 0xf2, 0xf2, 0x7d, 0xed, 0x37, 0x56, 0xd8, 0x2c, 0x9a, 0x2e, - 0x8c, 0x12, 0x71, 0xd8, 0xa6, 0xd1, 0x74, 0x61, 0x94, 0x60, 0x06, 0x41, 0x2e, 0x40, 0xfa, 0xbc, - 0xbe, 0x88, 0xf4, 0xed, 0xbd, 0x5b, 0xdb, 0x89, 0xe7, 0xcf, 0x7b, 0x41, 0x12, 0x27, 0xd1, 0xfc, - 0x5a, 0x90, 0xdc, 0x8c, 0xb8, 0x82, 0xa0, 0xc5, 0x1f, 0x2a, 0x5a, 0x58, 0xa3, 0x2b, 0x43, 0x4a, - 0x58, 0x1b, 0x83, 0xe6, 0x6d, 0xd3, 0x0d, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x32, 0xe3, 0xec, 0x6c, - 0x82, 0xfa, 0x0b, 0x0d, 0xfc, 0x57, 0x83, 0x6a, 0x6a, 0x99, 0x09, 0xf9, 0x86, 0x1e, 0x80, 0x58, - 0x94, 0x7d, 0xd2, 0x2e, 0xe8, 0x3e, 0xd7, 0x69, 0xbc, 0x22, 0x22, 0x1d, 0x57, 0x94, 0x2f, 0x17, - 0xe6, 0xc8, 0x7d, 0x5c, 0x4a, 0xb2, 0x44, 0x8c, 0x2c, 0xfb, 0xdc, 0x5a, 0x2d, 0x9b, 0x4b, 0x7e, - 0x59, 0x02, 0x70, 0x8a, 0x83, 0x16, 0x84, 0xf2, 0xc9, 0xad, 0x33, 0x1f, 0xcc, 0x28, 0x9f, 0x72, - 0x4a, 0x34, 0xed, 0xf3, 0x02, 0x8c, 0xaa, 0xe7, 0x79, 0x6a, 0xfc, 0x61, 0x94, 0x0a, 0x97, 0xc5, - 0x56, 0xd2, 0x62, 0xac, 0xe3, 0xa0, 0x75, 0x98, 0x8c, 0xf9, 0xdb, 0x41, 0x32, 0xb6, 0x43, 0x18, - 0x19, 0x9e, 0xcd, 0x3c, 0xe9, 0x2f, 0xc1, 0xfb, 0xac, 0x88, 0x6f, 0x65, 0x19, 0x0d, 0x92, 0x25, - 0x81, 0x5e, 0x85, 0x09, 0x5f, 0x7f, 0x18, 0xb5, 0x26, 0x6c, 0x10, 0xca, 0x45, 0xcd, 0x78, 0x36, - 0xb5, 0x86, 0x33, 0xd8, 0xe8, 0x75, 0x98, 0xd1, 0x4b, 0x44, 0x42, 0x24, 0x27, 0x68, 0x92, 0x58, - 0xbc, 0x33, 0xf2, 0xd8, 0xde, 0xee, 0xdc, 0xcc, 0xb5, 0x1e, 0x38, 0xb8, 0x67, 0x6d, 0x74, 0x09, - 0xc6, 0xe4, 0xf0, 0xb5, 0x48, 0xa8, 0xd4, 0x39, 0x52, 0x83, 0x61, 0x03, 0xf3, 0xbd, 0xdd, 0xdb, - 0x7e, 0x8e, 0x56, 0xd6, 0xce, 0x5d, 0xf4, 0x0e, 0x8c, 0xe9, 0x7d, 0xcc, 0x1e, 0xa8, 0xf9, 0x8f, - 0xcd, 0x8a, 0xf3, 0x5b, 0xf5, 0x5c, 0x87, 0x61, 0x83, 0xb6, 0x7d, 0x13, 0x86, 0xea, 0x3b, 0x71, - 0x23, 0xf1, 0x0b, 0x30, 0xa5, 0x27, 0x8d, 0x21, 0xa4, 0x1b, 0x86, 0x3d, 0x7c, 0x25, 0x46, 0x64, - 0x7f, 0xd9, 0x82, 0xc9, 0xf5, 0xe5, 0x5a, 0x3d, 0x6c, 0xdc, 0x23, 0xc9, 0x22, 0xd7, 0xcf, 0xb0, - 0xe0, 0x49, 0xd6, 0x21, 0x79, 0x4d, 0x37, 0x2e, 0x76, 0x16, 0x06, 0x36, 0xc3, 0x38, 0xc9, 0xda, - 0x38, 0xaf, 0x84, 0x71, 0x82, 0x19, 0xc4, 0xfe, 0x63, 0x0b, 0x06, 0xd9, 0xbb, 0x4e, 0x79, 0x6f, - 0x82, 0x15, 0x19, 0x17, 0x7a, 0x09, 0x86, 0xc8, 0xc6, 0x06, 0x69, 0x24, 0x62, 0x7b, 0xca, 0x78, - 0x81, 0xa1, 0x15, 0x56, 0x4a, 0x37, 0x1d, 0x6b, 0x8c, 0xff, 0xc5, 0x02, 0x19, 0x7d, 0x1a, 0x2a, - 0x89, 0xb7, 0x45, 0x16, 0x5d, 0x57, 0x18, 0x15, 0xfb, 0x73, 0x61, 0x51, 0x4c, 0x60, 0x5d, 0x12, - 0xc1, 0x29, 0x3d, 0xfb, 0xab, 0x25, 0x80, 0x34, 0x1e, 0x28, 0x6f, 0x98, 0x4b, 0x1d, 0x4f, 0x9f, - 0x3d, 0xdd, 0xe5, 0xe9, 0x33, 0x94, 0x12, 0xec, 0xf2, 0xf0, 0x99, 0x9a, 0xaa, 0x72, 0xa1, 0xa9, - 0x1a, 0xe8, 0x67, 0xaa, 0x96, 0xe1, 0x44, 0x1a, 0xcf, 0x64, 0x06, 0x86, 0xb2, 0x44, 0xa8, 0xeb, - 0x59, 0x20, 0xee, 0xc4, 0xb7, 0xbf, 0x6a, 0x81, 0x70, 0x7a, 0x2c, 0xb0, 0xa0, 0x5d, 0xf9, 0x4c, - 0x91, 0x91, 0xb1, 0xed, 0xd9, 0x22, 0xfe, 0xa0, 0x22, 0x4f, 0x9b, 0xda, 0x62, 0x46, 0x76, 0x36, - 0x83, 0xaa, 0xfd, 0x6b, 0x16, 0x8c, 0x72, 0xf0, 0x75, 0x26, 0x2b, 0xe7, 0xf7, 0xab, 0xaf, 0x2c, - 0xbb, 0xec, 0x05, 0x1f, 0x4a, 0x58, 0x65, 0x5b, 0xd5, 0x5f, 0xf0, 0x91, 0x00, 0x9c, 0xe2, 0xa0, - 0x67, 0x60, 0x38, 0x6e, 0xdf, 0x65, 0xe8, 0x19, 0x0f, 0xc8, 0x3a, 0x2f, 0xc6, 0x12, 0x6e, 0xff, - 0xd3, 0x12, 0x4c, 0x65, 0x1d, 0x60, 0x11, 0x86, 0x21, 0x2e, 0x3b, 0x67, 0xc5, 0xae, 0x83, 0xec, - 0x39, 0x9a, 0x03, 0x2d, 0xf0, 0x77, 0xa8, 0x99, 0xe1, 0x5d, 0x50, 0x42, 0x1b, 0x30, 0xea, 0x86, - 0xf7, 0x83, 0xfb, 0x4e, 0xe4, 0x2e, 0xd6, 0xd6, 0xc4, 0x97, 0xc8, 0x71, 0x59, 0xaa, 0xa6, 0x15, - 0x74, 0xf7, 0x5c, 0x66, 0x5f, 0x48, 0x41, 0x58, 0x27, 0x4c, 0x75, 0xc5, 0x46, 0x18, 0x6c, 0x78, - 0xcd, 0xeb, 0x4e, 0xab, 0xd8, 0xe5, 0xfc, 0xb2, 0x44, 0xd7, 0xda, 0x18, 0x17, 0xf9, 0x28, 0x38, - 0x00, 0xa7, 0x24, 0xed, 0x5f, 0x9d, 0x06, 0x63, 0x2d, 0x18, 0xa9, 0x70, 0xad, 0x87, 0x9e, 0x0a, - 0xf7, 0x4d, 0x18, 0x21, 0x5b, 0xad, 0x64, 0xa7, 0xea, 0x45, 0xc5, 0x12, 0x9b, 0xaf, 0x08, 0xec, - 0x4e, 0xea, 0x12, 0x82, 0x15, 0xc5, 0x1e, 0x89, 0x8d, 0xcb, 0xef, 0x8b, 0xc4, 0xc6, 0x03, 0x7f, - 0x2e, 0x89, 0x8d, 0x5f, 0x87, 0xe1, 0xa6, 0x97, 0x60, 0xd2, 0x0a, 0x45, 0x82, 0x8f, 0x9c, 0xc5, - 0x73, 0x99, 0x23, 0x77, 0xa6, 0xbc, 0x14, 0x00, 0x2c, 0xc9, 0xa1, 0x75, 0xb5, 0xa9, 0x86, 0x8a, - 0x1c, 0xf7, 0x9d, 0xf6, 0xbe, 0xae, 0xdb, 0x4a, 0x24, 0x32, 0x1e, 0x7e, 0xef, 0x89, 0x8c, 0x55, - 0xfa, 0xe1, 0x91, 0x87, 0x95, 0x7e, 0xd8, 0x48, 0xe3, 0x5c, 0x39, 0x8a, 0x34, 0xce, 0x5f, 0xb5, - 0xe0, 0x54, 0xab, 0x5b, 0x12, 0x74, 0x91, 0x48, 0xf8, 0x67, 0x0f, 0x91, 0x16, 0xde, 0x68, 0x9a, - 0x25, 0x2c, 0xe8, 0x8a, 0x86, 0xbb, 0x37, 0x2c, 0xf3, 0x41, 0x8f, 0xbe, 0xf7, 0x7c, 0xd0, 0x47, - 0x9d, 0x71, 0x38, 0xcd, 0x0e, 0x3d, 0x7e, 0x24, 0xd9, 0xa1, 0x27, 0x1e, 0x62, 0x76, 0x68, 0x2d, - 0xaf, 0xf3, 0xe4, 0xc3, 0xcd, 0xeb, 0xbc, 0x69, 0x9e, 0x4b, 0x3c, 0x8d, 0xf0, 0x4b, 0x85, 0xcf, - 0x25, 0xa3, 0x85, 0x83, 0x4f, 0x26, 0x9e, 0xe1, 0xfa, 0xc4, 0x7b, 0xcc, 0x70, 0x6d, 0xe4, 0x89, - 0x46, 0x47, 0x91, 0x27, 0xfa, 0x6d, 0xfd, 0x04, 0x3d, 0x59, 0xa4, 0x05, 0x75, 0x50, 0x76, 0xb6, - 0xd0, 0xed, 0x0c, 0xed, 0xcc, 0x44, 0x3d, 0x7d, 0xdc, 0x99, 0xa8, 0x4f, 0x1d, 0x61, 0x26, 0xea, - 0xd3, 0xc7, 0x9a, 0x89, 0xfa, 0x91, 0xf7, 0x49, 0x26, 0xea, 0x99, 0xe3, 0xca, 0x44, 0xfd, 0xe8, - 0x43, 0xcd, 0x44, 0x4d, 0x3f, 0x5d, 0x4b, 0x86, 0x91, 0xcd, 0xcc, 0x16, 0xf9, 0x74, 0x5d, 0xa3, - 0xce, 0xf8, 0xa7, 0x53, 0x20, 0x9c, 0x12, 0xb5, 0xff, 0x12, 0x9c, 0x39, 0x78, 0xe9, 0xa6, 0x1e, - 0x1b, 0xb5, 0xd4, 0x16, 0x96, 0xf1, 0xd8, 0x60, 0x62, 0xa1, 0x86, 0x55, 0x38, 0x55, 0xee, 0xb7, - 0x2c, 0x78, 0xa4, 0x47, 0x26, 0xc9, 0xc2, 0x31, 0x98, 0x2d, 0x98, 0x6c, 0x99, 0x55, 0x0b, 0x87, - 0x74, 0x1b, 0x99, 0x2b, 0x95, 0x9f, 0x7c, 0x06, 0x80, 0xb3, 0xe4, 0x97, 0x3e, 0xf4, 0xc3, 0x1f, - 0x9d, 0xf9, 0xc0, 0xef, 0xfe, 0xe8, 0xcc, 0x07, 0xfe, 0xf0, 0x47, 0x67, 0x3e, 0xf0, 0x73, 0x7b, - 0x67, 0xac, 0x1f, 0xee, 0x9d, 0xb1, 0x7e, 0x77, 0xef, 0x8c, 0xf5, 0x27, 0x7b, 0x67, 0xac, 0xaf, - 0xfe, 0xf8, 0xcc, 0x07, 0xde, 0x28, 0x6d, 0x5f, 0xf8, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xda, - 0x87, 0x52, 0x9e, 0x37, 0xcb, 0x00, 0x00, + + // 11182 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x8c, 0x24, 0xc7, + 0x75, 0x18, 0xae, 0x9e, 0xd9, 0xaf, 0x79, 0xfb, 0x5d, 0xb7, 0x77, 0x5c, 0xae, 0xc8, 0xdb, 0x63, + 0x53, 0xa4, 0x8f, 0xe4, 0x71, 0x57, 0x77, 0x24, 0x45, 0x4a, 0xd4, 0x8f, 0xd6, 0xee, 0xce, 0xee, + 0xdd, 0xea, 0xbe, 0x86, 0x35, 0x7b, 0x77, 0x14, 0xc5, 0x9f, 0xc8, 0xbe, 0xe9, 0xda, 0xd9, 0xe6, + 0xf5, 0x76, 0x0f, 0xbb, 0x7b, 0xf6, 0x6e, 0x25, 0x08, 0xb0, 0x15, 0x41, 0x72, 0x00, 0x25, 0x91, + 0xe1, 0x08, 0x08, 0x9c, 0x00, 0x0a, 0x0c, 0xc4, 0x51, 0x3e, 0x1d, 0x45, 0xd0, 0x87, 0x61, 0x39, + 0x1f, 0x8e, 0xe5, 0xc8, 0x40, 0xe2, 0x08, 0x30, 0x12, 0x3b, 0x30, 0xb2, 0xb6, 0x56, 0x88, 0xff, + 0x08, 0x90, 0xfc, 0x11, 0xff, 0x77, 0x09, 0x82, 0xa0, 0x3e, 0xbb, 0xaa, 0x67, 0x66, 0xbb, 0x67, + 0x79, 0xbb, 0x3e, 0x09, 0xf9, 0x6f, 0xa6, 0xde, 0xab, 0x57, 0x1f, 0x5d, 0xf5, 0xea, 0xbd, 0x57, + 0xef, 0xbd, 0x82, 0x73, 0x77, 0x5e, 0x89, 0x17, 0xbc, 0x70, 0xf1, 0x4e, 0xfb, 0x36, 0x89, 0x02, + 0x92, 0x90, 0x78, 0xb1, 0x75, 0xa7, 0xb9, 0xe8, 0xb4, 0xbc, 0xc5, 0x9d, 0xf3, 0x8b, 0x4d, 0x12, + 0x90, 0xc8, 0x49, 0x88, 0xbb, 0xd0, 0x8a, 0xc2, 0x24, 0x44, 0x8f, 0x71, 0xec, 0x85, 0x14, 0x7b, + 0xa1, 0x75, 0xa7, 0xb9, 0xe0, 0xb4, 0xbc, 0x85, 0x9d, 0xf3, 0x73, 0xcf, 0x37, 0xbd, 0x64, 0xab, + 0x7d, 0x7b, 0xa1, 0x11, 0x6e, 0x2f, 0x36, 0xc3, 0x66, 0xb8, 0xc8, 0x2a, 0xdd, 0x6e, 0x6f, 0xb2, + 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x89, 0xcd, 0xbd, 0x28, 0x9a, 0x76, 0x5a, 0xde, 0xb6, 0xd3, 0xd8, + 0xf2, 0x02, 0x12, 0xed, 0xaa, 0xc6, 0x23, 0x12, 0x87, 0xed, 0xa8, 0x41, 0xb2, 0x5d, 0x38, 0xb0, + 0x56, 0xbc, 0xb8, 0x4d, 0x12, 0xa7, 0x4b, 0xc7, 0xe7, 0x16, 0x7b, 0xd5, 0x8a, 0xda, 0x41, 0xe2, + 0x6d, 0x77, 0x36, 0xf3, 0x91, 0xbc, 0x0a, 0x71, 0x63, 0x8b, 0x6c, 0x3b, 0x1d, 0xf5, 0x5e, 0xe8, + 0x55, 0xaf, 0x9d, 0x78, 0xfe, 0xa2, 0x17, 0x24, 0x71, 0x12, 0x1d, 0x34, 0xa6, 0x98, 0x44, 0x3b, + 0x24, 0x4a, 0x07, 0x44, 0xee, 0x39, 0xdb, 0x2d, 0x9f, 0x74, 0x1b, 0xd3, 0x25, 0xed, 0xd3, 0x3d, + 0xef, 0x34, 0x9b, 0x11, 0x69, 0x3a, 0x49, 0xa8, 0xd5, 0x75, 0x5a, 0x5e, 0x44, 0x9a, 0x5e, 0x9c, + 0x44, 0x4e, 0xe2, 0x85, 0xc1, 0xe2, 0xce, 0x79, 0xc7, 0x6f, 0x6d, 0x39, 0x1d, 0x94, 0xec, 0x3f, + 0xb2, 0xe0, 0xcc, 0xd2, 0xad, 0xfa, 0xaa, 0xef, 0xc4, 0x89, 0xd7, 0x58, 0xf6, 0xc3, 0xc6, 0x9d, + 0x7a, 0x12, 0x46, 0xe4, 0x66, 0xe8, 0xb7, 0xb7, 0x49, 0x9d, 0x7d, 0x08, 0x74, 0x0e, 0x46, 0x76, + 0xd8, 0xff, 0xf5, 0xea, 0xac, 0x75, 0xc6, 0x3a, 0x5b, 0x59, 0x9e, 0xfa, 0xe1, 0xde, 0xfc, 0x07, + 0xf6, 0xf7, 0xe6, 0x47, 0x6e, 0x8a, 0x72, 0xac, 0x30, 0xd0, 0xd3, 0x30, 0xb4, 0x19, 0x6f, 0xec, + 0xb6, 0xc8, 0x6c, 0x89, 0xe1, 0x4e, 0x08, 0xdc, 0xa1, 0xb5, 0x3a, 0x2d, 0xc5, 0x02, 0x8a, 0x16, + 0xa1, 0xd2, 0x72, 0xa2, 0xc4, 0xa3, 0x1d, 0x9c, 0x2d, 0x9f, 0xb1, 0xce, 0x0e, 0x2e, 0x4f, 0x0b, + 0xd4, 0x4a, 0x4d, 0x02, 0x70, 0x8a, 0x43, 0xbb, 0x11, 0x11, 0xc7, 0xbd, 0x1e, 0xf8, 0xbb, 0xb3, + 0x03, 0x67, 0xac, 0xb3, 0x23, 0x69, 0x37, 0xb0, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0x5e, 0x09, 0x46, + 0x96, 0x36, 0x37, 0xbd, 0xc0, 0x4b, 0x76, 0xd1, 0x3b, 0x30, 0x16, 0x84, 0x2e, 0x91, 0xff, 0xd9, + 0x28, 0x46, 0x2f, 0x3c, 0xbb, 0x70, 0xd0, 0xa2, 0x5e, 0xb8, 0xa6, 0xd5, 0x58, 0x9e, 0xda, 0xdf, + 0x9b, 0x1f, 0xd3, 0x4b, 0xb0, 0x41, 0x11, 0xbd, 0x05, 0xa3, 0xad, 0xd0, 0x55, 0x0d, 0x94, 0x58, + 0x03, 0xcf, 0x1c, 0xdc, 0x40, 0x2d, 0xad, 0xb0, 0x3c, 0xb9, 0xbf, 0x37, 0x3f, 0xaa, 0x15, 0x60, + 0x9d, 0x1c, 0xf2, 0x61, 0x92, 0xfe, 0x0d, 0x12, 0x4f, 0xb5, 0x50, 0x66, 0x2d, 0x3c, 0x9f, 0xdf, + 0x82, 0x56, 0x69, 0xf9, 0xc4, 0xfe, 0xde, 0xfc, 0x64, 0xa6, 0x10, 0x67, 0x49, 0xdb, 0x9f, 0x85, + 0x89, 0xa5, 0x24, 0x71, 0x1a, 0x5b, 0xc4, 0xe5, 0xdf, 0x17, 0xbd, 0x08, 0x03, 0x81, 0xb3, 0x4d, + 0xc4, 0xd7, 0x3f, 0x23, 0xa6, 0x7d, 0xe0, 0x9a, 0xb3, 0x4d, 0xee, 0xef, 0xcd, 0x4f, 0xdd, 0x08, + 0xbc, 0xf7, 0xda, 0x62, 0xcd, 0xd0, 0x32, 0xcc, 0xb0, 0xd1, 0x05, 0x00, 0x97, 0xec, 0x78, 0x0d, + 0x52, 0x73, 0x92, 0x2d, 0xb1, 0x1a, 0x90, 0xa8, 0x0b, 0x55, 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0x05, + 0x0b, 0x2a, 0x4b, 0x3b, 0xa1, 0xe7, 0xd6, 0x42, 0x37, 0x46, 0x6d, 0x98, 0x6c, 0x45, 0x64, 0x93, + 0x44, 0xaa, 0x68, 0xd6, 0x3a, 0x53, 0x3e, 0x3b, 0x7a, 0xe1, 0x42, 0xce, 0xb8, 0xcd, 0x4a, 0xab, + 0x41, 0x12, 0xed, 0x2e, 0x3f, 0x22, 0x9a, 0x9e, 0xcc, 0x40, 0x71, 0xb6, 0x0d, 0xfb, 0x97, 0x4b, + 0x70, 0x72, 0xe9, 0xb3, 0xed, 0x88, 0x54, 0xbd, 0xf8, 0x4e, 0x76, 0x2b, 0xb8, 0x5e, 0x7c, 0xe7, + 0x5a, 0x3a, 0x19, 0x6a, 0x0d, 0x56, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x79, 0x18, 0xa6, 0xbf, 0x6f, + 0xe0, 0x75, 0x31, 0xfa, 0x13, 0x02, 0x79, 0xb4, 0xea, 0x24, 0x4e, 0x95, 0x83, 0xb0, 0xc4, 0x41, + 0x57, 0x61, 0xb4, 0xc1, 0x38, 0x47, 0xf3, 0x6a, 0xe8, 0x12, 0xf6, 0x85, 0x2b, 0xcb, 0xcf, 0x51, + 0xf4, 0x95, 0xb4, 0xf8, 0xfe, 0xde, 0xfc, 0x2c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, + 0xd9, 0x6a, 0x23, 0x0e, 0x30, 0x4a, 0xd0, 0x65, 0x13, 0x9e, 0xd5, 0xf6, 0xd4, 0x20, 0xdb, 0x53, + 0x63, 0x3d, 0xf6, 0xd3, 0x3f, 0xb4, 0xc4, 0x9c, 0xac, 0x79, 0xbe, 0xc9, 0x1e, 0x2e, 0x00, 0xc4, + 0xa4, 0x11, 0x91, 0x44, 0x9b, 0x15, 0xf5, 0x99, 0xeb, 0x0a, 0x82, 0x35, 0x2c, 0xba, 0xf9, 0xe3, + 0x2d, 0x27, 0x62, 0xab, 0x45, 0xcc, 0x8d, 0xda, 0xfc, 0x75, 0x09, 0xc0, 0x29, 0x8e, 0xb1, 0xf9, + 0xcb, 0xb9, 0x9b, 0xff, 0x77, 0x2c, 0x18, 0x5e, 0xf6, 0x02, 0xd7, 0x0b, 0x9a, 0xe8, 0x1d, 0x18, + 0xa1, 0x67, 0x83, 0xeb, 0x24, 0x8e, 0xd8, 0xf7, 0x1f, 0x96, 0x8b, 0x47, 0x67, 0xd5, 0x72, 0xf9, + 0xc4, 0x0b, 0x14, 0x9b, 0x2e, 0xa2, 0xeb, 0xb7, 0xdf, 0x25, 0x8d, 0xe4, 0x2a, 0x49, 0x9c, 0x74, + 0x38, 0x69, 0x19, 0x56, 0x54, 0xd1, 0x0d, 0x18, 0x4a, 0x9c, 0xa8, 0x49, 0x12, 0xb1, 0xed, 0x73, + 0x36, 0x25, 0xa7, 0x81, 0xe9, 0x92, 0x23, 0x41, 0x83, 0xa4, 0x0c, 0x72, 0x83, 0x11, 0xc1, 0x82, + 0x98, 0xdd, 0x80, 0xb1, 0x15, 0xa7, 0xe5, 0xdc, 0xf6, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x7e, 0x0e, + 0xca, 0x8e, 0xeb, 0xb2, 0x0d, 0x50, 0x59, 0x3e, 0xb9, 0xbf, 0x37, 0x5f, 0x5e, 0x72, 0xdd, 0xfb, + 0x7b, 0xf3, 0xa0, 0xb0, 0x76, 0x31, 0xc5, 0x40, 0xcf, 0xc2, 0x80, 0x1b, 0x85, 0xad, 0xd9, 0x12, + 0xc3, 0x3c, 0x45, 0x77, 0x6a, 0x35, 0x0a, 0x5b, 0x19, 0x54, 0x86, 0x63, 0xff, 0xa0, 0x04, 0x68, + 0x85, 0xb4, 0xb6, 0xd6, 0xea, 0xc6, 0x37, 0x3d, 0x0b, 0x23, 0xdb, 0x61, 0xe0, 0x25, 0x61, 0x14, + 0x8b, 0x06, 0xd9, 0xba, 0xb8, 0x2a, 0xca, 0xb0, 0x82, 0xa2, 0x33, 0x30, 0xd0, 0x4a, 0xb7, 0xf7, + 0x98, 0x64, 0x0d, 0x6c, 0x63, 0x33, 0x08, 0xc5, 0x68, 0xc7, 0x24, 0x12, 0xeb, 0x59, 0x61, 0xdc, + 0x88, 0x49, 0x84, 0x19, 0x24, 0x5d, 0x41, 0x74, 0x6d, 0x89, 0xd5, 0x9a, 0x59, 0x41, 0x14, 0x82, + 0x35, 0x2c, 0xf4, 0x36, 0x54, 0xf8, 0x3f, 0x4c, 0x36, 0xd9, 0xd2, 0xcd, 0x65, 0x0a, 0x57, 0xc2, + 0x86, 0xe3, 0x67, 0x27, 0x7f, 0x9c, 0xad, 0x38, 0x49, 0x08, 0xa7, 0x34, 0x8d, 0x15, 0x37, 0x94, + 0xbb, 0xe2, 0xfe, 0x96, 0x05, 0x68, 0xc5, 0x0b, 0x5c, 0x12, 0x1d, 0xc3, 0xd1, 0xd9, 0xdf, 0x66, + 0xf8, 0x13, 0xda, 0xb5, 0x70, 0xbb, 0x15, 0x06, 0x24, 0x48, 0x56, 0xc2, 0xc0, 0xe5, 0xc7, 0xe9, + 0xc7, 0x60, 0x20, 0xa1, 0x4d, 0xf1, 0x6e, 0x3d, 0x2d, 0x3f, 0x0b, 0x6d, 0xe0, 0xfe, 0xde, 0xfc, + 0xa9, 0xce, 0x1a, 0xac, 0x0b, 0xac, 0x0e, 0xfa, 0x28, 0x0c, 0xc5, 0x89, 0x93, 0xb4, 0x63, 0xd1, + 0xd1, 0x27, 0x64, 0x47, 0xeb, 0xac, 0xf4, 0xfe, 0xde, 0xfc, 0xa4, 0xaa, 0xc6, 0x8b, 0xb0, 0xa8, + 0x80, 0x9e, 0x81, 0xe1, 0x6d, 0x12, 0xc7, 0x4e, 0x53, 0x32, 0xb8, 0x49, 0x51, 0x77, 0xf8, 0x2a, + 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x84, 0x41, 0x12, 0x45, 0x61, 0x24, 0x56, 0xc4, 0xb8, 0x40, 0x1c, + 0x5c, 0xa5, 0x85, 0x98, 0xc3, 0xec, 0xff, 0x6c, 0xc1, 0xa4, 0xea, 0x2b, 0x6f, 0xeb, 0x18, 0xb6, + 0xbc, 0x0b, 0xd0, 0x90, 0x03, 0x8c, 0xd9, 0x46, 0xd3, 0xda, 0xe8, 0xbe, 0xfc, 0x3a, 0x27, 0x34, + 0x6d, 0x43, 0x15, 0xc5, 0x58, 0xa3, 0x6b, 0xff, 0x5b, 0x0b, 0x4e, 0x64, 0xc6, 0x76, 0xc5, 0x8b, + 0x13, 0xf4, 0x56, 0xc7, 0xf8, 0x16, 0x8a, 0x8d, 0x8f, 0xd6, 0x66, 0xa3, 0x53, 0xeb, 0x45, 0x96, + 0x68, 0x63, 0xc3, 0x30, 0xe8, 0x25, 0x64, 0x5b, 0x0e, 0xeb, 0xf9, 0x82, 0xc3, 0xe2, 0xfd, 0x4b, + 0xbf, 0xd2, 0x3a, 0xa5, 0x81, 0x39, 0x29, 0xfb, 0x7f, 0x59, 0x50, 0x59, 0x09, 0x83, 0x4d, 0xaf, + 0x79, 0xd5, 0x69, 0x1d, 0xc3, 0xf7, 0xa9, 0xc3, 0x00, 0xa3, 0xce, 0x87, 0x70, 0x3e, 0x6f, 0x08, + 0xa2, 0x63, 0x0b, 0xf4, 0x4c, 0xe5, 0xc2, 0x82, 0x62, 0x53, 0xb4, 0x08, 0x33, 0x62, 0x73, 0x2f, + 0x43, 0x45, 0x21, 0xa0, 0x29, 0x28, 0xdf, 0x21, 0x5c, 0x92, 0xac, 0x60, 0xfa, 0x13, 0xcd, 0xc0, + 0xe0, 0x8e, 0xe3, 0xb7, 0xc5, 0xe6, 0xc5, 0xfc, 0xcf, 0xc7, 0x4a, 0xaf, 0x58, 0xf6, 0x0f, 0xd8, + 0x0e, 0x14, 0x8d, 0xac, 0x06, 0x3b, 0x82, 0x39, 0x7c, 0xd1, 0x82, 0x19, 0xbf, 0x0b, 0x53, 0x12, + 0x73, 0x72, 0x18, 0x76, 0xf6, 0x98, 0xe8, 0xf6, 0x4c, 0x37, 0x28, 0xee, 0xda, 0x1a, 0xe5, 0xf5, + 0x61, 0x8b, 0x2e, 0x38, 0xc7, 0x67, 0x5d, 0x17, 0x32, 0xc0, 0x75, 0x51, 0x86, 0x15, 0xd4, 0xfe, + 0x73, 0x0b, 0x66, 0xd4, 0x38, 0x2e, 0x93, 0xdd, 0x3a, 0xf1, 0x49, 0x23, 0x09, 0xa3, 0x87, 0x65, + 0x24, 0x8f, 0xf3, 0x6f, 0xc2, 0x79, 0xd2, 0xa8, 0x20, 0x50, 0xbe, 0x4c, 0x76, 0xf9, 0x07, 0xd2, + 0x07, 0x5a, 0x3e, 0x70, 0xa0, 0xbf, 0x65, 0xc1, 0xb8, 0x1a, 0xe8, 0x31, 0x6c, 0xb9, 0x2b, 0xe6, + 0x96, 0xfb, 0xb9, 0x82, 0xeb, 0xb5, 0xc7, 0x66, 0xfb, 0x9b, 0x25, 0xca, 0x36, 0x04, 0x4e, 0x2d, + 0x0a, 0xe9, 0x24, 0x51, 0x8e, 0xff, 0x90, 0x7c, 0xa5, 0xfe, 0x06, 0x7b, 0x99, 0xec, 0x6e, 0x84, + 0x54, 0x9a, 0xe8, 0x3e, 0x58, 0xe3, 0xa3, 0x0e, 0x1c, 0xf8, 0x51, 0x7f, 0xbf, 0x04, 0x27, 0xd5, + 0xb4, 0x18, 0xa7, 0xf4, 0xcf, 0xe4, 0xc4, 0x9c, 0x87, 0x51, 0x97, 0x6c, 0x3a, 0x6d, 0x3f, 0x51, + 0xda, 0xc4, 0x20, 0x57, 0x33, 0xab, 0x69, 0x31, 0xd6, 0x71, 0xfa, 0x98, 0xcb, 0xaf, 0x8f, 0x32, + 0x7e, 0x9e, 0x38, 0x74, 0xd5, 0x53, 0x09, 0x4f, 0x53, 0x0f, 0xc7, 0x74, 0xf5, 0x50, 0xa8, 0x82, + 0x4f, 0xc2, 0xa0, 0xb7, 0x4d, 0xcf, 0xfc, 0x92, 0x79, 0x94, 0xaf, 0xd3, 0x42, 0xcc, 0x61, 0xe8, + 0x29, 0x18, 0x6e, 0x84, 0xdb, 0xdb, 0x4e, 0xe0, 0xce, 0x96, 0x99, 0xcc, 0x39, 0x4a, 0xc5, 0x82, + 0x15, 0x5e, 0x84, 0x25, 0x0c, 0x3d, 0x06, 0x03, 0x4e, 0xd4, 0x8c, 0x67, 0x07, 0x18, 0xce, 0x08, + 0x6d, 0x69, 0x29, 0x6a, 0xc6, 0x98, 0x95, 0x52, 0x59, 0xf2, 0x6e, 0x18, 0xdd, 0xf1, 0x82, 0x66, + 0xd5, 0x8b, 0x98, 0x60, 0xa8, 0xc9, 0x92, 0xb7, 0x14, 0x04, 0x6b, 0x58, 0xa8, 0x06, 0x83, 0xad, + 0x30, 0x4a, 0xe2, 0xd9, 0x21, 0x36, 0xf1, 0xcf, 0xe5, 0x6e, 0x3f, 0x3e, 0xee, 0x5a, 0x18, 0x25, + 0xe9, 0x50, 0xe8, 0xbf, 0x18, 0x73, 0x42, 0x68, 0x05, 0xca, 0x24, 0xd8, 0x99, 0x1d, 0x66, 0xf4, + 0x3e, 0x74, 0x30, 0xbd, 0xd5, 0x60, 0xe7, 0xa6, 0x13, 0xa5, 0xfc, 0x6a, 0x35, 0xd8, 0xc1, 0xb4, + 0x36, 0x6a, 0x40, 0x45, 0x1a, 0xc3, 0xe2, 0xd9, 0x91, 0x22, 0x4b, 0x11, 0x0b, 0x74, 0x4c, 0xde, + 0x6b, 0x7b, 0x11, 0xd9, 0x26, 0x41, 0x12, 0xa7, 0x8a, 0x95, 0x84, 0xc6, 0x38, 0xa5, 0x8b, 0x1a, + 0x30, 0xc6, 0xe5, 0xcf, 0xab, 0x61, 0x3b, 0x48, 0xe2, 0xd9, 0x0a, 0xeb, 0x72, 0x8e, 0xe5, 0xe2, + 0x66, 0x5a, 0x63, 0x79, 0x46, 0x90, 0x1f, 0xd3, 0x0a, 0x63, 0x6c, 0x10, 0x45, 0x6f, 0xc1, 0xb8, + 0xef, 0xed, 0x90, 0x80, 0xc4, 0x71, 0x2d, 0x0a, 0x6f, 0x93, 0x59, 0x60, 0xa3, 0x79, 0x32, 0x4f, + 0x8b, 0x0f, 0x6f, 0x93, 0xe5, 0xe9, 0xfd, 0xbd, 0xf9, 0xf1, 0x2b, 0x7a, 0x6d, 0x6c, 0x12, 0x43, + 0x6f, 0xc3, 0x04, 0x15, 0x76, 0xbd, 0x94, 0xfc, 0x68, 0x71, 0xf2, 0x68, 0x7f, 0x6f, 0x7e, 0x02, + 0x1b, 0xd5, 0x71, 0x86, 0x1c, 0xda, 0x80, 0x8a, 0xef, 0x6d, 0x92, 0xc6, 0x6e, 0xc3, 0x27, 0xb3, + 0x63, 0x8c, 0x76, 0xce, 0xe6, 0xbc, 0x22, 0xd1, 0xb9, 0x82, 0xa1, 0xfe, 0xe2, 0x94, 0x10, 0xba, + 0x09, 0xa7, 0x12, 0x12, 0x6d, 0x7b, 0x01, 0xb3, 0xd1, 0x09, 0xe9, 0x97, 0x99, 0x4a, 0xc6, 0xd9, + 0xaa, 0x3d, 0x2d, 0x26, 0xf6, 0xd4, 0x46, 0x57, 0x2c, 0xdc, 0xa3, 0x36, 0xba, 0x0e, 0x93, 0x6c, + 0x3f, 0xd5, 0xda, 0xbe, 0x5f, 0x0b, 0x7d, 0xaf, 0xb1, 0x3b, 0x3b, 0xc1, 0x08, 0x3e, 0x25, 0x0d, + 0x20, 0xeb, 0x26, 0x98, 0x2a, 0x86, 0xe9, 0x3f, 0x9c, 0xad, 0x8d, 0x7c, 0x98, 0x8c, 0x49, 0xa3, + 0x1d, 0x79, 0xc9, 0x2e, 0x5d, 0xfb, 0xe4, 0x5e, 0x32, 0x3b, 0x59, 0x44, 0xd1, 0xad, 0x9b, 0x95, + 0xb8, 0xf5, 0x29, 0x53, 0x88, 0xb3, 0xa4, 0x29, 0xab, 0x88, 0x13, 0xd7, 0x0b, 0x66, 0xa7, 0x18, + 0x07, 0x52, 0xfb, 0xab, 0x4e, 0x0b, 0x31, 0x87, 0x31, 0xfb, 0x01, 0xfd, 0x71, 0x9d, 0x72, 0xe9, + 0x69, 0x86, 0x98, 0xda, 0x0f, 0x24, 0x00, 0xa7, 0x38, 0x54, 0x34, 0x48, 0x92, 0xdd, 0x59, 0xc4, + 0x50, 0xd5, 0x56, 0xdb, 0xd8, 0xf8, 0x14, 0xa6, 0xe5, 0xe8, 0x26, 0x0c, 0x93, 0x60, 0x67, 0x2d, + 0x0a, 0xb7, 0x67, 0x4f, 0x14, 0xe1, 0x01, 0xab, 0x1c, 0x99, 0x9f, 0x1f, 0xa9, 0x0a, 0x23, 0x8a, + 0xb1, 0x24, 0x86, 0xee, 0xc1, 0x6c, 0x97, 0xaf, 0xc4, 0x3f, 0xca, 0x0c, 0xfb, 0x28, 0x1f, 0x17, + 0x75, 0x67, 0x37, 0x7a, 0xe0, 0xdd, 0x3f, 0x00, 0x86, 0x7b, 0x52, 0xb7, 0x6f, 0xc3, 0x84, 0x62, + 0x54, 0xec, 0x7b, 0xa3, 0x79, 0x18, 0xa4, 0xbc, 0x58, 0x2a, 0xf4, 0x15, 0x3a, 0xa9, 0x94, 0x45, + 0xc7, 0x98, 0x97, 0xb3, 0x49, 0xf5, 0x3e, 0x4b, 0x96, 0x77, 0x13, 0xc2, 0x15, 0xbb, 0xb2, 0x36, + 0xa9, 0x12, 0x80, 0x53, 0x1c, 0xfb, 0xff, 0x70, 0x31, 0x29, 0xe5, 0x86, 0x05, 0x4e, 0x82, 0x73, + 0x30, 0xb2, 0x15, 0xc6, 0x09, 0xc5, 0x66, 0x6d, 0x0c, 0xa6, 0x82, 0xd1, 0x25, 0x51, 0x8e, 0x15, + 0x06, 0x7a, 0x15, 0xc6, 0x1b, 0x7a, 0x03, 0xe2, 0x18, 0x3b, 0x29, 0xaa, 0x98, 0xad, 0x63, 0x13, + 0x17, 0xbd, 0x02, 0x23, 0xcc, 0xca, 0xdd, 0x08, 0x7d, 0xa1, 0x42, 0xca, 0x53, 0x79, 0xa4, 0x26, + 0xca, 0xef, 0x6b, 0xbf, 0xb1, 0xc2, 0xa6, 0x8a, 0x38, 0xed, 0xc2, 0x7a, 0x4d, 0x1c, 0x20, 0x4a, + 0x11, 0xbf, 0xc4, 0x4a, 0xb1, 0x80, 0xda, 0xff, 0xac, 0xa4, 0xcd, 0x32, 0x55, 0x80, 0x08, 0x7a, + 0x13, 0x86, 0xef, 0x3a, 0x5e, 0xe2, 0x05, 0x4d, 0x21, 0x3d, 0xbc, 0x50, 0xf0, 0x34, 0x61, 0xd5, + 0x6f, 0xf1, 0xaa, 0xfc, 0xe4, 0x13, 0x7f, 0xb0, 0x24, 0x48, 0x69, 0x47, 0xed, 0x20, 0xa0, 0xb4, + 0x4b, 0xfd, 0xd3, 0xc6, 0xbc, 0x2a, 0xa7, 0x2d, 0xfe, 0x60, 0x49, 0x10, 0x6d, 0x02, 0xc8, 0xb5, + 0x44, 0x5c, 0x61, 0x5d, 0xfe, 0x48, 0x3f, 0xe4, 0x37, 0x54, 0xed, 0xe5, 0x09, 0x7a, 0xd6, 0xa6, + 0xff, 0xb1, 0x46, 0xd9, 0x4e, 0x98, 0x10, 0xd6, 0xd9, 0x2d, 0xf4, 0x69, 0xba, 0xa5, 0x9d, 0x28, + 0x21, 0xee, 0x52, 0x92, 0x35, 0xd0, 0x1f, 0x2c, 0x62, 0x6f, 0x78, 0xdb, 0x44, 0xdf, 0xfe, 0x82, + 0x08, 0x4e, 0xe9, 0xd9, 0xdf, 0x2d, 0xc3, 0x6c, 0xaf, 0xee, 0xd2, 0x25, 0x49, 0xee, 0x79, 0xc9, + 0x0a, 0x15, 0x93, 0x2c, 0x73, 0x49, 0xae, 0x8a, 0x72, 0xac, 0x30, 0xe8, 0xda, 0x88, 0xbd, 0xa6, + 0x54, 0x96, 0x06, 0xd3, 0xb5, 0x51, 0x67, 0xa5, 0x58, 0x40, 0x29, 0x5e, 0x44, 0x9c, 0x58, 0x5c, + 0x6e, 0x68, 0x6b, 0x08, 0xb3, 0x52, 0x2c, 0xa0, 0xba, 0x41, 0x64, 0x20, 0xc7, 0x20, 0x62, 0x4c, + 0xd1, 0xe0, 0x83, 0x9d, 0x22, 0xf4, 0x19, 0x80, 0x4d, 0x2f, 0xf0, 0xe2, 0x2d, 0x46, 0x7d, 0xa8, + 0x6f, 0xea, 0x4a, 0xc8, 0x5a, 0x53, 0x54, 0xb0, 0x46, 0x11, 0xbd, 0x04, 0xa3, 0x6a, 0x7b, 0xae, + 0x57, 0x67, 0x87, 0x4d, 0x83, 0x78, 0xca, 0xab, 0xaa, 0x58, 0xc7, 0xb3, 0xdf, 0xcd, 0xae, 0x17, + 0xb1, 0x2b, 0xb4, 0xf9, 0xb5, 0x8a, 0xce, 0x6f, 0xe9, 0xe0, 0xf9, 0xb5, 0xff, 0x53, 0x19, 0x26, + 0x8d, 0xc6, 0xda, 0x71, 0x01, 0x8e, 0xf6, 0x3a, 0x3d, 0xb0, 0x9c, 0x84, 0x88, 0x3d, 0x79, 0xae, + 0x9f, 0x4d, 0xa3, 0x1f, 0x6f, 0x74, 0x2f, 0x70, 0x4a, 0x68, 0x0b, 0x2a, 0xbe, 0x13, 0x33, 0x93, + 0x0a, 0x11, 0x7b, 0xb1, 0x3f, 0xb2, 0xa9, 0xfa, 0xe1, 0xc4, 0x89, 0x76, 0x7a, 0xf0, 0x56, 0x52, + 0xe2, 0xf4, 0xb4, 0xa5, 0xc2, 0x8e, 0xbc, 0x51, 0x53, 0xdd, 0xa1, 0x12, 0xd1, 0x2e, 0xe6, 0x30, + 0xf4, 0x0a, 0x8c, 0x45, 0x84, 0xad, 0x94, 0x15, 0x2a, 0xcf, 0xb1, 0xa5, 0x37, 0x98, 0x0a, 0x7e, + 0x58, 0x83, 0x61, 0x03, 0x33, 0x95, 0xfb, 0x87, 0x0e, 0x90, 0xfb, 0x9f, 0x81, 0x61, 0xf6, 0x43, + 0xad, 0x0a, 0xf5, 0x85, 0xd6, 0x79, 0x31, 0x96, 0xf0, 0xec, 0x22, 0x1a, 0x29, 0xb8, 0x88, 0x9e, + 0x85, 0x89, 0xaa, 0x43, 0xb6, 0xc3, 0x60, 0x35, 0x70, 0x5b, 0xa1, 0x17, 0x24, 0x68, 0x16, 0x06, + 0xd8, 0x79, 0xc2, 0xf7, 0xfb, 0x00, 0xa5, 0x80, 0x07, 0xa8, 0xec, 0x6e, 0xff, 0x49, 0x09, 0xc6, + 0xab, 0xc4, 0x27, 0x09, 0xe1, 0x7a, 0x4f, 0x8c, 0xd6, 0x00, 0x35, 0x23, 0xa7, 0x41, 0x6a, 0x24, + 0xf2, 0x42, 0xb7, 0x4e, 0x1a, 0x61, 0xc0, 0x2e, 0xa2, 0xe8, 0x01, 0x79, 0x6a, 0x7f, 0x6f, 0x1e, + 0x5d, 0xec, 0x80, 0xe2, 0x2e, 0x35, 0x90, 0x0b, 0xe3, 0xad, 0x88, 0x18, 0x76, 0x43, 0x2b, 0x5f, + 0xd4, 0xa8, 0xe9, 0x55, 0xb8, 0x34, 0x6c, 0x14, 0x61, 0x93, 0x28, 0xfa, 0x04, 0x4c, 0x85, 0x51, + 0x6b, 0xcb, 0x09, 0xaa, 0xa4, 0x45, 0x02, 0x97, 0xaa, 0x00, 0xc2, 0xda, 0x31, 0xb3, 0xbf, 0x37, + 0x3f, 0x75, 0x3d, 0x03, 0xc3, 0x1d, 0xd8, 0xe8, 0x4d, 0x98, 0x6e, 0x45, 0x61, 0xcb, 0x69, 0xb2, + 0x25, 0x23, 0xa4, 0x15, 0xce, 0x9b, 0xce, 0xed, 0xef, 0xcd, 0x4f, 0xd7, 0xb2, 0xc0, 0xfb, 0x7b, + 0xf3, 0x27, 0xd8, 0x94, 0xd1, 0x92, 0x14, 0x88, 0x3b, 0xc9, 0xd8, 0xef, 0xc1, 0xc9, 0x6a, 0x78, + 0x37, 0xb8, 0xeb, 0x44, 0xee, 0x52, 0x6d, 0x5d, 0x33, 0x4e, 0xbc, 0x21, 0x95, 0x5f, 0x7e, 0xc1, + 0x97, 0x73, 0xb2, 0x69, 0x34, 0xb8, 0xda, 0xb1, 0xe6, 0xf9, 0xa4, 0x87, 0x39, 0xe4, 0x1f, 0x95, + 0x8c, 0x36, 0x53, 0x7c, 0x75, 0x77, 0x61, 0xf5, 0xbc, 0xbb, 0xf8, 0x34, 0x8c, 0x6c, 0x7a, 0xc4, + 0x77, 0x31, 0xd9, 0x14, 0x5f, 0xeb, 0x7c, 0x91, 0xcb, 0x9d, 0x35, 0x5a, 0x47, 0x5a, 0xc7, 0xb8, + 0x12, 0xbd, 0x26, 0xc8, 0x60, 0x45, 0x10, 0xb5, 0x61, 0x4a, 0xea, 0x61, 0x12, 0x2a, 0x36, 0xfb, + 0x0b, 0xc5, 0xd4, 0x3c, 0xb3, 0x19, 0xf6, 0x79, 0x71, 0x86, 0x20, 0xee, 0x68, 0x82, 0xea, 0xcf, + 0xdb, 0xf4, 0xa8, 0x1b, 0x60, 0x4b, 0x9f, 0xe9, 0xcf, 0xcc, 0x14, 0xc0, 0x4a, 0xed, 0x5f, 0xb7, + 0xe0, 0x91, 0x8e, 0xd9, 0x12, 0x76, 0x92, 0x23, 0xfb, 0x46, 0x59, 0x63, 0x45, 0x29, 0xdf, 0x58, + 0x61, 0x5f, 0x87, 0x99, 0xd5, 0xed, 0x56, 0xb2, 0x5b, 0xf5, 0xcc, 0x2b, 0x97, 0x97, 0x61, 0x68, + 0x9b, 0xb8, 0x5e, 0x7b, 0x5b, 0x7c, 0xd6, 0x79, 0x79, 0x2e, 0x5c, 0x65, 0xa5, 0xf7, 0xf7, 0xe6, + 0xc7, 0xeb, 0x49, 0x18, 0x39, 0x4d, 0xc2, 0x0b, 0xb0, 0x40, 0xb7, 0x7f, 0x6c, 0xc1, 0xa4, 0xe4, + 0x0f, 0x4b, 0xae, 0x1b, 0x91, 0x38, 0x46, 0x73, 0x50, 0xf2, 0x5a, 0x82, 0x10, 0x08, 0x42, 0xa5, + 0xf5, 0x1a, 0x2e, 0x79, 0x2d, 0xf4, 0x26, 0x54, 0xf8, 0x4d, 0x5d, 0xba, 0x38, 0xfa, 0xbc, 0xf9, + 0x63, 0xba, 0xe1, 0x86, 0xa4, 0x81, 0x53, 0x72, 0x52, 0x4a, 0x66, 0x27, 0x4f, 0xd9, 0xbc, 0x37, + 0xba, 0x24, 0xca, 0xb1, 0xc2, 0x40, 0x67, 0x61, 0x24, 0x08, 0x5d, 0x7e, 0x99, 0xca, 0xf7, 0x29, + 0x5b, 0x72, 0xd7, 0x44, 0x19, 0x56, 0x50, 0xfb, 0x2b, 0x16, 0x8c, 0xc9, 0x31, 0x16, 0x14, 0xd8, + 0xe9, 0x26, 0x49, 0x85, 0xf5, 0x74, 0x93, 0x50, 0x81, 0x9b, 0x41, 0x0c, 0x39, 0xbb, 0xdc, 0x8f, + 0x9c, 0x6d, 0xff, 0x66, 0x09, 0x26, 0x64, 0x77, 0xea, 0xed, 0xdb, 0x31, 0xa1, 0x62, 0x48, 0xc5, + 0xe1, 0x93, 0x4f, 0xe4, 0x3a, 0x7b, 0x3e, 0x4f, 0x17, 0x33, 0xbe, 0x59, 0x2a, 0xe6, 0x2c, 0x49, + 0x3a, 0x38, 0x25, 0x89, 0x76, 0x60, 0x3a, 0x08, 0x13, 0x76, 0xbc, 0x29, 0x78, 0xb1, 0x9b, 0x8e, + 0x6c, 0x3b, 0x8f, 0x8a, 0x76, 0xa6, 0xaf, 0x65, 0xe9, 0xe1, 0xce, 0x26, 0xd0, 0x75, 0x69, 0x63, + 0x2a, 0xb3, 0xb6, 0x9e, 0x2d, 0xd6, 0x56, 0x6f, 0x13, 0x93, 0xfd, 0x7b, 0x16, 0x54, 0x24, 0xda, + 0x71, 0x5c, 0x79, 0xdd, 0x82, 0xe1, 0x98, 0x7d, 0x22, 0x39, 0x5d, 0xe7, 0x8a, 0x0d, 0x81, 0x7f, + 0xd7, 0xf4, 0x4c, 0xe7, 0xff, 0x63, 0x2c, 0xa9, 0x31, 0x63, 0xbb, 0x1a, 0xc8, 0x43, 0x67, 0x6c, + 0x57, 0x3d, 0xeb, 0x7d, 0xb3, 0x35, 0x6e, 0x58, 0x03, 0xa8, 0x60, 0xda, 0x8a, 0xc8, 0xa6, 0x77, + 0x2f, 0x2b, 0x98, 0xd6, 0x58, 0x29, 0x16, 0x50, 0xb4, 0x09, 0x63, 0x0d, 0x69, 0x8e, 0x4e, 0x59, + 0xc8, 0x87, 0x0b, 0xda, 0xfe, 0xd5, 0x35, 0x12, 0x77, 0x4d, 0x5a, 0xd1, 0x28, 0x61, 0x83, 0x2e, + 0xe5, 0x53, 0xe9, 0x4d, 0x79, 0xb9, 0xa0, 0xe1, 0x26, 0x22, 0x49, 0xda, 0x42, 0xcf, 0x4b, 0x72, + 0xfb, 0x1b, 0x16, 0x0c, 0x71, 0xfb, 0x65, 0x31, 0x23, 0xb0, 0x76, 0x41, 0x96, 0xce, 0xe7, 0x4d, + 0x5a, 0x28, 0xee, 0xcb, 0xd0, 0x2d, 0xa8, 0xb0, 0x1f, 0xcc, 0x16, 0x53, 0x2e, 0xe2, 0xa7, 0xc5, + 0xdb, 0xd7, 0xbb, 0x7a, 0x53, 0x12, 0xc0, 0x29, 0x2d, 0xfb, 0xfb, 0x65, 0xca, 0xfa, 0x52, 0x54, + 0xe3, 0x6c, 0xb7, 0x8e, 0xe3, 0x6c, 0x2f, 0x1d, 0xfd, 0xd9, 0xfe, 0x1e, 0x4c, 0x36, 0xb4, 0x0b, + 0xba, 0xf4, 0x8b, 0x5f, 0x28, 0xb8, 0xac, 0xb4, 0x5b, 0x3d, 0x6e, 0xaf, 0x5b, 0x31, 0xc9, 0xe1, + 0x2c, 0x7d, 0x44, 0x60, 0x8c, 0xaf, 0x07, 0xd1, 0xde, 0x00, 0x6b, 0x6f, 0xb1, 0xc8, 0x0a, 0xd3, + 0x1b, 0x63, 0xab, 0xb8, 0xae, 0x11, 0xc2, 0x06, 0x59, 0xfb, 0x57, 0x07, 0x61, 0x70, 0x75, 0x87, + 0x04, 0xc9, 0x31, 0xb0, 0xba, 0x6d, 0x98, 0xf0, 0x82, 0x9d, 0xd0, 0xdf, 0x21, 0x2e, 0x87, 0x1f, + 0xee, 0x78, 0x3f, 0x25, 0x1a, 0x99, 0x58, 0x37, 0x88, 0xe1, 0x0c, 0xf1, 0xa3, 0xb0, 0x14, 0xbc, + 0x0e, 0x43, 0x7c, 0x65, 0x08, 0x33, 0x41, 0x8e, 0x3d, 0x9f, 0x4d, 0xac, 0xd8, 0x41, 0xa9, 0x3d, + 0x83, 0x5f, 0x25, 0x08, 0x42, 0xe8, 0x5d, 0x98, 0xd8, 0xf4, 0xa2, 0x38, 0xa1, 0xca, 0x7e, 0x9c, + 0x38, 0xdb, 0xad, 0x43, 0xd8, 0x08, 0xd4, 0x8c, 0xac, 0x19, 0x94, 0x70, 0x86, 0x32, 0x6a, 0xc2, + 0x38, 0x55, 0x51, 0xd3, 0xa6, 0x86, 0xfb, 0x6e, 0x4a, 0x99, 0x08, 0xaf, 0xe8, 0x84, 0xb0, 0x49, + 0x97, 0xb2, 0xa4, 0x06, 0x53, 0x69, 0x47, 0x98, 0x74, 0xa3, 0x58, 0x12, 0xd7, 0x65, 0x39, 0x8c, + 0x72, 0x36, 0xe6, 0x29, 0x53, 0x31, 0x39, 0x5b, 0xea, 0x0f, 0x63, 0x7f, 0x8b, 0x9e, 0xc5, 0x74, + 0x0e, 0x8f, 0xe1, 0xf8, 0xba, 0x64, 0x1e, 0x5f, 0x4f, 0x16, 0xf8, 0xb2, 0x3d, 0x8e, 0xae, 0x77, + 0x60, 0x54, 0xfb, 0xf0, 0x68, 0x11, 0x2a, 0x0d, 0xe9, 0xcc, 0x21, 0xb8, 0xb8, 0x12, 0xa5, 0x94, + 0x97, 0x07, 0x4e, 0x71, 0xe8, 0xbc, 0x50, 0x11, 0x34, 0xeb, 0xfa, 0x45, 0x05, 0x54, 0xcc, 0x20, + 0xf6, 0x0b, 0x00, 0xab, 0xf7, 0x48, 0x63, 0x89, 0xab, 0x78, 0xda, 0xfd, 0x9e, 0xd5, 0xfb, 0x7e, + 0xcf, 0xfe, 0xa6, 0x05, 0x13, 0x6b, 0x2b, 0x86, 0x4c, 0xbf, 0x00, 0xc0, 0x65, 0xe3, 0x5b, 0xb7, + 0xae, 0x49, 0xfb, 0x35, 0x37, 0x32, 0xaa, 0x52, 0xac, 0x61, 0xa0, 0x47, 0xa1, 0xec, 0xb7, 0x03, + 0x21, 0xb2, 0x0e, 0xef, 0xef, 0xcd, 0x97, 0xaf, 0xb4, 0x03, 0x4c, 0xcb, 0x34, 0x1f, 0xab, 0x72, + 0x61, 0x1f, 0xab, 0x7c, 0x6f, 0xe3, 0xaf, 0x95, 0x61, 0x6a, 0xcd, 0x27, 0xf7, 0x8c, 0x5e, 0x3f, + 0x0d, 0x43, 0x6e, 0xe4, 0xed, 0x90, 0x28, 0x2b, 0x08, 0x54, 0x59, 0x29, 0x16, 0xd0, 0xc2, 0x6e, + 0x5f, 0x6f, 0x77, 0x1e, 0xe4, 0x47, 0xe7, 0xf2, 0x96, 0x3b, 0x66, 0xb4, 0x09, 0xc3, 0xfc, 0x3e, + 0x38, 0x9e, 0x1d, 0x64, 0x4b, 0xf1, 0xd5, 0x83, 0x3b, 0x93, 0x9d, 0x9f, 0x05, 0x61, 0x5f, 0xe1, + 0x0e, 0x37, 0x8a, 0x97, 0x89, 0x52, 0x2c, 0x89, 0xcf, 0x7d, 0x0c, 0xc6, 0x74, 0xcc, 0xbe, 0x3c, + 0x6f, 0xfe, 0x8a, 0x05, 0x27, 0xd6, 0xfc, 0xb0, 0x71, 0x27, 0xe3, 0x97, 0xf7, 0x12, 0x8c, 0xd2, + 0xcd, 0x14, 0x1b, 0x4e, 0xab, 0x86, 0x77, 0xae, 0x00, 0x61, 0x1d, 0x4f, 0xab, 0x76, 0xe3, 0xc6, + 0x7a, 0xb5, 0x9b, 0x53, 0xaf, 0x00, 0x61, 0x1d, 0xcf, 0xfe, 0x03, 0x0b, 0x1e, 0xbf, 0xb8, 0xb2, + 0x5a, 0x23, 0x51, 0xec, 0xc5, 0x09, 0x09, 0x92, 0x0e, 0xbf, 0x62, 0x2a, 0x33, 0xba, 0x5a, 0x57, + 0x52, 0x99, 0xb1, 0xca, 0x7a, 0x21, 0xa0, 0x0f, 0x8b, 0x73, 0xfd, 0x37, 0x2c, 0x38, 0x71, 0xd1, + 0x4b, 0x30, 0x69, 0x85, 0x59, 0x57, 0xe0, 0x88, 0xb4, 0xc2, 0xd8, 0x4b, 0xc2, 0x68, 0x37, 0xeb, + 0x0a, 0x8c, 0x15, 0x04, 0x6b, 0x58, 0xbc, 0xe5, 0x1d, 0x2f, 0xa6, 0x3d, 0x2d, 0x99, 0xaa, 0x2e, + 0x16, 0xe5, 0x58, 0x61, 0xd0, 0x81, 0xb9, 0x5e, 0xc4, 0x44, 0x86, 0x5d, 0xb1, 0x83, 0xd5, 0xc0, + 0xaa, 0x12, 0x80, 0x53, 0x1c, 0xfb, 0xef, 0x58, 0x70, 0xf2, 0xa2, 0xdf, 0x8e, 0x13, 0x12, 0x6d, + 0xc6, 0x46, 0x67, 0x5f, 0x80, 0x0a, 0x91, 0xc2, 0xbd, 0xe8, 0xab, 0x3a, 0x34, 0x94, 0xd4, 0xcf, + 0xfd, 0x90, 0x15, 0x5e, 0x01, 0x77, 0xd7, 0xfe, 0x9c, 0x33, 0x7f, 0xbb, 0x04, 0xe3, 0x97, 0x36, + 0x36, 0x6a, 0x17, 0x49, 0x22, 0xb8, 0x64, 0xbe, 0x51, 0x0a, 0x6b, 0x1a, 0xf9, 0x41, 0xc2, 0x4f, + 0x3b, 0xf1, 0xfc, 0x05, 0x1e, 0x78, 0xb2, 0xb0, 0x1e, 0x24, 0xd7, 0xa3, 0x7a, 0x12, 0x79, 0x41, + 0xb3, 0xab, 0x0e, 0x2f, 0x79, 0x79, 0xb9, 0x17, 0x2f, 0x47, 0x2f, 0xc0, 0x10, 0x8b, 0x7c, 0x91, + 0xc2, 0xc7, 0x07, 0x95, 0x9c, 0xc0, 0x4a, 0xef, 0xef, 0xcd, 0x57, 0x6e, 0xe0, 0x75, 0xfe, 0x07, + 0x0b, 0x54, 0xf4, 0x36, 0x8c, 0x6e, 0x25, 0x49, 0xeb, 0x12, 0x71, 0x5c, 0x12, 0x49, 0x3e, 0x71, + 0xf6, 0x60, 0x3e, 0x41, 0xa7, 0x83, 0x57, 0x48, 0xb7, 0x56, 0x5a, 0x16, 0x63, 0x9d, 0xa2, 0x5d, + 0x07, 0x48, 0x61, 0x0f, 0x48, 0x07, 0xb1, 0x7f, 0xb1, 0x04, 0xc3, 0x97, 0x9c, 0xc0, 0xf5, 0x49, + 0x84, 0xd6, 0x60, 0x80, 0xdc, 0x23, 0x0d, 0x71, 0x90, 0xe7, 0x74, 0x3d, 0x3d, 0xec, 0xb8, 0x5d, + 0x8d, 0xfe, 0xc7, 0xac, 0x3e, 0xc2, 0x30, 0x4c, 0xfb, 0x7d, 0x51, 0x79, 0x89, 0x3f, 0x97, 0x3f, + 0x0b, 0x6a, 0x51, 0xf0, 0x93, 0x52, 0x14, 0x61, 0x49, 0x88, 0x59, 0xa0, 0x1a, 0xad, 0x3a, 0x65, + 0x6f, 0x49, 0x31, 0xcd, 0x6e, 0x63, 0xa5, 0xc6, 0xd1, 0x05, 0x5d, 0x6e, 0x81, 0x92, 0x85, 0x38, + 0x25, 0x67, 0x6f, 0x40, 0x85, 0x7e, 0xfc, 0x25, 0xdf, 0x73, 0x0e, 0x36, 0x83, 0x3d, 0x07, 0x15, + 0x69, 0x88, 0x8a, 0x85, 0xcb, 0x39, 0xa3, 0x2a, 0xed, 0x54, 0x31, 0x4e, 0xe1, 0xf6, 0x2b, 0x30, + 0xc3, 0x6e, 0x79, 0x9d, 0x64, 0xcb, 0xd8, 0x8b, 0xb9, 0x8b, 0xde, 0xfe, 0xf6, 0x00, 0x4c, 0xaf, + 0xd7, 0x57, 0xea, 0xa6, 0x45, 0xf2, 0x15, 0x18, 0xe3, 0xc7, 0x3e, 0x5d, 0xca, 0x8e, 0x2f, 0xea, + 0xab, 0x9b, 0x89, 0x0d, 0x0d, 0x86, 0x0d, 0x4c, 0xf4, 0x38, 0x94, 0xbd, 0xf7, 0x82, 0xac, 0xaf, + 0xe0, 0xfa, 0xeb, 0xd7, 0x30, 0x2d, 0xa7, 0x60, 0x2a, 0x41, 0x70, 0xd6, 0xa9, 0xc0, 0x4a, 0x8a, + 0x78, 0x0d, 0x26, 0xbc, 0xb8, 0x11, 0x7b, 0xeb, 0x01, 0xe5, 0x2b, 0x4e, 0x43, 0x6e, 0x8a, 0x54, + 0xe4, 0xa7, 0x5d, 0x55, 0x50, 0x9c, 0xc1, 0xd6, 0xf8, 0xf8, 0x60, 0x61, 0x29, 0x24, 0xd7, 0x09, + 0x9d, 0x0a, 0x58, 0x2d, 0x36, 0xba, 0x98, 0x79, 0x1e, 0x09, 0x01, 0x8b, 0x0f, 0x38, 0xc6, 0x12, + 0x86, 0x2e, 0xc2, 0x74, 0x63, 0xcb, 0x69, 0x2d, 0xb5, 0x93, 0xad, 0xaa, 0x17, 0x37, 0xc2, 0x1d, + 0x12, 0xed, 0x32, 0x01, 0x78, 0x24, 0xb5, 0x69, 0x29, 0xc0, 0xca, 0xa5, 0xa5, 0x1a, 0xc5, 0xc4, + 0x9d, 0x75, 0x4c, 0x81, 0x04, 0x8e, 0x40, 0x20, 0x59, 0x82, 0x49, 0xd9, 0x6a, 0x9d, 0xc4, 0xec, + 0x88, 0x18, 0x65, 0xfd, 0x54, 0xb1, 0x3c, 0xa2, 0x58, 0xf5, 0x32, 0x8b, 0x6f, 0xbf, 0x0b, 0x15, + 0xe5, 0x29, 0x27, 0x1d, 0x44, 0xad, 0x1e, 0x0e, 0xa2, 0xf9, 0xcc, 0x5d, 0xda, 0xce, 0xcb, 0x5d, + 0x6d, 0xe7, 0xff, 0xc4, 0x82, 0xd4, 0xd5, 0x07, 0x61, 0xa8, 0xb4, 0x42, 0x76, 0xcf, 0x16, 0xc9, + 0x0b, 0xed, 0xa7, 0x72, 0xf6, 0x3c, 0xe7, 0x39, 0x7c, 0x42, 0x6a, 0xb2, 0x2e, 0x4e, 0xc9, 0xa0, + 0x2b, 0x30, 0xdc, 0x8a, 0x48, 0x3d, 0x61, 0xd1, 0x1d, 0x7d, 0x50, 0xe4, 0x0b, 0x81, 0xd7, 0xc4, + 0x92, 0x84, 0xfd, 0x2f, 0x2c, 0x80, 0x2b, 0xde, 0xb6, 0x97, 0x60, 0x27, 0x68, 0x92, 0x63, 0x50, + 0xac, 0xaf, 0xc1, 0x40, 0xdc, 0x22, 0x8d, 0x62, 0x37, 0xa5, 0x69, 0xcf, 0xea, 0x2d, 0xd2, 0x48, + 0x3f, 0x07, 0xfd, 0x87, 0x19, 0x1d, 0xfb, 0x7b, 0x00, 0x13, 0x29, 0x1a, 0x55, 0x6e, 0xd0, 0xf3, + 0x46, 0x58, 0xc3, 0xa3, 0x99, 0xb0, 0x86, 0x0a, 0xc3, 0xd6, 0x22, 0x19, 0x12, 0x28, 0x6f, 0x3b, + 0xf7, 0x84, 0x2e, 0xf5, 0x52, 0xd1, 0x0e, 0xd1, 0x96, 0x16, 0xae, 0x3a, 0xf7, 0xb8, 0xe8, 0xfa, + 0x9c, 0x5c, 0x48, 0x57, 0x9d, 0x7b, 0xf7, 0xf9, 0x7d, 0x28, 0xe3, 0x4e, 0x54, 0x79, 0xfb, 0xc2, + 0x9f, 0xa6, 0xff, 0xd9, 0x31, 0x44, 0x9b, 0x63, 0xad, 0x7a, 0x81, 0x30, 0x05, 0xf7, 0xd9, 0xaa, + 0x17, 0x64, 0x5b, 0xf5, 0x82, 0x02, 0xad, 0x7a, 0xcc, 0xff, 0x77, 0x58, 0xdc, 0xa0, 0x30, 0xe7, + 0xc9, 0xd1, 0x0b, 0x1f, 0xed, 0xab, 0x69, 0x71, 0x15, 0xc3, 0x9b, 0x5f, 0x94, 0xf2, 0xba, 0x28, + 0xcd, 0xed, 0x82, 0x6c, 0x1a, 0xfd, 0x5d, 0x0b, 0x26, 0xc4, 0x6f, 0x4c, 0xde, 0x6b, 0x93, 0x38, + 0x11, 0x72, 0xc1, 0x27, 0x0e, 0xd3, 0x1b, 0x41, 0x82, 0x77, 0xea, 0x23, 0x92, 0xfd, 0x9a, 0xc0, + 0xdc, 0xbe, 0x65, 0xfa, 0x83, 0xbe, 0x67, 0xc1, 0xcc, 0xb6, 0x73, 0x8f, 0xb7, 0xc8, 0xcb, 0xb0, + 0x93, 0x78, 0xa1, 0x70, 0x10, 0x5d, 0xeb, 0x77, 0x9d, 0x74, 0x10, 0xe2, 0xdd, 0x95, 0xbe, 0x5f, + 0x33, 0xdd, 0x50, 0x72, 0x3b, 0xdd, 0xb5, 0x87, 0x73, 0x9b, 0x30, 0x22, 0x17, 0x66, 0x17, 0x4d, + 0xa9, 0xaa, 0x8b, 0x3f, 0x39, 0x76, 0x89, 0x05, 0x69, 0x5d, 0x5c, 0x78, 0xbd, 0xed, 0x04, 0x89, + 0x97, 0xec, 0x6a, 0x9a, 0x15, 0x6b, 0x47, 0x2c, 0xc5, 0x23, 0x6d, 0xe7, 0x5d, 0x18, 0xd3, 0xd7, + 0xdd, 0x91, 0xb6, 0xf5, 0x1e, 0x9c, 0xe8, 0xb2, 0xaa, 0x8e, 0xb4, 0xc9, 0xbb, 0xf0, 0x68, 0xcf, + 0xf5, 0x71, 0x94, 0x0d, 0xdb, 0xbf, 0x6d, 0xe9, 0xac, 0xf3, 0x18, 0xec, 0x56, 0x57, 0x4d, 0xbb, + 0xd5, 0xd9, 0xa2, 0x7b, 0xa8, 0x87, 0xf1, 0x6a, 0x53, 0xef, 0x3e, 0x3d, 0x12, 0xd0, 0x06, 0x0c, + 0xf9, 0xb4, 0x44, 0x5e, 0x1b, 0x9e, 0xeb, 0x67, 0x97, 0xa6, 0x12, 0x18, 0x2b, 0x8f, 0xb1, 0xa0, + 0x65, 0x7f, 0xcf, 0x82, 0x81, 0xbf, 0xc4, 0xa0, 0xab, 0x0e, 0xd2, 0x22, 0x0b, 0xc1, 0x02, 0x76, + 0xee, 0xae, 0xde, 0x4b, 0x48, 0x10, 0x33, 0x31, 0xbe, 0x97, 0xe3, 0xc3, 0x28, 0x6d, 0x4a, 0xfa, + 0xb1, 0xbc, 0x0a, 0xe3, 0xbe, 0x73, 0x9b, 0xf8, 0xd2, 0xe6, 0x9e, 0x55, 0x7a, 0xaf, 0xe8, 0x40, + 0x6c, 0xe2, 0xd2, 0xca, 0x9b, 0xfa, 0x95, 0x84, 0x10, 0x92, 0x54, 0x65, 0xe3, 0xbe, 0x02, 0x9b, + 0xb8, 0x54, 0xeb, 0xba, 0xeb, 0x24, 0x8d, 0x2d, 0xa1, 0x10, 0xab, 0xee, 0xde, 0xa2, 0x85, 0x98, + 0xc3, 0xa8, 0xb0, 0x27, 0x57, 0xec, 0x4d, 0x12, 0x31, 0x61, 0x8f, 0x0b, 0xd5, 0x4a, 0xd8, 0xc3, + 0x26, 0x18, 0x67, 0xf1, 0xd1, 0xc7, 0x60, 0x82, 0x4e, 0x4e, 0xd8, 0x4e, 0xa4, 0x97, 0xce, 0x20, + 0xf3, 0xd2, 0x61, 0x4e, 0xde, 0x1b, 0x06, 0x04, 0x67, 0x30, 0xed, 0xb7, 0xe1, 0xc4, 0x95, 0xd0, + 0x71, 0x97, 0x1d, 0xdf, 0x09, 0x1a, 0x24, 0x5a, 0x0f, 0x9a, 0xb9, 0x1e, 0x00, 0xfa, 0x2d, 0x7d, + 0x29, 0xef, 0x96, 0xde, 0x8e, 0x00, 0xe9, 0x0d, 0x08, 0xff, 0xb2, 0xb7, 0x60, 0xd8, 0xe3, 0x4d, + 0x89, 0x65, 0x7b, 0x3e, 0x4f, 0x82, 0xee, 0xe8, 0xa3, 0xe6, 0x2f, 0xc5, 0x0b, 0xb0, 0x24, 0x49, + 0xf5, 0xad, 0x6e, 0x22, 0x77, 0xbe, 0xa2, 0x6c, 0xff, 0x55, 0x0b, 0x26, 0xaf, 0x65, 0xa2, 0x82, + 0x9f, 0x86, 0x21, 0x9e, 0xa5, 0x22, 0x6b, 0xa5, 0xaa, 0xb3, 0x52, 0x2c, 0xa0, 0x0f, 0xdc, 0x48, + 0xf2, 0x2b, 0x25, 0xa8, 0x30, 0x4f, 0xe5, 0x16, 0xd5, 0x9d, 0x8e, 0x5e, 0x4c, 0xbd, 0x6a, 0x88, + 0xa9, 0x39, 0x8a, 0xba, 0xea, 0x58, 0x2f, 0x29, 0x15, 0xdd, 0x50, 0xd1, 0xb2, 0x85, 0x74, 0xf4, + 0x94, 0x20, 0x8f, 0xa8, 0x9c, 0x30, 0x83, 0x6b, 0x65, 0x24, 0x2d, 0xbb, 0x37, 0x57, 0xb8, 0x0f, + 0xdd, 0xbd, 0xb9, 0xea, 0x59, 0x0f, 0xe6, 0x54, 0xd3, 0x3a, 0xcf, 0xd8, 0xf7, 0xcf, 0x33, 0xff, + 0x53, 0xc7, 0xf7, 0x3e, 0x4b, 0x54, 0xd0, 0xf9, 0xbc, 0xf0, 0x27, 0x15, 0xa5, 0xf7, 0x19, 0x9f, + 0x11, 0xff, 0x78, 0x4e, 0x81, 0xb4, 0x8a, 0x7d, 0x09, 0x26, 0x33, 0x53, 0x87, 0x5e, 0x82, 0xc1, + 0xd6, 0x96, 0x13, 0x93, 0x8c, 0x2b, 0xd0, 0x60, 0x8d, 0x16, 0xde, 0xdf, 0x9b, 0x9f, 0x50, 0x15, + 0x58, 0x09, 0xe6, 0xd8, 0xf6, 0x17, 0x4b, 0x30, 0x70, 0x2d, 0x74, 0x8f, 0x63, 0xa9, 0x5d, 0x32, + 0x96, 0xda, 0xd3, 0xf9, 0x19, 0x49, 0x7a, 0xae, 0xb2, 0x5a, 0x66, 0x95, 0x9d, 0x2d, 0x40, 0xeb, + 0xe0, 0x05, 0xb6, 0x0d, 0xa3, 0x2c, 0xe3, 0x89, 0xf0, 0x85, 0x7a, 0xc1, 0xd0, 0xac, 0xe6, 0x33, + 0x9a, 0xd5, 0xa4, 0x86, 0xaa, 0xe9, 0x57, 0xcf, 0xc0, 0xb0, 0xf0, 0xbd, 0xc9, 0x7a, 0xdf, 0x0a, + 0x5c, 0x2c, 0xe1, 0xf6, 0x3f, 0x2f, 0x83, 0x91, 0x61, 0x05, 0xfd, 0x9e, 0x05, 0x0b, 0x11, 0x8f, + 0x64, 0x72, 0xab, 0xed, 0xc8, 0x0b, 0x9a, 0xf5, 0xc6, 0x16, 0x71, 0xdb, 0xbe, 0x17, 0x34, 0xd7, + 0x9b, 0x41, 0xa8, 0x8a, 0x57, 0xef, 0x91, 0x46, 0x9b, 0x99, 0xba, 0x0b, 0x27, 0x76, 0x51, 0xf7, + 0xce, 0x17, 0xf6, 0xf7, 0xe6, 0x17, 0x70, 0x5f, 0xad, 0xe0, 0x3e, 0x7b, 0x85, 0xfe, 0xd8, 0x82, + 0x45, 0x9e, 0x63, 0xa4, 0xf8, 0x48, 0x0a, 0x69, 0xa4, 0x35, 0x49, 0x34, 0x25, 0xb7, 0x41, 0xa2, + 0xed, 0xe5, 0x97, 0xc5, 0x24, 0x2f, 0xd6, 0xfa, 0x6b, 0x15, 0xf7, 0xdb, 0x4d, 0xfb, 0x5f, 0x97, + 0x61, 0x9c, 0xce, 0x67, 0x9a, 0x57, 0xe0, 0x25, 0x63, 0x99, 0x3c, 0x91, 0x59, 0x26, 0xd3, 0x06, + 0xf2, 0x83, 0x49, 0x29, 0x10, 0xc3, 0xb4, 0xef, 0xc4, 0xc9, 0x25, 0xe2, 0x44, 0xc9, 0x6d, 0xe2, + 0xb0, 0xeb, 0xdd, 0xac, 0xeb, 0x48, 0x81, 0x1b, 0x63, 0x65, 0xfb, 0xba, 0x92, 0x25, 0x86, 0x3b, + 0xe9, 0xa3, 0x1d, 0x40, 0xec, 0x2a, 0x39, 0x72, 0x82, 0x98, 0x8f, 0xc5, 0x13, 0xa6, 0xf1, 0xfe, + 0x5a, 0x9d, 0x13, 0xad, 0xa2, 0x2b, 0x1d, 0xd4, 0x70, 0x97, 0x16, 0x34, 0x67, 0x81, 0xc1, 0xa2, + 0xce, 0x02, 0x43, 0x39, 0x6e, 0xef, 0x5f, 0xb2, 0xe0, 0x04, 0xfd, 0x2c, 0xa6, 0x8b, 0x74, 0x8c, + 0x42, 0x98, 0xa4, 0xcb, 0xce, 0x27, 0x89, 0x2c, 0x13, 0xfb, 0x2b, 0x47, 0xb2, 0x36, 0xe9, 0xa4, + 0xe2, 0xdb, 0x65, 0x93, 0x18, 0xce, 0x52, 0xb7, 0xbf, 0x69, 0x01, 0x73, 0x5a, 0x3c, 0x86, 0xc3, + 0xec, 0xa2, 0x79, 0x98, 0xd9, 0xf9, 0x1c, 0xa3, 0xc7, 0x39, 0xf6, 0x22, 0x4c, 0x51, 0x68, 0x2d, + 0x0a, 0xef, 0xed, 0x4a, 0x41, 0x3b, 0xdf, 0x9a, 0xfd, 0xa5, 0x12, 0xdf, 0x36, 0x2a, 0x24, 0x13, + 0x7d, 0xd9, 0x82, 0x91, 0x86, 0xd3, 0x72, 0x1a, 0x3c, 0x3f, 0x55, 0x01, 0xeb, 0x8c, 0x51, 0x7f, + 0x61, 0x45, 0xd4, 0xe5, 0x96, 0x85, 0x0f, 0xcb, 0xa1, 0xcb, 0xe2, 0x5c, 0x6b, 0x82, 0x6a, 0x7c, + 0xee, 0x0e, 0x8c, 0x1b, 0xc4, 0x8e, 0x54, 0x0d, 0xfd, 0xb2, 0xc5, 0x99, 0xbe, 0x52, 0x15, 0xee, + 0xc2, 0x74, 0xa0, 0xfd, 0xa7, 0xec, 0x4c, 0x4a, 0xc6, 0x0b, 0xc5, 0xd9, 0x3a, 0xe3, 0x82, 0x9a, + 0x83, 0x66, 0x86, 0x20, 0xee, 0x6c, 0xc3, 0xfe, 0x35, 0x0b, 0x1e, 0xd1, 0x11, 0xb5, 0x18, 0xda, + 0x3c, 0xbb, 0x71, 0x15, 0x46, 0xc2, 0x16, 0x89, 0x9c, 0x54, 0x2d, 0x3a, 0x2b, 0xe7, 0xff, 0xba, + 0x28, 0xbf, 0xbf, 0x37, 0x3f, 0xa3, 0x53, 0x97, 0xe5, 0x58, 0xd5, 0x44, 0x36, 0x0c, 0xb1, 0x79, + 0x89, 0x45, 0xf4, 0x33, 0xcb, 0xd7, 0xc4, 0xee, 0xa5, 0x62, 0x2c, 0x20, 0xf6, 0xdf, 0xb0, 0xf8, + 0x72, 0xd3, 0xbb, 0x8e, 0x3e, 0x07, 0x53, 0xdb, 0x54, 0x83, 0x5a, 0xbd, 0xd7, 0x8a, 0xb8, 0xd5, + 0x5b, 0xce, 0xd8, 0x4b, 0xc5, 0x67, 0x4c, 0x1b, 0xee, 0xf2, 0xac, 0xe8, 0xfd, 0xd4, 0xd5, 0x0c, + 0x59, 0xdc, 0xd1, 0x90, 0xfd, 0xf7, 0x4b, 0x7c, 0xcf, 0x32, 0x19, 0xee, 0x19, 0x18, 0x6e, 0x85, + 0xee, 0xca, 0x7a, 0x15, 0x8b, 0xb9, 0x52, 0x4c, 0xa7, 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0x0b, 0x00, + 0xe4, 0x5e, 0x42, 0xa2, 0xc0, 0xf1, 0xd5, 0x4d, 0xba, 0x12, 0x95, 0x56, 0x15, 0x04, 0x6b, 0x58, + 0xb4, 0x4e, 0x2b, 0x0a, 0x77, 0x3c, 0x97, 0x05, 0x7f, 0x94, 0xcd, 0x3a, 0x35, 0x05, 0xc1, 0x1a, + 0x16, 0xd5, 0x5b, 0xdb, 0x41, 0xcc, 0x8f, 0x31, 0xe7, 0xb6, 0x48, 0x2f, 0x34, 0x92, 0xea, 0xad, + 0x37, 0x74, 0x20, 0x36, 0x71, 0xd1, 0x65, 0x18, 0x4a, 0x1c, 0x76, 0x3f, 0x3c, 0x58, 0xc4, 0xd9, + 0x66, 0x83, 0xe2, 0xea, 0xf9, 0x9c, 0x68, 0x55, 0x2c, 0x48, 0xd8, 0xff, 0xb1, 0x02, 0x90, 0x4a, + 0x5d, 0xe8, 0x8b, 0x9d, 0x1b, 0xfe, 0x23, 0x45, 0x45, 0xb6, 0x07, 0xb7, 0xdb, 0xd1, 0x57, 0x2d, + 0x18, 0x75, 0x7c, 0x3f, 0x6c, 0x38, 0x09, 0x9b, 0x9e, 0x52, 0x51, 0xd6, 0x23, 0x7a, 0xb2, 0x94, + 0xd6, 0xe5, 0x9d, 0x79, 0x41, 0xde, 0xd9, 0x6a, 0x90, 0xdc, 0xfe, 0xe8, 0x5d, 0x40, 0x1f, 0x96, + 0x52, 0x3b, 0xff, 0xc2, 0x73, 0x59, 0xa9, 0xbd, 0xc2, 0x18, 0xae, 0x26, 0xb0, 0xa3, 0xb7, 0x8d, + 0x74, 0x3c, 0x03, 0x45, 0x22, 0x78, 0x0d, 0x39, 0x24, 0x2f, 0x13, 0x0f, 0x7a, 0x53, 0xf7, 0x4a, + 0x1f, 0x2c, 0x12, 0x22, 0xaf, 0x89, 0xc3, 0x39, 0x1e, 0xe9, 0x09, 0x4c, 0xba, 0xe6, 0xc9, 0x2b, + 0x3c, 0xeb, 0xce, 0xe7, 0xb7, 0x90, 0x39, 0xb2, 0xd3, 0xb3, 0x36, 0x03, 0xc0, 0xd9, 0x26, 0xd0, + 0x9b, 0x3c, 0x66, 0x60, 0x3d, 0xd8, 0x0c, 0x85, 0x77, 0xdd, 0xb9, 0x02, 0xdf, 0x7c, 0x37, 0x4e, + 0xc8, 0x36, 0xad, 0x93, 0x1e, 0xae, 0xd7, 0x04, 0x15, 0xac, 0xe8, 0xa1, 0x0d, 0x18, 0x62, 0x01, + 0x5b, 0xf1, 0xec, 0x48, 0x11, 0x4b, 0x9c, 0x19, 0xa7, 0x9c, 0xee, 0x1f, 0xf6, 0x37, 0xc6, 0x82, + 0x16, 0xba, 0x24, 0x33, 0x15, 0xc4, 0xeb, 0xc1, 0x8d, 0x98, 0xb0, 0x4c, 0x05, 0x95, 0xe5, 0x0f, + 0xa5, 0xa9, 0x07, 0x78, 0x79, 0xd7, 0x84, 0x84, 0x46, 0x4d, 0x2a, 0xd8, 0x88, 0xff, 0x32, 0xcf, + 0xe1, 0x2c, 0x14, 0xe9, 0xa8, 0x99, 0x15, 0x31, 0x9d, 0xec, 0x9b, 0x26, 0x31, 0x9c, 0xa5, 0x7e, + 0xac, 0x47, 0xea, 0x5c, 0x00, 0x53, 0xd9, 0x4d, 0x79, 0xa4, 0x47, 0xf8, 0x4f, 0x06, 0x60, 0xc2, + 0x5c, 0x1c, 0x68, 0x11, 0x2a, 0x82, 0x88, 0xca, 0x7b, 0xa6, 0xf6, 0xc0, 0x55, 0x09, 0xc0, 0x29, + 0x0e, 0xcb, 0x00, 0xc7, 0xaa, 0x6b, 0x7e, 0x55, 0x69, 0x06, 0x38, 0x05, 0xc1, 0x1a, 0x16, 0x95, + 0x84, 0x6f, 0x87, 0x61, 0xa2, 0x4e, 0x02, 0xb5, 0x6e, 0x96, 0x59, 0x29, 0x16, 0x50, 0x7a, 0x02, + 0xdc, 0xa1, 0x1f, 0xd3, 0x37, 0xad, 0x8a, 0xea, 0x04, 0xb8, 0xac, 0x03, 0xb1, 0x89, 0x4b, 0x4f, + 0xb4, 0x30, 0x66, 0x0b, 0x51, 0xc8, 0xdb, 0xa9, 0x9f, 0x5a, 0x9d, 0x07, 0x31, 0x4a, 0x38, 0xfa, + 0x14, 0x3c, 0xa2, 0x62, 0x0e, 0x31, 0xb7, 0xd2, 0xca, 0x16, 0x87, 0x0c, 0x95, 0xf9, 0x91, 0x95, + 0xee, 0x68, 0xb8, 0x57, 0x7d, 0xf4, 0x1a, 0x4c, 0x08, 0x59, 0x59, 0x52, 0x1c, 0x36, 0xdd, 0x0d, + 0x2e, 0x1b, 0x50, 0x9c, 0xc1, 0x46, 0x55, 0x98, 0xa2, 0x25, 0x4c, 0x48, 0x95, 0x14, 0x78, 0xec, + 0xa4, 0x3a, 0xea, 0x2f, 0x67, 0xe0, 0xb8, 0xa3, 0x06, 0x5a, 0x82, 0x49, 0x2e, 0xac, 0x50, 0xc5, + 0x90, 0x7d, 0x07, 0xe1, 0x12, 0xab, 0x36, 0xc2, 0x75, 0x13, 0x8c, 0xb3, 0xf8, 0xe8, 0x15, 0x18, + 0x73, 0xa2, 0xc6, 0x96, 0x97, 0x90, 0x46, 0xd2, 0x8e, 0x78, 0x1e, 0x10, 0xcd, 0x5f, 0x63, 0x49, + 0x83, 0x61, 0x03, 0xd3, 0xfe, 0x2c, 0x9c, 0xe8, 0xe2, 0x7f, 0x4f, 0x17, 0x8e, 0xd3, 0xf2, 0xe4, + 0x98, 0x32, 0x1e, 0x67, 0x4b, 0xb5, 0x75, 0x39, 0x1a, 0x0d, 0x8b, 0xae, 0x4e, 0x66, 0x9e, 0xd6, + 0xd2, 0x92, 0xaa, 0xd5, 0xb9, 0x26, 0x01, 0x38, 0xc5, 0xb1, 0xff, 0xa2, 0x02, 0x9a, 0xf5, 0xa6, + 0x80, 0x97, 0xd1, 0x2b, 0x30, 0x26, 0x33, 0xed, 0x6a, 0x19, 0x2e, 0xd5, 0x30, 0x2f, 0x6a, 0x30, + 0x6c, 0x60, 0xd2, 0xbe, 0x05, 0xd2, 0x26, 0x95, 0xf5, 0x6f, 0x53, 0xc6, 0x2a, 0x9c, 0xe2, 0xa0, + 0x73, 0x30, 0x12, 0x13, 0x7f, 0xf3, 0x8a, 0x17, 0xdc, 0x11, 0x0b, 0x5b, 0x71, 0xe6, 0xba, 0x28, + 0xc7, 0x0a, 0x03, 0x2d, 0x43, 0xb9, 0xed, 0xb9, 0x62, 0x29, 0x4b, 0xb1, 0xa1, 0x7c, 0x63, 0xbd, + 0x7a, 0x7f, 0x6f, 0xfe, 0x89, 0x5e, 0x09, 0x8c, 0xa9, 0x7e, 0x1e, 0x2f, 0xd0, 0xed, 0x47, 0x2b, + 0x77, 0xb3, 0xd3, 0x0f, 0xf5, 0x69, 0xa7, 0xbf, 0x00, 0x20, 0x46, 0x2d, 0xd7, 0x72, 0x39, 0xfd, + 0x6a, 0x17, 0x15, 0x04, 0x6b, 0x58, 0x54, 0xcb, 0x6f, 0x44, 0xc4, 0x91, 0x8a, 0x30, 0xf7, 0x0b, + 0x1f, 0x39, 0xbc, 0x96, 0xbf, 0x92, 0x25, 0x86, 0x3b, 0xe9, 0xa3, 0x10, 0xa6, 0x5d, 0x11, 0xd8, + 0x9a, 0x36, 0x5a, 0xe9, 0xdf, 0x19, 0x9d, 0xb9, 0xd4, 0x64, 0x09, 0xe1, 0x4e, 0xda, 0xe8, 0x33, + 0x30, 0x27, 0x0b, 0x3b, 0xa3, 0x8a, 0xd9, 0x76, 0x29, 0x2f, 0x9f, 0xde, 0xdf, 0x9b, 0x9f, 0xab, + 0xf6, 0xc4, 0xc2, 0x07, 0x50, 0x40, 0x6f, 0xc1, 0x10, 0xbb, 0xd7, 0x89, 0x67, 0x47, 0xd9, 0x89, + 0xf7, 0x62, 0x91, 0x90, 0x06, 0xba, 0xea, 0x17, 0xd8, 0xed, 0x90, 0x70, 0xd6, 0x4d, 0x2f, 0xcb, + 0x58, 0x21, 0x16, 0x34, 0x51, 0x0b, 0x46, 0x9d, 0x20, 0x08, 0x13, 0x87, 0x0b, 0x62, 0x63, 0x45, + 0x64, 0x49, 0xad, 0x89, 0xa5, 0xb4, 0x2e, 0x6f, 0x47, 0xf9, 0xff, 0x69, 0x10, 0xac, 0x37, 0x81, + 0xee, 0xc2, 0x64, 0x78, 0x97, 0x32, 0x4c, 0x79, 0xb5, 0x11, 0xcf, 0x8e, 0x9b, 0x03, 0xcb, 0x31, + 0xd4, 0x1a, 0x95, 0x35, 0x4e, 0x66, 0x12, 0xc5, 0xd9, 0x56, 0xd0, 0x82, 0x61, 0xae, 0x9e, 0x48, + 0x5d, 0xd2, 0x53, 0x73, 0xb5, 0x6e, 0x9d, 0x66, 0x91, 0xeb, 0xdc, 0x0d, 0x95, 0x71, 0x84, 0xc9, + 0x4c, 0xe4, 0x7a, 0x0a, 0xc2, 0x3a, 0xde, 0xdc, 0x47, 0x61, 0x54, 0x9b, 0xf8, 0x7e, 0x7c, 0x9f, + 0xe7, 0x5e, 0x83, 0xa9, 0xec, 0x84, 0xf6, 0xe5, 0x3b, 0xfd, 0x3f, 0x4b, 0x30, 0xd9, 0xe5, 0xde, + 0xe8, 0x8e, 0xc7, 0xfc, 0xf7, 0x0d, 0xd6, 0x77, 0xd9, 0x0b, 0x5c, 0xcc, 0x20, 0x26, 0x03, 0x2b, + 0x15, 0x60, 0x60, 0x92, 0x9b, 0x96, 0x7b, 0x72, 0x53, 0xc1, 0xb4, 0x06, 0xde, 0x0f, 0xd3, 0x32, + 0xcf, 0x89, 0xc1, 0x42, 0xe7, 0xc4, 0x03, 0x60, 0x74, 0xc6, 0x51, 0x33, 0x5c, 0xe0, 0xa8, 0xf9, + 0x46, 0x09, 0xa6, 0x52, 0x3f, 0x71, 0x91, 0x7e, 0xfb, 0xe8, 0xaf, 0x21, 0x36, 0x8c, 0x6b, 0x88, + 0xbc, 0xec, 0xda, 0x99, 0xfe, 0xf5, 0xbc, 0x92, 0x78, 0x2b, 0x73, 0x25, 0xf1, 0x62, 0x9f, 0x74, + 0x0f, 0xbe, 0x9e, 0xf8, 0x6e, 0x09, 0x4e, 0x66, 0xab, 0xac, 0xf8, 0x8e, 0xb7, 0x7d, 0x0c, 0xf3, + 0xf5, 0x29, 0x63, 0xbe, 0x5e, 0xee, 0x6f, 0x5c, 0xac, 0x93, 0x3d, 0x27, 0xcd, 0xc9, 0x4c, 0xda, + 0x47, 0x0f, 0x43, 0xfc, 0xe0, 0x99, 0xfb, 0x43, 0x0b, 0x1e, 0xed, 0x5a, 0xef, 0x18, 0x0c, 0xaf, + 0x6f, 0x98, 0x86, 0xd7, 0x17, 0x0e, 0x31, 0xba, 0x1e, 0x96, 0xd8, 0x5f, 0x2f, 0xf7, 0x18, 0x15, + 0x33, 0x4d, 0x5d, 0x87, 0x51, 0xa7, 0xd1, 0x20, 0x71, 0x7c, 0x35, 0x74, 0x55, 0x0e, 0xac, 0xe7, + 0xd9, 0xd9, 0x92, 0x16, 0xdf, 0xdf, 0x9b, 0x9f, 0xcb, 0x92, 0x48, 0xc1, 0x58, 0xa7, 0x60, 0x66, + 0xe7, 0x2b, 0x1d, 0x51, 0x76, 0xbe, 0x0b, 0x00, 0x3b, 0x4a, 0x8b, 0xcd, 0x5a, 0xbc, 0x34, 0xfd, + 0x56, 0xc3, 0x42, 0xff, 0x3f, 0x93, 0x08, 0xb9, 0x93, 0xc6, 0x80, 0x19, 0x72, 0x9a, 0xf3, 0xfd, + 0x74, 0x87, 0x0f, 0x1e, 0xd9, 0xaa, 0xac, 0x83, 0x8a, 0x24, 0xfa, 0x04, 0x4c, 0xc5, 0x3c, 0x7f, + 0xc2, 0x8a, 0xef, 0xc4, 0x2c, 0x40, 0x42, 0xf0, 0x53, 0x16, 0xa4, 0x5a, 0xcf, 0xc0, 0x70, 0x07, + 0xb6, 0xfd, 0x9d, 0x32, 0x7c, 0xf0, 0x80, 0x65, 0x8b, 0x96, 0xcc, 0x5b, 0xdb, 0xe7, 0xb2, 0xf6, + 0x9f, 0xb9, 0xae, 0x95, 0x0d, 0x83, 0x50, 0xe6, 0x6b, 0x97, 0xde, 0xf7, 0xd7, 0xfe, 0x9a, 0x6e, + 0xad, 0xe3, 0x7e, 0x9b, 0x17, 0x0f, 0xbd, 0x31, 0x7f, 0x5a, 0x8d, 0xf5, 0x5f, 0xb0, 0xe0, 0x89, + 0xae, 0xc3, 0x32, 0xbc, 0x44, 0x16, 0xa1, 0xd2, 0xa0, 0x85, 0x5a, 0x38, 0x53, 0x1a, 0x47, 0x28, + 0x01, 0x38, 0xc5, 0x31, 0x9c, 0x41, 0x4a, 0xb9, 0xce, 0x20, 0xbf, 0x6f, 0xc1, 0x4c, 0xb6, 0x13, + 0xc7, 0xc0, 0xb7, 0xea, 0x26, 0xdf, 0x5a, 0xe8, 0xef, 0xe3, 0xf7, 0x60, 0x59, 0xff, 0x6d, 0x02, + 0x4e, 0x75, 0x9c, 0x7a, 0x7c, 0x16, 0x7f, 0xc1, 0x82, 0xe9, 0x26, 0x93, 0xde, 0xb5, 0x98, 0x31, + 0x31, 0xae, 0x9c, 0x40, 0xbb, 0x03, 0x43, 0xcd, 0xb8, 0x2e, 0xd2, 0x81, 0x82, 0x3b, 0x1b, 0x43, + 0x5f, 0xb1, 0x60, 0xc6, 0xb9, 0x1b, 0x77, 0x3c, 0x0e, 0x23, 0x16, 0xd2, 0x6b, 0x39, 0xc6, 0xb2, + 0x9c, 0x67, 0x65, 0x96, 0x67, 0xf7, 0xf7, 0xe6, 0x67, 0xba, 0x61, 0xe1, 0xae, 0xad, 0xd2, 0xef, + 0xbb, 0x25, 0x62, 0x47, 0x8a, 0x45, 0x3f, 0x76, 0x8b, 0x34, 0xe1, 0x6c, 0x4d, 0x42, 0xb0, 0xa2, + 0x88, 0xde, 0x81, 0x4a, 0x53, 0x86, 0x89, 0x65, 0xd9, 0x66, 0x8f, 0x69, 0xee, 0x16, 0x55, 0xc6, + 0x7d, 0xf7, 0x15, 0x08, 0xa7, 0x44, 0xd1, 0x25, 0x28, 0x07, 0x9b, 0xb1, 0x08, 0xc8, 0xce, 0xf3, + 0x01, 0x32, 0x3d, 0xaf, 0x78, 0x0c, 0xeb, 0xb5, 0xb5, 0x3a, 0xa6, 0x24, 0x28, 0xa5, 0xe8, 0xb6, + 0x2b, 0xac, 0xc4, 0x39, 0x94, 0xf0, 0x72, 0xb5, 0x93, 0x12, 0x5e, 0xae, 0x62, 0x4a, 0x02, 0xd5, + 0x60, 0x90, 0x45, 0xa6, 0x08, 0x13, 0x70, 0x4e, 0xd4, 0x7e, 0x47, 0xfc, 0x0d, 0x4f, 0x22, 0xc9, + 0x8a, 0x31, 0x27, 0x84, 0x36, 0x60, 0xa8, 0xc1, 0xde, 0x41, 0x10, 0xba, 0x79, 0x5e, 0x3e, 0x8b, + 0x8e, 0x37, 0x13, 0xf8, 0xbd, 0x17, 0x2f, 0xc7, 0x82, 0x16, 0xa3, 0x4a, 0x5a, 0x5b, 0x9b, 0xb1, + 0x50, 0xbe, 0xf3, 0xa8, 0x76, 0xbc, 0x68, 0x21, 0xa8, 0xb2, 0x72, 0x2c, 0x68, 0xa1, 0x2a, 0x94, + 0x36, 0x1b, 0x22, 0x70, 0x25, 0xc7, 0xf4, 0x6b, 0x06, 0x24, 0x2f, 0x0f, 0xed, 0xef, 0xcd, 0x97, + 0xd6, 0x56, 0x70, 0x69, 0xb3, 0x81, 0xde, 0x80, 0xe1, 0x4d, 0x1e, 0x62, 0x2a, 0xf2, 0xce, 0x9e, + 0xcf, 0x8b, 0x83, 0xed, 0x88, 0x47, 0xe5, 0xf1, 0x19, 0x02, 0x80, 0x25, 0x39, 0x96, 0x92, 0x4f, + 0x05, 0xcd, 0x8a, 0xc4, 0xb3, 0x0b, 0xfd, 0x05, 0xd9, 0x0a, 0x9d, 0x54, 0x95, 0x62, 0x8d, 0x22, + 0x5d, 0xf3, 0x8e, 0x7c, 0xd2, 0x85, 0x25, 0x9d, 0xcd, 0x5d, 0xf3, 0x5d, 0x5f, 0x80, 0xe1, 0x6b, + 0x5e, 0x81, 0x70, 0x4a, 0x14, 0xb5, 0x61, 0x7c, 0x27, 0x6e, 0x6d, 0x11, 0xb9, 0xf5, 0x59, 0x26, + 0xda, 0xd1, 0x0b, 0x1f, 0xcf, 0x49, 0x2f, 0x2c, 0xaa, 0x78, 0x51, 0xd2, 0x76, 0xfc, 0x0e, 0x0e, + 0xc6, 0x72, 0xa0, 0xdd, 0xd4, 0xc9, 0x62, 0xb3, 0x15, 0xfa, 0x49, 0xde, 0x6b, 0x87, 0xb7, 0x77, + 0x13, 0x22, 0x32, 0xd5, 0xe6, 0x7c, 0x92, 0xd7, 0x39, 0x72, 0xe7, 0x27, 0x11, 0x00, 0x2c, 0xc9, + 0xa9, 0x29, 0x63, 0xdc, 0x78, 0xaa, 0xf0, 0x94, 0x75, 0x8c, 0x21, 0x9d, 0x32, 0xc6, 0x7d, 0x53, + 0xa2, 0x8c, 0xeb, 0xb6, 0xb6, 0xc2, 0x24, 0x0c, 0x32, 0xbc, 0x7f, 0xba, 0x08, 0xd7, 0xad, 0x75, + 0xa9, 0xd9, 0xc9, 0x75, 0xbb, 0x61, 0xe1, 0xae, 0xad, 0xa2, 0x00, 0x26, 0x5a, 0x61, 0x94, 0xdc, + 0x0d, 0x23, 0xb9, 0x0e, 0x51, 0x21, 0x1d, 0xd1, 0xa8, 0x23, 0xda, 0x66, 0x6e, 0xb8, 0x26, 0x04, + 0x67, 0xa8, 0xd3, 0x4f, 0x17, 0x37, 0x1c, 0x9f, 0xac, 0x5f, 0x9f, 0x3d, 0x51, 0xe4, 0xd3, 0xd5, + 0x39, 0x72, 0xe7, 0xa7, 0x13, 0x00, 0x2c, 0xc9, 0xd9, 0xbf, 0x36, 0xd4, 0x29, 0x38, 0x30, 0xd5, + 0xe0, 0xaf, 0x77, 0xde, 0xc4, 0x7e, 0xa2, 0x7f, 0x0d, 0xf8, 0x01, 0xde, 0xc9, 0x7e, 0xc5, 0x82, + 0x53, 0xad, 0xae, 0x62, 0x81, 0x38, 0x7a, 0xfb, 0x55, 0xa4, 0xf9, 0xb4, 0xa8, 0x84, 0xd2, 0xdd, + 0xe1, 0xb8, 0x47, 0x9b, 0x59, 0x61, 0xba, 0xfc, 0xbe, 0x85, 0xe9, 0x5b, 0x30, 0xc2, 0xa4, 0xbf, + 0x34, 0x5d, 0x4c, 0x9f, 0x99, 0x55, 0xd8, 0x21, 0xbe, 0x22, 0x48, 0x60, 0x45, 0x8c, 0x4e, 0xdc, + 0xe3, 0xd9, 0x41, 0x60, 0xc2, 0xc0, 0x22, 0x8d, 0x21, 0xd7, 0x54, 0xd6, 0xc4, 0x4c, 0x3c, 0x5e, + 0x3b, 0x08, 0xf9, 0x7e, 0x1e, 0x02, 0x3e, 0xb8, 0x31, 0x54, 0xed, 0xa2, 0x2a, 0x0d, 0x99, 0xd7, + 0x2e, 0xf9, 0xea, 0xd2, 0xf1, 0x8a, 0xf8, 0xff, 0xc0, 0xea, 0x22, 0x91, 0x72, 0xb5, 0xec, 0xe3, + 0xa6, 0x5a, 0xf6, 0x74, 0x56, 0x2d, 0xeb, 0x30, 0xc6, 0x18, 0x1a, 0x59, 0xf1, 0x34, 0xac, 0x45, + 0xf3, 0xe1, 0xd8, 0x3e, 0x9c, 0xc9, 0x63, 0x77, 0xcc, 0x15, 0xcb, 0x55, 0x97, 0x90, 0xa9, 0x2b, + 0x96, 0xbb, 0x5e, 0xc5, 0x0c, 0x52, 0x34, 0xa5, 0x82, 0xfd, 0x8b, 0x25, 0x28, 0xd7, 0x42, 0xf7, + 0x18, 0x8c, 0x4b, 0x17, 0x0d, 0xe3, 0xd2, 0x53, 0xb9, 0x4f, 0xfc, 0xf5, 0x34, 0x25, 0x5d, 0xcf, + 0x98, 0x92, 0x7e, 0x2e, 0x9f, 0xd4, 0xc1, 0x86, 0xa3, 0xef, 0x95, 0x41, 0x7f, 0xa4, 0x10, 0xfd, + 0xfb, 0xc3, 0x78, 0xe8, 0x96, 0x8b, 0xbd, 0x5b, 0x28, 0xda, 0x60, 0x9e, 0x5c, 0x32, 0xae, 0xef, + 0xa7, 0xd6, 0x51, 0xf7, 0x16, 0xf1, 0x9a, 0x5b, 0x09, 0x71, 0xb3, 0x03, 0x3b, 0x3e, 0x47, 0xdd, + 0x3f, 0xb7, 0x60, 0x32, 0xd3, 0x3a, 0xf2, 0xbb, 0x05, 0x04, 0x1d, 0xd2, 0x5c, 0x34, 0x9d, 0x1b, + 0x41, 0xb4, 0x00, 0xa0, 0xac, 0xfe, 0xd2, 0x24, 0xc3, 0xa4, 0x53, 0x75, 0x2d, 0x10, 0x63, 0x0d, + 0x03, 0xbd, 0x04, 0xa3, 0x49, 0xd8, 0x0a, 0xfd, 0xb0, 0xb9, 0x7b, 0x99, 0xc8, 0x64, 0x1f, 0xea, + 0xc6, 0x64, 0x23, 0x05, 0x61, 0x1d, 0xcf, 0xfe, 0x7e, 0x19, 0xb2, 0x4f, 0x5c, 0xfe, 0xbf, 0x75, + 0xfa, 0xd3, 0xb3, 0x4e, 0xff, 0xc8, 0x82, 0x29, 0xda, 0x3a, 0x73, 0x9d, 0x91, 0x0e, 0xb5, 0xea, + 0x4d, 0x08, 0xeb, 0x80, 0x37, 0x21, 0x9e, 0xa6, 0xdc, 0xce, 0x0d, 0xdb, 0x89, 0x30, 0x22, 0x69, + 0x4c, 0x8c, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x8a, 0x44, 0xe4, 0x91, 0x8e, 0x47, 0xa2, 0x08, + 0x0b, 0xa8, 0x7c, 0x32, 0x62, 0xa0, 0xc7, 0x93, 0x11, 0x2c, 0x5d, 0x96, 0x70, 0xd7, 0x10, 0x62, + 0x85, 0x96, 0x2e, 0x4b, 0xfa, 0x71, 0xa4, 0x38, 0xf6, 0xb7, 0xca, 0x30, 0x56, 0x0b, 0xdd, 0xd4, + 0x53, 0xfe, 0x45, 0xc3, 0x53, 0xfe, 0x4c, 0xc6, 0x53, 0x7e, 0x4a, 0xc7, 0x7d, 0x30, 0x8e, 0xf2, + 0x22, 0xad, 0x1a, 0x7b, 0xd4, 0xe4, 0x90, 0x4e, 0xf2, 0x46, 0x5a, 0x35, 0x45, 0x08, 0x9b, 0x74, + 0x7f, 0x96, 0x9c, 0xe3, 0xff, 0xb7, 0x05, 0x13, 0xb5, 0xd0, 0xa5, 0x0b, 0xf4, 0x67, 0x69, 0x35, + 0xea, 0xc9, 0xd8, 0x86, 0x0e, 0x48, 0xc6, 0xf6, 0x1b, 0x16, 0x0c, 0xd7, 0x42, 0xf7, 0x18, 0x0c, + 0xac, 0x6b, 0xa6, 0x81, 0xf5, 0x89, 0x5c, 0xce, 0xdb, 0xc3, 0xa6, 0xfa, 0x9d, 0x32, 0x8c, 0xd3, + 0x1e, 0x87, 0x4d, 0xf9, 0xbd, 0x8c, 0xb9, 0xb1, 0x0a, 0xcc, 0x0d, 0x15, 0x09, 0x43, 0xdf, 0x0f, + 0xef, 0x66, 0xbf, 0xdd, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0xce, 0xc1, 0x48, 0x2b, 0x22, 0x3b, 0x5e, + 0xd8, 0x8e, 0xb3, 0x51, 0x8c, 0x35, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x11, 0xc6, 0x62, 0x2f, 0x68, + 0x10, 0xe9, 0xcc, 0x31, 0xc0, 0x9c, 0x39, 0x78, 0xde, 0x4b, 0xad, 0x1c, 0x1b, 0x58, 0xe8, 0x16, + 0x54, 0xd8, 0x7f, 0xb6, 0x83, 0xfa, 0x7f, 0xf3, 0x81, 0xe7, 0x56, 0x91, 0x04, 0x70, 0x4a, 0x0b, + 0x5d, 0x00, 0x48, 0xa4, 0xdb, 0x49, 0x2c, 0x92, 0xcb, 0x28, 0xb9, 0x54, 0x39, 0xa4, 0xc4, 0x58, + 0xc3, 0x42, 0xcf, 0x41, 0x25, 0x71, 0x3c, 0xff, 0x8a, 0x17, 0x90, 0x58, 0xb8, 0xed, 0x88, 0x1c, + 0xd6, 0xa2, 0x10, 0xa7, 0x70, 0x7a, 0xde, 0xb3, 0x18, 0x6a, 0xfe, 0x9e, 0xcc, 0x08, 0xc3, 0x66, + 0xe7, 0xfd, 0x15, 0x55, 0x8a, 0x35, 0x0c, 0xfb, 0x15, 0x38, 0x59, 0x0b, 0xdd, 0x5a, 0x18, 0x25, + 0x6b, 0x61, 0x74, 0xd7, 0x89, 0x5c, 0xf9, 0xfd, 0xe6, 0x65, 0xea, 0x64, 0x7a, 0x26, 0x0f, 0x72, + 0x9b, 0xa3, 0x91, 0x0a, 0xf9, 0x05, 0x76, 0xe2, 0xf7, 0x19, 0x82, 0xf1, 0xa3, 0x12, 0xa0, 0x1a, + 0x73, 0x8c, 0x31, 0x9e, 0x1f, 0xda, 0x82, 0x89, 0x98, 0x5c, 0xf1, 0x82, 0xf6, 0x3d, 0x41, 0xaa, + 0x58, 0xcc, 0x4b, 0x7d, 0x55, 0xaf, 0xc3, 0x2d, 0x1d, 0x66, 0x19, 0xce, 0xd0, 0xa5, 0x93, 0x19, + 0xb5, 0x83, 0xa5, 0xf8, 0x46, 0x4c, 0x22, 0xf1, 0xdc, 0x0e, 0x9b, 0x4c, 0x2c, 0x0b, 0x71, 0x0a, + 0xa7, 0x8b, 0x87, 0xfd, 0xb9, 0x16, 0x06, 0x38, 0x0c, 0x13, 0xb9, 0xdc, 0xd8, 0xf3, 0x0b, 0x5a, + 0x39, 0x36, 0xb0, 0xd0, 0x1a, 0xa0, 0xb8, 0xdd, 0x6a, 0xf9, 0xec, 0xae, 0xd1, 0xf1, 0x2f, 0x46, + 0x61, 0xbb, 0xc5, 0xfd, 0xa3, 0xc5, 0xcb, 0x05, 0xf5, 0x0e, 0x28, 0xee, 0x52, 0x83, 0x32, 0x8b, + 0xcd, 0x98, 0xfd, 0x16, 0x01, 0xd5, 0xdc, 0x5e, 0x59, 0x67, 0x45, 0x58, 0xc2, 0xec, 0xcf, 0xb3, + 0x03, 0x8e, 0xbd, 0x83, 0x92, 0xb4, 0x23, 0x82, 0xb6, 0x61, 0xbc, 0xc5, 0x0e, 0xb1, 0x24, 0x0a, + 0x7d, 0x9f, 0x48, 0xf9, 0xf2, 0x70, 0xae, 0x39, 0xfc, 0xe5, 0x03, 0x9d, 0x1c, 0x36, 0xa9, 0xdb, + 0xff, 0x7d, 0x82, 0xf1, 0x2a, 0x71, 0xdd, 0x3b, 0x2c, 0x9c, 0x70, 0x85, 0x24, 0xf7, 0xa1, 0x22, + 0x2f, 0x9a, 0xa5, 0xe7, 0x80, 0x70, 0xe9, 0xc5, 0x92, 0x0a, 0xfa, 0x34, 0x73, 0x31, 0xe7, 0x0c, + 0xa2, 0xf8, 0x3b, 0x8d, 0x1c, 0xdf, 0x70, 0x2f, 0x17, 0x24, 0xb0, 0x46, 0x0e, 0x5d, 0x81, 0x71, + 0xf1, 0x6c, 0x86, 0x30, 0x53, 0x94, 0x0d, 0x15, 0x7b, 0x1c, 0xeb, 0xc0, 0xfb, 0xd9, 0x02, 0x6c, + 0x56, 0x46, 0x4d, 0x78, 0x5c, 0x7b, 0x16, 0xaa, 0x8b, 0x1b, 0x19, 0xe7, 0x3c, 0x4f, 0xec, 0xef, + 0xcd, 0x3f, 0xbe, 0x71, 0x10, 0x22, 0x3e, 0x98, 0x0e, 0xba, 0x0e, 0x27, 0x9d, 0x46, 0xe2, 0xed, + 0x90, 0x2a, 0x71, 0x5c, 0xdf, 0x0b, 0x88, 0x19, 0x75, 0xff, 0xe8, 0xfe, 0xde, 0xfc, 0xc9, 0xa5, + 0x6e, 0x08, 0xb8, 0x7b, 0x3d, 0xf4, 0x71, 0xa8, 0xb8, 0x41, 0x2c, 0xe6, 0x60, 0xc8, 0x78, 0x05, + 0xad, 0x52, 0xbd, 0x56, 0x57, 0xe3, 0x4f, 0xff, 0xe0, 0xb4, 0x02, 0x7a, 0x8f, 0xbf, 0xf2, 0xaf, + 0xb4, 0x19, 0xfe, 0xfa, 0xde, 0xcb, 0x85, 0xf4, 0x67, 0x23, 0x16, 0x86, 0x5b, 0xf0, 0x94, 0xbb, + 0xa6, 0x11, 0x26, 0x63, 0x34, 0x81, 0x3e, 0x09, 0x28, 0x26, 0xd1, 0x8e, 0xd7, 0x20, 0x4b, 0x0d, + 0x96, 0x2c, 0x96, 0xd9, 0x78, 0x46, 0x8c, 0xb8, 0x05, 0x54, 0xef, 0xc0, 0xc0, 0x5d, 0x6a, 0xa1, + 0x4b, 0x94, 0xf3, 0xe8, 0xa5, 0xc2, 0xbb, 0x56, 0x0a, 0x86, 0xb3, 0x55, 0xd2, 0x8a, 0x48, 0xc3, + 0x49, 0x88, 0x6b, 0x52, 0xc4, 0x99, 0x7a, 0xf4, 0x5c, 0x52, 0xef, 0x01, 0x80, 0xe9, 0x13, 0xda, + 0xf9, 0x26, 0x00, 0xd5, 0xb3, 0xb6, 0xc2, 0x38, 0xb9, 0x46, 0x92, 0xbb, 0x61, 0x74, 0x47, 0x24, + 0xd8, 0x4a, 0x33, 0xef, 0xa5, 0x20, 0xac, 0xe3, 0x51, 0x19, 0x8a, 0x5d, 0x9e, 0xad, 0x57, 0xd9, + 0xcd, 0xc4, 0x48, 0xba, 0x77, 0x2e, 0xf1, 0x62, 0x2c, 0xe1, 0x12, 0x75, 0xbd, 0xb6, 0xc2, 0x6e, + 0x19, 0x32, 0xa8, 0xeb, 0xb5, 0x15, 0x2c, 0xe1, 0x28, 0xec, 0x7c, 0x6b, 0x6e, 0xa2, 0xc8, 0x8d, + 0x4f, 0x27, 0x27, 0x2f, 0xf8, 0xdc, 0xdc, 0x3d, 0x98, 0x52, 0xef, 0xdd, 0xf1, 0x1c, 0x64, 0xf1, + 0xec, 0x24, 0x5b, 0x38, 0x87, 0x49, 0x65, 0xa6, 0xec, 0x7a, 0xeb, 0x19, 0x9a, 0xb8, 0xa3, 0x15, + 0x23, 0x7b, 0xc4, 0x54, 0xee, 0x1b, 0x0f, 0x8b, 0x50, 0x89, 0xdb, 0xb7, 0xdd, 0x70, 0xdb, 0xf1, + 0x02, 0x76, 0x15, 0xa0, 0xbf, 0x98, 0x2f, 0x01, 0x38, 0xc5, 0x41, 0x35, 0x18, 0x71, 0x84, 0x0a, + 0x27, 0x4c, 0xf6, 0x39, 0xd1, 0xe5, 0x52, 0xe1, 0xe3, 0xd6, 0x55, 0xf9, 0x0f, 0x2b, 0x2a, 0xe8, + 0x55, 0x18, 0x17, 0xc1, 0x51, 0xc2, 0x89, 0xf1, 0x84, 0xe9, 0x48, 0x5f, 0xd7, 0x81, 0xd8, 0xc4, + 0x45, 0x4d, 0x98, 0xa0, 0x54, 0x52, 0x06, 0x38, 0x3b, 0xd3, 0x1f, 0x0f, 0xd5, 0xb2, 0x69, 0xeb, + 0x64, 0x70, 0x86, 0x2c, 0x72, 0xe1, 0x31, 0xa7, 0x9d, 0x84, 0xdb, 0x74, 0x27, 0x98, 0xfb, 0x64, + 0x23, 0xbc, 0x43, 0x82, 0xd9, 0x93, 0x6c, 0x05, 0x9e, 0xd9, 0xdf, 0x9b, 0x7f, 0x6c, 0xe9, 0x00, + 0x3c, 0x7c, 0x20, 0x15, 0xf4, 0x36, 0x8c, 0x26, 0xa1, 0x2f, 0x7c, 0x93, 0xe3, 0xd9, 0x53, 0x45, + 0x72, 0xda, 0x6c, 0xa8, 0x0a, 0xba, 0x19, 0x43, 0x11, 0xc1, 0x3a, 0x45, 0xf4, 0x0e, 0x8c, 0xd1, + 0x6f, 0x7f, 0xd5, 0x69, 0xb5, 0xbc, 0xa0, 0x19, 0xcf, 0x3e, 0x52, 0x64, 0xb6, 0x54, 0xc6, 0x46, + 0x73, 0xff, 0xb2, 0x22, 0x12, 0x63, 0x83, 0xe2, 0xdc, 0xcf, 0xc3, 0x74, 0x07, 0xd3, 0xeb, 0xcb, + 0x41, 0xf4, 0x3f, 0x0c, 0x42, 0x45, 0xd9, 0x0c, 0xd1, 0xa2, 0x69, 0x1e, 0x7e, 0x34, 0x6b, 0x1e, + 0x1e, 0xa1, 0x22, 0x9a, 0x6e, 0x11, 0xfe, 0x4c, 0x97, 0x37, 0xd4, 0x9f, 0xcd, 0xdd, 0xe5, 0xc5, + 0x63, 0xb6, 0xfa, 0x78, 0x69, 0x3e, 0xd5, 0x1b, 0x07, 0x0e, 0xd4, 0x1b, 0x0b, 0xbe, 0x0b, 0x48, + 0x35, 0xc4, 0x56, 0xe8, 0xae, 0xd7, 0xb2, 0xcf, 0x5e, 0xd5, 0x68, 0x21, 0xe6, 0x30, 0x26, 0xd9, + 0xd3, 0x53, 0x9b, 0x49, 0xf6, 0xc3, 0x87, 0x94, 0xec, 0x25, 0x01, 0x9c, 0xd2, 0x42, 0x3b, 0x30, + 0xdd, 0x30, 0x5f, 0x31, 0x53, 0x91, 0x58, 0xcf, 0xf7, 0xf1, 0x8a, 0x58, 0x5b, 0x7b, 0xe2, 0x64, + 0x25, 0x4b, 0x0f, 0x77, 0x36, 0x81, 0x5e, 0x85, 0x91, 0xf7, 0xc2, 0x98, 0x5d, 0x5c, 0x88, 0xa3, + 0x4b, 0x46, 0xbc, 0x8c, 0xbc, 0x7e, 0xbd, 0xce, 0xca, 0xef, 0xef, 0xcd, 0x8f, 0xd6, 0x42, 0x57, + 0xfe, 0xc5, 0xaa, 0x02, 0xfa, 0x82, 0x05, 0x27, 0x8d, 0x9d, 0xac, 0x7a, 0x0e, 0x87, 0xe9, 0xf9, + 0xe3, 0xa2, 0xe5, 0x93, 0xeb, 0xdd, 0x68, 0xe2, 0xee, 0x4d, 0xd9, 0xbf, 0xcb, 0x8d, 0xa4, 0xc2, + 0x6c, 0x42, 0xe2, 0xb6, 0x7f, 0x1c, 0xcf, 0x0d, 0x5c, 0x37, 0x2c, 0x3a, 0x0f, 0xc0, 0x4c, 0xff, + 0xef, 0x2c, 0x66, 0xa6, 0xdf, 0x20, 0xdb, 0x2d, 0xdf, 0x49, 0x8e, 0xc3, 0x7f, 0xf8, 0xd3, 0x30, + 0x92, 0x88, 0xd6, 0x8a, 0xbd, 0x95, 0xa0, 0x75, 0x8f, 0x5d, 0x5f, 0xa8, 0xa3, 0x4f, 0x96, 0x62, + 0x45, 0xd0, 0xfe, 0x97, 0xfc, 0xab, 0x48, 0xc8, 0x31, 0xd8, 0x22, 0xae, 0x99, 0xb6, 0x88, 0x67, + 0x0a, 0x8f, 0xa5, 0x87, 0x4d, 0xe2, 0xfb, 0xe6, 0x08, 0x98, 0x86, 0xf2, 0xd3, 0x73, 0x8f, 0x64, + 0xff, 0xaa, 0x05, 0x33, 0xdd, 0x2e, 0xf4, 0xa9, 0x08, 0xc3, 0xf5, 0x23, 0x75, 0xc3, 0xa6, 0x66, + 0xf5, 0xa6, 0x28, 0xc7, 0x0a, 0xa3, 0x70, 0xf2, 0xf2, 0xfe, 0x92, 0x43, 0x5d, 0x07, 0xf3, 0x3d, + 0x3c, 0xf4, 0x1a, 0x0f, 0x17, 0xb0, 0xd4, 0x83, 0x75, 0xfd, 0x85, 0x0a, 0xd8, 0xdf, 0x2e, 0xc1, + 0x0c, 0x37, 0x73, 0x2f, 0xed, 0x84, 0x9e, 0x5b, 0x0b, 0x5d, 0x11, 0x3c, 0xe1, 0xc2, 0x58, 0x4b, + 0x53, 0x6f, 0x8b, 0x25, 0x9b, 0xd1, 0x15, 0xe2, 0x54, 0xa5, 0xd0, 0x4b, 0xb1, 0x41, 0x95, 0xb6, + 0x42, 0x76, 0xbc, 0x86, 0xb2, 0x9a, 0x96, 0xfa, 0x3e, 0x19, 0x54, 0x2b, 0xab, 0x1a, 0x1d, 0x6c, + 0x50, 0x3d, 0x82, 0x37, 0x47, 0xec, 0xbf, 0x67, 0xc1, 0x23, 0x3d, 0x12, 0xd2, 0xd0, 0xe6, 0xee, + 0xb2, 0xab, 0x05, 0xf1, 0xe0, 0xa2, 0x6a, 0x8e, 0x5f, 0x38, 0x60, 0x01, 0x45, 0xb7, 0x01, 0xf8, + 0x85, 0x01, 0x7b, 0x7e, 0xbf, 0x54, 0xc4, 0xe3, 0xa9, 0x23, 0xed, 0x83, 0x96, 0x11, 0x40, 0x3d, + 0xb8, 0xaf, 0x51, 0xb5, 0xbf, 0x59, 0x86, 0x41, 0xfe, 0xae, 0x77, 0x0d, 0x86, 0xb7, 0x78, 0x82, + 0xdc, 0xfe, 0xf2, 0xf3, 0xa6, 0xea, 0x0b, 0x2f, 0xc0, 0x92, 0x0c, 0xba, 0x0a, 0x27, 0xe8, 0xc9, + 0xe2, 0x39, 0x7e, 0x95, 0xf8, 0xce, 0xae, 0xd4, 0x87, 0xf9, 0x43, 0x14, 0x32, 0x63, 0xfa, 0x89, + 0xf5, 0x4e, 0x14, 0xdc, 0xad, 0x1e, 0x7a, 0xad, 0x23, 0x9f, 0x1d, 0x4f, 0x3c, 0xac, 0x64, 0xe1, + 0x83, 0x73, 0xda, 0x51, 0x89, 0xbd, 0xd5, 0xa1, 0xf9, 0x6b, 0xcf, 0x27, 0x9b, 0xda, 0xbe, 0x89, + 0xcb, 0xbc, 0x17, 0xda, 0xcc, 0x6b, 0x63, 0x63, 0x2b, 0x22, 0xf1, 0x56, 0xe8, 0xbb, 0xe2, 0xe5, + 0xcf, 0xd4, 0x7b, 0x21, 0x03, 0xc7, 0x1d, 0x35, 0x28, 0x95, 0x4d, 0xc7, 0xf3, 0xdb, 0x11, 0x49, + 0xa9, 0x0c, 0x99, 0x54, 0xd6, 0x32, 0x70, 0xdc, 0x51, 0x83, 0xae, 0xad, 0x93, 0xe2, 0xb1, 0x48, + 0x19, 0x7e, 0x2d, 0x58, 0xd0, 0xa7, 0x60, 0x58, 0x3a, 0xe1, 0x17, 0xca, 0x12, 0x22, 0x5c, 0x13, + 0xd4, 0xc3, 0x93, 0xda, 0xc3, 0x64, 0xc2, 0xfd, 0x5e, 0xd2, 0x3b, 0xcc, 0xa3, 0x84, 0x7f, 0x66, + 0xc1, 0x89, 0x2e, 0xce, 0x64, 0x9c, 0xa5, 0x35, 0xbd, 0x38, 0x51, 0xcf, 0x22, 0x68, 0x2c, 0x8d, + 0x97, 0x63, 0x85, 0x41, 0x77, 0x0b, 0x67, 0x9a, 0x59, 0x46, 0x29, 0x9c, 0x4c, 0x04, 0xb4, 0x3f, + 0x46, 0x89, 0xce, 0xc0, 0x40, 0x3b, 0x26, 0x91, 0x7c, 0x21, 0x50, 0xf2, 0x79, 0x66, 0x69, 0x64, + 0x10, 0x2a, 0xb6, 0x36, 0x95, 0x91, 0x4f, 0x13, 0x5b, 0xb9, 0x99, 0x8f, 0xc3, 0xec, 0xaf, 0x95, + 0x61, 0x32, 0xe3, 0x54, 0x4a, 0x3b, 0xb2, 0x1d, 0x06, 0x5e, 0x12, 0xaa, 0xcc, 0x6d, 0xfc, 0x51, + 0x32, 0xd2, 0xda, 0xba, 0x2a, 0xca, 0xb1, 0xc2, 0x40, 0x4f, 0xcb, 0x47, 0x61, 0xb3, 0xcf, 0x3d, + 0x2c, 0x57, 0x8d, 0x77, 0x61, 0x8b, 0x3e, 0xd5, 0xf2, 0x24, 0x0c, 0xb4, 0x42, 0xf5, 0xc6, 0xb7, + 0xfa, 0x9e, 0x78, 0xb9, 0x5a, 0x0b, 0x43, 0x1f, 0x33, 0x20, 0x7a, 0x4a, 0x8c, 0x3e, 0x73, 0x37, + 0x82, 0x1d, 0x37, 0x8c, 0xb5, 0x29, 0x78, 0x06, 0x86, 0xef, 0x90, 0xdd, 0xc8, 0x0b, 0x9a, 0xd9, + 0x9b, 0xa1, 0xcb, 0xbc, 0x18, 0x4b, 0xb8, 0x99, 0xfd, 0x7c, 0xf8, 0x88, 0x9f, 0x63, 0x19, 0xc9, + 0x3d, 0x07, 0xbf, 0x63, 0xc1, 0x24, 0x4b, 0x67, 0x2a, 0x82, 0xff, 0xbd, 0x30, 0x38, 0x06, 0x19, + 0xe3, 0x49, 0x18, 0x8c, 0x68, 0xa3, 0xd9, 0xf7, 0x14, 0x58, 0x4f, 0x30, 0x87, 0xa1, 0xc7, 0x60, + 0x80, 0x75, 0x81, 0x7e, 0xc6, 0x31, 0x9e, 0x35, 0xbd, 0xea, 0x24, 0x0e, 0x66, 0xa5, 0x2c, 0x8e, + 0x0b, 0x93, 0x96, 0xef, 0xf1, 0x4e, 0xa7, 0x06, 0xdd, 0x87, 0x2d, 0x8e, 0xab, 0x6b, 0x27, 0x1f, + 0x54, 0x1c, 0x57, 0x77, 0xe2, 0x07, 0xcb, 0xf9, 0xff, 0xa3, 0x04, 0xa7, 0xbb, 0xd6, 0x4b, 0xef, + 0x98, 0xd7, 0x8c, 0x3b, 0xe6, 0x0b, 0x99, 0x3b, 0x66, 0xfb, 0xe0, 0xda, 0x0f, 0xe6, 0xd6, 0xb9, + 0xfb, 0x65, 0x70, 0xf9, 0x18, 0x2f, 0x83, 0x07, 0x8a, 0x8a, 0x38, 0x83, 0x39, 0x22, 0xce, 0x1f, + 0x5a, 0xf0, 0x68, 0xd7, 0x29, 0x7b, 0xe8, 0x02, 0xe7, 0xba, 0xf6, 0xb2, 0x87, 0x76, 0xf2, 0x2b, + 0xe5, 0x1e, 0xa3, 0x62, 0x7a, 0xca, 0x59, 0xca, 0x85, 0x18, 0x30, 0x16, 0xc2, 0xdb, 0x18, 0xe7, + 0x40, 0xbc, 0x0c, 0x2b, 0x28, 0x8a, 0xb5, 0xc0, 0x33, 0xde, 0xc9, 0xd5, 0x43, 0x6e, 0xa8, 0x05, + 0xd3, 0x12, 0xaf, 0x67, 0x34, 0xc8, 0x86, 0xa3, 0xdd, 0xd2, 0x34, 0xcf, 0xf2, 0x61, 0x34, 0xcf, + 0xb1, 0xee, 0x5a, 0x27, 0x5a, 0x82, 0xc9, 0x6d, 0x2f, 0x60, 0xaf, 0xb8, 0x9a, 0xd2, 0x93, 0x8a, + 0xfe, 0xbd, 0x6a, 0x82, 0x71, 0x16, 0x7f, 0xee, 0x55, 0x18, 0x3f, 0xbc, 0x75, 0xed, 0xc7, 0x65, + 0xf8, 0xe0, 0x01, 0x4c, 0x81, 0x9f, 0x0e, 0xc6, 0x77, 0xd1, 0x4e, 0x87, 0x8e, 0x6f, 0x53, 0x83, + 0x99, 0xcd, 0xb6, 0xef, 0xef, 0x32, 0x0f, 0x2d, 0xe2, 0x4a, 0x0c, 0x21, 0xd4, 0xa8, 0xe7, 0xe2, + 0xd7, 0xba, 0xe0, 0xe0, 0xae, 0x35, 0xd1, 0x27, 0x01, 0x85, 0xb7, 0x59, 0xc2, 0x5f, 0x37, 0xcd, + 0xd8, 0xc0, 0x3e, 0x41, 0x39, 0xdd, 0xaa, 0xd7, 0x3b, 0x30, 0x70, 0x97, 0x5a, 0x54, 0x4e, 0x65, + 0x2f, 0xcd, 0xab, 0x6e, 0x65, 0xe4, 0x54, 0xac, 0x03, 0xb1, 0x89, 0x8b, 0x2e, 0xc2, 0xb4, 0xb3, + 0xe3, 0x78, 0x3c, 0x81, 0x97, 0x24, 0xc0, 0x05, 0x55, 0x65, 0xbf, 0x5a, 0xca, 0x22, 0xe0, 0xce, + 0x3a, 0xa8, 0x65, 0x18, 0x24, 0x79, 0xaa, 0xff, 0x8f, 0x1f, 0x62, 0x05, 0x17, 0x36, 0x51, 0xda, + 0xff, 0xc5, 0xa2, 0x47, 0x5f, 0x97, 0x07, 0x3f, 0xe9, 0x8c, 0x28, 0x03, 0x9b, 0x16, 0x48, 0xa7, + 0x66, 0x64, 0x45, 0x07, 0x62, 0x13, 0x97, 0x2f, 0x8d, 0x38, 0x75, 0x18, 0x37, 0xa4, 0x4d, 0x11, + 0x83, 0xaa, 0x30, 0xa8, 0x04, 0xed, 0x7a, 0x3b, 0x5e, 0x1c, 0x46, 0x62, 0x03, 0xf5, 0xe9, 0x3e, + 0x9c, 0xf2, 0xcb, 0x2a, 0x27, 0x83, 0x25, 0x3d, 0xfb, 0xeb, 0x25, 0x18, 0x97, 0x2d, 0xbe, 0xde, + 0x0e, 0x13, 0xe7, 0x18, 0x8e, 0xf4, 0xd7, 0x8d, 0x23, 0x7d, 0xb1, 0x58, 0x48, 0x2e, 0xeb, 0x5c, + 0xcf, 0xa3, 0xfc, 0x53, 0x99, 0xa3, 0xfc, 0x7c, 0x3f, 0x44, 0x0f, 0x3e, 0xc2, 0xff, 0x8d, 0x05, + 0xd3, 0x06, 0xfe, 0x31, 0x9c, 0x24, 0x35, 0xf3, 0x24, 0x79, 0xae, 0x8f, 0xd1, 0xf4, 0x38, 0x41, + 0xbe, 0x55, 0xca, 0x8c, 0x82, 0x9d, 0x1c, 0x9f, 0x83, 0x81, 0x2d, 0x27, 0x72, 0x8b, 0x65, 0xb3, + 0xec, 0xa8, 0xbe, 0x70, 0xc9, 0x89, 0x5c, 0xce, 0xff, 0xcf, 0xa9, 0xe7, 0xc8, 0x9c, 0xc8, 0xcd, + 0x8d, 0xa3, 0x60, 0x8d, 0xa2, 0x57, 0x60, 0x28, 0x6e, 0x84, 0x2d, 0xe5, 0x69, 0x7a, 0x86, 0x3f, + 0x55, 0x46, 0x4b, 0xee, 0xef, 0xcd, 0x23, 0xb3, 0x39, 0x5a, 0x8c, 0x05, 0xfe, 0x5c, 0x13, 0x2a, + 0xaa, 0xe9, 0x23, 0xf5, 0xb5, 0xff, 0xaf, 0x65, 0x38, 0xd1, 0x65, 0xad, 0xa0, 0xcf, 0x1b, 0xf3, + 0xf6, 0x6a, 0xdf, 0x8b, 0xed, 0x7d, 0xce, 0xdc, 0xe7, 0x99, 0xa6, 0xe4, 0x8a, 0xd5, 0x71, 0x88, + 0xe6, 0x6f, 0xc4, 0x24, 0xdb, 0x3c, 0x2d, 0xca, 0x6f, 0x9e, 0x36, 0x7b, 0x6c, 0xd3, 0x4f, 0x1b, + 0x52, 0x3d, 0x3d, 0xd2, 0xef, 0xfc, 0x4b, 0x03, 0x30, 0xd3, 0x2d, 0xf6, 0x1f, 0x7d, 0xc9, 0xca, + 0x3c, 0x59, 0xf1, 0x5a, 0xff, 0x09, 0x04, 0xf8, 0x3b, 0x16, 0x22, 0x5f, 0xce, 0x82, 0xf9, 0x88, + 0x45, 0xee, 0x8c, 0x8b, 0xd6, 0x59, 0x04, 0x54, 0xc4, 0x9f, 0x1f, 0x91, 0x5c, 0xe1, 0x13, 0x87, + 0xe8, 0x8a, 0x78, 0xc1, 0x24, 0xce, 0x44, 0x40, 0xc9, 0xe2, 0xfc, 0x08, 0x28, 0xd9, 0x87, 0x39, + 0x0f, 0x46, 0xb5, 0x71, 0x1d, 0xe9, 0x32, 0xb8, 0x43, 0x8f, 0x28, 0xad, 0xdf, 0x47, 0xba, 0x14, + 0xfe, 0xb6, 0x05, 0x19, 0xb7, 0x30, 0x65, 0x96, 0xb1, 0x7a, 0x9a, 0x65, 0xce, 0xc0, 0x40, 0x14, + 0xfa, 0x24, 0xfb, 0x9c, 0x02, 0x0e, 0x7d, 0x82, 0x19, 0x44, 0xbd, 0x50, 0x5c, 0xee, 0xf5, 0x42, + 0x31, 0xd5, 0xd3, 0x7d, 0xb2, 0x43, 0xa4, 0x91, 0x44, 0xb1, 0xf1, 0x2b, 0xb4, 0x10, 0x73, 0x98, + 0xfd, 0x5b, 0x03, 0x70, 0xa2, 0x4b, 0x3c, 0x1d, 0xd5, 0x90, 0x9a, 0x4e, 0x42, 0xee, 0x3a, 0xbb, + 0xd9, 0xb4, 0xae, 0x17, 0x79, 0x31, 0x96, 0x70, 0xe6, 0xce, 0xca, 0x53, 0xc3, 0x65, 0x4c, 0x57, + 0x22, 0x23, 0x9c, 0x80, 0x1e, 0xfd, 0x5b, 0xb6, 0x17, 0x00, 0xe2, 0xd8, 0x5f, 0x0d, 0xa8, 0x84, + 0xe7, 0x0a, 0xb7, 0xd9, 0x34, 0xa3, 0x60, 0xfd, 0x8a, 0x80, 0x60, 0x0d, 0x0b, 0x55, 0x61, 0xaa, + 0x15, 0x85, 0x09, 0x37, 0x0c, 0x56, 0xb9, 0xab, 0xc5, 0xa0, 0x19, 0xaf, 0x55, 0xcb, 0xc0, 0x71, + 0x47, 0x0d, 0xf4, 0x12, 0x8c, 0x8a, 0x18, 0xae, 0x5a, 0x18, 0xfa, 0xc2, 0x8c, 0xa4, 0xee, 0xe3, + 0xeb, 0x29, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0x66, 0x6d, 0x1c, 0xee, 0x5a, 0x8d, 0x5b, 0x1c, 0x35, + 0xbc, 0x4c, 0x86, 0x90, 0x91, 0x42, 0x19, 0x42, 0x52, 0xc3, 0x5a, 0xa5, 0xf0, 0x45, 0x0c, 0xe4, + 0x1a, 0xa0, 0xfe, 0xa0, 0x0c, 0x43, 0xfc, 0x53, 0x1c, 0x83, 0x94, 0x57, 0x13, 0x26, 0xa5, 0x42, + 0xd9, 0x18, 0x78, 0xaf, 0x16, 0xaa, 0x4e, 0xe2, 0x70, 0xd6, 0xa4, 0x76, 0x48, 0x6a, 0x86, 0x42, + 0x0b, 0xc6, 0x1e, 0x9a, 0xcb, 0x58, 0x4a, 0x80, 0xd3, 0xd0, 0x76, 0xd4, 0x16, 0x40, 0xcc, 0xde, + 0x53, 0xa5, 0x34, 0x44, 0xce, 0xd9, 0x17, 0x0b, 0xf5, 0xa3, 0xae, 0xaa, 0xf1, 0xde, 0xa4, 0xcb, + 0x52, 0x01, 0xb0, 0x46, 0x7b, 0xee, 0x65, 0xa8, 0x28, 0xe4, 0x3c, 0x15, 0x72, 0x4c, 0x67, 0x6d, + 0xff, 0x1f, 0x4c, 0x66, 0xda, 0xea, 0x4b, 0x03, 0xfd, 0x1d, 0x0b, 0x26, 0x79, 0x97, 0x57, 0x83, + 0x1d, 0xc1, 0x0a, 0xbe, 0x68, 0xc1, 0x8c, 0xdf, 0x65, 0x27, 0x8a, 0xcf, 0x7c, 0x98, 0x3d, 0xac, + 0x94, 0xcf, 0x6e, 0x50, 0xdc, 0xb5, 0x35, 0x74, 0x16, 0x46, 0xf8, 0xf3, 0xd0, 0x8e, 0x2f, 0x7c, + 0xb4, 0xc7, 0x78, 0xb6, 0x6d, 0x5e, 0x86, 0x15, 0xd4, 0xfe, 0x89, 0x05, 0xd3, 0x7c, 0x10, 0x97, + 0xc9, 0xae, 0x52, 0xaf, 0x1e, 0x92, 0x61, 0x88, 0xbc, 0xe2, 0xa5, 0x1e, 0x79, 0xc5, 0xf5, 0x51, + 0x96, 0x0f, 0x1c, 0xe5, 0xb7, 0x2d, 0x10, 0x2b, 0xf4, 0x18, 0xf4, 0x87, 0x75, 0x53, 0x7f, 0xf8, + 0x50, 0x91, 0x45, 0xdf, 0x43, 0x71, 0xf8, 0xe5, 0x12, 0x4c, 0x71, 0x84, 0xf4, 0x46, 0xe6, 0x61, + 0xf9, 0x38, 0xfd, 0xbd, 0x77, 0xa3, 0x1e, 0x19, 0xed, 0x3e, 0x52, 0xe3, 0x5b, 0x0e, 0x1c, 0xf8, + 0x2d, 0xff, 0xc2, 0x02, 0xc4, 0xe7, 0x24, 0xfb, 0xb6, 0x36, 0x3f, 0xdd, 0x34, 0x73, 0x40, 0xca, + 0x39, 0x14, 0x04, 0x6b, 0x58, 0x0f, 0x78, 0x08, 0x99, 0xfb, 0xb0, 0x72, 0xfe, 0x7d, 0x58, 0x1f, + 0xa3, 0xfe, 0xdd, 0x32, 0x64, 0x9d, 0x35, 0xd1, 0x3b, 0x30, 0xd6, 0x70, 0x5a, 0xce, 0x6d, 0xcf, + 0xf7, 0x12, 0x8f, 0xc4, 0xc5, 0x2e, 0xdc, 0x57, 0xb4, 0x1a, 0xe2, 0x1a, 0x4a, 0x2b, 0xc1, 0x06, + 0x45, 0xb4, 0x00, 0xd0, 0x8a, 0xbc, 0x1d, 0xcf, 0x27, 0x4d, 0xa6, 0xf1, 0xb0, 0x68, 0x0f, 0x7e, + 0x77, 0x2c, 0x4b, 0xb1, 0x86, 0xd1, 0x25, 0x3a, 0xa0, 0x7c, 0x1c, 0xd1, 0x01, 0x03, 0x7d, 0x46, + 0x07, 0x0c, 0x16, 0x8a, 0x0e, 0xc0, 0x70, 0x4a, 0x1e, 0xde, 0xf4, 0xff, 0x9a, 0xe7, 0x13, 0x21, + 0xbb, 0xf1, 0x68, 0x90, 0xb9, 0xfd, 0xbd, 0xf9, 0x53, 0xb8, 0x2b, 0x06, 0xee, 0x51, 0xd3, 0x6e, + 0xc3, 0x89, 0x3a, 0x89, 0x3c, 0x96, 0xf5, 0xd2, 0x4d, 0xf7, 0xd2, 0x67, 0xa0, 0x12, 0x65, 0xb6, + 0x71, 0x9f, 0x21, 0xff, 0x5a, 0x9e, 0x34, 0xb9, 0x6d, 0x53, 0x92, 0xf6, 0x5f, 0x2b, 0xc1, 0xb0, + 0x70, 0xd3, 0x3c, 0x06, 0xe1, 0xe3, 0xb2, 0x61, 0x62, 0x7a, 0x26, 0x8f, 0xff, 0xb1, 0x6e, 0xf5, + 0x34, 0x2e, 0xd5, 0x33, 0xc6, 0xa5, 0xe7, 0x8a, 0x91, 0x3b, 0xd8, 0xac, 0xf4, 0x8f, 0xcb, 0x30, + 0x61, 0xba, 0xad, 0x1e, 0xc3, 0xb4, 0xbc, 0x01, 0xc3, 0xb1, 0xf0, 0xa0, 0x2e, 0x15, 0xf1, 0xd9, + 0xcb, 0x7e, 0xe2, 0xf4, 0x26, 0x5e, 0xf8, 0x4c, 0x4b, 0x72, 0x5d, 0x9d, 0xb4, 0xcb, 0xc7, 0xe2, + 0xa4, 0x9d, 0xe7, 0x4d, 0x3c, 0xf0, 0x20, 0xbc, 0x89, 0xed, 0x1f, 0x30, 0x96, 0xaf, 0x97, 0x1f, + 0xc3, 0x31, 0xfe, 0xba, 0x79, 0x38, 0x9c, 0x2b, 0xb4, 0xee, 0x44, 0xf7, 0x7a, 0x1c, 0xe7, 0xdf, + 0xb5, 0x60, 0x54, 0x20, 0x1e, 0xc3, 0x00, 0x3e, 0x69, 0x0e, 0xe0, 0xa9, 0x42, 0x03, 0xe8, 0xd1, + 0xf3, 0xaf, 0x97, 0x54, 0xcf, 0x6b, 0x61, 0x94, 0x14, 0xca, 0xf1, 0x3d, 0x42, 0x55, 0xbf, 0xb0, + 0x11, 0xfa, 0x42, 0x80, 0x7b, 0x2c, 0x0d, 0xfe, 0xe3, 0xe5, 0xf7, 0xb5, 0xdf, 0x58, 0x61, 0xb3, + 0xd8, 0xb4, 0x30, 0x4a, 0xc4, 0x01, 0x9a, 0xc6, 0xa6, 0x85, 0x51, 0x82, 0x19, 0x04, 0xb9, 0x00, + 0xe9, 0x63, 0xf5, 0x22, 0x6e, 0xb6, 0xf7, 0x6e, 0x6d, 0x27, 0x9e, 0xbf, 0xe0, 0x05, 0x49, 0x9c, + 0x44, 0x0b, 0xeb, 0x41, 0x72, 0x3d, 0xe2, 0x42, 0xbf, 0x16, 0xcd, 0xa7, 0x68, 0x61, 0x8d, 0xae, + 0x0c, 0x13, 0x61, 0x6d, 0x0c, 0x9a, 0x37, 0x48, 0xd7, 0x44, 0x39, 0x56, 0x18, 0xf6, 0xcb, 0x8c, + 0xb3, 0xb3, 0x09, 0xea, 0x2f, 0xd0, 0xee, 0x5f, 0x0d, 0xaa, 0xa9, 0x65, 0x66, 0xe1, 0x6b, 0x7a, + 0x38, 0x5f, 0x51, 0xf6, 0x49, 0xbb, 0xa0, 0xfb, 0x51, 0xa7, 0xd1, 0x7f, 0x88, 0x74, 0x5c, 0x3b, + 0xbe, 0x5c, 0x98, 0x23, 0xf7, 0x71, 0xd1, 0xc8, 0xd2, 0x1a, 0xb2, 0x5c, 0x6e, 0xeb, 0xb5, 0x6c, + 0x66, 0xf6, 0x15, 0x09, 0xc0, 0x29, 0x0e, 0x5a, 0x14, 0x0a, 0x25, 0xb7, 0xb8, 0x7c, 0x30, 0xa3, + 0x50, 0xca, 0x29, 0xd1, 0x34, 0xca, 0xf3, 0x30, 0xaa, 0x1e, 0xbb, 0xa9, 0xf1, 0x67, 0x46, 0x2a, + 0x5c, 0xbe, 0x5a, 0x4d, 0x8b, 0xb1, 0x8e, 0x83, 0x36, 0x60, 0x32, 0xe6, 0x2f, 0xf1, 0xc8, 0x78, + 0x0d, 0x61, 0x38, 0x78, 0x36, 0xf3, 0x40, 0xbe, 0x04, 0xdf, 0x67, 0x45, 0x7c, 0x2b, 0xcb, 0x08, + 0x8f, 0x2c, 0x09, 0xf4, 0x1a, 0x4c, 0xf8, 0xfa, 0x33, 0xa3, 0x35, 0x61, 0x57, 0x50, 0x6e, 0x67, + 0xc6, 0x23, 0xa4, 0x35, 0x9c, 0xc1, 0x46, 0x6f, 0xc0, 0xac, 0x5e, 0x22, 0xd2, 0x0b, 0x39, 0x41, + 0x93, 0xc4, 0xe2, 0xd5, 0x8e, 0xc7, 0xf6, 0xf7, 0xe6, 0x67, 0xaf, 0xf4, 0xc0, 0xc1, 0x3d, 0x6b, + 0xa3, 0x57, 0x60, 0x4c, 0x0e, 0x5f, 0x8b, 0x6e, 0x4a, 0x1d, 0x1e, 0x35, 0x18, 0x36, 0x30, 0xdf, + 0xdf, 0x5d, 0xec, 0xe7, 0x68, 0x65, 0xed, 0xdc, 0x45, 0xef, 0xc2, 0x98, 0xde, 0xc7, 0xec, 0x81, + 0x9a, 0xff, 0x74, 0xab, 0x38, 0xbf, 0x55, 0xcf, 0x75, 0x18, 0x36, 0x68, 0xdb, 0xd7, 0x61, 0xa8, + 0xbe, 0x1b, 0x37, 0x12, 0xbf, 0x00, 0x53, 0x7a, 0xd2, 0x18, 0x42, 0xba, 0x61, 0xd8, 0x33, 0x52, + 0x62, 0x44, 0xf6, 0x97, 0x2d, 0x98, 0xdc, 0x58, 0xa9, 0xd5, 0xc3, 0xc6, 0x1d, 0x92, 0x2c, 0x71, + 0x9d, 0x0b, 0x0b, 0x9e, 0x64, 0x1d, 0x92, 0xd7, 0x74, 0xe3, 0x62, 0x67, 0x60, 0x60, 0x2b, 0x8c, + 0x93, 0xac, 0xdd, 0xf2, 0x52, 0x18, 0x27, 0x98, 0x41, 0xec, 0x3f, 0xb5, 0x60, 0x90, 0xbd, 0x92, + 0x94, 0xf7, 0xc2, 0x56, 0x91, 0x71, 0xa1, 0x97, 0x60, 0x88, 0x6c, 0x6e, 0x92, 0x46, 0x22, 0xb6, + 0xa7, 0x8c, 0x01, 0x18, 0x5a, 0x65, 0xa5, 0x74, 0xd3, 0xb1, 0xc6, 0xf8, 0x5f, 0x2c, 0x90, 0xd1, + 0xa7, 0xa1, 0x92, 0x78, 0xdb, 0x64, 0xc9, 0x75, 0x85, 0xa1, 0xb0, 0x3f, 0xb7, 0x14, 0xc5, 0x04, + 0x36, 0x24, 0x11, 0x9c, 0xd2, 0xb3, 0xbf, 0x5a, 0x02, 0x48, 0x63, 0x7c, 0xf2, 0x86, 0xb9, 0xdc, + 0xf1, 0x90, 0xd8, 0xd3, 0x5d, 0x1e, 0x12, 0x43, 0x29, 0xc1, 0x2e, 0xcf, 0x88, 0xa9, 0xa9, 0x2a, + 0x17, 0x9a, 0xaa, 0x81, 0x7e, 0xa6, 0x6a, 0x05, 0xa6, 0xd3, 0x18, 0x25, 0x33, 0xd8, 0x93, 0xa5, + 0x15, 0xdd, 0xc8, 0x02, 0x71, 0x27, 0xbe, 0xfd, 0x55, 0x0b, 0x84, 0x23, 0x63, 0x81, 0x05, 0xed, + 0xca, 0x47, 0x7f, 0x8c, 0xfc, 0x67, 0xcf, 0x16, 0xf1, 0xf1, 0x14, 0x59, 0xcf, 0xd4, 0x16, 0x33, + 0x72, 0x9d, 0x19, 0x54, 0xed, 0xdf, 0xb4, 0x60, 0x94, 0x83, 0xaf, 0x32, 0x59, 0x39, 0xbf, 0x5f, + 0x7d, 0xe5, 0xac, 0x65, 0xef, 0xe1, 0x50, 0xc2, 0x2a, 0x77, 0xa9, 0xfe, 0x1e, 0x8e, 0x04, 0xe0, + 0x14, 0x07, 0x3d, 0x03, 0xc3, 0x71, 0xfb, 0x36, 0x43, 0xcf, 0x78, 0x35, 0xd6, 0x79, 0x31, 0x96, + 0x70, 0xfb, 0x9f, 0x96, 0x60, 0x2a, 0xeb, 0xd4, 0x8a, 0x30, 0x0c, 0x71, 0xd9, 0x39, 0x2b, 0x76, + 0x1d, 0x64, 0xa3, 0xd1, 0x9c, 0x62, 0x81, 0xbf, 0xea, 0xcc, 0x8c, 0xe9, 0x82, 0x12, 0xda, 0x84, + 0x51, 0x37, 0xbc, 0x1b, 0xdc, 0x75, 0x22, 0x77, 0xa9, 0xb6, 0x2e, 0xbe, 0x44, 0x8e, 0x1b, 0x52, + 0x35, 0xad, 0xa0, 0xbb, 0xdc, 0x32, 0x9b, 0x41, 0x0a, 0xc2, 0x3a, 0x61, 0xaa, 0x2b, 0x36, 0xc2, + 0x60, 0xd3, 0x6b, 0x5e, 0x75, 0x5a, 0xc5, 0x2e, 0xdc, 0x57, 0x24, 0xba, 0xd6, 0xc6, 0xb8, 0xc8, + 0xee, 0xc0, 0x01, 0x38, 0x25, 0x69, 0xff, 0xc6, 0x0c, 0x18, 0x6b, 0xc1, 0x48, 0x2c, 0x6b, 0x3d, + 0xf0, 0xc4, 0xb2, 0x6f, 0xc1, 0x08, 0xd9, 0x6e, 0x25, 0xbb, 0x55, 0x2f, 0x2a, 0x96, 0x26, 0x7c, + 0x55, 0x60, 0x77, 0x52, 0x97, 0x10, 0xac, 0x28, 0xf6, 0x48, 0x13, 0x5c, 0x7e, 0x28, 0xd2, 0x04, + 0x0f, 0xfc, 0xa5, 0xa4, 0x09, 0x7e, 0x03, 0x86, 0x9b, 0x5e, 0x82, 0x49, 0x2b, 0x14, 0xe9, 0x32, + 0x72, 0x16, 0xcf, 0x45, 0x8e, 0xdc, 0x99, 0x40, 0x52, 0x00, 0xb0, 0x24, 0x87, 0x36, 0xd4, 0xa6, + 0x1a, 0x2a, 0x72, 0xdc, 0x77, 0xda, 0xf0, 0xba, 0x6e, 0x2b, 0x91, 0x16, 0x78, 0xf8, 0xfd, 0xa7, + 0x05, 0x56, 0xc9, 0x7c, 0x47, 0x1e, 0x54, 0x32, 0x5f, 0x23, 0x29, 0x72, 0xe5, 0x28, 0x92, 0x22, + 0x7f, 0xd5, 0x82, 0x93, 0xad, 0x6e, 0x29, 0xc5, 0x45, 0x5a, 0xde, 0x9f, 0x3f, 0x44, 0x92, 0x75, + 0xa3, 0x69, 0x96, 0x84, 0xa0, 0x2b, 0x1a, 0xee, 0xde, 0xb0, 0xcc, 0xae, 0x3c, 0xfa, 0xfe, 0xb3, + 0x2b, 0x1f, 0x75, 0xfe, 0xde, 0x34, 0xd7, 0xf2, 0xf8, 0x91, 0xe4, 0x5a, 0x9e, 0x78, 0x80, 0xb9, + 0x96, 0xb5, 0x2c, 0xc9, 0x93, 0x0f, 0x36, 0x4b, 0xf2, 0x96, 0x79, 0x2e, 0xf1, 0xa4, 0xbc, 0x2f, + 0x15, 0x3e, 0x97, 0x8c, 0x16, 0x0e, 0x3e, 0x99, 0x78, 0xbe, 0xe8, 0xe9, 0xf7, 0x99, 0x2f, 0xda, + 0xc8, 0xba, 0x8c, 0x8e, 0x22, 0xeb, 0xf2, 0x3b, 0xfa, 0x09, 0x7a, 0xa2, 0x48, 0x0b, 0xea, 0xa0, + 0xec, 0x6c, 0xa1, 0xdb, 0x19, 0xda, 0x99, 0xd7, 0x79, 0xe6, 0xb8, 0xf3, 0x3a, 0x9f, 0x3c, 0xc2, + 0xbc, 0xce, 0xa7, 0x8e, 0x35, 0xaf, 0xf3, 0x23, 0x0f, 0x49, 0x5e, 0xe7, 0xd9, 0xe3, 0xca, 0xeb, + 0xfc, 0xe8, 0x03, 0xcd, 0xeb, 0x4c, 0x3f, 0x5d, 0x4b, 0x86, 0x86, 0xcd, 0xce, 0x15, 0xf9, 0x74, + 0x5d, 0x23, 0xc9, 0xf8, 0xa7, 0x53, 0x20, 0x9c, 0x12, 0xb5, 0x7f, 0xa9, 0x04, 0xa7, 0x0f, 0x5e, + 0xbb, 0xa9, 0x1b, 0x46, 0x2d, 0x35, 0x86, 0x65, 0xdc, 0x30, 0x98, 0x5c, 0xa8, 0x61, 0x15, 0x8e, + 0x87, 0xbd, 0x08, 0xd3, 0xca, 0x51, 0xc4, 0xf7, 0x1a, 0xbb, 0xda, 0x5b, 0x30, 0xca, 0xc1, 0xb9, + 0x9e, 0x45, 0xc0, 0x9d, 0x75, 0xd0, 0x12, 0x4c, 0x1a, 0x85, 0xeb, 0x55, 0xa1, 0x5d, 0x28, 0x97, + 0xf6, 0xba, 0x09, 0xc6, 0x59, 0x7c, 0xfb, 0x5b, 0x16, 0x3c, 0xd2, 0x23, 0x49, 0x64, 0xe1, 0x20, + 0xcf, 0x16, 0x4c, 0xb6, 0xcc, 0xaa, 0x85, 0x63, 0xc6, 0x8d, 0xa4, 0x94, 0xaa, 0xd7, 0x19, 0x00, + 0xce, 0x92, 0x5f, 0xfe, 0xd0, 0x0f, 0x7f, 0x7c, 0xfa, 0x03, 0x3f, 0xfa, 0xf1, 0xe9, 0x0f, 0xfc, + 0xf1, 0x8f, 0x4f, 0x7f, 0xe0, 0x17, 0xf6, 0x4f, 0x5b, 0x3f, 0xdc, 0x3f, 0x6d, 0xfd, 0x68, 0xff, + 0xb4, 0xf5, 0x67, 0xfb, 0xa7, 0xad, 0xaf, 0xfe, 0xe4, 0xf4, 0x07, 0xde, 0x2c, 0xed, 0x9c, 0xff, + 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa7, 0x52, 0x37, 0x5e, 0x12, 0xcb, 0x00, 0x00, } diff --git a/pkg/api/v1/generated.proto b/pkg/api/v1/generated.proto index 355768c11635e..7652941486a6d 100644 --- a/pkg/api/v1/generated.proto +++ b/pkg/api/v1/generated.proto @@ -3970,6 +3970,14 @@ message VsphereVirtualDiskVolumeSource { // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // +optional optional string fsType = 2; + + // Storage Policy Based Management (SPBM) profile name. + // +optional + optional string storagePolicyName = 3; + + // Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + // +optional + optional string storagePolicyID = 4; } // The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) diff --git a/pkg/api/v1/types.generated.go b/pkg/api/v1/types.generated.go index 7e81fa3d65a2d..7cee3b943cc28 100644 --- a/pkg/api/v1/types.generated.go +++ b/pkg/api/v1/types.generated.go @@ -17322,13 +17322,15 @@ func (x *VsphereVirtualDiskVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [2]bool + var yyq2 [4]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[1] = x.FSType != "" + yyq2[2] = x.StoragePolicyName != "" + yyq2[3] = x.StoragePolicyID != "" var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(2) + r.EncodeArrayStart(4) } else { yynn2 = 1 for _, b := range yyq2 { @@ -17383,6 +17385,56 @@ func (x *VsphereVirtualDiskVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePolicyName)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("storagePolicyName")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePolicyName)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePolicyID)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("storagePolicyID")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.StoragePolicyID)) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -17468,6 +17520,30 @@ func (x *VsphereVirtualDiskVolumeSource) codecDecodeSelfFromMap(l int, d *codec1 *((*string)(yyv6)) = r.DecodeString() } } + case "storagePolicyName": + if r.TryDecodeAsNil() { + x.StoragePolicyName = "" + } else { + yyv8 := &x.StoragePolicyName + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*string)(yyv8)) = r.DecodeString() + } + } + case "storagePolicyID": + if r.TryDecodeAsNil() { + x.StoragePolicyID = "" + } else { + yyv10 := &x.StoragePolicyID + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*string)(yyv10)) = r.DecodeString() + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -17479,16 +17555,16 @@ func (x *VsphereVirtualDiskVolumeSource) codecDecodeSelfFromArray(l int, d *code var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l } else { - yyb8 = r.CheckBreak() + yyb12 = r.CheckBreak() } - if yyb8 { + if yyb12 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -17496,21 +17572,21 @@ func (x *VsphereVirtualDiskVolumeSource) codecDecodeSelfFromArray(l int, d *code if r.TryDecodeAsNil() { x.VolumePath = "" } else { - yyv9 := &x.VolumePath - yym10 := z.DecBinary() - _ = yym10 + yyv13 := &x.VolumePath + yym14 := z.DecBinary() + _ = yym14 if false { } else { - *((*string)(yyv9)) = r.DecodeString() + *((*string)(yyv13)) = r.DecodeString() } } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l } else { - yyb8 = r.CheckBreak() + yyb12 = r.CheckBreak() } - if yyb8 { + if yyb12 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -17518,26 +17594,70 @@ func (x *VsphereVirtualDiskVolumeSource) codecDecodeSelfFromArray(l int, d *code if r.TryDecodeAsNil() { x.FSType = "" } else { - yyv11 := &x.FSType - yym12 := z.DecBinary() - _ = yym12 + yyv15 := &x.FSType + yym16 := z.DecBinary() + _ = yym16 if false { } else { - *((*string)(yyv11)) = r.DecodeString() + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.StoragePolicyName = "" + } else { + yyv17 := &x.StoragePolicyName + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + *((*string)(yyv17)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.StoragePolicyID = "" + } else { + yyv19 := &x.StoragePolicyID + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + *((*string)(yyv19)) = r.DecodeString() } } for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l } else { - yyb8 = r.CheckBreak() + yyb12 = r.CheckBreak() } - if yyb8 { + if yyb12 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj8-1, "") + z.DecStructFieldNotFound(yyj12-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index 945079129c555..5210d858c7fb9 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -1100,6 +1100,12 @@ type VsphereVirtualDiskVolumeSource struct { // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. // +optional FSType string `json:"fsType,omitempty" protobuf:"bytes,2,opt,name=fsType"` + // Storage Policy Based Management (SPBM) profile name. + // +optional + StoragePolicyName string `json:"storagePolicyName,omitempty" protobuf:"bytes,3,opt,name=storagePolicyName"` + // Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + // +optional + StoragePolicyID string `json:"storagePolicyID,omitempty" protobuf:"bytes,4,opt,name=storagePolicyID"` } // Represents a Photon Controller persistent disk resource. diff --git a/pkg/api/v1/types_swagger_doc_generated.go b/pkg/api/v1/types_swagger_doc_generated.go index 585b4a9da656c..f1ebab13c2a7c 100644 --- a/pkg/api/v1/types_swagger_doc_generated.go +++ b/pkg/api/v1/types_swagger_doc_generated.go @@ -1971,9 +1971,11 @@ func (VolumeSource) SwaggerDoc() map[string]string { } var map_VsphereVirtualDiskVolumeSource = map[string]string{ - "": "Represents a vSphere volume resource.", - "volumePath": "Path that identifies vSphere volume vmdk", - "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "": "Represents a vSphere volume resource.", + "volumePath": "Path that identifies vSphere volume vmdk", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "storagePolicyName": "Storage Policy Based Management (SPBM) profile name.", + "storagePolicyID": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName.", } func (VsphereVirtualDiskVolumeSource) SwaggerDoc() map[string]string { diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 59162ce2f6e5d..46871ce9659e9 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -5018,6 +5018,8 @@ func Convert_api_VolumeSource_To_v1_VolumeSource(in *api.VolumeSource, out *Volu func autoConvert_v1_VsphereVirtualDiskVolumeSource_To_api_VsphereVirtualDiskVolumeSource(in *VsphereVirtualDiskVolumeSource, out *api.VsphereVirtualDiskVolumeSource, s conversion.Scope) error { out.VolumePath = in.VolumePath out.FSType = in.FSType + out.StoragePolicyName = in.StoragePolicyName + out.StoragePolicyID = in.StoragePolicyID return nil } @@ -5029,6 +5031,8 @@ func Convert_v1_VsphereVirtualDiskVolumeSource_To_api_VsphereVirtualDiskVolumeSo func autoConvert_api_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource(in *api.VsphereVirtualDiskVolumeSource, out *VsphereVirtualDiskVolumeSource, s conversion.Scope) error { out.VolumePath = in.VolumePath out.FSType = in.FSType + out.StoragePolicyName = in.StoragePolicyName + out.StoragePolicyID = in.StoragePolicyID return nil } From 28a107143c7758b2fba3eb8bc5646fb09d5a577b Mon Sep 17 00:00:00 2001 From: Balu Dontu Date: Wed, 10 May 2017 18:09:24 -0700 Subject: [PATCH 3/7] Open API and swagger spec changes --- api/openapi-spec/swagger.json | 8 ++++++++ api/swagger-spec/apps_v1beta1.json | 8 ++++++++ api/swagger-spec/batch_v1.json | 8 ++++++++ api/swagger-spec/batch_v2alpha1.json | 8 ++++++++ api/swagger-spec/extensions_v1beta1.json | 8 ++++++++ api/swagger-spec/settings.k8s.io_v1alpha1.json | 8 ++++++++ api/swagger-spec/v1.json | 8 ++++++++ 7 files changed, 56 insertions(+) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 89a215552a29f..afb104ae960e5 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -41643,6 +41643,14 @@ "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", "type": "string" }, + "storagePolicyID": { + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName.", + "type": "string" + }, + "storagePolicyName": { + "description": "Storage Policy Based Management (SPBM) profile name.", + "type": "string" + }, "volumePath": { "description": "Path that identifies vSphere volume vmdk", "type": "string" diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 4c6641c7f26a2..41c551f4e7806 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -3326,6 +3326,14 @@ "fsType": { "type": "string", "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "storagePolicyName": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile name." + }, + "storagePolicyID": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName." } } }, diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index be62f990493cc..3b04660466189 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -2109,6 +2109,14 @@ "fsType": { "type": "string", "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "storagePolicyName": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile name." + }, + "storagePolicyID": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName." } } }, diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json index 701e1402db356..8cc60e33c73dc 100644 --- a/api/swagger-spec/batch_v2alpha1.json +++ b/api/swagger-spec/batch_v2alpha1.json @@ -3142,6 +3142,14 @@ "fsType": { "type": "string", "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "storagePolicyName": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile name." + }, + "storagePolicyID": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName." } } }, diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index b26008bae5ebf..93e1f1ddd02c1 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -7573,6 +7573,14 @@ "fsType": { "type": "string", "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "storagePolicyName": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile name." + }, + "storagePolicyID": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName." } } }, diff --git a/api/swagger-spec/settings.k8s.io_v1alpha1.json b/api/swagger-spec/settings.k8s.io_v1alpha1.json index 252e4a97d669c..671516f35defe 100644 --- a/api/swagger-spec/settings.k8s.io_v1alpha1.json +++ b/api/swagger-spec/settings.k8s.io_v1alpha1.json @@ -1936,6 +1936,14 @@ "fsType": { "type": "string", "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "storagePolicyName": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile name." + }, + "storagePolicyID": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName." } } }, diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index d045e970abd2f..ddee0486a3b76 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -18659,6 +18659,14 @@ "fsType": { "type": "string", "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified." + }, + "storagePolicyName": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile name." + }, + "storagePolicyID": { + "type": "string", + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName." } } }, From 6d41087235d1789e1d0a5c15d87eba802fbe4df3 Mon Sep 17 00:00:00 2001 From: Balu Dontu Date: Fri, 12 May 2017 16:08:38 -0700 Subject: [PATCH 4/7] SPBM policy ID support in vsphere cloud provider --- examples/volumes/vsphere/README.md | 46 +++++- ...ere-volume-spbm-policy-with-datastore.yaml | 9 + .../vsphere/vsphere-volume-spbm-policy.yaml | 8 + .../providers/vsphere/vsphere.go | 154 ++++++++++++------ .../providers/vsphere/vsphere_test.go | 2 +- .../providers/vsphere/vsphere_util.go | 128 ++++++++++++++- pkg/volume/vsphere_volume/attacher.go | 2 +- pkg/volume/vsphere_volume/vsphere_volume.go | 16 +- .../vsphere_volume/vsphere_volume_test.go | 15 +- .../vsphere_volume/vsphere_volume_util.go | 50 ++++-- 10 files changed, 349 insertions(+), 81 deletions(-) create mode 100644 examples/volumes/vsphere/vsphere-volume-spbm-policy-with-datastore.yaml create mode 100644 examples/volumes/vsphere/vsphere-volume-spbm-policy.yaml diff --git a/examples/volumes/vsphere/README.md b/examples/volumes/vsphere/README.md index bc5f7eaa27076..dce01c7b59574 100644 --- a/examples/volumes/vsphere/README.md +++ b/examples/volumes/vsphere/README.md @@ -5,7 +5,9 @@ - [Volumes](#volumes) - [Persistent Volumes](#persistent-volumes) - [Storage Class](#storage-class) - - [Virtual SAN policy support inside Kubernetes](#virtual-san-policy-support-inside-kubernetes) + - [Storage Policy Management inside kubernetes] (#storage-policy-management-inside-kubernetes) + - [Using existing vCenter SPBM policy] (#using-existing-vcenter-spbm-policy) + - [Virtual SAN policy support](#virtual-san-policy-support) - [Stateful Set](#stateful-set) ## Prerequisites @@ -374,7 +376,47 @@ pvpod 1/1 Running 0 48m ``` -### Virtual SAN policy support inside Kubernetes +### Storage Policy Management inside kubernetes +#### Using existing vCenter SPBM policy + Admins can use the existing vCenter Storage Policy Based Management (SPBM) policy to configure a persistent volume with the SPBM policy. + + __Note: Here you don't need to create persistent volume it is created for you.__ + 1. Create Storage Class. + + Example 1: + + ```yaml + kind: StorageClass + apiVersion: storage.k8s.io/v1beta1 + metadata: + name: fast + provisioner: kubernetes.io/vsphere-volume + parameters: + diskformat: zeroedthick + storagePolicyName: gold + ``` + [Download example](vsphere-volume-spbm-policy.yaml?raw=true) + + The admin specifies the SPBM policy - "gold" as part of storage class definition for dynamic volume provisioning. When a PVC is created, the persistent volume will be provisioned on a compatible datastore with maximum free space that satisfies the "gold" storage policy requirements. + + Example 2: + + ```yaml + kind: StorageClass + apiVersion: storage.k8s.io/v1beta1 + metadata: + name: fast + provisioner: kubernetes.io/vsphere-volume + parameters: + diskformat: zeroedthick + storagePolicyName: gold + datastore: VSANDatastore + ``` + [Download example](vsphere-volume-spbm-policy-with-datastore.yaml?raw=true) + + The admin can also specify a custom datastore where he wants the volume to be provisioned along with the SPBM policy name. When a PVC is created, the vSphere Cloud Provider checks if the user specified datastore satisfies the "gold" storage policy requirements. If yes, it will provision the persistent volume on user specified datastore. If not, it will error out to the user that the user specified datastore is not compatible with "gold" storage policy requirements. + +#### Virtual SAN policy support Vsphere Infrastructure(VI) Admins will have the ability to specify custom Virtual SAN Storage Capabilities during dynamic volume provisioning. You can now define storage requirements, such as performance and availability, in the form of storage capabilities during dynamic volume provisioning. The storage capability requirements are converted into a Virtual SAN policy which are then pushed down to the Virtual SAN layer when a persistent volume (virtual disk) is being created. The virtual disk is distributed across the Virtual SAN datastore to meet the requirements. diff --git a/examples/volumes/vsphere/vsphere-volume-spbm-policy-with-datastore.yaml b/examples/volumes/vsphere/vsphere-volume-spbm-policy-with-datastore.yaml new file mode 100644 index 0000000000000..7ebcd88a5b1c8 --- /dev/null +++ b/examples/volumes/vsphere/vsphere-volume-spbm-policy-with-datastore.yaml @@ -0,0 +1,9 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1beta1 +metadata: + name: fast +provisioner: kubernetes.io/vsphere-volume +parameters: + diskformat: zeroedthick + storagePolicyName: gold + datastore: VSANDatastore diff --git a/examples/volumes/vsphere/vsphere-volume-spbm-policy.yaml b/examples/volumes/vsphere/vsphere-volume-spbm-policy.yaml new file mode 100644 index 0000000000000..6d0ce49b85f32 --- /dev/null +++ b/examples/volumes/vsphere/vsphere-volume-spbm-policy.yaml @@ -0,0 +1,8 @@ +kind: StorageClass +apiVersion: storage.k8s.io/v1beta1 +metadata: + name: fast +provisioner: kubernetes.io/vsphere-volume +parameters: + diskformat: zeroedthick + storagePolicyName: gold diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index ed9164e80514c..5d45f98195520 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -45,6 +45,7 @@ import ( "github.com/vmware/govmomi/vim25/types" "golang.org/x/net/context" + pbm "github.com/vmware/govmomi/pbm" k8stypes "k8s.io/apimachinery/pkg/types" k8runtime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/kubernetes/pkg/api/v1" @@ -165,7 +166,7 @@ type VSphereConfig struct { type Volumes interface { // AttachDisk attaches given disk to given node. Current node // is used when nodeName is empty string. - AttachDisk(vmDiskPath string, nodeName k8stypes.NodeName) (diskID string, diskUUID string, err error) + AttachDisk(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskID string, diskUUID string, err error) // DetachDisk detaches given disk to given node. Current node // is used when nodeName is empty string. @@ -189,12 +190,14 @@ type Volumes interface { // VolumeOptions specifies capacity, tags, name and diskFormat for a volume. type VolumeOptions struct { - CapacityKB int - Tags map[string]string - Name string - DiskFormat string - Datastore string - StorageProfileData string + CapacityKB int + Tags map[string]string + Name string + DiskFormat string + Datastore string + VSANStorageProfileData string + StoragePolicyName string + StoragePolicyID string } // Generates Valid Options for Diskformat @@ -554,14 +557,12 @@ func (vs *VSphere) NodeAddresses(nodeName k8stypes.NodeName) ([]v1.NodeAddress, addressType = v1.NodeInternalIP } for _, ip := range v.IpAddress { - if net.ParseIP(ip).To4() != nil { - v1helper.AddToNodeAddresses(&addrs, - v1.NodeAddress{ - Type: addressType, - Address: ip, - }, - ) - } + v1helper.AddToNodeAddresses(&addrs, + v1.NodeAddress{ + Type: addressType, + Address: ip, + }, + ) } } return addrs, nil @@ -737,7 +738,7 @@ func cleanUpController(ctx context.Context, newSCSIController types.BaseVirtualD } // Attaches given virtual disk volume to the compute running kubelet. -func (vs *VSphere) AttachDisk(vmDiskPath string, nodeName k8stypes.NodeName) (diskID string, diskUUID string, err error) { +func (vs *VSphere) AttachDisk(vmDiskPath string, storagePolicyID string, nodeName k8stypes.NodeName) (diskID string, diskUUID string, err error) { var newSCSIController types.BaseVirtualDevice // Create context @@ -785,14 +786,8 @@ func (vs *VSphere) AttachDisk(vmDiskPath string, nodeName k8stypes.NodeName) (di return "", "", err } - // verify scsi controller in virtual machine - vmDevices, err := vm.Device(ctx) - if err != nil { - return "", "", err - } - // Get VM device list - _, vmDevices, _, err = getVirtualMachineDevices(ctx, vs.cfg, vs.client, vSphereInstance) + _, vmDevices, _, err := getVirtualMachineDevices(ctx, vs.cfg, vs.client, vSphereInstance) if err != nil { glog.Errorf("cannot get vmDevices for VM err=%s", err) return "", "", fmt.Errorf("cannot get vmDevices for VM err=%s", err) @@ -811,9 +806,9 @@ func (vs *VSphere) AttachDisk(vmDiskPath string, nodeName k8stypes.NodeName) (di // Create a new finder f := find.NewFinder(vs.client.Client, true) - // Set data center f.SetDatacenter(dc) + datastorePathObj := new(object.DatastorePath) isSuccess := datastorePathObj.FromString(vmDiskPath) if !isSuccess { @@ -837,28 +832,54 @@ func (vs *VSphere) AttachDisk(vmDiskPath string, nodeName k8stypes.NodeName) (di backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo) backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent) - // Attach disk to the VM - err = vm.AddDevice(ctx, disk) + virtualMachineConfigSpec := types.VirtualMachineConfigSpec{} + deviceConfigSpec := &types.VirtualDeviceConfigSpec{ + Device: disk, + Operation: types.VirtualDeviceConfigSpecOperationAdd, + } + // Configure the disk with the SPBM profile only if ProfileID is not empty. + if storagePolicyID != "" { + profileSpec := &types.VirtualMachineDefinedProfileSpec{ + ProfileId: storagePolicyID, + } + deviceConfigSpec.Profile = append(deviceConfigSpec.Profile, profileSpec) + } + virtualMachineConfigSpec.DeviceChange = append(virtualMachineConfigSpec.DeviceChange, deviceConfigSpec) + task, err := vm.Reconfigure(ctx, virtualMachineConfigSpec) if err != nil { - glog.Errorf("cannot attach disk to the vm - %v", err) + glog.Errorf("Failed to attach the disk with storagePolicy: %+q with err - %v", storagePolicyID, err) if newSCSICreated { cleanUpController(ctx, newSCSIController, vmDevices, vm) } return "", "", err } - - vmDevices, err = vm.Device(ctx) + err = task.Wait(ctx) if err != nil { + glog.Errorf("Failed to attach the disk with storagePolicy: %+q with err - %v", storagePolicyID, err) if newSCSICreated { cleanUpController(ctx, newSCSIController, vmDevices, vm) } return "", "", err } - devices := vmDevices.SelectByType(disk) - if len(devices) < 1 { + + deviceName, diskUUID, err := getVMDiskInfo(ctx, vm, disk) + if err != nil { if newSCSICreated { cleanUpController(ctx, newSCSIController, vmDevices, vm) } + vs.DetachDisk(deviceName, nodeName) + return "", "", err + } + return deviceName, diskUUID, nil +} + +func getVMDiskInfo(ctx context.Context, vm *object.VirtualMachine, disk *types.VirtualDisk) (string, string, error) { + vmDevices, err := vm.Device(ctx) + if err != nil { + return "", "", err + } + devices := vmDevices.SelectByType(disk) + if len(devices) < 1 { return "", "", ErrNoDevicesFound } @@ -867,18 +888,13 @@ func (vs *VSphere) AttachDisk(vmDiskPath string, nodeName k8stypes.NodeName) (di deviceName := devices.Name(newDevice) // get device uuid - diskUUID, err = getVirtualDiskUUID(newDevice) + diskUUID, err := getVirtualDiskUUID(newDevice) if err != nil { - if newSCSICreated { - cleanUpController(ctx, newSCSIController, vmDevices, vm) - } - vs.DetachDisk(deviceName, nodeName) return "", "", err } return deviceName, diskUUID, nil } - func getNextUnitNumber(devices object.VirtualDeviceList, c types.BaseVirtualController) (int32, error) { // get next available SCSI controller unit number var takenUnitNumbers [SCSIDeviceSlots]bool @@ -1266,19 +1282,43 @@ func (vs *VSphere) CreateVolume(volumeOptions *VolumeOptions) (volumePath string dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) f.SetDatacenter(dc) + if volumeOptions.StoragePolicyName != "" { + // Get the pbm client + pbmClient, err := pbm.NewClient(ctx, vs.client.Client) + if err != nil { + return "", err + } + volumeOptions.StoragePolicyID, err = pbmClient.ProfileIDByName(ctx, volumeOptions.StoragePolicyName) + if err != nil { + return "", err + } + // Get the resource pool for current node. + resourcePool, err := vs.getCurrentNodeResourcePool(ctx, dc) + if err != nil { + return "", err + } + + dsRefs, err := vs.GetCompatibleDatastores(ctx, pbmClient, resourcePool, volumeOptions.StoragePolicyID) + if err != nil { + return "", err + } + + if volumeOptions.Datastore != "" { + if !IsUserSpecifiedDatastoreCompatible(dsRefs, volumeOptions.Datastore) { + return "", fmt.Errorf("User specified datastore: %q is not compatible with the StoragePolicy: %q requirements", volumeOptions.Datastore, volumeOptions.StoragePolicyName) + } + } else { + datastore = GetBestFitCompatibleDatastore(dsRefs) + } + } + ds, err := f.Datastore(ctx, datastore) if err != nil { glog.Errorf("Failed while searching for datastore %+q. err %s", datastore, err) return "", err } - // Create a disk with the VSAN storage capabilities specified in the volumeOptions.StorageProfileData. - // This is achieved by following steps: - // 1. Create dummy VM if not already present. - // 2. Add a new disk to the VM by performing VM reconfigure. - // 3. Detach the new disk from the dummy VM. - // 4. Delete the dummy VM. - if volumeOptions.StorageProfileData != "" { + if volumeOptions.VSANStorageProfileData != "" { // Check if the datastore is VSAN if any capability requirements are specified. // VSphere cloud provider now only supports VSAN capabilities requirements ok, err := checkIfDatastoreTypeIsVSAN(vs.client, ds) @@ -1291,7 +1331,14 @@ func (vs *VSphere) CreateVolume(volumeOptions *VolumeOptions) (volumePath string " The policy parameters will work only with VSAN Datastore."+ " So, please specify a valid VSAN datastore in Storage class definition.", datastore) } - + } + // Create a disk with the VSAN storage capabilities specified in the volumeOptions.VSANStorageProfileData. + // This is achieved by following steps: + // 1. Create dummy VM if not already present. + // 2. Add a new disk to the VM by performing VM reconfigure. + // 3. Detach the new disk from the dummy VM. + // 4. Delete the dummy VM. + if volumeOptions.VSANStorageProfileData != "" || volumeOptions.StoragePolicyName != "" { // Acquire a read lock to ensure multiple PVC requests can be processed simultaneously. cleanUpDummyVMLock.RLock() defer cleanUpDummyVMLock.RUnlock() @@ -1562,13 +1609,11 @@ func (vs *VSphere) createDummyVM(ctx context.Context, datacenter *object.Datacen if err != nil { return nil, err } - // Get the folder reference for global working directory where the dummy VM needs to be created. vmFolder, err := getFolder(ctx, vs.client, vs.cfg.Global.Datacenter, vs.cfg.Global.WorkingDir) if err != nil { return nil, fmt.Errorf("Failed to get the folder reference for %q with err: %+v", vs.cfg.Global.WorkingDir, err) } - task, err := vmFolder.CreateVM(ctx, virtualMachineConfigSpec, resourcePool, nil) if err != nil { return nil, err @@ -1665,12 +1710,17 @@ func (vs *VSphere) createVirtualDiskWithPolicy(ctx context.Context, datacenter * FileOperation: types.VirtualDeviceConfigSpecFileOperationCreate, } - storageProfileSpec := &types.VirtualMachineDefinedProfileSpec{ - ProfileId: "", - ProfileData: &types.VirtualMachineProfileRawData{ + storageProfileSpec := &types.VirtualMachineDefinedProfileSpec{} + // Is PBM storage policy ID is present, set the storage spec profile ID, + // else, set raw the VSAN policy string. + if volumeOptions.StoragePolicyID != "" { + storageProfileSpec.ProfileId = volumeOptions.StoragePolicyID + } else if volumeOptions.VSANStorageProfileData != "" { + storageProfileSpec.ProfileId = "" + storageProfileSpec.ProfileData = &types.VirtualMachineProfileRawData{ ExtensionKey: "com.vmware.vim.sps", - ObjectData: volumeOptions.StorageProfileData, - }, + ObjectData: volumeOptions.VSANStorageProfileData, + } } deviceConfigSpec.Profile = append(deviceConfigSpec.Profile, storageProfileSpec) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_test.go b/pkg/cloudprovider/providers/vsphere/vsphere_test.go index ffb91a6e6f851..7ab128ecc9ddd 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_test.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_test.go @@ -232,7 +232,7 @@ func TestVolumes(t *testing.T) { t.Fatalf("Cannot create a new VMDK volume: %v", err) } - _, _, err = vs.AttachDisk(volPath, "") + _, _, err = vs.AttachDisk(volPath, "", "") if err != nil { t.Fatalf("Cannot attach volume(%s) to VM(%s): %v", volPath, nodeName, err) } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index fb9fc930faa52..247b27b5d54fe 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -18,10 +18,27 @@ package vsphere import ( "context" - "github.com/vmware/govmomi" "os" "runtime" "strings" + + "github.com/vmware/govmomi" + "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/pbm" + "github.com/vmware/govmomi/property" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/types" + + "fmt" + + pbmtypes "github.com/vmware/govmomi/pbm/types" +) + +const ( + ClusterComputeResource = "ClusterComputeResource" + ParentProperty = "parent" + DatastoreProperty = "datastore" + DatastoreInfoProperty = "info" ) // Reads vSphere configuration from system environment and construct vSphere object @@ -63,3 +80,112 @@ func GetgovmomiClient(cfg *VSphereConfig) (*govmomi.Client, error) { client, err := newClient(context.TODO(), cfg) return client, err } + +// Get list of compatible datastores that satisfies the storage policy requirements. +func (vs *VSphere) GetCompatibleDatastores(ctx context.Context, pbmClient *pbm.Client, resourcePool *object.ResourcePool, storagePolicyID string) ([]mo.Datastore, error) { + datastores, err := vs.getAllAccessibleDatastoresForK8sCluster(ctx, resourcePool) + if err != nil { + return nil, err + } + var hubs []pbmtypes.PbmPlacementHub + for _, ds := range datastores { + hubs = append(hubs, pbmtypes.PbmPlacementHub{ + HubType: ds.Type, + HubId: ds.Value, + }) + } + req := []pbmtypes.BasePbmPlacementRequirement{ + &pbmtypes.PbmPlacementCapabilityProfileRequirement{ + ProfileId: pbmtypes.PbmProfileId{ + UniqueId: storagePolicyID, + }, + }, + } + res, err := pbmClient.CheckRequirements(ctx, hubs, nil, req) + if err != nil { + return nil, err + } + compatibleHubs := res.CompatibleDatastores() + // Return an error if there are no compatible datastores. + if len(compatibleHubs) < 1 { + return nil, fmt.Errorf("There are no compatible datastores: %+v that satisfy the storage policy: %+q requirements", datastores, storagePolicyID) + } + var compatibleDatastoreRefs []types.ManagedObjectReference + for _, hub := range compatibleHubs { + compatibleDatastoreRefs = append(compatibleDatastoreRefs, types.ManagedObjectReference{ + Type: hub.HubType, + Value: hub.HubId, + }) + } + dsMorefs, err := vs.getDatastoreMorefs(ctx, compatibleDatastoreRefs) + if err != nil { + return nil, err + } + return dsMorefs, nil +} + +// Verify if the user specified datastore is in the list of compatible datastores. +func IsUserSpecifiedDatastoreCompatible(dsRefs []mo.Datastore, dsName string) bool { + for _, ds := range dsRefs { + if ds.Info.GetDatastoreInfo().Name == dsName { + return true + } + } + return false +} + +// Get the best fit compatible datastore by free space. +func GetBestFitCompatibleDatastore(dsRefs []mo.Datastore) string { + var curMax int64 + curMax = -1 + var index int + for i, ds := range dsRefs { + dsFreeSpace := ds.Info.GetDatastoreInfo().FreeSpace + if dsFreeSpace > curMax { + curMax = dsFreeSpace + index = i + } + } + return dsRefs[index].Info.GetDatastoreInfo().Name +} + +// Get the datastore morefs. +func (vs *VSphere) getDatastoreMorefs(ctx context.Context, dsRefs []types.ManagedObjectReference) ([]mo.Datastore, error) { + pc := property.DefaultCollector(vs.client.Client) + var datastoreMorefs []mo.Datastore + err := pc.Retrieve(ctx, dsRefs, []string{DatastoreInfoProperty}, &datastoreMorefs) + if err != nil { + return nil, err + } + return datastoreMorefs, nil +} + +// Get all datastores accessible inside the current Kubernetes cluster. +func (vs *VSphere) getAllAccessibleDatastoresForK8sCluster(ctx context.Context, resourcePool *object.ResourcePool) ([]types.ManagedObjectReference, error) { + var resourcePoolMoref mo.ResourcePool + s := object.NewSearchIndex(vs.client.Client) + err := s.Properties(ctx, resourcePool.Reference(), []string{ParentProperty}, &resourcePoolMoref) + if err != nil { + return nil, err + } + + // The K8s cluster might be deployed inside a cluster or a host. + // For a cluster it is ClusterComputeResource object, for others it is a ComputeResource object. + var datastores []types.ManagedObjectReference + if resourcePoolMoref.Parent.Type == ClusterComputeResource { + var cluster mo.ClusterComputeResource + err = s.Properties(ctx, resourcePoolMoref.Parent.Reference(), []string{DatastoreProperty}, &cluster) + if err != nil { + return nil, err + } + datastores = cluster.Datastore + } else { + var host mo.ComputeResource + err = s.Properties(ctx, resourcePoolMoref.Parent.Reference(), []string{DatastoreProperty}, &host) + if err != nil { + return nil, err + } + datastores = host.Datastore + } + return datastores, nil +} diff --git a/pkg/volume/vsphere_volume/attacher.go b/pkg/volume/vsphere_volume/attacher.go index d60619b0aab62..91ebdc183b9e6 100644 --- a/pkg/volume/vsphere_volume/attacher.go +++ b/pkg/volume/vsphere_volume/attacher.go @@ -75,7 +75,7 @@ func (attacher *vsphereVMDKAttacher) Attach(spec *volume.Spec, nodeName types.No // vsphereCloud.AttachDisk checks if disk is already attached to host and // succeeds in that case, so no need to do that separately. - _, diskUUID, err := attacher.vsphereVolumes.AttachDisk(volumeSource.VolumePath, nodeName) + _, diskUUID, err := attacher.vsphereVolumes.AttachDisk(volumeSource.VolumePath, volumeSource.StoragePolicyID, nodeName) if err != nil { glog.Errorf("Error attaching volume %q to node %q: %+v", volumeSource.VolumePath, nodeName, err) return "", err diff --git a/pkg/volume/vsphere_volume/vsphere_volume.go b/pkg/volume/vsphere_volume/vsphere_volume.go index c1767f129e30f..e466fc373e198 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume.go +++ b/pkg/volume/vsphere_volume/vsphere_volume.go @@ -152,7 +152,7 @@ func (plugin *vsphereVolumePlugin) ConstructVolumeSpec(volumeName, mountPath str // Abstract interface to disk operations. type vdManager interface { // Creates a volume - CreateVolume(provisioner *vsphereVolumeProvisioner) (vmDiskPath string, volumeSizeGB int, fstype string, err error) + CreateVolume(provisioner *vsphereVolumeProvisioner) (volSpec *VolumeSpec, err error) // Deletes a volume DeleteVolume(deleter *vsphereVolumeDeleter) error } @@ -344,13 +344,13 @@ func (plugin *vsphereVolumePlugin) newProvisionerInternal(options volume.VolumeO } func (v *vsphereVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { - vmDiskPath, sizeKB, fstype, err := v.manager.CreateVolume(v) + volSpec, err := v.manager.CreateVolume(v) if err != nil { return nil, err } - if fstype == "" { - fstype = "ext4" + if volSpec.Fstype == "" { + volSpec.Fstype = "ext4" } pv := &v1.PersistentVolume{ @@ -365,12 +365,14 @@ func (v *vsphereVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { PersistentVolumeReclaimPolicy: v.options.PersistentVolumeReclaimPolicy, AccessModes: v.options.PVC.Spec.AccessModes, Capacity: v1.ResourceList{ - v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dKi", sizeKB)), + v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dKi", volSpec.Size)), }, PersistentVolumeSource: v1.PersistentVolumeSource{ VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{ - VolumePath: vmDiskPath, - FSType: fstype, + VolumePath: volSpec.Path, + FSType: volSpec.Fstype, + StoragePolicyName: volSpec.StoragePolicyName, + StoragePolicyID: volSpec.StoragePolicyID, }, }, }, diff --git a/pkg/volume/vsphere_volume/vsphere_volume_test.go b/pkg/volume/vsphere_volume/vsphere_volume_test.go index 6608c513f6461..ba16b58187113 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume_test.go +++ b/pkg/volume/vsphere_volume/vsphere_volume_test.go @@ -63,8 +63,15 @@ func getFakeDeviceName(host volume.VolumeHost, volPath string) string { return path.Join(host.GetPluginDir(vsphereVolumePluginName), "device", volPath) } -func (fake *fakePDManager) CreateVolume(v *vsphereVolumeProvisioner) (vmDiskPath string, volumeSizeKB int, fstype string, err error) { - return "[local] test-volume-name.vmdk", 100, "ext4", nil +func (fake *fakePDManager) CreateVolume(v *vsphereVolumeProvisioner) (volSpec *VolumeSpec, err error) { + volSpec = &VolumeSpec{ + Path: "[local] test-volume-name.vmdk", + Size: 100, + Fstype: "ext4", + StoragePolicyName: "gold", + StoragePolicyID: "1234", + } + return volSpec, nil } func (fake *fakePDManager) DeleteVolume(vd *vsphereVolumeDeleter) error { @@ -155,6 +162,10 @@ func TestPlugin(t *testing.T) { t.Errorf("Provision() returned unexpected path %s", persistentSpec.Spec.PersistentVolumeSource.VsphereVolume.VolumePath) } + if persistentSpec.Spec.PersistentVolumeSource.VsphereVolume.StoragePolicyName != "gold" { + t.Errorf("Provision() returned unexpected storagepolicy name %s", persistentSpec.Spec.PersistentVolumeSource.VsphereVolume.StoragePolicyName) + } + cap := persistentSpec.Spec.Capacity[v1.ResourceStorage] size := cap.Value() if size != 100*1024 { diff --git a/pkg/volume/vsphere_volume/vsphere_volume_util.go b/pkg/volume/vsphere_volume/vsphere_volume_util.go index 7f97dda56b2ae..62aa33979ea23 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume_util.go +++ b/pkg/volume/vsphere_volume/vsphere_volume_util.go @@ -39,6 +39,7 @@ const ( diskformat = "diskformat" datastore = "datastore" Fstype = "fstype" + StoragePolicyName = "storagepolicyname" HostFailuresToTolerateCapability = "hostfailurestotolerate" ForceProvisioningCapability = "forceprovisioning" @@ -63,6 +64,14 @@ var ErrProbeVolume = errors.New("Error scanning attached volumes") type VsphereDiskUtil struct{} +type VolumeSpec struct { + Path string + Size int + Fstype string + StoragePolicyID string + StoragePolicyName string +} + func verifyDevicePath(path string) (string, error) { if pathExists, err := volumeutil.PathExists(path); err != nil { return "", fmt.Errorf("Error checking if path exists: %v", err) @@ -74,11 +83,11 @@ func verifyDevicePath(path string) (string, error) { } // CreateVolume creates a vSphere volume. -func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (vmDiskPath string, volumeSizeKB int, fstype string, err error) { - +func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (volSpec *VolumeSpec, err error) { + var fstype string cloud, err := getCloudProvider(v.plugin.host.GetCloudProvider()) if err != nil { - return "", 0, "", err + return nil, err } capacity := v.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] @@ -103,37 +112,48 @@ func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (vmDiskPa case Fstype: fstype = value glog.V(4).Infof("Setting fstype as %q", fstype) + case StoragePolicyName: + volumeOptions.StoragePolicyName = value + glog.V(4).Infof("Setting StoragePolicyName as %q", volumeOptions.StoragePolicyName) case HostFailuresToTolerateCapability, ForceProvisioningCapability, CacheReservationCapability, DiskStripesCapability, ObjectSpaceReservationCapability, IopsLimitCapability: capabilityData, err := validateVSANCapability(strings.ToLower(parameter), value) if err != nil { - return "", 0, "", err - } else { - volumeOptions.StorageProfileData += capabilityData + return nil, err } - + volumeOptions.VSANStorageProfileData += capabilityData default: - return "", 0, "", fmt.Errorf("invalid option %q for volume plugin %s", parameter, v.plugin.GetPluginName()) + return nil, fmt.Errorf("invalid option %q for volume plugin %s", parameter, v.plugin.GetPluginName()) } } - if volumeOptions.StorageProfileData != "" { - volumeOptions.StorageProfileData = "(" + volumeOptions.StorageProfileData + ")" + if volumeOptions.VSANStorageProfileData != "" { + if volumeOptions.StoragePolicyName != "" { + return nil, fmt.Errorf("Cannot specify storage policy capabilities along with storage policy name. Please specify only one.") + } + volumeOptions.VSANStorageProfileData = "(" + volumeOptions.VSANStorageProfileData + ")" } - glog.V(1).Infof("StorageProfileData in vsphere volume %q", volumeOptions.StorageProfileData) + glog.V(4).Infof("VSANStorageProfileData in vsphere volume %q", volumeOptions.VSANStorageProfileData) // TODO: implement PVC.Selector parsing if v.options.PVC.Spec.Selector != nil { - return "", 0, "", fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on vSphere") + return nil, fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on vSphere") } - vmDiskPath, err = cloud.CreateVolume(volumeOptions) + vmDiskPath, err := cloud.CreateVolume(volumeOptions) if err != nil { glog.V(2).Infof("Error creating vsphere volume: %v", err) - return "", 0, "", err + return nil, err + } + volSpec = &VolumeSpec{ + Path: vmDiskPath, + Size: volSizeKB, + Fstype: fstype, + StoragePolicyName: volumeOptions.StoragePolicyName, + StoragePolicyID: volumeOptions.StoragePolicyID, } glog.V(2).Infof("Successfully created vsphere volume %s", name) - return vmDiskPath, volSizeKB, fstype, nil + return volSpec, nil } // DeleteVolume deletes a vSphere volume. From 82f5736060cbab21ff9ddf75be1b40e53197095d Mon Sep 17 00:00:00 2001 From: Balu Dontu Date: Tue, 16 May 2017 14:48:04 -0700 Subject: [PATCH 5/7] Addresses review comments from team --- .../providers/vsphere/vsphere.go | 34 +++-- .../providers/vsphere/vsphere_util.go | 139 ++++++++++-------- 2 files changed, 99 insertions(+), 74 deletions(-) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 5d45f98195520..24c518751041f 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -557,12 +557,14 @@ func (vs *VSphere) NodeAddresses(nodeName k8stypes.NodeName) ([]v1.NodeAddress, addressType = v1.NodeInternalIP } for _, ip := range v.IpAddress { - v1helper.AddToNodeAddresses(&addrs, - v1.NodeAddress{ - Type: addressType, - Address: ip, - }, - ) + if net.ParseIP(ip).To4() != nil { + v1helper.AddToNodeAddresses(&addrs, + v1.NodeAddress{ + Type: addressType, + Address: ip, + }, + ) + } } } return addrs, nil @@ -1292,23 +1294,31 @@ func (vs *VSphere) CreateVolume(volumeOptions *VolumeOptions) (volumePath string if err != nil { return "", err } - // Get the resource pool for current node. - resourcePool, err := vs.getCurrentNodeResourcePool(ctx, dc) + + vmRegex := vs.cfg.Global.WorkingDir + vs.localInstanceID + currentVM, err := f.VirtualMachine(ctx, vmRegex) if err != nil { return "", err } - dsRefs, err := vs.GetCompatibleDatastores(ctx, pbmClient, resourcePool, volumeOptions.StoragePolicyID) + compatibilityResult, err := vs.GetPlacementCompatibilityResult(ctx, pbmClient, currentVM, volumeOptions.StoragePolicyID) if err != nil { return "", err } + if len(compatibilityResult) < 1 { + return "", fmt.Errorf("There are no compatible datastores that satisfy the storage policy: %+q requirements", volumeOptions.StoragePolicyID) + } if volumeOptions.Datastore != "" { - if !IsUserSpecifiedDatastoreCompatible(dsRefs, volumeOptions.Datastore) { - return "", fmt.Errorf("User specified datastore: %q is not compatible with the StoragePolicy: %q requirements", volumeOptions.Datastore, volumeOptions.StoragePolicyName) + ok, nonCompatibleDsref := vs.IsUserSpecifiedDatastoreNonCompatible(ctx, compatibilityResult, volumeOptions.Datastore) + if ok { + faultMsg := GetNonCompatibleDatastoreFaultMsg(compatibilityResult, *nonCompatibleDsref) + return "", fmt.Errorf("User specified datastore: %q is not compatible with the storagePolicy: %q. Failed with faults: %+q", volumeOptions.Datastore, volumeOptions.StoragePolicyName, faultMsg) } } else { - datastore = GetBestFitCompatibleDatastore(dsRefs) + dsMoList := vs.GetCompatibleDatastoresMo(ctx, compatibilityResult) + dsMo := GetMostFreeDatastore(dsMoList) + datastore = dsMo.Info.GetDatastoreInfo().Name } } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index 247b27b5d54fe..53e10f1520963 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -29,16 +29,12 @@ import ( "github.com/vmware/govmomi/vim25/mo" "github.com/vmware/govmomi/vim25/types" - "fmt" - pbmtypes "github.com/vmware/govmomi/pbm/types" ) const ( - ClusterComputeResource = "ClusterComputeResource" - ParentProperty = "parent" - DatastoreProperty = "datastore" - DatastoreInfoProperty = "info" + DatastoreProperty = "datastore" + DatastoreInfoProperty = "info" ) // Reads vSphere configuration from system environment and construct vSphere object @@ -81,9 +77,9 @@ func GetgovmomiClient(cfg *VSphereConfig) (*govmomi.Client, error) { return client, err } -// Get list of compatible datastores that satisfies the storage policy requirements. -func (vs *VSphere) GetCompatibleDatastores(ctx context.Context, pbmClient *pbm.Client, resourcePool *object.ResourcePool, storagePolicyID string) ([]mo.Datastore, error) { - datastores, err := vs.getAllAccessibleDatastoresForK8sCluster(ctx, resourcePool) +// Get placement compatibility result based on storage policy requirements. +func (vs *VSphere) GetPlacementCompatibilityResult(ctx context.Context, pbmClient *pbm.Client, vmObj *object.VirtualMachine, storagePolicyID string) (pbm.PlacementCompatibilityResult, error) { + datastores, err := vs.getAllAccessibleDatastores(ctx, vmObj) if err != nil { return nil, err } @@ -105,87 +101,106 @@ func (vs *VSphere) GetCompatibleDatastores(ctx context.Context, pbmClient *pbm.C if err != nil { return nil, err } - compatibleHubs := res.CompatibleDatastores() - // Return an error if there are no compatible datastores. - if len(compatibleHubs) < 1 { - return nil, fmt.Errorf("There are no compatible datastores: %+v that satisfy the storage policy: %+q requirements", datastores, storagePolicyID) - } - var compatibleDatastoreRefs []types.ManagedObjectReference - for _, hub := range compatibleHubs { - compatibleDatastoreRefs = append(compatibleDatastoreRefs, types.ManagedObjectReference{ - Type: hub.HubType, - Value: hub.HubId, - }) - } - dsMorefs, err := vs.getDatastoreMorefs(ctx, compatibleDatastoreRefs) - if err != nil { - return nil, err - } - return dsMorefs, nil + return res, nil } -// Verify if the user specified datastore is in the list of compatible datastores. -func IsUserSpecifiedDatastoreCompatible(dsRefs []mo.Datastore, dsName string) bool { - for _, ds := range dsRefs { +// Verify if the user specified datastore is in the list of non-compatible datastores. +// If yes, return the non compatible datastore reference. +func (vs *VSphere) IsUserSpecifiedDatastoreNonCompatible(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult, dsName string) (bool, *types.ManagedObjectReference) { + dsMoList := vs.GetNonCompatibleDatastoresMo(ctx, compatibilityResult) + for _, ds := range dsMoList { if ds.Info.GetDatastoreInfo().Name == dsName { - return true + dsMoRef := ds.Reference() + return true, &dsMoRef + } + } + return false, nil +} + +func GetNonCompatibleDatastoreFaultMsg(compatibilityResult pbm.PlacementCompatibilityResult, dsMoref types.ManagedObjectReference) string { + var faultMsg string + for _, res := range compatibilityResult { + if res.Hub.HubId == dsMoref.Value { + for _, err := range res.Error { + faultMsg = faultMsg + err.LocalizedMessage + } } } - return false + return faultMsg } // Get the best fit compatible datastore by free space. -func GetBestFitCompatibleDatastore(dsRefs []mo.Datastore) string { +func GetMostFreeDatastore(dsMo []mo.Datastore) mo.Datastore { var curMax int64 curMax = -1 var index int - for i, ds := range dsRefs { + for i, ds := range dsMo { dsFreeSpace := ds.Info.GetDatastoreInfo().FreeSpace if dsFreeSpace > curMax { curMax = dsFreeSpace index = i } } - return dsRefs[index].Info.GetDatastoreInfo().Name + return dsMo[index] } -// Get the datastore morefs. -func (vs *VSphere) getDatastoreMorefs(ctx context.Context, dsRefs []types.ManagedObjectReference) ([]mo.Datastore, error) { +func (vs *VSphere) GetCompatibleDatastoresMo(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult) []mo.Datastore { + compatibleHubs := compatibilityResult.CompatibleDatastores() + // Return an error if there are no compatible datastores. + if len(compatibleHubs) < 1 { + return nil + } + dsMoList, err := vs.getDatastoreMo(ctx, compatibleHubs) + if err != nil { + return nil + } + return dsMoList +} + +func (vs *VSphere) GetNonCompatibleDatastoresMo(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult) []mo.Datastore { + nonCompatibleHubs := compatibilityResult.NonCompatibleDatastores() + // Return an error if there are no compatible datastores. + if len(nonCompatibleHubs) < 1 { + return nil + } + dsMoList, err := vs.getDatastoreMo(ctx, nonCompatibleHubs) + if err != nil { + return nil + } + return dsMoList +} + +// Get the datastore managed objects for the place hubs using property collector. +func (vs *VSphere) getDatastoreMo(ctx context.Context, hubs []pbmtypes.PbmPlacementHub) ([]mo.Datastore, error) { + var dsMoRefs []types.ManagedObjectReference + for _, hub := range hubs { + dsMoRefs = append(dsMoRefs, types.ManagedObjectReference{ + Type: hub.HubType, + Value: hub.HubId, + }) + } + pc := property.DefaultCollector(vs.client.Client) - var datastoreMorefs []mo.Datastore - err := pc.Retrieve(ctx, dsRefs, []string{DatastoreInfoProperty}, &datastoreMorefs) + var dsMoList []mo.Datastore + err := pc.Retrieve(ctx, dsMoRefs, []string{DatastoreInfoProperty}, &dsMoList) if err != nil { return nil, err } - return datastoreMorefs, nil + return dsMoList, nil } -// Get all datastores accessible inside the current Kubernetes cluster. -func (vs *VSphere) getAllAccessibleDatastoresForK8sCluster(ctx context.Context, resourcePool *object.ResourcePool) ([]types.ManagedObjectReference, error) { - var resourcePoolMoref mo.ResourcePool - s := object.NewSearchIndex(vs.client.Client) - err := s.Properties(ctx, resourcePool.Reference(), []string{ParentProperty}, &resourcePoolMoref) +// Get all datastores accessible for the virtual machine object. +func (vs *VSphere) getAllAccessibleDatastores(ctx context.Context, vmObj *object.VirtualMachine) ([]types.ManagedObjectReference, error) { + host, err := vmObj.HostSystem(ctx) if err != nil { return nil, err } - // The K8s cluster might be deployed inside a cluster or a host. - // For a cluster it is ClusterComputeResource object, for others it is a ComputeResource object. - var datastores []types.ManagedObjectReference - if resourcePoolMoref.Parent.Type == ClusterComputeResource { - var cluster mo.ClusterComputeResource - err = s.Properties(ctx, resourcePoolMoref.Parent.Reference(), []string{DatastoreProperty}, &cluster) - if err != nil { - return nil, err - } - datastores = cluster.Datastore - } else { - var host mo.ComputeResource - err = s.Properties(ctx, resourcePoolMoref.Parent.Reference(), []string{DatastoreProperty}, &host) - if err != nil { - return nil, err - } - datastores = host.Datastore + var hostSystemMo mo.HostSystem + s := object.NewSearchIndex(vs.client.Client) + err = s.Properties(ctx, host.Reference(), []string{DatastoreProperty}, &hostSystemMo) + if err != nil { + return nil, err } - return datastores, nil + return hostSystemMo.Datastore, nil } From ccbf878c0c8fc967bfcc26a66fbcb8b03acec72c Mon Sep 17 00:00:00 2001 From: Balu Dontu Date: Fri, 19 May 2017 08:14:11 -0700 Subject: [PATCH 6/7] Find a shared datastore for all my kubernetes cluster VM's --- .../providers/vsphere/vsphere.go | 105 ++++-------------- .../providers/vsphere/vsphere_util.go | 102 +++++++++++++++-- 2 files changed, 115 insertions(+), 92 deletions(-) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 24c518751041f..71b27c9356171 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -83,6 +83,7 @@ const ( CleanUpDummyVMRoutine_Interval = 5 UUIDPath = "/sys/class/dmi/id/product_serial" UUIDPrefix = "VMware-" + NameProperty = "name" ) // Controller types that are currently supported for hot attach of disks @@ -1295,13 +1296,7 @@ func (vs *VSphere) CreateVolume(volumeOptions *VolumeOptions) (volumePath string return "", err } - vmRegex := vs.cfg.Global.WorkingDir + vs.localInstanceID - currentVM, err := f.VirtualMachine(ctx, vmRegex) - if err != nil { - return "", err - } - - compatibilityResult, err := vs.GetPlacementCompatibilityResult(ctx, pbmClient, currentVM, volumeOptions.StoragePolicyID) + compatibilityResult, err := vs.GetPlacementCompatibilityResult(ctx, pbmClient, volumeOptions.StoragePolicyID) if err != nil { return "", err } @@ -1316,7 +1311,10 @@ func (vs *VSphere) CreateVolume(volumeOptions *VolumeOptions) (volumePath string return "", fmt.Errorf("User specified datastore: %q is not compatible with the storagePolicy: %q. Failed with faults: %+q", volumeOptions.Datastore, volumeOptions.StoragePolicyName, faultMsg) } } else { - dsMoList := vs.GetCompatibleDatastoresMo(ctx, compatibilityResult) + dsMoList, err := vs.GetCompatibleDatastoresMo(ctx, compatibilityResult) + if err != nil { + return "", err + } dsMo := GetMostFreeDatastore(dsMoList) datastore = dsMo.Info.GetDatastoreInfo().Name } @@ -1535,7 +1533,7 @@ func (vs *VSphere) cleanUpDummyVMs(dummyVMPrefix string) { f.SetDatacenter(dc) // Get the folder reference for global working directory where the dummy VM needs to be created. - vmFolder, err := getFolder(ctx, vs.client, vs.cfg.Global.Datacenter, vs.cfg.Global.WorkingDir) + vmFolder, err := f.Folder(ctx, strings.TrimSuffix(vs.cfg.Global.WorkingDir, "/")) if err != nil { glog.V(4).Infof("[cleanUpDummyVMs] Unable to get the kubernetes folder: %q reference with err: %+v", vs.cfg.Global.WorkingDir, err) continue @@ -1543,12 +1541,19 @@ func (vs *VSphere) cleanUpDummyVMs(dummyVMPrefix string) { // A write lock is acquired to make sure the cleanUp routine doesn't delete any VM's created by ongoing PVC requests. cleanUpDummyVMLock.Lock() - dummyVMRefList, err := getDummyVMList(ctx, vs.client, vmFolder, dummyVMPrefix) + vmMoList, err := vs.GetVMsInsideFolder(ctx, vmFolder, []string{NameProperty}) if err != nil { - glog.V(4).Infof("[cleanUpDummyVMs] Unable to get dummy VM list in the kubernetes cluster: %q reference with err: %+v", vs.cfg.Global.WorkingDir, err) + glog.V(4).Infof("[cleanUpDummyVMs] Unable to get VM list in the kubernetes cluster: %q reference with err: %+v", vs.cfg.Global.WorkingDir, err) cleanUpDummyVMLock.Unlock() continue } + var dummyVMRefList []*object.VirtualMachine + for _, vmMo := range vmMoList { + if strings.HasPrefix(vmMo.Name, dummyVMPrefix) { + dummyVMRefList = append(dummyVMRefList, object.NewVirtualMachine(vs.client.Client, vmMo.Reference())) + } + } + for _, dummyVMRef := range dummyVMRefList { err = deleteVM(ctx, dummyVMRef) if err != nil { @@ -1560,33 +1565,6 @@ func (vs *VSphere) cleanUpDummyVMs(dummyVMPrefix string) { } } -// Get the dummy VM list from the kubernetes working directory. -func getDummyVMList(ctx context.Context, c *govmomi.Client, vmFolder *object.Folder, dummyVMPrefix string) ([]*object.VirtualMachine, error) { - vmFolders, err := vmFolder.Children(ctx) - if err != nil { - glog.V(4).Infof("Unable to retrieve the virtual machines from the kubernetes cluster: %+v", vmFolder) - return nil, err - } - - var dummyVMRefList []*object.VirtualMachine - pc := property.DefaultCollector(c.Client) - for _, vmFolder := range vmFolders { - if vmFolder.Reference().Type == "VirtualMachine" { - var vmRefs []types.ManagedObjectReference - var vmMorefs []mo.VirtualMachine - vmRefs = append(vmRefs, vmFolder.Reference()) - err = pc.Retrieve(ctx, vmRefs, []string{"name"}, &vmMorefs) - if err != nil { - return nil, err - } - if strings.HasPrefix(vmMorefs[0].Name, dummyVMPrefix) { - dummyVMRefList = append(dummyVMRefList, object.NewVirtualMachine(c.Client, vmRefs[0])) - } - } - } - return dummyVMRefList, nil -} - func (vs *VSphere) createDummyVM(ctx context.Context, datacenter *object.Datacenter, datastore *object.Datastore, vmName string) (*object.VirtualMachine, error) { // Create a virtual machine config spec with 1 SCSI adapter. virtualMachineConfigSpec := types.VirtualMachineConfigSpec{ @@ -1620,7 +1598,10 @@ func (vs *VSphere) createDummyVM(ctx context.Context, datacenter *object.Datacen return nil, err } // Get the folder reference for global working directory where the dummy VM needs to be created. - vmFolder, err := getFolder(ctx, vs.client, vs.cfg.Global.Datacenter, vs.cfg.Global.WorkingDir) + f := find.NewFinder(vs.client.Client, true) + dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) + f.SetDatacenter(dc) + vmFolder, err := f.Folder(ctx, strings.TrimSuffix(vs.cfg.Global.WorkingDir, "/")) if err != nil { return nil, fmt.Errorf("Failed to get the folder reference for %q with err: %+v", vs.cfg.Global.WorkingDir, err) } @@ -1869,52 +1850,6 @@ func makeDirectoryInDatastore(c *govmomi.Client, dc *object.Datacenter, path str return err } -// Get the folder for a given VM -func getFolder(ctx context.Context, c *govmomi.Client, datacenterName string, folderName string) (*object.Folder, error) { - f := find.NewFinder(c.Client, true) - - // Fetch and set data center - dc, err := f.Datacenter(ctx, datacenterName) - if err != nil { - return nil, err - } - f.SetDatacenter(dc) - - folderName = strings.TrimSuffix(folderName, "/") - dcFolders, err := dc.Folders(ctx) - vmFolders, _ := dcFolders.VmFolder.Children(ctx) - - var vmFolderRefs []types.ManagedObjectReference - for _, vmFolder := range vmFolders { - vmFolderRefs = append(vmFolderRefs, vmFolder.Reference()) - } - - // Get only references of type folder. - var folderRefs []types.ManagedObjectReference - for _, vmFolder := range vmFolderRefs { - if vmFolder.Type == "Folder" { - folderRefs = append(folderRefs, vmFolder) - } - } - - // Find the specific folder reference matching the folder name. - var resultFolder *object.Folder - pc := property.DefaultCollector(c.Client) - for _, folderRef := range folderRefs { - var refs []types.ManagedObjectReference - var folderMorefs []mo.Folder - refs = append(refs, folderRef) - err = pc.Retrieve(ctx, refs, []string{"name"}, &folderMorefs) - for _, fref := range folderMorefs { - if fref.Name == folderName { - resultFolder = object.NewFolder(c.Client, folderRef) - } - } - } - - return resultFolder, nil -} - // Delete the VM. func deleteVM(ctx context.Context, vm *object.VirtualMachine) error { destroyTask, err := vm.Destroy(ctx) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index 53e10f1520963..402e01db9757f 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -22,7 +22,10 @@ import ( "runtime" "strings" + "fmt" + "github.com/vmware/govmomi" + "github.com/vmware/govmomi/find" "github.com/vmware/govmomi/object" "github.com/vmware/govmomi/pbm" "github.com/vmware/govmomi/property" @@ -35,6 +38,8 @@ import ( const ( DatastoreProperty = "datastore" DatastoreInfoProperty = "info" + Folder = "Folder" + VirtualMachine = "VirtualMachine" ) // Reads vSphere configuration from system environment and construct vSphere object @@ -78,8 +83,8 @@ func GetgovmomiClient(cfg *VSphereConfig) (*govmomi.Client, error) { } // Get placement compatibility result based on storage policy requirements. -func (vs *VSphere) GetPlacementCompatibilityResult(ctx context.Context, pbmClient *pbm.Client, vmObj *object.VirtualMachine, storagePolicyID string) (pbm.PlacementCompatibilityResult, error) { - datastores, err := vs.getAllAccessibleDatastores(ctx, vmObj) +func (vs *VSphere) GetPlacementCompatibilityResult(ctx context.Context, pbmClient *pbm.Client, storagePolicyID string) (pbm.PlacementCompatibilityResult, error) { + datastores, err := vs.getSharedDatastoresInK8SCluster(ctx) if err != nil { return nil, err } @@ -144,17 +149,17 @@ func GetMostFreeDatastore(dsMo []mo.Datastore) mo.Datastore { return dsMo[index] } -func (vs *VSphere) GetCompatibleDatastoresMo(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult) []mo.Datastore { +func (vs *VSphere) GetCompatibleDatastoresMo(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult) ([]mo.Datastore, error) { compatibleHubs := compatibilityResult.CompatibleDatastores() // Return an error if there are no compatible datastores. if len(compatibleHubs) < 1 { - return nil + return nil, fmt.Errorf("There are no compatible datastores that satisfy the storage policy requirements") } dsMoList, err := vs.getDatastoreMo(ctx, compatibleHubs) if err != nil { - return nil + return nil, err } - return dsMoList + return dsMoList, nil } func (vs *VSphere) GetNonCompatibleDatastoresMo(ctx context.Context, compatibilityResult pbm.PlacementCompatibilityResult) []mo.Datastore { @@ -190,7 +195,90 @@ func (vs *VSphere) getDatastoreMo(ctx context.Context, hubs []pbmtypes.PbmPlacem } // Get all datastores accessible for the virtual machine object. -func (vs *VSphere) getAllAccessibleDatastores(ctx context.Context, vmObj *object.VirtualMachine) ([]types.ManagedObjectReference, error) { +func (vs *VSphere) getSharedDatastoresInK8SCluster(ctx context.Context) ([]types.ManagedObjectReference, error) { + f := find.NewFinder(vs.client.Client, true) + dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) + f.SetDatacenter(dc) + vmFolder, err := f.Folder(ctx, strings.TrimSuffix(vs.cfg.Global.WorkingDir, "/")) + if err != nil { + return nil, err + } + vmMoList, err := vs.GetVMsInsideFolder(ctx, vmFolder, []string{NameProperty}) + if err != nil { + return nil, err + } + dsMorefs := make(map[int][]types.ManagedObjectReference) + for i, vmMo := range vmMoList { + if !strings.HasPrefix(vmMo.Name, DummyVMPrefixName) { + dsMorefs[i], err = vs.getAllAccessibleDatastores(ctx, vmMo) + if err != nil { + return nil, err + } + } + } + sharedDSMorefs := intersectMorefs(dsMorefs) + if len(sharedDSMorefs) == 0 { + return nil, fmt.Errorf("No shared datastores found in the Kubernetes cluster") + } + return sharedDSMorefs, nil +} + +func intersectMorefs(args map[int][]types.ManagedObjectReference) []types.ManagedObjectReference { + arrLength := len(args) + tempMap := make(map[string]int) + tempArrayNew := make([]types.ManagedObjectReference, 0) + for _, arg := range args { + tempArr := arg + for idx := range tempArr { + if _, ok := tempMap[tempArr[idx].Value]; ok { + tempMap[tempArr[idx].Value]++ + if tempMap[tempArr[idx].Value] == arrLength { + tempArrayNew = append(tempArrayNew, arg[idx]) + } + } else { + tempMap[tempArr[idx].Value] = 1 + } + } + } + return tempArrayNew +} + +// Get the VM list inside a folder. +func (vs *VSphere) GetVMsInsideFolder(ctx context.Context, vmFolder *object.Folder, properties []string) ([]mo.VirtualMachine, error) { + vmFolders, err := vmFolder.Children(ctx) + if err != nil { + return nil, err + } + + pc := property.DefaultCollector(vs.client.Client) + var vmRefs []types.ManagedObjectReference + var vmMoList []mo.VirtualMachine + for _, vmFolder := range vmFolders { + if vmFolder.Reference().Type == VirtualMachine { + vmRefs = append(vmRefs, vmFolder.Reference()) + } + } + err = pc.Retrieve(ctx, vmRefs, properties, &vmMoList) + if err != nil { + return nil, err + } + return vmMoList, nil +} + +// Get the datastores accessible for the virtual machine object. +func (vs *VSphere) getAllAccessibleDatastores(ctx context.Context, vmMo mo.VirtualMachine) ([]types.ManagedObjectReference, error) { + f := find.NewFinder(vs.client.Client, true) + dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) + if err != nil { + return nil, err + } + f.SetDatacenter(dc) + vmRegex := vs.cfg.Global.WorkingDir + vmMo.Name + vmObj, err := f.VirtualMachine(ctx, vmRegex) + if err != nil { + return nil, err + } + host, err := vmObj.HostSystem(ctx) if err != nil { return nil, err From ddbbe3c283d3ac6cb32feb532552b38c70e919c1 Mon Sep 17 00:00:00 2001 From: Balu Dontu Date: Fri, 19 May 2017 22:48:10 -0700 Subject: [PATCH 7/7] Get shared datastores made more code readable --- .../providers/vsphere/vsphere.go | 1 - .../providers/vsphere/vsphere_util.go | 58 +++++++++++-------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 71b27c9356171..29aa1cf8197fb 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -1319,7 +1319,6 @@ func (vs *VSphere) CreateVolume(volumeOptions *VolumeOptions) (volumePath string datastore = dsMo.Info.GetDatastoreInfo().Name } } - ds, err := f.Datastore(ctx, datastore) if err != nil { glog.Errorf("Failed while searching for datastore %+q. err %s", datastore, err) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere_util.go b/pkg/cloudprovider/providers/vsphere/vsphere_util.go index 402e01db9757f..75ed698809761 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere_util.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere_util.go @@ -207,40 +207,47 @@ func (vs *VSphere) getSharedDatastoresInK8SCluster(ctx context.Context) ([]types if err != nil { return nil, err } - dsMorefs := make(map[int][]types.ManagedObjectReference) - for i, vmMo := range vmMoList { + index := 0 + var sharedDs []string + for _, vmMo := range vmMoList { if !strings.HasPrefix(vmMo.Name, DummyVMPrefixName) { - dsMorefs[i], err = vs.getAllAccessibleDatastores(ctx, vmMo) + accessibleDatastores, err := vs.getAllAccessibleDatastores(ctx, vmMo) if err != nil { return nil, err } + if index == 0 { + sharedDs = accessibleDatastores + } else { + sharedDs = intersect(sharedDs, accessibleDatastores) + if len(sharedDs) == 0 { + return nil, fmt.Errorf("No shared datastores found in the Kubernetes cluster") + } + } + index++ } } - sharedDSMorefs := intersectMorefs(dsMorefs) - if len(sharedDSMorefs) == 0 { - return nil, fmt.Errorf("No shared datastores found in the Kubernetes cluster") + var sharedDSMorefs []types.ManagedObjectReference + for _, ds := range sharedDs { + sharedDSMorefs = append(sharedDSMorefs, types.ManagedObjectReference{ + Value: ds, + Type: "Datastore", + }) } return sharedDSMorefs, nil } -func intersectMorefs(args map[int][]types.ManagedObjectReference) []types.ManagedObjectReference { - arrLength := len(args) - tempMap := make(map[string]int) - tempArrayNew := make([]types.ManagedObjectReference, 0) - for _, arg := range args { - tempArr := arg - for idx := range tempArr { - if _, ok := tempMap[tempArr[idx].Value]; ok { - tempMap[tempArr[idx].Value]++ - if tempMap[tempArr[idx].Value] == arrLength { - tempArrayNew = append(tempArrayNew, arg[idx]) - } - } else { - tempMap[tempArr[idx].Value] = 1 +func intersect(list1 []string, list2 []string) []string { + var sharedList []string + for _, val1 := range list1 { + // Check if val1 is found in list2 + for _, val2 := range list2 { + if val1 == val2 { + sharedList = append(sharedList, val1) + break } } } - return tempArrayNew + return sharedList } // Get the VM list inside a folder. @@ -266,7 +273,7 @@ func (vs *VSphere) GetVMsInsideFolder(ctx context.Context, vmFolder *object.Fold } // Get the datastores accessible for the virtual machine object. -func (vs *VSphere) getAllAccessibleDatastores(ctx context.Context, vmMo mo.VirtualMachine) ([]types.ManagedObjectReference, error) { +func (vs *VSphere) getAllAccessibleDatastores(ctx context.Context, vmMo mo.VirtualMachine) ([]string, error) { f := find.NewFinder(vs.client.Client, true) dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) if err != nil { @@ -290,5 +297,10 @@ func (vs *VSphere) getAllAccessibleDatastores(ctx context.Context, vmMo mo.Virtu if err != nil { return nil, err } - return hostSystemMo.Datastore, nil + + var dsRefValues []string + for _, dsRef := range hostSystemMo.Datastore { + dsRefValues = append(dsRefValues, dsRef.Value) + } + return dsRefValues, nil }